IT 책 독서록

[객체지향의 사실과 오해] 1 ~ 3장 통합 정리, 자바에선 어떻게 이걸 적용했나?

robinjoon98 2022. 2. 23. 22:36

2021.07.13 - [IT 책 독서록] - [객체지향의 사실과 오해] 1장 내용 정리

 

[객체지향의 사실과 오해] 1장 내용 정리

객체지향 시스템은 자율적인 객체간의 협력으로 이루어진다. 협력을 구성하는 각 객체들은 각각의 역할이 있고 역할은 곧 책임을 의미한다. 실세계의 커피숍을 이와같은 관점으로보면 커피를

blog.robinjoon.space

2021.07.14 - [IT 책 독서록] - [객체지향의 사실과 오해] 2장 내용 정리

 

[객체지향의 사실과 오해] 2장 내용 정리

2021.07.13 - [IT 책 독서록] - [객체지향의 사실과 오해] 1장 내용 정리 [객체지향의 사실과 오해] 1장 내용 정리 객체지향 시스템은 자율적인 객체간의 협력으로 이루어진다. 협력을 구성하는 각 객

blog.robinjoon.space

2021.07.20 - [IT 책 독서록] - [객체지향의 사실과 오해] 3장 내용정리

 

[객체지향의 사실과 오해] 3장 내용정리

2021.07.14 - [IT 책 독서록] - [객체지향의 사실과 오해] 2장 내용 정리 [객체지향의 사실과 오해] 2장 내용 정리 2021.07.13 - [IT 책 독서록] - [객체지향의 사실과 오해] 1장 내용 정리 [객체지향의 사실과

blog.robinjoon.space

개요

작년 7월에 읽다가 멈춘 이 책을 다시 펴볼 기회가 되서 다시 펴봤다. 약 반년전에 읽었을 때와, 지금 읽었을 때 중요하다고 여긴 부분이 다르면 새로 정리하려했으나 그때나 지금이나 중요하다고 생각하는 부분이 같길래 따로 정리는 안했다. 대신, 각 장의 핵심내용을 자바에서 어떻게 이 개념을 적용하고있는지 생각하여 정리해보았다.

 

1장 : 협력하는 객체들의 공동체

1장의 핵심인 

객체지향이 객체들간의 협력이라는 점, 그 과정에서 객체에는 역할이 부여되고 역할은 곧 책임을 의미한다는 것은 자바로 뭐라도 만들어봤으면 바로 이해가 갈 것이다. 여러 클래스들을 생성하고  각 클래스들은 서로에서 소로의 객체들을 만들고 메서드를 호출하여 협력하고, 각 객체는 각 객체들만의 역할(어떤 기능의 구현)이 부여되기 때문이다.

2장 : 이상한 나라의 객체

2장의 핵심인

객체는 상태와 행동으로 이루어져있으며, 객체들간의 소통은 오직 행동으로만 이루어지고 상태는 철저히 감춰진다는 것은 컬렉션 프레임워크의 여러 클래스들을 보면 알 수 있다. 아래는 컬렉션 프레임워크의 클래스간 계층도 일부이다.

우리는 코드에서 ArrayList나 LinkedList를 많이 사용한다. 하지만 단 한번도, 이들 클래스 내부에서 사용되는 필드들, 즉 상태에 직접 접근해 본적이 없을 것이다. 그러면서도 이들 을 사용하는데 전혀 문제가 없었다. 왜? 객체와 의사소통은 행동 즉 메서드로만 하니까!!! 내부에서 배열을 사용하든 연결리스트를 사용하든, 뭐 어떤 걸 사용하든 전혀 상관없다. 내가 집어넣고자 하는 객체를 add() 메서드를 통해 넣어두고, get() 메서드를 통해 꺼내올 수 만 있으면 내부 구조 즉 상태따위는 전혀 상관 없다. 이것이 자바의 캡슐화다.

3장 : 타입과 추상화

3장의 핵심인 

복잡성을 극복하기 위해 추상화를 하고 그 과정에서 공통점을 기반으로 객체를 묶기위한 그릇인 개념, 같은말로 타입이라 한다. 타입을 결정하는 것은 객체가 어떤 행동을 하는지 이고, 이 때 객체가 행동을 어떻게 하는지는 전혀 중요하지 않다 는 것은 인터페이스 특히 컬렉션 프레임워크를 보면 알 수 있다. 

 

컬렉션 프레임워크의 List 인터페이스엔 add(), get() 등의 메서드 즉, 동작을 정의해 두었다. 이 인터페이스를 구현(implements) 하는 클래스에서 이를 알아서 어떻게 동작할지 구현하게 된다. ArrayList 에선 내부에 배열을 두고 이를 이용해 구현하였고, linkedList는 내부에 연결리스트를 두고 이를 이용해 구현하였다. 

코드에선 이 둘을 보통 이렇게 사용한다.

List<Integer> list = new ArrayList<>(); //List<Integer> list = new LinkedList<>();

list.add(1);
System.out.println(list.get());

이 코드에서 주석을 풀고 ArrayList 대신 LinkedList를 사용해도 동일하게 동작한다. 이는 둘이 같은 행동을 할 수 있음을 의미한다. 같은 행동을 할 수 있다면 같은 타입이기 때문에, 자바에선 인터페이스를 하나의 타입으로 하고, 이를 구현한 여러 객체들을 인터페이스 타입의 변수에 대입할수 있게 했다. 

 

마지막으로 추상화의 두가지 차원을 이야기하며 포스팅을 마치겠다.

  • 구체적인 사물들간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것.
  • 중요한 부분을 강조하기위해 불필요한 세부사항을 제거함으로써 단순하게 만드는 것. 

자바의 ArrayList와 LinkedList의 관계는 첫번째 차원의 예시(둘 다 List 타입으로 사용할 수 있다)이고,

List와 ArrayList 의 관계는 두번째 차원의 예시(일판화/특수화)이다.