본문 바로가기

Swift

Swift - Self & Super

Self와 Super는 형식(자료형)에 기본적으로 추가되는 특별한 속성임.

 

self  // 인스턴스 자체 접근시 사용. 인스턴스 자신.

self.propertyName // 인스턴스 속성에 접근(생략도 가능)

self.method() // 인스턴스 메소드에 접근(생략도 가능) 

self[index] // 서브스크립트 접근시 

self.init(parameters) // 동일한 형식에 있는 다른 생성자 호출시 사용. 셀프생략불가.

 

self는 인스턴스에서 자동으로 추가됨. (형식에 기본적으로 추가되는 self.) 

인스턴스멤버에서 접근하면 인스턴스에 접근.

타입멤버에서 접근하면 형식에 접근.

 

  1. self는 현재 인스턴스에 접근하기 위한 특별한 속성이다.

  2. 단, 타입멤버에서 사용하면 인스턴스가 아닌 형식 자체에 접근함.

 

class Size { 

var width = 0.0 

var height = 0.0 

 

func calcArea() -> Double { 

return self.width * self.height   // self생략 가능.  

}

var area: Double { 

return self.calcArea()  // 속성과 마찬가지로 self생략 가능.

func update(width: Double, height: Double) { 

self.width = width //파라미터 이름과 속성 이름이 동일. 이 경우 컴파일러는 모두 파라미터로 인식하여 컴파일 에러 발생. 셀프표현으로 속성과 파라미터 구분해야 함.

self.height = height 

}

func doSomething() { 

let c = { self.width * self.height } // 클로저에서 인스턴스 멤버에 접근하려면 셀프를 캡쳐해야 함. 클로저 내부에서 인스턴스 속성에 접근하려면 반드시 self를 사용해야 함.  셀프를 캡쳐해야 함.

 

static let unit = “” 

static func doSomething() { 

self.width       //error발생. width라는 형식속성은 존재하지 않음. 

self.unit // 가능. 둘다 타입멤버라 가능. self도 생략 가능. 

 

}

}

중요: Self를 반드시 써야 하는 경우:

  1. 생성자에서 파라미터와 속성이름이 같을 경우

  2. 클로저 내부에서 인스턴스 내부 접근 : 인스턴스 멤버 접근시 self. 반드시 사용.

 

Self의 특성 2가지:

  • Self는 현재 인스턴스에 접근하기 위해 사용하는 특별한 속성이다.

  • 타입멤버에서 사용하면 인스턴스가 아닌 형식 자체를 나타낸다. 

구조체에서의 self 

아래 self = Size(width: value, height: value) 를 통해 새로운 인스턴스를 생성할 수 있다. (클래스에서는 사용 불가.)

struct Size {

    var width = 0.0

    var height = 0.0

    

    mutating func reset(value: Double) {

// width = value 

// height = value 

        self = Size(width: value, height: value) // self에 새로운 인스턴스를 저장됨.  인스턴스가 새로운 인스턴스로 교체됨. 클래스에서는 사용 불가함. 

    }

}

 

var p2 = Size()

p2.reset(value: 10)

 

print(p2.width)

print(p2.height)

 

super는 상속과 연관이 있기 때문에 class에서만 사용 가능. 

super.propertyName // 인스턴스 속성에 접근(생략도 가능)

super.method() // 인스턴스 메소드에 접근(생략도 가능) 

super[index] // 서브스크립트 접근시 

super.init(parameters) // 동일한 형식에 있는 다른 생성자 호출시 사용. 셀프생략불가.

 

'Swift' 카테고리의 다른 글

Swift - In Out Parameters (입출력 파라미터)  (0) 2020.03.22
Swift - Generics(제네릭)  (0) 2020.03.22
Swift - 고차 함수  (0) 2020.03.21
Swift - Optional(옵셔널)  (0) 2020.03.20
Swift - First Class Citizen  (0) 2020.03.19