인스턴스 메서드와 타입 메서드

Zeto·2022년 3월 9일
0

Swift_Study

목록 보기
5/18
post-custom-banner

객체 내에서 선언된 함수를 의미하는 메서드 (Method)

func라는 키워드로 시작하면서 우리에게 매우 친숙한 함수는 Class나 Struct, Enum과 같은 객체 내에서 선언될 경우 함수가 아닌, 메서드(Method)라는 이름으로 불리게 된다. 마치 정찬성이 UFC에서는 '코리안좀비'라고 주로 불리는 것과 같다고 할까?

여튼 이렇게 객체 내의 함수라 쓰고 메서드라고 읽는 요녀석은 희한하게도 인스턴스 메서드(Instance Method)와 타입 메서드(Type Method)로 분류된다. 이처럼 단순히 용어만 들어서는 쉽게 이해가 되지 않을 테지만 아래의 예시들과 같이 보면 바로 이해가 될 거라 생각된다.

# 인스턴스 메서드(Instance Method)

class Number{
	private var number = 0
    
    func increament(){
    	number += 1
    }
    
    func showNumber() -> Int{
		return number
    }
}

let number = Number()
number.increament()	// 1
let value = number.showNumber	// 1

위의 예시와 같이 우리가 일반적으로 Class나 Struct 같은 객체의 인스턴스를 생성한 뒤, 내부에 정의된 메서드를 호출하는 경우가 잦은데 이렇게 인스턴스를 생성하고 나서야 호출이 가능한 메서드를 인스턴스 메서드라고 부른다.

즉, 위의 코드에서 Number 내의 increment()나 showNumber() 같은 메서드들은 인스턴스 생성 전까지는 어떤 방법으로도 호출이 불가능하며, number 상수에 할당한 것처럼 Number의 인스턴스가 생성이 되어야 호출이 가능하다.

# 타입 메서드(Type Method)

class Number{
	........
    
    static func randomNumber() -> Int{
    	return Int.random(in: 1...10)
    }
}

let randomNumber = Number.randomNumber()

이쯤되면 타입 메서드는 어떤 녀석인지 감이 와야겠죠? 바로 앞에서 설명한 인스턴스 메서드와 정반대의 메서드로서 굳이 인스턴스를 생성하지 않더라도 "타입명.메서드명"을 통해 호출이 가능한 메서드를 의미한다.

즉, 객체 자체에서 호출이 가능하며 타입 프로퍼티와 작동이 동일하다는 것을 알 수 있다. 다만 타입 메서드는 인스턴스 생성 없이 호출이 가능한 메서드이다보니, 해당 객체 내의 프로퍼티를 활용하지 못 한다는 것은 항상 염두에 두고 작성할 필요가 있다.

static? class? 뭐 써야 되는데??

타입 메서드를 사용하다보면 우리가 자주 접하는 static 키워드 외에 class라는 키워드도 존재하는 것을 알 수 있는데, 대체 왜 타입 메서드를 사용할 수 있는 키워드는 두 개나 있을까?

값 타입에서는 타입 메서드를 위한 키워드는 static 밖에 없으며, class를 사용할 수 있는 곳은 키워드 철자 그대로 Class, 즉 참조 타입에서 뿐이다. 이는 Class가 가지고 있는 '상속'이라는 특성에서 기인되었으며, 메서드 오버라이딩 여부를 판단하기 위해 키워드를 두 가지로 나누게 된 것이다.

class Animal{
	static func numberOfLegs(){ }
    class func sex(){ }
}

class Human: Animal{
	override static func numberOfLegs() { }
    // 오버라이딩 비허용이므로 에러 발생
    override class func sex() { }
    // 오버라이딩을 허용
}

위의 예시와 같이 상속 시, static으로 작성한 타입 메서드는 오버라이딩이 불가하니 오버라이딩이 필요한 타입 메서드를 작성하고 싶을 때에는 class 키워드를 활용하면 되겠다.

# 프로퍼티 접근 범위

번외 겸, 가볍게 인스턴스 메서드와 타입 메서드의 내부 멤버 접근 범위를 정리하고자 한다.

인스턴스 메서드는 위에서 말한 대로 인스턴스를 생성한 뒤에 사용할 수 있는 메서드이므로 모든 초기화가 완료된 상태의 일반적인 저장/연산 프로퍼티에 접근이 가능하다. 물론 타입 프로퍼티도 타입을 알고 있다는 전제 하에 접근이 가능하므로, 결국 모든 프로퍼티 종류라도 접근이 가능하다는 의미를 가진다.

다만 이와 다르게 타입 메서드는 초기화 전에도 메서드를 호출할 수 있기 때문에 일반적인 저장/연산 프로퍼티에 접근은 불가하고 오로지 타입 프로퍼티에만 접근이 가능하다.

profile
중2병도 iOS가 하고싶어
post-custom-banner

0개의 댓글