연산자 오버로딩, init

나이든별 / Oldstar·2022년 4월 29일
0

Think about Keywords

목록 보기
10/37

공부한 것

  • 연산자 오버로딩
  • init

고민한 점

  • 오버로딩이라는 용어 자체를 몰랐다. 오버라이딩이랑 헷갈렸고.
  • 오버로딩이란, 동일한 이름이지만 매개변수가 다른 함수나 메소드를 추가로 정의하는 것이다.
  • 내가 썼던 코드에서 발췌해보자면..
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 메서드는 상속이 불가능하니까.
profile
함께 나아가고자 하는 사람

0개의 댓글