타입 메서드 & 서브스크립트

조현우·2022년 6월 26일
0

타입 메서드

class Mac {
    static var model = "Mac"
    
    var name: String
    var weight: Double
    
    init(name: String, weight: Double) {
        self.name = name
        self.weight = weight
    }
    
    
    func changeName(newName name: String) {
        self.name = name
    }
    
    // 타입 메서드에서, 타입속성에 접근시에는 타입으로 접근하지 않아도 된다.
    // 둘 다 타입 자체에 속해있기 때문이다.
    static func letMeKnow() {   
    	// Mac.model 과 같이 접근해도 된다.
        print("\(model)입니다.")    
    }
}

Mac.letMeKnow()
// Mac입니다.

// Int.random(...), Double.random(...) 와 같은 메서드들도 타입 메서드이다.
// Int, Double 기본형 타입에서 인스턴스 생성없이 바로 점문법으로 메서드 사용가능.
class UpperClass {
	class func someTypeMethod() {
    	print("타입과 관련된 공통된 기능을 구현")
    }
}

UpperClass.someTypeMethod()
// 타입과 관련된 공통된 기능을 구현

class SomeThingClass: UpperClass {
	override class func someTypeMethod() {
    	print("타입과 관련된 공통된 기능을 구현(업그레이드)")
    }
}	

SomeThingClass.someTypeMethod()
// 타입과 관련된 공통된 기능을 구현(업그레이드)

타입 메서드는
1. 메서드이기 때문에 타입에 메모리 공간이 할당되어 있지 않다.
2. 인스턴스에 속한 속성이 아니고, 타입자체에 속한 속성이기에 내/외부에서 Type.method()로 접근해야 한다.
=> 메서드 실행시, 스택프레임을 만들고 타입 데이터를 사용 -> 메서드 종료시 스택프레임 사라짐
3. 타입에 해당하는 보편적인 동작(예: Int.random(...))의 경우
4. static(상속시 재정의 불가) 또는 class(상속시 재정의 가능) 키워드 사용


서브스크립트

"[ ]" 대괄호를 이용해 배열의 요소(Element)나 딕셔너리의 키에 접근하기 위해 사용하는 문법

대괄호는 특별한 형태의 메서드(기능)이다. 메서드를 직접 구현도 가능하다.(배열, 딕셔너리 제외)

class SubScript {
    var num = [10, 20, 30, 40, 50]
    
    subscript(index: Int) -> Int {
        get {
            return num[index]
        }
        set {
            return self.num[index] = newValue
        }
    }
}

let someClass: SubScript = SubScript()

print(someClass[2])		// 30
someClass[2] = 10
print(someClass[2])		// 10
enum SomeEnum: Int {
	case pc = 1, Mac, notebook, cellphone
    
    // 타입을 넘겨주는 것도 가능
    subscript(n: Int) -> someEnum {
    	return someEnum(rawValue: n)!
    }
}

let someEnum = SomeEnum[2]
print(someEnum)
// Mac

서브스크립트는
메서드이기 때문에 인스턴스에 메모리 공간이 할당되어 있지 않다.
파라미터를 2개 이상 사용할 수도 있다.(아규먼트 레이블을 따로 사용하지 않는다)

profile
현우

0개의 댓글