method

E_H·2021년 7월 4일
0

Swift

목록 보기
7/11

Method ( 메서드 )란

우선 명칭부터 정리하자면 함수와 메서드 둘 다 Func 키워드를 쓰지만

func someFunc{
//some code
}

class someClass{

    func someMethod{
    //some code    
    }

}

함수는 전역이든 지역이든 독립적인 기능을 수행하도록 하는 것이고

메서드는 클래스나 구조체, 열거형에 포함되어 사용한다면 함수가 아니라
메서드라 부른다.

음흠 이걸 메서드라 부르구나 그럼 메서드의 특징은 뭘까?

Method의 특징

Method는 우선 두 가지로 나눌 수 있다.
하나는 인스턴스 메서드(Instance Method)
다른 하나는 타입메서드(Type Method) 이다.

Instance Method

class someClass{

    func someMethod{
    //some code    
    }

}

인스턴스 메서드란 인스턴스와 관련된 메서드로
인스턴스를 생성해야만 호출이 가능하다.

위 예제 처럼 일반적으로 사용하는 메서드를 인스턴스 메서드이며
호출하기 위해선 아래 와 같이 나타낸다.

let some: someClass = someClass()
some.someMethod()

정리

일반적으로 우리가 사용하는 수식어가 없는 Func 선언을 인스턴스 메서드라 부르며 인스턴스를 생성해야만 호출할 수 있다.

Type Method

Type에 관한 메서드로 인스턴스 생성없이 Type만 알면 호출이 가능하다.
메서드 선언시 static 이나 class 키워드를 붙여 선언할 수 있다.

class SomeClass { 
	static func someTypeMethod() { 
	} 
	class func someOverridableTypeMethod() { 
	} 
} 

예제 코드와 같이 static 과 class를 붙여 선언하며

SomeClass.someTypeMethod()
SomeClass.someOverridableTypeMethod()

인스턴스 생성을 하지 않고 .(dot)을 이용해 바로 호출 할 수 있다.

Static VS Class

그렇다면 타입메서드를 선언할 때 붙이는 Static과 Class의 차이점은 무엇일까

class SomeChildClass: SomeClass {  
	override static func someTypeMethod() { 
	// compile error 
	} 
	override class func someOverridableTypeMethod() { 
	// OK 
	} 
} 

위 예제처럼 override를 할 수 있냐 아니냐의 차이가 있다.

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

class someWater {
    let name = "TamSaaSoo"                 // 저장 프로퍼티
    static let alias = "SamDasoo"   // 저장 타입 프로퍼티
    static func sayHello() {
     print(name)              // error! 
     print(alias)
    }
}

class 안에 name이라는 저장 프로퍼티와 alias라는 저장 타입 프로퍼티가 있을 때 타입 메서드안에 인스턴스 프로퍼티를 호출하려고 하면 에러가 난다.

왜 그럴까?
인스턴스가 생성되어야만 접근할 수 있는 프로퍼티이기에 접근이 불가능 한 것이고
타입 프로퍼티는 타입 메서드와 같이 애초에 인스턴스를 생성할 필요가 없기 때문에 에러가 나지 않는다.

class someWater {
    let name = "TamSaaSoo"                
    static let alias = "SamDasoo"  
    
    func sayHello() {
        print(name)            
        print(someWater.alias)
    }
}

또한 인스턴스 메서드에서 타입 프로퍼티를 호출하려면 타입 이름을 알면 접근이 가능하여 'name' 프로퍼티와 'alias' 타입 저장 프로퍼티 모두 호출이 가능하다.

출처:
https://babbab2.tistory.com/122
https://zeddios.tistory.com/233
https://stackoverflow.com/questions/24133879/what-are-the-differences-between-functions-and-methods-in-swift

0개의 댓글