swift-9 메서드

영점·2022년 10월 5일
0

Swift_Study

목록 보기
9/12

스터디를 진행하며 처음부터 다시 Swift를 공부하고 있습니다.
오늘 작성할 파트는 메서드 입니다.

swift.org에 프로퍼티 다음인 카테고리입니다.
프로퍼티 개념과 연계되므로 프로퍼티를 먼저 배우고 아는걸 추천합니다.
( 그래야 이해가 빨리 되더라구요 )

메서드의 개념을 요약해보자면 이렇다.

클래스, 구조체, 열거형 속에 포함되어 있는 "함수"

어? 설마 그건가? 하면 맞을 수도 있습니다.
아마 개발 하실 때 많이 보셨을 수도 있음!!

인스턴스 메서드

class Music {
    func kPop() {
        print("awesome")
    }
}

아무런 수식어 없이 func으로 시작하는 메서드는 모두 인스턴스 메서드라고 한다.

해당 예제에서는 kPop 함수가 인스턴스 메서드인 것이다.

let listen : Music = .init()
listen.kPop()

호출은 이렇게 인스턴스를 생성한 다음 .을 이용하여 호출한다.

( 저장 프로퍼티때의 호출이랑 같은 방식! )

인스턴스 메서드는 인스턴스를 생성 하지 않으면 해당 메서드에 접근하여 값을 호출하는 것이 불가능하다.

타입 메서드

메서드의 func키워드 전에 static키워드를 작성하여 타입 메서드를 나타낸다.

클래스는 대신 class키워드를 사용하여 하위 클래스가 해당 메서드의 수퍼 클래스 구현을 재정의 할 수 있다.

class Music {
    static func kPop() {
        print("awesome")
    }
    
    class func pop() {
        print("perfect")
    }
}

따라서 kPop(), pop() 모두 타입메서드이다.

Music.kPop() //awesome
Music.pop() //perfect

인스턴스 메서드와 다르게 타입메서드는 Music이라는 타입에만 연관되어 있으므로 이렇게 호출한다.

따라서 타입 메서드는 해당 메서드가 속해 있는 타입만 알면 호출이 가능하다.

+) 한 class에 저장 프로퍼티와 저장 타입 프로퍼티가 같이 있을 경우 각 메서드의 멤버 접근 범위?

해당 개념은 위의 인스턴스 메서드와 타입 메서드의 호출방식을 이해했다면 이해하기 쉽다.

먼저 저장 프로퍼티와 저장 타입 프로퍼티를 생성한다.

class Music {
    let kPop : String = "Awesome"
    static let pops : String = "Perfect"
}

1️⃣ 타입 메서드에서는 타입 멤버만 사용 가능하고, 같은 타입 멤버는 타입 이름 없이 접근 가능

class Music {
    let kPop : String = "Awesome"
    static let pops : String = "Perfect"
    
    static func Player() {
        print(kPop) //Instance member 'kPop' cannot be used on type 'Music'
        print(pops)
    }
}

저장 프로퍼티인 kPop은 인스턴스 멤버이기 때문에 호출할 때 인스턴스를 선언하고 호출해야 한다.
하지만 예시에서는 그렇게 하지 않고 저장 타입 프로퍼티처럼 타입 이름 없이 접근을 해버려서 에러가 난 것.

class Music {
    let kPop : String = "Awesome"
    static let pops : String = "Perfect"
    
    static func Player() {
        let asd : Music = .init()
        print(asd.kPop)
        print(pops)
    }
}

print(Music.Player())
/*
Awesome
Perfect
()
*/

→ 인스턴스를 선언하고 호출하면 에러가 사라지긴 하나, 이럴거면 2번 방법 사용하는게.. 더 나을것 같다.

결론적으로 타입 메서드는 "인스턴스를 선언할 필요 없는" 메서드 이기 때문에, 자기랑 똑같이 "인스턴스를 생성할 필요 없는" 타입 프로퍼티의 경우, "같은 타입에 한해 타입 이름 없이도 접근"이 가능하지만, 인스턴스가 생성 되어야만 저장 공간을 갖는 인스턴스 멤버(프로퍼티, 메서드)엔 접근할 수 없는 것이다.

2️⃣ 인스턴스 메서드에서는 인스턴스 멤버를 사용할 수 있고, 타입 멤버도 타입만 알면 접근 가능

class Music {
    let kPop : String = "Awesome"
    static let pops : String = "Perfect"
    
    func Player() {
        print(kPop)
        print(Music.pops)
    }
}

인스턴스 메서드에선 인스턴스 생성이 되었기 때문에 kPop에 그냥 접근이 가능하다.

인스턴스와 상관 없는 타입 멤버(프로퍼티&메서드)에 접근할 경우, 기존의 접근 방식과 마찬가지로 타입 이름을 통해서 접근할 수 있다.

static과 class

위의 타입메서드 정의에서 나온걸 조금 더 알아보자.

선언할 때 언제 static을 사용하고 언제 class를 사용할까?
바로 메소드 오버라이딩을 허용하지 않을 때 / 할 때 각각 사용한다.

static의 경우는 메소드 오버라이딩을 허용하지 않을 때 사용한다.

class Music {
    static func kPop() {
        print("awesome")
    }
}

class MusicPlayer : Music {
    override static func kPop() { //Cannot override static method
    }
}

static으로 메서드를 선언했을 때, 해당 메소드를 Subclass에서 오버라이드를 시도하면
예시처럼 에러가 나게 된다.

class의 경우에는 메소드 오버라이딩을 허용할 때 사용한다.

class Music {
    class func pop() {
        print("perfect")
    }
}

class MusicPlayer : Music {
    override class func pop() {
        
    }
}
profile
일단 배운내용은 적어두기

0개의 댓글