-
Swift #9 - 객체 초기화Swift의 온도 2021. 1. 14. 01:37
1. Initializer
- 초기화
#모든 객체는 사용하기 전에 초기화
#프로퍼티 초기화
*초기값과 함께 선언된 프로퍼티
*옵셔널 타입의 프로퍼티
*초기값이 없고, 옵셔널 타입이 아닌 프로퍼티
- 객체 준비
#객체 사용 준비
*클래스 선언class Rectangle {var width = 0var height = 0var name : String?}*객체 생성var obj = Rectangle()obj.widthobj.heightobj.namecs *클래스 선언*초기값이 없고 옵셔널 타입이 아닌 프로퍼티class MyClass {var value : Int}*객체가 생성되면?var obj = MyClass()obj.value = ???cs - Initializer
#객체 사용에 앞서
*객체 사용하려면 초기화 필요
*옵셔널/초기값이 있는 프로퍼티 : 자동 초기화
*옵셔널 타입이 아니고 초기값이 프로퍼티 : 수동 초기화
# Initializer
*객체 초기화 코드 작성
*하나의 클래스에 다수의 Initializer 작성 가능
init() {//객체 초기화}cs - Initializer 작성과 객제 생성
#Initializer 작성
*초기화가 필요한 프로퍼티 초기화\class Rectangle {var width : Intvar height : intinit() {width = 0height = 0}}*객체 생성 : Initializer 형태에 맞게let obj = Rectangle()cs #파라미터가 있는 Initializer
class Rectangle {var width : Intvar height : Intinit(width : Int, height : Int) {self.width = widthself.height = height}}*객체 생성 : Initializer 형태에 맞게let obj1 = Rectangle(width:10, height:20)let obj2 = Rectangle()cs - Initializer 종류
#Designated Initializer
*객체 초기화를 단독으로 완료 가능
*모든 초기화가 필요한 프로퍼티 초기화
*클래스에 반드시 1개 이상 필요
#Convenience Initializer
*단독으로 초기화 불가능
*일부 프로퍼티 초기화
*다른 Initializer를 이용해서 초기화
*중복 코드 방지
- Designated Initializer
*모든 값 초기화class MyClass {var a : Intvar b : Intinit(a : Int, b : Int)self.a = aself.b = b}}*초기화 코드 먼저 작성init(a : Int, b : Int) {self.a = b//초기화가 끝나기 전에 다른 메소드 호출은 에러}cs - Convenience Initializer
*단독으로 객체 초기화 불가
*초기화가 필요한 모든 프로퍼티를 초기화하지 않음
*다른 초기화 메소드에 의존(Initializer Delegation)
#Initializer Delegation
*다른 init 메소드 호출하기
*다양한 객체 생성 방법 제공 -> 메소드 다수
*초기화 코드의 중복 방지, 재사용 높이기
*초기화 위임 이후에 다른 초기화 동작 작성convenience init(파라미터) {//초기화 위임//초기화 코드}cs class MyClass {var a, b : Intinit() {a = 0b = 0}init(a:Int, b:Int)self.a = aself.b = b}convenience init(b:Int) {self.init() //Initializer delegationself.b = b}}cs //Designated Initializer로 객체 생성var obj1 = MyClass()var obj2 = MYClass(a: 1, b: 2)//Convenience Initializer로 객체 생성var obj2 = MyClass(b: 2)cs 2. Failable Initializer
- Failable Initializer
#객체 생성, 초기화 과정 실패
*출생년가 미래인 Person 객체
*학번 규칙이 맞지 않는 Student 객체
*크기가 음수인 Rectangle 객체
#초기화 실패의 결과는?
*nil 반환 - Failable Initializerlet obj = Rectangle(width:-10, height:-20)obj // nilcs #작성 방법
*Initializer와 동일
*조건 체크 - 오류상황에 nil 반환
#Initializer 이름
init?, init!cs - Failable Initializer 작성
*1900년 이전 출생한 사람은 없는 시스템*Initializer의 파라미터 조건 검사init?(birth Year : Int) {if birthYear <= 1900 {return nil}else {self.birthYear = birthYear}}cs - Failable Initializer로 객체 생성
*객체 생성 메소드 - 반환 타입이 옵셔널var obj1 = Person(birthYear: -1990) // nil, Optionalvar obj2 = Person(birthYear: 1990)*if-let 바인딩if let obj = Person(birthYear. 1990) {}*강제 언래핑var obj2 = Person(birthYear. -1800)*암시적 언래핑 옵셔널로 작성 가능init!(birthYear : Int) {// 초기화 코드}*생성된 객체의 타입let obj : Person! = Person(birthYear : 1999)cs 3. 객체 해체
- 해제 메소드
#객체의 메모리 해제
*객체가 메모리에서 해제되면서 호출
*이름 deinit
*파라미터, 리턴 타입 없음
*객첵 ㅏ메모리에서 해제되면서 호출*이름 deinit*파라미터, 리턴 타입 없음class MyClass {deinit//객체 해제 시 동작}}cs - deinit
#객체 생성, 해제
var obj : MyClass! = MyClass()//객체 해제obj = nilprint("== END ==")cs 'Swift의 온도' 카테고리의 다른 글
Swift #11 - 메모리 관리 (0) 2021.01.19 Swift #10 - 상속 (0) 2021.01.15 Swift #8 - 클래스 (0) 2021.01.13 Swift #7 - 함수 (0) 2021.01.12 Swift #6 - nil과 옵셔널 (0) 2021.01.08