개발쿠키

[JAVA]객체지향과 객체지향 프로그래밍(OOP) 본문

개발/java

[JAVA]객체지향과 객체지향 프로그래밍(OOP)

쿠키와개발 2023. 7. 31. 15:42

들어가기 전

먼저 이 글을 쓰게 된 계기를 말하자면 스프링과 자바를 이용해서 개발하는 중에 이런 생각이 들었다.

 

'그래서 쓰는 법은 알겠는데 controller - service - repository 구조에서 각각의 클래스들을 활용한게 어떤 의미에서 객체지향 프로그래밍이라는거지?' (이걸 생각하기까지 1년 반이 걸린 나에게 충격이였다.)

 

답을 찾기 위해 객체지향프로그래밍 즉 OOP가 정확히 어떤것인가를 공부하다가 도저히 이해가 안가서 OOP를 공부하기 이전에 OOP의 본질 객체지향이라는 것이 무엇인가를 찾아보았고 와중에 조영호님의 '객체지향의 사실과 오해'를 읽고 내가 이해한 바를 정리하기 위해 쓰게 되었다. 

 

1. 객체지향이란?

우선 객체지향 패러다임이 왜 등장했는지는 다른 분들이 많이 이야기한다. 나는 이것도 중요하지만 이 전에 객체지향 패러다임의 출발점인 '사람이 인지할 수 있는 다양한 객체들이 모여 현실 세계를 이루듯 소프트웨어 세계 역시 인간이 인지할 수 있는 다양한 객체들이 모여 이루고 있다는 믿음' 이 부분이 중요하다고 생각한다. 

 

나는 처음에 객체지향이라는 것이 단순하게 현실 세계의 객체를 프로그램으로 만드는 것 정도로 생각했다. 하지만 본질은 담고 있지 않았다. 객체라는 것은 단순하게 생각하면 형태가 있고 보이는 것이라고 할 수 있지만 이것만으로는 OOP를 할 수 없다. 책의 예시를 언급하면 주문과 계좌 이체는 실체가 존재하지 않지만 사람이 하나의 단위로 인지할 수 있는 개념적인 객체의 일종이다 라는 말이 있다. 즉 객체는 실체하는 것이 다가 아니라 인지할 수 있는 하나의 단위도 객체라는 것이다. 그렇기 때문에 우리는 쇼핑몰을 개발할 때 주문이라는 객체를 만들고 있었던 것이다. 

 

이러한 부분에서 객체지향이라는 것은 개발을 하기 전에 구현하고자 하는 것의 시점을 객체에 맞춰서 생각하는 것이라고 생각한다. 책의 예시를 보면 커피숍에서의 커피가 나오기까지의 일들을 나열하며 예시를 든다. 만약 우리가 커피를 제공하는 프로그램을 만든다고 할 때 현실 세계에서 일어나는 일련의 과정 중에 역할,책임 그리고 협력을 하는 각 객체들의 관점에서 보는 것이 객체지향이라는 말과 잘 어울리는 것 같다. 

 

2. 객체지향 프로그래밍

객체 지향이 무엇인지가 감이 잡힌다면 객체 지향 프로그래밍도 어느정도 이해하기가 쉽다. 

 

위키백과의 말을 빌려오면 '컴퓨터 프로그램 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.' 라고 적혀있다.

 

우리는 앞서 객체 지향이라는 것이 현실 세계의 객체들이 메세지를 주고받고 상호작용 할 때 역할, 책임, 협력을 하는 객체들의 관점에서 보는 것이라고 했다. 이러한 개념을 적용하여 프로그램을 단순히 명령어로 동작하는 것이 아니라 프로그램 내에 존재하는 객체들이 각자의 역할, 책임을 가지고 다른 객체들과 소통(협력)하며 동작하도록 프로그래밍 하는 것이 객체지향 프로그래밍이다. 

 

이러한 객체지향 프로그래밍의 특징으로는 다형성, 추상화, 상속, 캡슐화가 존재한다. 각각의 개념들은 하나씩 다뤄볼 예정이다.

마치며

책에서 언급한 내용 중 객체지향 프로그래밍은 현실 세계를 모방하는 것이 아니라 새로운 세계를 창조하는 것이라고 한다. 

나는 단순히 모방을 해야겠다는 틀에 갇혀서 오히려 객체지향이라는 것이 더 어렵게 느껴진것 같다. 예시로 현실에서는 단순하게 커피 주문을 받고 계산을 하면 커피를 받을 수 있다. 하지만 프로그램에서는 절대로 저게 불가능하다. 주문을 받는 순간 관련된 많은 객체들과 소통하며 복잡하게 처리가 된다. 이러한 부분에서 새로운 세계를 창조한다라는 표현에 많은 공감을 했다. 

 

 

'개발 > java' 카테고리의 다른 글

[JAVA]클래스, 객체, 인스턴스  (0) 2023.07.20
[JAVA]Call By Reference, Call By Value  (0) 2023.07.14
[JAVA]JVM  (0) 2023.07.06
[JAVA]String  (0) 2023.07.04
[JAVA]JVM, JRE, JDK  (0) 2023.07.03