OOP를 아래와 같은 단어들로 설명하고 있다. 우리가 흔히 이야기 하는 객체 지향 프로그래밍(기법)도 여기서 나온 말이다.
Object : 객체
Oriented : 지향하는
Programming : 프로그래밍
하나씩 살펴보면, "Object"란 말그대로 물체이다. 이 세상은 물체로 구성되어 있다. 즉 우리 세상에 채워져 있는 독립된 하나하나의 (물체)를 Object란 단어로 표현하고 있는듯하다. 내 책상 위를 봐도 모니터, 컴퓨터, 키보드, 마우스, 종이컵, 머그컵, 연필꽂이, 다양한 볼펜, 달력 등등 아주 수 많은 물체들로 가득하다.
그런데 그 중에서 연필꽂이를 봤더니 비슷비슷한 볼펜들이 가득 꽂혀있고, 심지어 똑같은 모양의 펜들도 있다. 이렇게 비슷하거나 똑같은 펜들은 실제 똑같은 방식이나 똑같은 공장에서 만들었을것이다. 또는 비슷한 기계를 통해서 만들어 졌음을 우리는 예상할 수 있다. 그리고 그 기계만 있으면 우리는 얼마든지 볼펜을 찍어낼 수 있을것이다.
눈치가 빠른 사람은 객체와 함께 설명하고 있는 이 기계 또는 공장에 대해서 내가 무슨 말을 하려는지 감이올것 같은데.. 그렇다! 바로 "클래스"이다. 현실세계를 가득 체우고 있는 물체를 만들어 내는 공장? 기계? 설계도? 레시피? 틀? 아무튼 사물을 만들어내는 그 무엇이라고 설명할 수 있겠다.
그럼 이 개념을 프로그램에 적용시켜보면, 객체란 프로그램을 수행하는 단위(모듈, 쓰레드, 프로세스)라고 하면, Class(클래스)는 이 객체를 효율적으로 만들어 낼 수 있는 기계라고 볼 수 있겠다.
그런데, 우리가 프로그램을 수행시키기 위해 객체만 만들면 되지 클래스란 놈은 왜 만드나 하는 생각이 든다.
즉, 우리가 필요할 때 그때 그때 함수를 만들어 쓰면 되지... 뭣 하러 쓸데없이...?
결론부터 말하자면, 효율이다. Ctrl+c, v보다 편하고 효율적이기 때문이다. 아니라고 생각하는 사람이 있을 수 있겠지만, 내 생각은 그렇다.
아까 내책상 위의 펜을 만드는 업체의 입장에서 생각해보자. 예를 들어, 다음주 입학하는 학생들에게 나누어줄 볼펜, 샤프, 싸인펜에 대한 주문 받았을 때, 시간과 자원이 한정되어 있는 구조에서 생산성을 높이기 위해서 당신은 어떻게 하겠는가? (참고로 당신의 회사에는 3명의 직원이 있다고 가정해 보자.)
방법 1) 직원 3명이 머릴 맞대고 볼펜 생산 기계 설계도를 만들고, 샤프 생산 기계 설계도를 만들고, 싸인펜에 대한 설계도를 만들어 각각 나누어 기계를 돌린다.
방법 2) 직원 3사람이 각각 볼펜, 샤프, 싸인펜을 생산하는 기계의 설계도를 만들고 각각 생산한다.
방법 3) 현재 만들고 있는 볼펜 기계의 설계도면을 이용해 각 펜의 공통 부분은 활용하고, 특화된 부분에 대해서만 직원 3사람이 볼펜, 샤프, 싸인펜의 설계도를 변형/추가 하여 생산한다.
당산은 어떤 회사의 일하는 방법이 효율적이라 생각하는가?
아마도 세번째 방법이 가장 빨리 볼펜, 샤프, 싸인펜 생산 기계를 만들고 각각 생산에 들어갈 수 있을것이다. 즉, 기존의 기술을 베이스로 특화된 기능을 추가하여 새로운 클래스를 빠르게 생성할 수 있고, 클래스만 있으면 얼마든지 객체를 생성해 낼 수 있다는 말이다.
그럼 다시 처음으로 돌아가서 OOP에 대해서 내가 이해한 바를 정리해보면, OOP는 프로그래밍 기법중에 하나인데 기존과 같이 내가 필요로 하는 동작에 대한 프로그램(객체의 의미)을 직접적으로 그때 그때 작성하는게 아니라 우선 그 프로그램을 생성해 낼 수 있는 클래스를 생성하여 이를 통해 실제 일하는 프로그램(객체)을 생성하는 방식으로 프로그래밍하는 것이라고 정리할 수 있겠다.
여담 : 또다른 버전으로 설명하고 싶었던 스타크레프트.. 우리는 SCV이고 SCV가 생산하는 다양한 건물을 통해 실제 게임을 수행하는 유닛들을 만들어 낼 수 있다. 즉, 유닛을 생산해 낼 수 있는 건물이 Class라면, 각 건물에서 생산해 낼 수 있는 유닛이 Object라고 할 수 있다.
다음글 : 2022.01.26 - [Code Story] - Class of Python - 클래스 기본적인 사용
'Code Story' 카테고리의 다른 글
클래스 속성과 인스턴스 속성 (0) | 2022.01.26 |
---|---|
Class of Python - 클래스 기본적인 사용 (0) | 2022.01.26 |
[Admob] eCPM을 높여라 (0) | 2021.01.12 |
[Tistory] 이미지 넣기 (0) | 2021.01.10 |
[GitLab] 버전 변경 및 반영하기 (0) | 2021.01.10 |