[iOS / Swift] Swift 문법을 알아보자! - 20편 : 인스턴스 메소드와 타입 메소드

프린스송·2021년 7월 18일
2

Swift 문법

목록 보기
20/21
post-thumbnail

안녕하세요~~ 오늘은 인스턴스 메소드와 타입 메소드에 대해서 공부를 해보겠습니다!! 메소드는 함수이지만 클래스, 구조체나 열거형 등 객체 안에 있는 함수를 말하는 것을 다들 아시죠??ㅎㅎ 이러한 메소드들 중에도 크게 두가지로 나누게 됩니다. 그럼 이 두가지의 메소드에 대해 자세히 알아보죠.


인스턴스 메소드

애플 공식 문서에서는 인스턴스 메소드를 다음과 같이 정의합니다. "인스턴스 메서드는 특정 클래스, 구조 또는 열거형 인스턴스에 속하는 함수입니다. 인스턴스 속성에 액세스하고 수정하는 방법을 제공하거나 인스턴스의 용도와 관련된 기능을 제공하여 이러한 인스턴스의 기능을 지원합니다."

조금은 어려운 말로 설명을 해놨지만 쉽게 풀어 쓰자면 인스턴스 메소드는 인스턴스 생성을 한 후 해당 인스턴스가 메소드를 호출할 수 있는 메소드이다. 따라서 일반적으로 이때까지 우리가 만들었던 메소드를 칭하는 것이고 함수와 똑같은 형태를 가지게 됩니다.

인스턴스 메소드 : 인스턴스를 생성한 후 호출할 수 있는 메소드

간단한 예를 살펴보겠습니다.

class Counter {
    var count = 0
    
    func increment() {
        count += 1
    }
}

var counter = Counter()
counter.increment()
print(counter.count)

다음과 같은 간단한 클래스를 생성했습니다. count프로퍼티와 increment()메소드를 각각 생성하고 counter변수를 인스턴스로 만들어 주었습니다. 그리고 .을 이용하여 increment() 메소드에 접근을 해주었습니다. 바로 이것이 인스턴스 메소드입니다.


타입 메소드

그렇다면 타입 메소드는 무엇일까요?
애플 공식 문서에서는 타입 메소드를 다음과 같이 정의합니다. 인스턴스 메소드와는 다르게 타입 자체에서 호출되는 메서드를 정의할 수도 있습니다. 이러한 종류의 방법을 타입 메소드라고 합니다 즉! 인스턴스를 생성하지 않고도 타입 자체에서 메소드를 호출할 수 있는 메소드입니다!

타입 메소드는 인스턴스 메소드와는 다른 형태를 띄고 있습니다. 메소드 앞에 static이나 class의 키워드가 붙는다는 특징이 있죠.

타입 메소드 : 인스턴스를 생성 없이 타입 자체에서 호출할 수 있는 메소드

class 키워드

이번에도 간단한 코드를 작성해보겠습니다. 아래 코드는 class키워드를 이용하여 타입 메소드를 생성해 주었습니다.

class Print {
    
    class func printMessage() {
        print("Hello!!")
    }
}

Print.printMessage()

이번에는 Print라는 클래스를 만들고 안에 class키워드를 이용하여 타입 메소드 printMessage()를 만들어 주었습니다. 이 printMessage()메소드는 타입 메소드이므로 따로 인스턴스를 생성해줄 필요 없이 타입 자체에서 호출을 할 수 있습니다.
클래스에서는 상속이 가능하지만 구조체나 열거형에서는 상속이 불가능하여 class 메소드를 선언할 수 없습니다. 오직 static 키워드만 사용할 수 있다는 점!!

static 키워드

타입 메소드를 생성할 때는 class 키워드 말고도 static 키워드를 사용하여 선언을 할 수 있습니다. 이 둘의 가장 큰 차이점은 오버라이드(override)가 가능하냐 불가능하냐의 차이점이라고 합니다.

  • static 메소드 : 서브클래스에서 오버라이드를 할 수 없음
  • class 메소드 : 서브클래스에서 오버라이드가 가능

위에서 만들었던 코드에 조금더 더하여 static키워드에 대해 알아보겠습니다.

class Print {
    
    static func printMessage() {
        print("Hello!!")
    }
}

Print.printMessage()

위의 코드는 기존 코드에서 static만 변경을 해주었습니다. 이렇게 실행을 해본다면 실행 결과에는 별 차이가 없는 것을 확인할 수 있습니다. 하지만 오버라이딩의 가능과 불가능에 차이가 있으므로 하나의 클래스를 더 만들어 상속을 받는 형태로 만들어보겠습니다.

class Print {

    static func printMessage() {
        print("Hello!!")
    }
}

class Print2:Print {
    
    override class func printMessage() {
        print("Hello I'm Song!")
    }
}

Print2.printMessage()

Print를 상속받는 Print2클래스를 하나 만들었습니다. 이 클래스는 printMessage() 메소드를 오버라이딩하고 있습니다. 하지만 위의 코드는 static으로 타입 메소드를 선언하였으므로 에러가 납니다! static키워드는 오버라이딩을 할 수 없게 때문에!!
그렇다면 static을 다시 class로 바꾸어준다면 해결을 할 수 있을 것 같습니다.
실행이 잘 되는 것을 확인할 수 있네요! 하나의 더 중요한 점은 클래스에서는 상속이 가능하지만 구조체나 열거형에서는 상속이 불가능하여 class 메소드를 선언할 수 없습니다. 오직 static 키워드만 사용할 수 있다는 점!!


오늘은 인스턴스 메소드와 타입 메소드에 대해서 공부를 해보았습니다. 만약 공부를 하지 않았더라면 계속 몰랐었던 단어들이었을 것 같습니다. 그럼 오늘도 수고 많으셨습니다!

profile
[iOS / Swift] [React Native]

0개의 댓글