ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift #9 - 객체 초기화
    Swift의 온도 2021. 1. 14. 01:37

     

    1. Initializer

     

    - 초기화

    #모든 객체는 사용하기 전에 초기화

    #프로퍼티 초기화

     *초기값과 함께 선언된 프로퍼티

     *옵셔널 타입의 프로퍼티

     *초기값이 없고, 옵셔널 타입이 아닌 프로퍼티

     

    - 객체 준비

    #객체 사용 준비

    *클래스 선언
     
    class Rectangle {
        var width = 0
        var height = 0
        var name : String?
    }
     
    *객체 생성
     
    var obj = Rectangle()
    obj.width
    obj.height
    obj.name
    cs
    *클래스 선언
    *초기값이 없고 옵셔널 타입이 아닌 프로퍼티
     
    class MyClass {
        var value : Int
    }
     
    *객체가 생성되면?
     
    var obj = MyClass()
    obj.value = ???
    cs

     

    - Initializer

    #객체 사용에 앞서

     *객체 사용하려면 초기화 필요

     *옵셔널/초기값이 있는 프로퍼티 : 자동 초기화

     *옵셔널 타입이 아니고 초기값이 프로퍼티 : 수동 초기화

     

    Initializer

     *객체 초기화 코드 작성

     *하나의 클래스에 다수의 Initializer 작성 가능

    init() {
        //객체 초기화
    }
    cs

     

    - Initializer 작성과 객제 생성

    #Initializer 작성

    *초기화가 필요한 프로퍼티 초기화\
     
    class Rectangle {
        var width : Int
        var height : int
        init() {
            width = 0
            height = 0
        }
    }
     
    *객체 생성 : Initializer 형태에 맞게
     
    let obj = Rectangle()
    cs

     

    #파라미터가 있는 Initializer

    class Rectangle {
        var width : Int
        var height : Int
     
        init(width : Int, height : Int) {
            self.width = width
            self.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 : Int
        var b : Int
     
     
        init(a : Int, b : Int)
            self.a = a
            self.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 : Int
        init() {
            a = 0
            b = 0
        }
        init(a:Int, b:Int)
            self.a = a
            self.b = b
        }
        convenience init(b:Int) {
            self.init() //Initializer delegation
            self.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 Initializer
     
    let obj = Rectangle(width:-10, height:-20)
    obj // nil
    cs

     

    #작성 방법

     *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, Optional
    var 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 = nil
     
    print("== 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

    댓글