일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 백준
- web
- django rest framework
- 알고리즘 문제
- 알고리즘
- CSS
- Baekjoon
- Git
- MAC
- 장고
- PYTHON
- 파이썬 알고리즘
- Algorithm
- react
- 파이썬
- AWS
- c++
- form
- django widget
- java
- API
- javascript
- django ORM
- js
- 알고리즘 연습
- HTML
- 알고리즘 풀이
- Django
- es6
- DRF
- Today
- Total
수학과의 좌충우돌 프로그래밍
객체 지향 프로그래밍 이란? 본문
안녕하세요 강민성 입니다.
요즘 Java 언어를 공부하고 있는데 공부를 하다보니 문뜩 그런 생각이 들더라고요.
파이썬도 그렇고 Java 도 그렇고 객체 지향 프로그래밍 이라고는 하는데 과연 이게 무엇일까?
그래서 오늘은 객체 지향 프로그래밍에 대해서 알아보도록 하겠습니다.
객체 지향 프로그래밍 vs 절차지향 프로그래밍
객체 지향 프로그래밍(Object-Oriented Programming) 은 줄여서 OOP 라고 하며
프로그램을 어떻게 설계하는 지에 대한 방법입니다.
다른 방법으로 절차 지향 프로그래밍이 있습니다.
그러면 이 둘을 비교해볼까요?
빠른 이해를 위해서 예시를 하나 들어보겠습니다.
물건을 판매하는 가게는 크게 두 가지 형태로 나누어집니다.
|
ex) 햄버거 가게, 약국, 은행 |
|
손님이 직원에게 제품을 말하면 직원이 제품을 가져와서 전달 |
손님이 직접 제품에 접근 가능 |
손님이 직접 제품에 접근 불가능 |
여러 명의 손님이 동시에 제품을 찾을 수 있으므로 상대적으로 구매가 빠르다. |
손님 한 명 씩 순차적으로 물건을 구매하게 되므로 대기자가 생겨 상대적으로 느리다. |
제품의 배치나 구조가 바뀌면 손님에게 영향을 미친다. |
가게에서 제품의 배치나 구조가 바뀌더라도 손님에게 미치는 영영향이 많이 없다. |
물품을 구매할 때 손님과 직원의 역할과 책임이 불분명 |
물품을 구매할 때 손님과 직원의 역할과 책임이 분명 |
좌측의 편의점과 같은 가게의 형식은 절차지향프로그래밍 , 우측의 햄버거 가게와 같은 가게의 형식은 객체지향프로그래밍입니다.
손님은 프로그램의 함수와
물품은 데이터, 변수, 메모리에 대응 시켜 생각을 하면 되겠습니다.
두 방법은 다음과 같이 여러가지 차이가 있지만 명확히 반대되는 개념은 아니며
언어를 다음과 같은 기준으로 이분법 할 수도 없습니다.
C 와 C++ 을 생각해봤을 때 C++ 을 쓴다고 해서 객체 지향 프로그래밍을 한 것이 아니고
코드를 짜는 방식을 객체지향으로 바꾸어야 합니다.
그리고 편의점과 햄버거 가게 중 어느 가게의 판매 방식이 맞다고 할 수 없는 것 처럼
두 프로그래밍 방식도 역시 상황에 맞게 쓰이는 게 중요하지 어느 방법이 더 좋다고 말할 순 없습니다.
객체란..
객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고
다른 것과 식별 가능한 것을 말합니다.
우리 주위에서도 많이 찾아볼 수 있는데요, 개, 고양이, 책상, 의자, 자전거 등과 같은 것들이 있습니다.
개는 엄연히 자신만의 고유한 속성으로 다른 것들과 구분이 될 수가 있죠.
이러한 객체들은 속성과 동작으로 구성이 되어있습니다.
예를 들어 개 같은 경우에는 이름, 품종, 털색, 몸무게 등의 속성과
달리다, 걷다, 짖다, 잠을 자다 등의 동작을 가지고 있습니다.
객체지향프로그래밍이란...
그렇다면 객체지향이라는 말은 위에서 알아본 '객체' 를 사용해서 프로그래밍을 하겠다는 뜻입니다.
좀 더 풀어서 이야기 해보면 프로그램에서 필요한 부분들을 일반화 시켜서 객체로 만들고
이 객체들 간의 상호작용을 통해서 프로그래밍을 하겠다는 의미입니다.
우리가 '동영상 플레이어'를 만든다고 생각해봅시다.
그러면 앞으로 감기, 뒤로 감기, 정지하기, 몇 초 후 몇 초 전으로 건너 뛰기 등 여러가지의
부품 객체들을 만든 후 이를 조립하여 하나의 동영상 플레이어를 만들 수 있는 겁니다.
이렇게 한 번 만들어 놓은 부품 객체들은 나중에 그대로 사용할 수 있기 때문에
프로그램 개발 속도 및 수정용이성에 큰 영향을 미칩니다.
객체지향 프로그래밍이 나온 배경도 바로 여기에 있습니다.
프로젝트의 규모가 커짐에 따라 더 이상 절차지향으로는 감당할 수 없게 된 것이죠.
그러면 여기서 한 가지 의문이 들 것 입니다.
절차지향 프로그래밍도 필요한 행위를 함수화해서 계속 해서 사용하고 수정하면 되지 않은가?
이를 '스타크래프트'에 비유해서 생각을 해보겠습니다.
게임 속 마린이라는 캐릭터 역시 프로그래밍이 되있을 겁니다.
마린의 체력, 공격력, 방어력, 움직임 하나 하나 이에 해당하는 함수가 필요하겠죠.
마린이 100 마리가 생산이 된 상태에서 공격력 업그레이드를 통해 공격력이 1 증가 했다고 가정을 해보겠습니다.
절차지향에서 단순히 함수로 프로그래밍한 상태에서는 각각의 마린들을 수정해줘야 할 것 입니다.
하지만 객체지향과 같은 경우에는 한 줄의 수정으로 이를 해결할 수 있습니다.
마무리
사실 저 역시도 이렇게 설명을 했지만 객체지향과 절차지향에 대해서 완벽하게 이해했다고 하기엔 부족함이 있습니다.
그만큼 어려운 개념이니 이해가 잘 안된다고 해도 이상하지 않습니다.
다만 언어 공부를 하시며, 프로젝트를 하다보면 '아 이래서!' 라고 느끼시는 순간이 올거라 믿습니다.
다음 시간에는 객체지향언어의 특징들을 알아보도록 하겠습니다.
감사합니다 :)