iOS/Swift

메서드

밤새는 탐험가89 2024. 1. 26. 12:22

 

 

함수 1편 (함수 정의 및 호출) :: 밤새는 iOS 탐험기 (tistory.com)

 

함수 1편 (함수 정의 및 호출)

함수와 메서드 기본적으로 함수와 메서드는 동일, (상황이나 위치에 따라 용어가 다름) 메서드: 구조체, 클래스, 열거형 등 특정 타입에 연관되어 사용하는 함수 함수: 모듈 전체에서 사용하는

explorer89.tistory.com

 

 

함수와 메서드 

기본적으로 함수와 메서드는 동일,

(상황이나 위치에 따라 용어가 다름)

 

 

메서드

구조체, 클래스, 열거형 등 특정 타입에 연관되어 사용하는 함수 

 

class someClass {
    func runSomething() {
        print(" Method runSomething")
    }
}

 

함수

모듈 전체에서 사용하는 함수

func runSomething() {
    print(" Method runSomething")
}

 

 

 

 

인스턴스 메서드 

특정 타입의 인스턴스에 속한 함수

(즉, 인스턴스가 존재할 때만 사용 가능)

 

인스턴스 내부의 프로퍼티 값 변경 

특정 연산 결과를 반환하는 등

인스턴스와 관련된 기능을 실행 

 

 

클래스와 인스턴스 메서드 

class StairsClass {

    var floor: Int = 0 {
        didSet {
            print("floor: \(floor)")
        }
    }
    
    func goUP() { 
        print("Go up!")
        floor += 1
    }
}

 

 

위에서 구현한 StairsClass 내의

goUp 메서드를 인스턴스 메서드라고 함

 

 

 

인스턴스 메서드 호출 

let jerryWhere: StairsClass = StairsClass()
jerryWhere.goUP()

// Go up!
// floor: 1

 

먼저 jerryWhere 이란 "인스턴스"를 먼저 생성한 다음

goUp() 인스턴스 메서드에 접근

 

 

 

타입 메서드 

타입 자체에 호출이 가능한 메서드 

인스턴스 생성 없이 타입 이름만으로 호출이 가능 

 

메서드 앞에 "static" 키워드를 사용

 

클래스의 타입 메서드는

"static" 키워드와 "class" 키워드 있음

 

"static" => 상속 후, 메서드 재정의 불가능 

"class" => 상속 후, 메서드 정의 가능 

 

 

클래스의 타입 메서드 

 

class ParentClass {
    static func staticTypeMethod() {
        print("ParentClass staticTypeMethod")
    }
    
    class func classTypeMethod() {
        print("ParentClass classTypeMethod")
    }
}

 

 

위에 ParentClass 내에 "static" 과 "class" 키워드를 사용하여 타입 메서드 생성

 

 

ParentClass 상속 받은 ChildClass 생성

 

class ChildClass: ParentClass {
    
    /* 
    // 오류 발생 
    override static func staticTypeMethod() {
        
    }
    */
    
    override class func classTypeMethod() {
        print("ChildClass classTypeMethod")
    }
}

 

 

 

타입 메서드 호출

 

ParentClass.staticTypeMethod()
ParentClass.classTypeMethod()

// ParentClass staticTypeMethod
// ParentClass classTypeMethod

 

 

타입 프로퍼티를 호출할 때와 마찬가지로 

"ParentClass" 라는 Type 이름을 통해 호출 

 

(인스턴스를 생성 필요 없고, 인스턴스와 상관없음)

 

 

 

타입 메서드와 self

인스턴스 메서드에서는 self 가 인스턴스를 가리킴

타입 메서드에서는 self타입 자체를 가리킴 

 

class Contact {
    
    static var contactCount: Int = 0
    
    static func countUp() {
        self.contactCount = contactCount + 1
    }
}

 

 

 "self.contactCount" 이 부분에서 "self"는 "Contact"를 가리킴

"Contact.contactCount" 와 같은 표현 

 

 

 

타입 메서드와 인스턴스 메서드 범위 

 

프로퍼티 종류는 일반 프로퍼티와 타입 프로퍼티가 있음

 

class Fruit {
    let name = "Apple"                     // 저장 프로퍼티
    static let market = "jerry`s market"   // 저장 타입 프로퍼티
}

 

 

타입 메서드는 저장 타입 프로퍼티에만 접근 가능 

 

왜냐하면?

저장 프로퍼티 name은 메모리에 올라가야 사용 가능하지만,

저장 타입 프로퍼티 market은 이것과는 상관없기 때문

 

class Fruit {
    let name = "Apple"                     // 저장 프로퍼티
    static let market = "jerry`s market"   // 저장 타입 프로퍼티
    
    
    static func check() {
        print(name)     //  error: instance member 'name' cannot be used on type 'Fruit'
        print(market)
    }
}

 

 

 

인스턴스 메서드에서는 인스턴스 프로퍼티를 사용하고, 

타입 프로퍼티타입만 알면 접근 가능 

 

class Fruit {
    let name = "Apple"                     // 저장 프로퍼티
    static let market = "jerry`s market"   // 저장 타입 프로퍼티

    func check() {
        print(name)
        print(Fruit.market)
    }
}

let jerry: Fruit = Fruit()
jerry.check()

// Apple
// jerry`s market