공부한 것
고민한 점
- 오버로딩이라는 용어 자체를 몰랐다. 오버라이딩이랑 헷갈렸고.
- 오버로딩이란, 동일한 이름이지만 매개변수가 다른 함수나 메소드를 추가로 정의하는 것이다.
- 내가 썼던 코드에서 발췌해보자면..
struct Fruits {
private var strawberry: Int
private var banana: Int
private var kiwi: Int
init(strawberry: Int = 0, banana: Int = 0, kiwi: Int = 0) {
self.strawberry = strawberry
self.banana = banana
self.kiwi = kiwi
}
static func -=(lhs: inout Fruits, rhs: Fruits) {
lhs.strawberry -= rhs.strawberry
lhs.banana -= rhs.banana
lhs.kiwi -= rhs.kiwi
}
}
- 이처럼, 사용자 지정 타입이어서
-=
연산자를 쓰지 못했던 나의 Fruits
자료형에서 동일한 기능을 임의로 구현해주는 것이다.
- 오버로딩해준 연산자 안에 들어있는
-=
는 Int
끼리의 계산이라, 이미 구현되어 있는 것이다.
- 이 사례를 통해서도, 동일한 이름이지만 받는 매개변수가 다른 메서드를 구현하는 것이 오버로딩임을 알 수 있다.
convenience init
의 사용에 대해 고민해봤다.
- 먼저, 이 친구는 상속이 되지 않는다. 그리고 자식 클래스에서는 부모 클래스의 지정 이니셜라이저를
super.init()
을 통해 불러와야 한다.
- 그렇다면 필요한 경우에, 부모 클래스의 지정 이니셜라이저를
private init()
으로 설정하고 convenience init
을 추가해서, 클래스 내부에서는 이니셜라이징이 가능하지만 해당 클래스를 상속한 클래스에서는 이니셜라이징이 불가능하게끔 만들 수도 있지 않을까?!
- 사실 이렇게 하느니
final class
를 써서 아예 상속 불가능하게 막아 버리지.. 하는 생각도 들지만, 상속이 아예 되지 않게 하는 것과 상속은 허용하되 이니셜라이징만 막아 놓은 것은 엄연히 다른 것이므로, 나름의 쓰임새가 있을 것이다.
- 예를 들면 부모 클래스의
class
메서드만 사용하고 싶을 때라던지.. static
메서드는 상속이 불가능하니까.