Chapter 3

자바와 객체 지향

  • 3.1 객체 지향은 인간 지향이다
  • 3.2 클래스 vs 객체
  • 3.3 캡슐화
  • 3.4 상속
  • 3.5 추상화
  • 3.6 다형성
  • 3.7 static 멤버 vs 인스턴스 멤버
  • 3.8 참조 변수의 복사

객체 지향의 4대 특성 — 캡슐화, 상속, 추상화, 다형성 — 을 그냥 외우면 아무 쓸모없어. 이걸 메모리에서 무슨 일이 벌어지는지와 연결해야 진짜 이해가 돼.

사람은 세상을 순서가 아니라 사물 단위로 인식하잖아. 자동차, 사람, 건물 — 각각의 속성과 행위로 세상을 파악하지. 객체 지향은 이 사고방식을 코드에 반영한 거야. 클래스는 "쥐는 이름이 있고 찍찍 소리를 낸다"는 분류 체계고, 객체는 그 설계도로 찍어낸 실체야. 메모리로 보면 클래스 정보는 스태틱 영역에, 객체 데이터는 힙에, 참조 변수는 스택에 산다.

캡슐화는 내부 구현을 숨기고 인터페이스만 노출하는 거야. ageprivate으로 막고 setAge()를 통해서만 접근하게 하면, 음수 체크 같은 검증을 끼워넣을 수 있지. 내부가 바뀌어도 외부 코드를 수정할 필요가 없어지는 게 핵심이야.

상속에서 저자가 강하게 주장하는 게 있어 — "상속은 재사용이 아니라 분류다." 고래 is-a 포유류처럼 is-a 관계가 성립해야 올바른 상속이야. 코드 재사용 목적으로 is-a가 안 되는 걸 상속시키면 나중에 반드시 문제가 생겨. 메모리에서 보면 new 고래()를 하면 힙에 고래 객체가 만들어지면서 상위 클래스인 포유류, 동물의 변수 공간까지 함께 확보돼.

추상화는 프로그램 목적에 맞는 속성과 행위만 뽑아내는 거야. 같은 "쥐"라도 게임이면 위치와 이동이 중요하고, 동물병원이면 체중과 진료기록이 중요하잖아. 뭘 추상화할지는 컨텍스트가 결정해.

그리고 다형성 — 객체 지향의 꽃이야. Animal animal = new Dog()에서 animal.cry()를 호출하면 실행 시점에 실제 객체 타입을 보고 Dog의 cry()가 실행돼. 상위 타입으로 프로그래밍하면 새로운 하위 타입이 추가되어도 기존 코드를 안 건드려도 되거든. 이게 나중에 OCP로 이어지지.

마지막으로 참조 변수 복사를 알아야 해. Mouse jerry = mickey를 하면 주소가 복사돼서 둘이 힙의 같은 객체를 가리키게 돼. 한쪽에서 수정하면 다른 쪽에도 반영되는 거야. 자바는 항상 Call by Value인데, 참조 변수의 경우 복사되는 "값"이 주소값이라 Call by Reference처럼 보이는 것뿐이야.


정리

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

  1. 클래스는 분류(설계도), 객체는 실체(인스턴스). 클래스는 스태틱 영역, 객체는 힙 영역에 산다
  2. 캡상추다 — 캡슐화(정보 은닉), 상속(is-a 분류), 추상화(공통 특성 추출), 다형성(같은 타입 다른 동작). 이 네 가지가 객체 지향의 기둥
  3. 상속은 재사용이 아니라 분류다. "하위 is-a 상위"가 성립해야 올바른 상속이다
  4. 참조 변수를 복사하면 주소가 복사된다. 같은 객체를 가리키게 되니까, 한쪽 수정이 다른 쪽에 영향을 준다