자바와 C#의 객체지향 지원
부모는 하나만 두면서, 여러 가지 약속을 지키게 하려면?
자바
기본 타입만 빼고 모두 객체
자바에서는 int 같은 기본 타입(primitive type)만 빼고 모든 데이터가 객체입니다. 객체는 모두 new로 힙에 만듭니다. 기본 타입 값은 래퍼 클래스(wrapper class)로 감싸 객체로 다룹니다.
다 쓴 객체는 가비지 컬렉터가 찾아 치우고, 그 직전에 객체의 finalize 메서드가 불립니다. 값 3은 예시입니다.
인터페이스
몸체 없는 메서드 이름만 받습니다
자바는 단일 상속만 지원합니다. 대신 인터페이스(interface)가 다중 상속의 이점 일부를 줍니다. 메서드 선언과 상수만 들어 있고, 몸체는 받는 클래스가 채웁니다.
Comparable과 compareTo(견주기)는 교재의 예이고, Circle이 받는 것은 예시입니다.
final과 동적 바인딩
자바는 기본이 동적입니다
자바는 모든 메시지를 동적으로 잇는 것이 기본입니다. 예외는 오버라이딩(덮어쓰기)할 수 없는 메서드입니다. final, static, private 메서드는 덮어쓸 자식이 없으니 정적으로 바인딩합니다.
final은 서브클래스가 오버라이딩하지 못하게 막는 표시입니다. static 메서드는 2편에서 본 클래스 메서드입니다.
자바의 중첩 클래스
안에서 밖을 볼 수 있는가
4편에서 중첩 클래스는 안팎이 서로 어디까지 보는지가 문제라고 했습니다. 자바에서 static 없이 넣은 이너 클래스(inner class)는 바깥 클래스의 멤버를 쓸 수 있고, static을 붙인 중첩 클래스는 쓸 수 없습니다.
C#의 중첩 클래스는 자바의 static 중첩 클래스처럼 동작합니다.
C#
클래스는 힙에, 구조체는 스택에
C#의 객체지향 지원은 자바와 비슷합니다. 다른 점은 클래스와 함께 구조체(struct)를 둔 것입니다. 구조체는 스택에 바로 놓이고 상속이 없는, 클래스보다 기능이 적은 타입입니다.
C#도 단일 상속만 지원합니다. 모든 클래스는 맨 위 클래스 Object에서 갈라져 나옵니다. 값 3, 4는 예시입니다.
C#의 동적 바인딩
양쪽에 표시해야 이어집니다
C#에서 호출을 동적으로 이으려면 두 곳에 표시합니다. 부모 클래스의 메서드에 virtual, 서브클래스에서 다시 정의한 메서드에 override를 붙입니다.
교재의 C# 예는 메서드 이름을 Draw라고 씁니다. 추상 메서드는 abstract로 표시하고, 모든 서브클래스가 구현해야 합니다.
다음 편