자바가 확장한 객체 지향
- 4.1 abstract 키워드
- 4.2 생성자
- 4.3 static 블록
- 4.4 final 키워드
- 4.5 instanceof 연산자
- 4.6 interface와 implements
- 4.7 this 키워드
- 4.8 super 키워드
자바의 키워드들은 각각 객체 지향의 어떤 개념을 코드로 표현하기 위해 존재해. 문법을 외우는 게 아니라, 3장의 원리가 어떤 키워드로 구현되는지를 연결하는 게 핵심이야.
abstract는 "이 클래스는 불완전하니까 상속해서 완성시켜라"는 설계 의도를 표현해. abstract void cry()라고 선언하면 "동물은 울긴 우는데, 어떻게 우는지는 하위 클래스가 정해라"는 뜻이야. 추상 클래스는 직접 new로 못 만들어 — 불완전한 걸 실체화하면 안 되니까. 반대편에 있는 게 final이야. 클래스에 붙이면 상속 불가, 메서드에 붙이면 오버라이딩 불가, 변수에 붙이면 값 변경 불가. String 클래스가 final인 건 상속받아서 내부를 바꿔버리면 자바 보안이 깨질 수 있으니까 아예 막아놓은 거지.
interface는 abstract와 비슷해 보이지만 관계의 성격이 달라. 추상 클래스가 is-a(~이다)라면, 인터페이스는 is-able-to(~할 수 있다)야. "새는 동물이다"면 상속, "새는 날 수 있다"면 인터페이스. 자바에서 클래스는 하나만 상속할 수 있지만 인터페이스는 여러 개 구현할 수 있거든, 능력은 여러 개 가질 수 있으니까 자연스럽지.
생성자는 객체가 태어날 때 자동으로 호출되는 메서드야. new Dog("바둑이", 3) 하면 힙에 공간이 잡히고, 생성자 스택 프레임이 생기고, 인스턴스 변수를 초기화하고, 끝나면 스택 프레임은 사라지고 힙 주소만 반환돼. 매개변수 있는 생성자를 하나라도 만들면 기본 생성자가 자동 생성 안 되니까 주의해야 해.
this는 자기 자신 객체의 참조고, super는 상위 클래스의 참조야. 생성자에서 super(name)으로 부모를 먼저 초기화하고 this.breed = breed로 자기 걸 세팅하는 패턴은 거의 모든 자바 코드에서 나와. instanceof는 객체가 특정 타입의 인스턴스인지 확인하는 연산자인데, 남발하면 다형성이 깨져. 타입 체크로 분기하는 코드가 많다는 건 오버라이딩으로 해결해야 할 문제를 instanceof로 때우고 있다는 신호야.
결국 이 키워드들은 전부 3장의 캡상추다를 자바 문법으로 옮긴 도구야. abstract와 interface는 추상화, final은 캡슐화의 변경 차단, this와 super는 상속 구조에서의 탐색. 도구의 용도를 알면 언제 꺼내 쓸지가 보여.
정리
4장 읽고 기억할 거 네 가지:
abstract는 "불완전하니까 상속해서 완성시켜라"는 설계 의도를 코드로 표현한다. 추상 클래스는 직접 인스턴스화할 수 없다interface는 is-able-to 관계, 추상 클래스는 is-a 관계. "~할 수 있다"면 인터페이스, "~이다"면 상속final은 변경 가능성을 차단한다. 클래스에 붙이면 상속 불가, 메서드에 붙이면 오버라이딩 불가, 변수에 붙이면 값 변경 불가this는 자기 자신,super는 상위 클래스. 생성자 체이닝에서super()로 상위 클래스를 먼저 초기화하는 패턴을 기억하자