ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 지정생성자vs편의생성자, 클래스와 인스턴스의 메모리 구조 차이
    code 2023. 3. 15. 23:59

    클래스와 인스턴스의 메모리 구조 차이 

    클래스 구조체
    클래스의 인스턴스는 힙에 저장,
     인스턴스를 가리키는 변수의 메모리 주소가 스택에 담겨 저장된다.
    실제 인스턴스의 데이터 자체가 스택에 저장
    참조 타입 값 타입

     

    생성자란 무엇인가?

    클래스나 구조체의 모든 저장 속성에 초기값을 설정하여 인스턴스를 생성할 수 있도록 하는 것

    -> 저장속성의 메모리에 모든 값들을 갖게 만들어, 각각의 인스턴스가 모든 데이터를 가지고 데이터로서 역할을 할 수 있도록 생성하는 함수

     

     

    지정 생성자 vs 편의 생성자 

    지정생성자 - 직접적으로 메모리값을 세팅하는 역할을 하는 생성자, 
    - 모든 프로퍼티를 초기화해야 할 임무를 가지고 있음. 클래스에 하나 이상 정의해야함.
    - 조상클래스에서 지정 이니셜라이저가 자손클래스의 지정 이니셜라이저 역할을 충분히 할 수 있다면, 자손클래스는 지정 이니셜라이저를 갖지 않을 수도 있음
    편의생성자 - 직접적으로 메모리값을 세팅하지 않고, 메모리값 세팅을 지정생성자에게 위임(지정생성자를 자신 내부에서 호출함)하는 생성자
    - 편의생성자 내부에서 반드시 나의 단계의 지정생성자를 궁극적으로 호출해야함 (self.init(...))

     

    클래스의 초기화 위임

    1. 자식 클래스의 지정 이니셜라이저는 부모클래스의 지정 이니셜라이저를 반드시 호출해야 함.

    2. 편의 이니셜라이저는 자신을 정의한 클래스의 다른 이니셜라이저반드시 호출해야함

    3. 편의 이니셜라이저는 궁극적으로는 지정 이니셜라이저를 반드시 호출해야함.

     

    class Bclass: Aclass {
    
        var z: Int
    
        // 이 부분에 지정생성자 및 편의 생성자(상위의 지정생성자를 재정의해서) 구현
        init(x: Int, y: Int, z: Int) {
            self.z = z              
            super.init(x: x, y: y) 
        }
        
        //편의생성자
        convenience override init(x: Int, y: Int) {  
        	//지정생성자 호출 필요
            self.init(x: x, y: y, z: 0)             
        }
    }

    2단계 초기화

    스위프트의 클래스 초기화는 2단계를 거침. 

    1단계 -> 클래스에 정의한 각각의 저장 프로퍼티에 초깃값이 할당됨.

    모든 저장 프로퍼티의 초기 상태가 결정되면 2단계로 돌입해 저장 프로퍼티들을 사용자 정의할 기회를 얻음.

     

    안전확인(safty-checks)

    1. 자식클래스의 지정 이니셜라이저가 부모클래스의 이니셜라이저를 호출하기 전에 자신의 프로퍼티를 모두 초기화했는지 확인

    -> 자식클래스의 지정 이니셜라이저에서 부모클래스의 지정 이니셜라이저를 호출하기 전에 자신의 모든 저장 프로퍼티에 값을 할당해주었는지 확인해야함

    2. 자식클래스의 지정 이니셜라이저는 상속받은 프로퍼티에 값을 할당하기 전에 반드시 부모클래스의 이니셜라이저를 호출해야함.

    3. 편의 이니셜라이저값을 할당하기 전에 다른 이니셜라이저를 호출해야함

    4. 초기화 1단계를 마치기 전까지는 이니셜라이저는 인스턴스 메서드를 호출할 수 없음. 인스턴스 프로퍼티의 값을 읽어들일 수도 없음. self 프로퍼티를 자신의 인스턴스를 나타내는 값으로 활용할 수도 없음.

     

    : 클래스의 인스턴스는 초기화 1단계를 마치기 전까지는 유효하지 않다. 

     

     

     

    출처: 스위프트 프로그래밍 (야곰)

Designed by Tistory.