Chapter 4

자바가 확장한 객체 지향

  • 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인 건 상속받아서 내부를 바꿔버리면 자바 보안이 깨질 수 있으니까 아예 막아놓은 거지.

interfaceabstract와 비슷해 보이지만 관계의 성격이 달라. 추상 클래스가 is-a(~이다)라면, 인터페이스는 is-able-to(~할 수 있다)야. "새는 동물이다"면 상속, "새는 날 수 있다"면 인터페이스. 자바에서 클래스는 하나만 상속할 수 있지만 인터페이스는 여러 개 구현할 수 있거든, 능력은 여러 개 가질 수 있으니까 자연스럽지.

생성자는 객체가 태어날 때 자동으로 호출되는 메서드야. new Dog("바둑이", 3) 하면 힙에 공간이 잡히고, 생성자 스택 프레임이 생기고, 인스턴스 변수를 초기화하고, 끝나면 스택 프레임은 사라지고 힙 주소만 반환돼. 매개변수 있는 생성자를 하나라도 만들면 기본 생성자가 자동 생성 안 되니까 주의해야 해.

this는 자기 자신 객체의 참조고, super는 상위 클래스의 참조야. 생성자에서 super(name)으로 부모를 먼저 초기화하고 this.breed = breed로 자기 걸 세팅하는 패턴은 거의 모든 자바 코드에서 나와. instanceof는 객체가 특정 타입의 인스턴스인지 확인하는 연산자인데, 남발하면 다형성이 깨져. 타입 체크로 분기하는 코드가 많다는 건 오버라이딩으로 해결해야 할 문제를 instanceof로 때우고 있다는 신호야.

결국 이 키워드들은 전부 3장의 캡상추다를 자바 문법으로 옮긴 도구야. abstractinterface는 추상화, final은 캡슐화의 변경 차단, thissuper는 상속 구조에서의 탐색. 도구의 용도를 알면 언제 꺼내 쓸지가 보여.


정리

4장 읽고 기억할 거 네 가지:

  1. abstract는 "불완전하니까 상속해서 완성시켜라"는 설계 의도를 코드로 표현한다. 추상 클래스는 직접 인스턴스화할 수 없다
  2. interface는 is-able-to 관계, 추상 클래스는 is-a 관계. "~할 수 있다"면 인터페이스, "~이다"면 상속
  3. final은 변경 가능성을 차단한다. 클래스에 붙이면 상속 불가, 메서드에 붙이면 오버라이딩 불가, 변수에 붙이면 값 변경 불가
  4. this는 자기 자신, super는 상위 클래스. 생성자 체이닝에서 super()로 상위 클래스를 먼저 초기화하는 패턴을 기억하자