진짜 개인적인 잡담이며, 관련 내용은 별개의 정리 포스팅으로 올리고 있습니다.
디자인 패턴 공부하면서 조금 충격받은게 내가 inheritance와 access modifier조차 이해를 잘못하고 있었다는 사실이다. 단순한 예로 private으로 지정한 클래스 변수는 서브클래스에서 접근이 불가능할 뿐 상속은 되는 거였는데, 상속이 안되는걸로 착각을 하고 있었다. 내 프로그래머 인생이 몽땅 야매였다는 느낌을 받았다.
private variable 또는 backing field를 서브클래스에서 어떻게 접근하나 싶었는데, 부모 클래스에서는 모든 메소드에서 접근 가능하므로 public 또는 protected 메소드를 통해 접근 가능하다.
property또한 abstract로 지정하면 서브클래스에서 override 가능하다.
두번째는 abstract와 override의 사용이다. C#을 보면서 override를 굳이 지정해줘야 하나 생각했는데, Kotlin에서도 쓰이는 키워드였다. C#에서 더이상 override못하게 하는 키워드로 ‘new’를 쓰는걸 보면서 키워드를 헷갈리게 만든건 둘 째치고 이게 굳이 필요한가 싶었는데, Kotlin에서도 똑같이 대응하는 ‘final’이란 키워드가 있었다.
Interface를 상속하는 경우, Kotlin은 메소드 정의에 override키워드를 써줘야 한다. 반면, C#은 사용하지 않는다.
C#은 abstract, virtual, override로 명시된 부모 메소드만 override가능하다. 반면, Kotlin에는 virtual이 없다. abstract, override가 붙은 메소드는 동일하게 override가 가능하지만, 그렇지 않은경우 기본값으로 final이 붙어있기 때문에, 서브클래스에서 override하려면 open 키워드를 붙여줘야한다.
C#의 abstract와 virtual의 차이는 abstract는 body를 가질 수 없고, virtual은 가질 수 있다. abstract는 Kotlin에서도 body를 가질 수 없다. 또한 C#, Kotlin동일하게 class도 abstract여야 한다.