swift 5(인스턴스 생성 및 소멸, 접근제어)

1 분 소요

2020.03.18

‘야곰. 스위프트 프로그래밍 3판. 한빛미디어’를 바탕으로 작성되었습니다.

11장 인스턴스 생성 및 소멸

  • 옵셔널 저장 프로퍼티를 제외한 모든 저장 프로퍼티에 초기값을 할당해야 합니다.
  • 옵셔널 자장 프로퍼티를 값을 할당하지 않는다면 nil로 저장됩니다.
  • 생성자와 default 값으로 초기화할 때는 프로퍼티 감시자 메서드는 호출되지 않습니다.
  • 상수 프로퍼티는 인스턴스 초기화 과정에서만 값을 초기화 할 수 있고 이후 수정할 수 없습니다.
  • 구조체 같은 경우 생성자를 따로 설정하지 않아도 기본 생성자를 사용할 수 있습니다. (클래스는 불가능)
struct Test {
    var subject: String = "";
    var score: Int = 0;
}

var korean: Test = Test(subject: "Kor", score: 100);
var math: Test = Test(subject: "Math");
var english: Test = Test(score: 90);
  • init? 키워드를 사용해서 인스턴스 생성 실패 가능한 경우를 처리할 수 있습니다.
class Person {
    var name: String;
    var age: Int?;

    init?(name: String){
        if name.isEmpty {
            return nil;
        }
        self.name = name;
    }

    init?(name: String, age: Int){
        if name.isEmpty || age < 0 {
            return nil;
        }
        self.name = name;
        self.age = age;
    }
}

var philip: Person? = Person(name: "Philip", age: -1);

if let person: Person = philip {
    print(person.name);
} else{
    print("philip == nil");
}
  • Deinitializer는 클래스 인스턴스에서만 구현할 수 있습니다.

12장 접근제어

  • public : 모든 곳 사용 가능
  • open : 클래스에서만 사용 가능. open 으로 정의된 클래스는 그 클래스가 정의된 모듈 밖의 다른 모듈에서도 상속 가능.
  • internal : (default) 외부 모듈에서는 접근 불가능
  • fileprivate : 소스파일 내부에서만 사용 가능. 즉 다른 파일은 접근 불가능
  • private : 같은 소스파일 안에 구현한 다른 타입이나 기능에서도 사용 불가능
  • 내부수준, 튜플 내부 요소 타입은 상위 타입의 접근수준보다 같거나 높아야 합니다.
private class SomeClass {
    // class가 private이므로 공개 범위는 private 이다.
    public func SomeMethod() {

    }
}
  • private으로 지정했더라도, extension을 사용하면 private 요소에 접근이 가능합니다.
public struct SomeStruct {
    private var privateVariable: Int = 0;
    fileprivate var fileprivateVariable: Int = 0;
}

extension SomeStruct {
    public func publicMethod(){
        print("private variable : \(privateVariable), fileprivateVariable : \(fileprivateVariable");
    }
}

struct OtherStruct {
    var someStruct: SomeStruct = SomeStruct();

    func someMethod() {
        self.someStruct.publicMethod();
    }
}
  • setter의 접근수준을 더 낮출 수 있습니다.
public struct SomeStruct {
    public var num: Int = 0;   
    public private(set) var publicGetOnly: Int = 0;
}

var someStruct: SomeStruct = SomeStruct();
print(someStruct.num);
print(someStruct.publicGetOnly);
someStruct.publicGetOnly = 10;      // cannot assign to property: 'publicGetOnly' setter is inaccessible

카테고리:

업데이트:

댓글남기기