절차지향 코딩에서 객체지향으로의 변화를 일으킨 클래스를 배우기 이전에, 객체지향에 대해 알아보자.
기존의 코딩 방식은 절차지향. 즉, 하나의 선상에서 순차적으로 프로그램이 진행되며 구현되는 것이었다면,
객체지향은 프로그램 구현에 필요한 각 객체들을 중심으로,
각 객체들이 가진 요소나 기능들을 활용하여 프로그램을 구현하는 것이다.
절차지향 프로그래밍 (Procedure Programming)은, 말 그대로 처리기(Procedure)를 통해 구현되는 프로그래밍이다.
데이터 위주로 이루어진 이 처리기들은 프로그램을 처리순서대로 처리하여 프로그램을 구현시킨다.
이 때, 다루려는 데이터의 자료형이나 의미들을 변경할 필요가 생기면, 해당 데이터를 다루는 모든 처리기의 값을
수정해야하기 때문에, 수정이나 변경등에 있어 단점을 갖고있다.
이와 달리 객체지향 프로그래밍(Object-Oriented Programming)은 각 기능을 담당하는 객체들의 상호작용이 중점이 된다.
절차지향 프로그래밍에서는 구현하고자 하는 하나의 프로그램을 위해 미리 데이터와 기능들을 설계하고,
설계대로 프로그래밍을 구현한다면, 객체지향 프로그래밍은 이와 반대로 먼저 기능들을 수행할 객체들과,
객체들이 가져야할 요소들을 정한 후, 객체들의 상호작용을 통해 구현하고자 하는 기능들을 만드는 것이다.
정리하여 비교하자면,
절차지향은 단일 선상에 놓고 그 길을 따라간 끝에 프로그램이 구현되는 것이라면,
객체지향은 여러 객체들을 만들고,
그 객체들이 서로 데이터를 주고받으며 상호작용을 한 결과로 프로그램이 구현되는 것이다.
딱딱한 말로만 설명하려니 머리에 잘 들어오지 않는다.
객체지향과 절차지향의 차이를 예시로 들어보겠다.
이전에도 사용했던 예시인 '공장'이 바로 절차지향의 예시라고 보겠다.
근데, 이전처럼 여러 공정이 있는 것이 아니라 자동화된 하나의 라인만 있는 공장이다.
이 공장은 캔 커피를 만든다.
캔 커피 공장의 자동화 라인은 맨 처음에 빈 캔을 레일 위로 가져다 놓는다.
레일을 따라가며 빈 캔은, 안에 커피가 채워지고, 캔 뚜껑이 닫히며 마지막으로는 박스에 담겨 납품준비를 마친다.
이렇듯 절차지향은 프로그램의 시작부터 끝을 경로로 하나씩 구현시키는 것이다.
객체지향은 이와 다르다.
앞서 객체지향은 객체들의 상호작용을 중점으로 본다고 얘기했다.
똑같이 캔 커피를 예를 들자면, 객체지향은 캔 커피를 구매하는 일련의 과정이라고 예를 들겠다.
우리가 캔 커피를 만들기 위해서는 무엇이 필요할까?
캔커피를 구매하기 위한 가게와 돈이 필요하며, 가게까지 가야하고, 가서 돈을 내고 구입해야한다.
그렇다면 여기서 캔커피 가게에는 무엇이 필요할까?
캔커피 가게는 캔커피가 있어야 할 것이고, 캔커피를 팔기 위해서 계산을 해야 할 것이다.
여기서 캔커피 가게와 캔커피를 사려는 '나'가 바로 객체들이고, 캔커피를 구매하는 것이 객체지향 프로그래밍이다.
'나'는 캔커피를 사기 위해 돈이 필요하며, 가게까지 가는 기능과 구매하는 기능이 탑재되어야 한다.
캔커피 가게는 캔커피가 필요하며, 커피를 계산하는 기능과 판매하는 기능이 탑재되어야 한다.
이렇듯 '캔커피를 구매한다' 라는 프로그램을 구현하기 위해,
'돈'을 멤버변수로 갖고, '가게로 걸어가기', '캔커피 사기' 기능이 있는 '나'가 하나의 객체가 되고,
'커피'를 멤버변수로 갖고, '커피를 계산하기', '캔커피 판매하기'기능이 있는 커피 가게가 객체가 되어
최종 목적인 '캔커피를 구매한다'라는 프로그램을 구현하는 일련의 과정을 객체지향이라고 부를 수 있다.
절차지향은 말 그대로, 프로그램을 구현하기 위한 일련의 과정. 절차들이 매우 중요하지만
반대로 객체지향은 객체들이 갖는 기능, 요소와 같은 객체의 특징이 더 중요하다.
서두에 절차지향에서 객체지향으로의 변화를 일으켰다. 라고 말했는데,
그럼 객체지향이 더 뛰어나서 변화가 일어난 것일까?
객체지향과 절차지향 중에 무엇이 옳고, 어떤 방향으로 프로그래밍을 해야하는 걸까?
이 질문에 대한 해답은 존재하지 않는다. 질문이 굉장히 포괄적이기 때문이다.
만약, 캔커피 공장을 지으려면 절차지향으로 지어야할까 객체지향으로 지어야할까? 라는 질문이었다면,
절차지향으로 지어야지. 라는 대답을 내렸겠지만, 무엇이 앞서고 뒤떨어지느냐에 대한 해답은 없다.
절차지향 프로그래밍을 통해 구현하는 것이 유리한 프로그램이 있고,
객체지향 프로그래밍을 통해 구현하는 것이 유리한 프로그램이 있기 떄문이다.
하지만, 게임을 만들기 위해 프로그래밍을 공부하는 나에게 있어서는, 객체지향 프로그래밍이 조금 더 유리할 것 같다.
우리가 게임을 하면 알 수 있듯, 게임에는 여러 객체들이 움직이고 행동한다.
그들은 각자 필요한 요소들을 갖고 있으며, 그 요소들로 다양한 기능을 수행하며,
서로 물건을 사고 팔거나, 결투를 벌이는 등, 서로 풍부한 상호작용을 하고있기 때문이다.
물론 그렇지 않은 게임도 있겠지만, 그래도 대부분의 게임에서 객체지향 프로그래밍이 유리한 모습을 찾아볼 수 있었다.
지금까지의 포스팅에서는 절차지향형 프로그래밍이 대부분 아니, 전부였지만,
C++에서 클래스를 공부하고, 나중에 객체지향 프로그램언어 C#을 공부하게 되면
앞으로의 프로그래밍은 객체지향 프로그래밍이 될 것 같다.
다음으로는 객체지향 프로그래밍의 중심, 클래스를 다루어 보겠다.
'C++ 일기' 카테고리의 다른 글
| 20. 템플릿 (0) | 2024.02.29 |
|---|---|
| 19. 클래스(Class) (2) | 2024.02.28 |
| 17. 네임스페이스 (namespace) (0) | 2024.02.28 |
| 16. Call by Reference, Call by Value, Call by Reference (0) | 2024.02.27 |
| 15. 포인터 (0) | 2024.02.27 |