[Swift] self vs Self

임승섭·2023년 6월 27일
0

Swift

목록 보기
15/35

self

  • 인스턴스를 가리킴
/*1). 인스턴스를 가리키기 위해 사용*/
class Person {
	var name: String
    
    init(name: String) {
    	self.name = name
    }
}

/*2). 값 타입에서 새로운 값으로 속성을 초기화 (클래스에서는 불가능)*/
struct Calculator {
	var number: Int = 0
    
    // (구조체, 열거형에서) 메서드 내에서자기 자신의 속성을 바꾸는 경우 - mutating 키워드
    // 원래 속성 변경 불가능
    mutating func plusNumber(_ num: Int) {
    	number = number + num
    }
    
    // 인스턴스 값 자체를 치환해서 사용
    mutating func reset() {
    	self = Calculator()		// 아예 새로 생성해서 치환
    }


/*3). 타입멤버(속성/메서드)에서 사용하면, 인스턴스가 아닌 타입 자체를 가리킴*/
struct MyStruct {
	static let club = "iOS 부서"
    
    // 타입 메서드인 경우
    static func doPrinting() {
    	print("소속은 \(self.club)입니다.")
    }
    
    /*인스턴스 메서드인 경우
    func doPrinting() {
    	print("소속은 \(MyStruct.club)입니다.")
    }
    */
}

/*4). 타입 인스턴스를 가리키는 경우에 사용 (외부에서 타입을 가리키는 경우)*/
// 타입 인스턴스 : 붕어빵 틀 자체의 메모리를 명시할 때 사용하는 용어
class SomeClass {
	static let name = "SomeClass"
}

let myClass: SomeClass.Type = SomeClass.self	// 실제 데이터 영역에 있는 메모리 구조

Self

  • 타입을 가리킴
extension Int {
	
    /*1). 타입을 선언하는 위치에서 사용*/
    // 타입 저장 속성 (동일한 의미)
	static let zero: Self = 0
	static let zero: Int = 0
    
    // 인스턴스 계산 속성 (동일한 의미)
    var zero: Selr {
    	return 0
    }
    var zero: Int {
    	return 0
    }
    
    /*2). 타입속성/타입메서드를 지칭하는 자리에서 대신 사용 가능*/
    static func toZero() -> Self {	// Int 쓰는거랑 동일
    	return Self.zero	// Int.zero 쓰는거랑 동일
    }

프로토콜에서 사용

  • 프로토콜으르 채택한 해당 타입을 이용할 수 있다.
extension BinaryInteger {
	func squard() -> Self {		// 프로토콜을 채택한 해당 타입 자체(Int, UInt, ...)를 가리킴
    	return self * self		// 인스턴스(7)을 가리킴
    }
}

// => Int와 UInt 간에도 비교가 가능하도록 만들어준다!!
// (타입이 다른데도 비교가 가능)

let x1: Int = -7
let y1: UInt = 7

if x1 <= y1 {
	print("\(y1)가 더 크거나 같다")
}
else {
	print("(x1)가 더 크다")
}

7.squared()

0개의 댓글