※ Struct & Class
구조체와 클래스는
- 프로그래머가 데이터를 용도에 맞게 묶어 표현하고자 할 때 유용
- 프로퍼티, 메서드를 사용하여 구조화된 데이터, 기능을 가질 수 있음
- 하나의 새로운 사용자 정의 데이터 타입을 만들어 주는 것임 ( ex. var animal : Animal 이 뜻은 Animal이라는 데이터 타입을 따르는 animal이라는 변수라는 뜻 )
구조체와 클래스의 차이는
- 구조체 인스턴스는 값(value) 타입 : 전달될 값이 복사되어 전달
- 클래스 인스턴스는 참조(reference) 타입 : 값을 복사하지 않고 참조(주소)가 전달
Struct
구조체 정의가 의미하는 것
- 구조체를 정의한다는 것은 새로운 타입을 생성해주는 것
- 기본 타입 이름처럼 Upper Camel Case 적용한다
- 구조체에 들어가는 프로퍼티와 메서드는 Lower Camel Case 적용
구조체 정의 예시 코드
//'BasicInformation'이라는 새로운 데이터타입 정의
struct BasicInformation {
var name: String
var age: Int
}
구조체 인스턴스의 생성 및 초기화
- 새로운 인스턴스를 생성하는 것을 초기화라고 한다. 그리고 생성자가 초기화를 담당한다.
- struct가 붕어빵 틀이라면, 인스턴스는 생성되는 하나의, 별개의, 낱개의 붕어빵. 프로퍼티는 팥, 슈크림, 피자 등등 안에 들어가는 특징
- 구조체 정의를 마친 후, 인스턴스를 생성하고 초기화하고자 할 때는 기본적으로 생성되는 memberwise initializer(멤버와이즈 이니셜라이저) 사용
- 멤버와이즈 이니셜라이저 : 구조체가 자동으로 제공하는 생성자. 구조체에 기본 생성된 이니셜라이저의 매개변수는 구조체의 프로퍼티 이름으로 자동 지정된다

//default값 없는 경우에서 인스턴스 생성
struct BasicInformation {
var name: String
var age: Int
}
var citizen = BasicInformation(name: "K", age: 50)
print(citizen.name)
//K
//default값 있는 경우에서 인스턴스 생성
struct SpecialInformation {
var color: String = "blue"
}
var he = SpecialInformation()
print(he.color)
//blue
Initializer
- initialization(초기화)는 클래스나 구조체 또는 열거형의 인스턴스를 사용하기 위한 준비 과정 : 준비를 하기 위하여 저장 프로퍼티의 초깃값을 설정하는 등의 일을 수행
- initializer를 정의하면 초기화 과정을 직접 구현할 수 있음
- 그렇게 구현된 이니셜라이저는 새로운 인스턴스를 생성할 수 있는 특별한 메서드가 됨.
밑의 코드는 매개변수가 없는 기본 이니셜라이저의 모습.
struct SomeStruct {
init() {
//초기화할 때 필요한 코드
}
}
프로퍼티 기본값
- 인스턴스를 처음 생성할 때 모든 저장 프로퍼티에 적절한 초깃값을 할당해야 한다. 왜냐하면 초기화 후에 값이 확정되지 않은 저장 프로퍼티는 존재할 수 없기 때문.
- 옵셔널 저장 프로퍼티는 초깃값 설정 안 해줘도 된다. 값이 자동으로 nil로 할당되기 때문이다.
- 만약 애초에 프로퍼티를 설정할 때 default value를 설정해준다면 이니셜라이저에서 따로 초기값을 할당하지 않더라도 default value로 값이 초기화됨
이거는 Initial Value
struct Data {
var title : String
//이니셜라이저를 통한 인스턴스 초기화 & initial value 할당
init(){
title = "Initial Value"
}
}
var article = Data()
print(article.title)
//Initial Value
이거는 Default Value
default value가 있다면, 필요한 매개변수만 사용하여 초기화할 수 있음
struct Data {
//default value 할당
var title : String = "Default Value"
var length : Int = 5
}
var article = Data()
print(article.title)
//Dafault Value
var anotherArticle = Data(length:0)
print(anotherArticle.length)
//0
이니셜라이저 매개변수
struct Person {
var name: String
//1
init (Myname my: String) {
name = "난 " + my
}
//2
init (YourName name: String) {
self.name = "너는 "+name
//좌항 self.name : 맨 처음 지정해주었던 name
//우항 name : init의 매개변수 name 지칭
}
//3
init (value: String) {
name = value
}
//4
init (_ value: String) {
name = value
}
}
let first = Person(Myname: "K")
print(first.name)
//난 K
let second = Person(YourName: "SE")
print(second.name)
//너는 SE
let third = Person(value: "안녕")
print(third.name)
//안녕
let fourth = Person("또 보자") //init에서 (_ value: String)이기 때문에 별도의 매개변수 필요 X
print(fourth.name)
//또 보자
self를 붙이는 이유 : 매개변수와 프로퍼티 이름이 겹치는 것을 구분하기 위해. self 붙은 게 프로퍼티임
이거는 예시 코드
struct Town {
var name : String
var family : [String]
var description : [String : Int]
init (name: String, family: [String], description: [String:Int]) {
self.name = name
self.family = family
self.description = description
}
}
var myTown = Town(
name: "Happy", family: ["K","J","JS"], description: ["K" : 10]
)
print(myTown.family)
//["K", "J", "JS"]
myTown.family.append("P")
print(myTown.family)
//["K", "J", "JS", "P"]
궁금한 것 : 이렇게 다양한 이니셜라이저들 각각의 장단점. 어떤 상황에서 어떤 것을 왜 쓰는지?
'iOS > Swift' 카테고리의 다른 글
| [iOS - Swift] XCTest FAQ (XCTest를 공부하다 생긴 궁금증들) (0) | 2023.03.07 |
|---|---|
| [iOS - Swift] static func vs func (0) | 2023.03.06 |
| [iOS 앱 프로그래밍] 회원가입 화면 구현 - 2. 화면의 전환 (1) 내비게이션 인터페이스 (0) | 2021.08.09 |
| [iOS 앱 프로그래밍] 회원가입 화면 구현 - 1. H.I.G (0) | 2021.08.09 |
| [iOS 앱 프로그래밍] 음원 재생기 애플리케이션 - 6. MVC (0) | 2021.08.08 |