궁금한 내용을 검색해보세요!
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
서근 개발노트
티스토리에 팔로잉
SWIFT/Grammar

Swift : 기초문법 [메서드 #3 타입 메서드]

서근
QUOTE THE DAY

-
Written by SeogunSEOGUN

반응형

본 게시글은 yagom님과Zedd0202님의 게시글을 참고하여 작성되었습니다.

 

타입 메서드 Type Methods

타입 메서드는 타입 프로퍼티에서 알아봤던 것처럼 static 키워드를 사용한다. 메서드는 특정 타입의 인스턴스에 호출되는 메서드이고, 타입 자체에서 호출되는 메서드를 정의할 수 있다. 이런 종류의 메서드를 타입 메서드라고 한다.

 

인스턴스 메서드와 동일하게 func 키워드를 사용하며, 이 앞에 static 키워드를 작성하여 타입 메서드를 나타낸다.

 

타입 프로퍼티와 마찬가지로 클래스는 class 키워드를 사용하여 하위 클래스가 슈퍼클래스의 해당 메서드 구현을 override(재정의)할 수 있도록 할 수 있다.

 

타입 메서드는 인스턴스 메서드처럼 . 구문으로 호출되지만, 인스턴스로 메서드를 호출하는 것이 아닌 타입으로 호출한다.

class AClass {
   static func firstTypeMethod() {
   
   }
   
   class func secondTypeMethod() {
   
   }
}

//AClass의 인스턴스를 생성하지 않고 바로 타입을 통해 메서드 호출 가능
AClass.firstTypeMethod() 
AClass.secondTypeMethod()

주의할점은 static로 정의하면 상속 후 메서드 재정의가 불가능하고 class로 정의하면 상속 후 메서드 재정의가 가능하다는 점이다. 

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

class BClass: AClass {
  override static func staticTypeMethod() {
     // error 재정의가 불가함
  }
  
  override class func classTypeMethod() {
    print("BClass classTypeMethod")
}

//AClass의 인스턴스를 생성하지 않고 바로 타입을 통해 메서드 호출 가능
AClass.staticTypeMethod() //AClass staticTypeMethod
AClass.classTypeMethod()  //AClass classTypeMethod
BClass.classTypeMethod()  //BClass classTypeMethod
class Person {
    var age: Int = 10
    var height: Double = 130.5
    
     func display() {
        print("나이: \(age)살, 신장: \(height)")
    }
    
    class func classTypeMethod() {  //override 재정의 가능
        print("classTypeMethod")
    }
    
    static func staticTypeMethod() { //override 재정의 불가능
        print("staticTypeMethod")
    }
}

var Seogun: Person = Person()
Seogun.display()
//Seogun.classTypeMethod는 Seogun이 인스턴스이기 때문에 아무키워드가 없는 func 메서드만 가능하다

Person.classTypeMethod()
Person.staticTypeMethod()

타입 메서드는 인스턴스 메서드와 달리 self 프로퍼티는 해당 타입의 인스턴스가 아닌, 타입 '자체'를 참조한다.

 

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

타입 메서드에서의 self  ➜ 타입을 가리킴

struct SystemVolume {
    //타입 프로퍼티를 사용하면 언제나 유일한 값이 된다.
    static var volume: Int = 3
    
    //타입 메서드
    static func mute() {
        self.volume = 0  //self는 SystemVolume.Type을 의미함
                         //SystemVolume.volume = 0 과 같은 표현
    }
}

class Navigation {
    var volume: Int = 3
    
    func guideWay() {
        SystemVolume.mute()
    }
    
    func finishGuideWay() {
        SystemVolume.volume = self.volume //self는 Navigation의 volume을 의미함
    }
}

SystemVolume.volume = 5

let myNavigation: Navigation = Navigation()

myNavigation.guideWay()
print("시스템 음량 : \(SystemVolume.volume)") //시스템 음량 : 0

myNavigation.finishGuideWay()
print("시스템 음량 : \(SystemVolume.volume)") //시스템 음량 : 3

 

 

읽어주셔서 감사합니다 🤟

 

 

 


잘못된 내용이 있으면 언제든 피드백 부탁드립니다.


서근


위처럼 이미지 와 함께 댓글을 작성할 수 있습니다.