"객체지향이란 무엇인가?"라는 질문에 뭐라고 답할 것인가?
"실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임"입니다. 객체지향 프로그래밍이란 실제로 존재하는 사물을 최대한 유사하게 모방해 소프트웨어 내부로 옮겨오는 작업이기 때문에, 객체지향 소프트웨어는 실세계의 투영이며, 객체란 현실 세계에 존재하는 사물에 대한 추상화입니다. 이러한 관점을 잘못됐고, 정작 실세계의 모방이라는 개념이 저도 납득이 잘 가지 않았습니다. 왜냐하면 예시를 들어 붕어빵을 제조하는 과정을 객체지향에 빗대어 설명하는데, 저희가 애플리케이션을 개발할 때 붕어빵을 만들진 않기 때문입니다. 그냥 객체지향을 쉽게 이해하기 위한 방안입니다.
또한 객체지향의 목표는 실세계의 모방이 아닌, 실세계의 창조입니다. 시대가 계속 바뀌면서, 사용자들은 더 나은 서비스를 이용하려고 할 것입니다. 그래서 더 나은 서비스를 만들기 위해 "객체지향"이란 단어에 "창조"라는 단어를 적용하는 것입니다. 하지만, 객체지향을 이해하는 데 있어서는 "창조"가 아닌 "모방"의 관점에서 바라보면 더욱 이해하기 쉽기에, 이 책에서는 "모방"의 관점에서 1장을 이해하는데 포커스를 두었습니다.
객체들이 어떻게 상호작용할지에 대한 관점을 역할, 책임, 협력의 관점에서 바라볼려고 합니다. "객체지향의 사실과 오해"라는 책을 읽으면서 얻은 깨달음과 저의 생각을 기록하면서 객체지향의 목표에 다다르기 위한 과정과 기본지식들을 기록하려고 합니다.
객체지향에서 가장 중요한 개념 세가지는 역할, 책임, 협력입니다. 우선적으로 협력은 요청과 응답으로 구성되어 있습니다. 손님이 캐시어에게 커피를 주문하고(요청), 요청은 받은 캐시어가 바리스타에게 커피를 제조하라고(요청) 명령합니다. 또한 바리스타가 커피를 만듦으로써 캐시어의 요청에 응답합니다. 이러한 요청과 응답의 과정을 통해 다른 사람들과 협력을 함으로써 하나의 공동체를 형성할 수 있게 됩니다. 또한 손님, 캐시어, 바리스타는 각각의 역할을 가지고 있습니다. 손님은 커피를 주문하고, 캐시어는 손님과 바리스타의 중재자 역할을 하고, 바리스타는 커피를 제조할 책임이 있습니다. 역할은 책임의 개념을 내포합니다.
역할의 특징
- 여러 사람이 동일한 역할을 수행할 수 있습니다. (캐시어가 일을 관두면, 다른 사람으로 대체하는 것== 여러 객체가 동일한 역할 수행 가능)
- 역할은 대체 가능성을 의미합니다. (서로 다른 두 명이 같은 역할을 수행)
- 책임을 수행하는 방법은 자율적으로 선택할 수 있습니다. (커피를 제조하는 과정은 가게마다 다름== 객체는 책임을 수행하는 방법을 자율적으로 선택 -> 이를 다형성(Polymorphism)이라고 합니다)
- 한 사람이 여러 역할을 수행할 수 있습니다.(캐시어와 바리스타 역할 동시에 수행 가능== 하나의 객체가 여러 역할을 가짐)
이러한 실생활적인 내용이 객체지향의 핵심과 중요한 개념을 대부분 포함하고 있음을 알아야 합니다. 손님, 캐시어, 바리스타는 객체이고, 각각의 요청은 메세지이고, 요청에 대한 응답은 메서드로 바꿀 수 있게 됩니다.
협력에 참여하는 주체는 "객체"이며 객체지향의 중심은 클래스, 상속이 아닌 "객체"라는 것을 이해해야 합니다. 또한 협력에 참여하는 주체도 객체입니다. 객체는 협력적이면서 자율적이어야 합니다. 이 말이 무슨 말이냐면, 객체가 다른 객체와 상호작용 하면서 다른 객체에 응답은 객체가 자율적으로 응해야 한다는 뜻입니다. 또한 자율성의 구분은 객체의 내부와 외부를 구분하는 것과 같습니다. 객체는 다른 객체가 무엇을 수행하는지는 알 수 있지만, 어떻게 수행되는지는 알 수 없어야 합니다.
"객체"는 상태와 행동을 함께 지닌 실체입니다. 협력에 참여하기 위한 행동을 해야 한다면, 행동을 하기 위한 상태도 필요합니다. 협력에 참여하는 과정에서 스스로 판단하고, 협력을 하기 위해선 행동과 상태가 정의되어야 합니다.
메시지(요청)와 메서드(응답)를 구분하는 데 있어서 필요한 개념은 캡슐화입니다. 캡슐화는 다음 리뷰에서 기록하도록 하겠습니다.
이러한 책 내용을 기반으로 객체지향을 다음과 같이 정의할 수 있습니다.
- 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법입니다.
- 자율적인 객체란 상태와 행동을 지니며, 스스로 자기 자신을 책임지는 객체를 의미합니다.
- 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력합니다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 책임과 연관성이 깊습니다.
- 객체는 협력을 위해 메세지(요청)와 메서드(응답)를 주고받습니다.
1장 결론
객체지향의 중심에는 클래스가 아니라 객체가 위치하며, 중요한 것은 클래스들의 정적인 관계가 아니라 메세지를 주고받는 객체들의 동적인 관계입니다. 클래스의 구조와 메서드가 아닌 객체의 역할, 책임, 협력에 집중하는 것이 중요하고, 객체지향은 객체를 지향하는 것이 아닌, 클래스를 지향하는 것입니다.
<참고 자료>
'Java > Java Concept' 카테고리의 다른 글
[Java] HashMap, HashTable, ConcurrentHashMap 자료구조에 대해서 알아보자 (2) | 2024.01.22 |
---|---|
[Java] EnumSet에 대해서 (1) | 2023.11.13 |
[Java] HashMap, HashSet 개념정리 (2) | 2022.10.31 |
ArrayList<E> 클래스 및 제네릭 함수 개념 (0) | 2022.08.13 |
메소드 오버라이딩(Method Overriding) 개념 (0) | 2022.08.09 |