Swift - Struct / Class (2_메서드)

이한솔·2023년 8월 7일
0

Swift 문법 🍎

목록 보기
14/32

메서드

구조체나 클래스 내에서 정의된 함수, 특정 타입의 객체 내부에서 사용하는 함수
함수는 독립적인 기능 구현을 위해 만들어지지만, 메서드는 하나의 객체 내에 정의된 다른 메서드들과 서로 협력하여 함수적 기능을 수행한다.



인스턴스 메서드

클래스, 구조체 또는 열거형과 같은 객체 타입이 만들어내는 인스턴스에 소속된 함수

class Person {
    var name: String?
    
     init(name: String) {
        self.name = name
    }
    
      func greeting() {
        print("\(name), Hi")
    }    
}

let p = Person(name: "Hansol")
p.greeting() // 출력값: Hansol, Hi


타입 메서드

형식(Type)에 연관된 메서드로, 인스턴스 생성 없이 형식(Type) 이름만 알면 호출이 가능하다. 메서드 선언 시 func 키워드 앞에 static이나 class를 붙이면 된다.

static: 자식 클래스에서 재정의 불가능, 구조체는 상속이 불가능하므로 static 키워드만 사용해서 타입 프로퍼티 및 메서드 정의
class: 자식 클래스에서 재정의(override) 가능

class Person {
    var name: String?
    
    init(name: String) {
        self.name = name
    }
    
    func greeting() {
        print("\(name), Hi")
    }
    
    class func sayHi() {
        print("Hi")
    }
    
    static func sayBye() {
        print("Bye")
    }
}

Person.sayHi() // 출력값: Hi


// class 키워드 타입 메서드 오버라이딩 가능
class Person2: Person {
    
    override class func sayHi() {
        print("Hi!")
    }
    
}

// static 키워드 타입 메서드 오버라이딩 불가능
class Person3: Person {
    
    override static func sayBye() {
        print("Bye!") // Error: Cannot override static method
    }
    
}


타입 메서드와 인스턴스 메서드의 멤버 접근 범위

  1. 타입 메서드에서는 타입 멤버(프로퍼티&메서드)만 사용 가능하고, 같은 타입 멤버는 타입 이름 없이 접근 가능하다.
class Person {
    var name: String?          
    static var name2 = "sol"
    
    init(name: String) {
        self.name = name
    }
    
    static func sayHello() {
        print(name) // Error: 타입 메서드는 인스턴스 프로퍼티는 사용 불가능하다.
        print(name2)
    }
}

💡 이유는?
타입 메서드는 인스턴스를 선언할 필요 없는 메서드이기 때문에
똑같이 인스턴스를 생성할 필요 없는 타입 프로퍼티의 경우 같은 타입에 한해 타입 이름 없이도 접근이 가능하지만, 일반 저장 프로퍼티인 name과 같은 인스턴스가 생성 되어야만 저장 공간을 갖는 인스턴스 멤버엔 접근할 수 없다.


  1. 인스턴스 메서드에서는 인스턴스 멤버(프로퍼티&메서드)를 사용할 수 있고, 타입 멤버도 타입만 알면 접근 가능하다.
class Person {
    var name: String?          
    static var name2 = "sol"
    
    init(name: String) {
        self.name = name
    }
    
    func sayHello() {
         print(name)            
         print(Person.name2)
     }
     
 }

💡 이유는?
인스턴스를 생성해야만 접근할 수 있는 인스턴스 메서드에선
인스턴스가 생성 됐으니 인스턴스 멤버인 name도 메모리에 올라가기 때문에 접근 가능하고 인스턴스와 상관 없는 타입 멤버에 접근 시, 기존 방식과 같이 타입 이름을 통해서 접근할 수 있다.

3개의 댓글

comment-user-thumbnail
2023년 8월 7일

깔끔한 정리 감사합니다

답글 달기
comment-user-thumbnail
2023년 8월 7일

예시가 있어 이해하기 쉬운것 같습니다.

답글 달기
comment-user-thumbnail
2023년 8월 7일

정리 감사합니다 :)

답글 달기