-
클래스와 구조체의 인스턴스 그리고 초기화iOS 앱 개발 부트캠프/TIL 2024. 11. 1. 23:47
Swift의 인스턴스와 초기화(init)
Swift에서 클래스(Class), 구조체(Struct), 열거형(Enum)은 설계도의 역할을 한다. 이 설계도를 통해 실제 메모리에 만들어지는 실체가 바로 인스턴스이다.
1. 인스턴스의 생성과 초기화(init)
인스턴스를 생성할 때는 상태(프로퍼티)를 초기화해야 하며, 이를 위해 init 키워드를 사용한다. 모든 프로퍼티에 값을 설정하지 않으면 오류가 발생하지만, 기본값이나 Optional로 선언된 프로퍼티는 초기화 생략이 가능하다.
2. 클래스와 초기화
클래스는 프로퍼티와 메소드로 구성되며, 클래스는 다음과 같은 특징을 가진다:
• 지정 초기화(init): 모든 프로퍼티에 대해 초기값을 설정하는 일반적인 초기화 방법
class Person { var name: String var age: Int init(name: String, age: Int){ self.name = name self.age = age } }
• 기본값 초기화: 프로퍼티에 기본값을 넣어 초기화할 수 있어 init을 생략할 수 있다.
class Person { var name: String = "이름없음" var age: Int = 0 // init 생략 가능 } let person = Person() // 혹은 파라미터를 받지 않는 init에서 모든 프로퍼티 값을 정해줄 수 있다. class Person { var name: String var age: Int init() { self.name = "이름없음" self.age = 15 } }
• 여러개의 init: 여러 초기화 메소드를 만들 수 있다.
class Person { var name: String var age: Int init(name: String, age: Int) { // 파라미터 두 개 넣을 때 이곳 init 구문 호출 self.name = name self.age = age } init(name: String) { // name 파라미터 하나일 땐 이곳 init 구문 호출 self.name = name self.age = 0 } init() { // 파라미터가 없을 땐 이곳 init 호출 self.name = "이름없음" self.age = 15 } }
• 보조 초기화(convenience init): 클래스에서만 제공하는 추가 초기화 방법으로, self.init을 통해 지정 초기화를 간편하게 사용하게 도와준다.
// 컨비니언스 이니셜라이저(convenience initializer) 사용해보기 // 파라미터에 값을 할당하지 않고 컨비니언스 이니셜라이즈를 사용해도 비슷한 효과를 낼 수 있습니다. class Person { var name: String var age: Int // 기본값을 주지 않았어요! init(name: String, age: Int) { self.name = name self.age = age } convenience init(name: String) { // convenience init에서 name만 받은 후 아래 init에서 기본값을 정해줄 수 있습니다. self.init(name: name, age: 0) } } let person = Person(name: "이름만 있어요!") print(person.age) // 0
3. 구조체와 초기화
구조체는 클래스와 유사하지만 값 타입(Value Type)이라는 차이가 있다. 인스턴스의 값이 복사되어 서로 다른 값으로 처리된다.
구조체의 특징:
- 멤버와이즈 초기화(memberwise init): 모든 프로퍼티를 초기화하는 기본 init을 자동 생성해준다. 클래스에는 없는 기능이며 init을 직접 생성하면 멤버와이즈 초기화 기능이 사용되지 않는다.
- 상속 불가: 구조체는 다른 구조체로부터 상속받거나 상속할 수 없다.
- mutating 키워드 필요: 구조체 인스턴스를 let으로 선언하면 프로퍼티 변경이 불가능하며, 함수 내에서 프로퍼티를 변경하려면 mutating을 선언해야 한다.
- 클래스와 달리 인스턴스를 let으로 만들면 내부 프로퍼티를 변경할 수 없다.
class와 struct에 대해 배우면서 느낀 건, 몇가지 있다.
지금껏 class와 struct을 써오면서도, init을 왜 써야하는지에 대해서는 모호하게 이해하고 있었다. 강의를 들으며 느낀 걸 비유해보자면, 초기화는 마치 전자기기가 어떤 건전지를 얼마나 필요로 하는지 알아야 전자기기를 쓸 수 있듯이, class 혹은 struct라는 전자기기를 사용하기 위한 건전지를 설명하는 느낌이었다.
따라서 init() 구문을 제대로 작성하지 않고서 클래스를 사용하려들었던 건, 이 전자기기가 어떤 건전지를 쓰는지도 모르면서 작동부터 시키려고 했던 것인 셈이다. 새로 산 전자기기에 필요한 건전지가 들어있는채 파는 경우처럼, init을 생략 가능한 경우나 memberwise init 같이 자동으로 초기화를 해주는 경우들 때문에 착각했던 것이다.
그리고 아직 잘 이해되지 않은 개념이, class의 보조 초기화(convenienc init)이다. 여러개의 init()을 작성해 다양한 초기화 방식을 지정해놓은 경우와 뭐가 다르고 어떤 장단점이 있는지 좀 더 찾아봐야 할 것 같고,
class는 참조타입, struct는 값타입이라는 개념이 정확히 뭔지 모르겠어서 let으로 선언한 인스턴스의 내부 프로퍼티 변경에 대한 처리가 다른 것도 모호하게 이해하고 있다. 좀더 찾아봐야 할 것 같다.
'iOS 앱 개발 부트캠프 > TIL' 카테고리의 다른 글
짝수와 홀수, 배열의 평균값, 자리수 합치기 (0) 2024.11.03 짝수의 합, 배열의 평균 값 (2) 2024.11.02 추상화 된 프로토콜 만들기 (0) 2024.10.31 자동완성 없이 코딩하기 (0) 2024.10.30 swift 문법 기초 챕터1 Recap (0) 2024.10.29