swift 5(인스턴스 생성 및 소멸, 접근제어)
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
댓글남기기