3장에선 객체 지향의 4대 특성에 대해 배웠다.
캡슐화(Encapsulation) : 정보 은닉
상속(Inheritance) : 재사용
추상화(Abstraction) : 모델링
다형성(Polymorphism) : 사용 편의
4대 특성에 대해 알기 위해선 먼저 클래스와 객체에 대해 먼저 알아야 한다.
객체 : 세상에 존재하는 유일 무이한 사물
클래스 : 분류, 집합 같은 속성과 기능을 가진 객체를 총칭하는 개념
ex) 클라스 : 객체 = 물고기 : 고등어 = 과일 : 귤
추상화란 구체적인 것을 분해해서 관심 영역(애플리케이션 경계)에 있는 특성만 가지고 재조합하는 것 = 모델링
즉, 모델링은 실제 사물을 정확히 복제하는 것이 아닌 필요한 특성만을 추출해서 표현하여 단순하게 묘사하는 것이다.
실습에 들어가기 앞서 애플리케이션 경계를 설정해야한다. 새들의 종류 관리 프로그램을 만든다고 가정해 보자. 클래스 설게를 위해 해당 클래스의 객체로부터 공통 특성을 뽑아내야 한다. 가장 흔한 새인 비둘기와 참새를 가지고 시작해 보자.
[그림 1] 새 객체의 특성
이제 추상화를 통해 애플리케이션 경계 내에서 관심 있는 특성들만 뽑아내면 된다. 간단하게 종류, 서식지, 날개수, 그리고 날다()를 뽑아내서 모델을 만들어 보자.
[그림 2] 새 클래스의 논리적 / 물리적 설게
논리적 설계는 개발 환경(언어 등)에 영향을 받지 않는 설계이며, 물리적 설계는 개발 환경에 맞춰진 설계이다. 위 클래스 다이어그램을 자바 코드로 변환하면 그림3 과 같다.
[그림 3] Bird.java
이제 Bird 클래스를 가지고 객체를 생성해 보고 객체의 특성을 활용해 볼 수 있도록 main() 메서드를 가진 별도의 테스트용 클래스를 만들어 보자.
[그림 4] BirdDriver.java
BirdDriver.main() 메서드가 시작점이니 12번째 줄 직전의 메모리 스냅샷을 그려보면 그림5와 같다.
[그림 5] 12번째 줄을 실행한 후 메모리
String도 객체이지만 내용을 이해하기 위해서 단순화 하였다. 6번째 줄에 Bird pigeon에 의해 Bird 타입의 객체를 참조할 수 있는 객체 참조 변수 pigeon이 main() 메서드 스택 프레임 안에 생성된다. 객체 참조 변수가 Bird 객체의 주소(포인터)를 갖고 있다는 것은 화살표로 표현 하였다. 그림6은 디버깅을 통해 확인해본 결과이다.
[그림 6] 12번째 줄을 실행한 후 디버깅 결과
14번째 줄에서 객체 참조 변수 pigeon에 null을 할당하고 있다.
[그림 7] 14번째 줄을 실행한 후 메모리
때문에 객체 참조 변수 pigeon은 더 이상 힙 영역에 존재하는 Bird 객체를 참조하지 않는다. 이렇게 아무도 참조해 주지 않는 Bird 객체는 가비지 컬렉터(Garbage Collector)가 쓰레기로 인지하고 수거해 간다. 가비지 컬렉터가 Bird 객체를 수거해 갔다고 가정하고 22번째 줄을 실행한 후 메모리를 살펴보자.
[그림 8] 22번째 줄을 실행한 후 메모리
16번째 줄이 실행되면 이전과 같은 과정을 거쳐서 새로운 Bird 객체가 생성되고 객체 참조 변수 sparrow에 그 주소값이 할당된다. 이후 main() 메서드 스택 프레임을 종료하는 중괄호를 만나면 프로그램은 완전히 종료된다. 그림9는 디버깅을 통해 확인해본 결과이다.
[그림 9] 22번째 줄을 실행한 후 디버깅 결과