Web/Javascript

[객체지향프로그래밍(OOP)] (1) 객체지향프로그래밍이란?

outwater 2021. 1. 15. 04:21

*필자는 javascript를 공부하고 있는 학생으로, 포스팅에서 설명하고 있는 개념들이 다소 부정확할 수 있습니다. 혹시라도 잘못된 부분, 부족한 부분이 있다면 너그럽게 이해해주시고, 댓글을 통해 언급하여 주신다면, 해당 부분을 좀 더 심도깊이 다시 공부해보고 수정하도록 하겠습니다. (공부하며 참고하게 된 OOP에 관한 좋은 reference 사이트들을 아래 첨부하였으니, 저와 같이 공부를 하시는 분들은 한 번 읽어보시면 분명 도움이 될 것이라 생각합니다.)

 

객체지향프로그래밍이 워낙 이해하기 어려운 개념인 만큼 여러 포스팅에 걸쳐 천천히 음미해보려고 합니다.
먼저 첫 포스팅에서는 객체지향프로그래밍이 무엇인지 개괄적으로 살펴보고, 이후 객체지향프로그래밍의 대표적인 4가지 특징, JavaScript 에서의 객체지향프로그래밍(프로토타입기반)등을 차례대로 살펴보도록 하겠습니다.

1. 객체지향프로그래밍(OOP) 이란 무엇인가? 

객체지향프로그래밍이 우리에게 어려운 개념으로 느껴지는 것은 명확한 정의가 없고, 직관적으로 떠오르는 이미지가 없기 때문일 것이다. 이렇게 어렵고 낯선 단어를 이해하기 좋은 2가지 방법으로 '(1)잘개 쪼개어 생각해보기, (2) 대비되는 개념 생각해보기' 가 있다.

1-(1) 잘개쪼개어 생각해보기

'객체지향프로그래밍' 은 객체/지향/프로그래밍 의 3개의 단어로 쪼개어 생각해볼 수 있다. 그리고 이 중에서 우리의 이해를 어렵게 하는 것은 객체라는 단어일 것이다. 지향한다는 것은 ~을 중심으로 생각한다는 말과 같으므로, 예를 들어 '속도중심 프로그래밍' 이라고 한다면 우리 머리속에는  '아아~ 얘는 뭐 처리속도가 중요해서 신속하게 데이터를 주고 받기 위한 특징을 가진 프로그래밍 방법이겠구나 '  와 같은 이미지를 떠올릴 수 있을 것이다.
객체를 조금 더 친숙한  '개념' 이라는 단어를 가져와 '개념중심 프로그래밍'으로 생각해볼 수 있다.

'개념' 이란 '어떤 사물이나 현상에 대한 일반적인 지식'을 뜻하는 단어이다. 내가 '지난 주 당근마켓에서 구매한 이 맥북15인치 노트북은'은 일반적인 지식이라기 보단 특정한 물체를 가리키므로 개념이라고 할 수 없다. 하지만 '노트북' 그 자체는 개념이라고 할 수 있는데, 노트북이라는 개념은 '모델명, 제조사, CPU, RAM, 입출력기능, 통신기능' 과 같이 공통적인 특징을 가지고 있는 물체들을 가리키는 일반적인 지식이기 때문이다.
우리는 여기서 이 공통적인 특징에 값을 부여하여 특정한 물체를 구분할 수 있다. 
내가 가지고 있는 노트북은 { 제조사 : Apple, RAM: 16GB, 제조년: 15년 7월, 일련번호: 20170522 ...} 으로 표현하여 하나의 특정한 노트북으로 구분해볼 수 있다. 우리는 이와 같은 방법으로 공통된 속성에 각기 다른 값을 부여하여 이 세상에 존재하는 수백수천수만개 이상의 노트북에 대해 표현할 수 있게 되었다.

객체지향프로그래밍에서는 '클래스'와 '인스턴스' 라는 개념을 사용하는데, '클래스'는 공통적인 속성을 가지고 특정 노트북을 찍어내는 하나의 틀이라고 볼 수 있다. 인스턴스는 이 찍어내는 틀인 클래스에 특정 주문을 반영하여 나온 하나의 개별 노트북이라고 할 수 있다.

 

한문장으로 요약하여 보면, 객체지향프로그래밍은 개념중심프로그래밍으로 바꾸어 생각하면 이해하기 쉬우며, 개념중심프로그래밍이라는 것은 공통적인 특징을 가지고 있는 하나의 틀인 '클래스' 가 존재하고, 공통적인 특징에 특정 값을 가지고 있는 '인스턴스'로 데이터구조를 접근하는 하나의 프로그래밍 패턴이라고 할 수 있다.

출처: 잔재미 코딩

1-(2) 대비되는 개념 생각해보기

'객체지향 프로그래밍'과 대비되는(자주비교되는,반대라고는 할 수 없다!) 개념은 전통적인 절차지향 프로그래밍이라고 할 수 있는데, 이 절차지향 프로그래밍은 함수들의 집합(컴퓨터 명령어들의 목록)이라는 관점에서 프로그래밍에 접근한다.
이에 따라 절차지향 프로그래밍에서는 순차적인 처리가 중요시 되고, 이는 컴퓨터의 처리 구조와 유사해 처리속도가 빠르다는 장점을 갖는다. 하지만 소프트웨어가 급격하게 발달하고, 점점 더 복잡하고 거대한 구조를 프로그래밍에서 다루기 시작하면서 데이터를 구조화하는 것에 큰 어려움을 겪는다.
 이에 하나의 해결방안으로 등장한 것이 바로 '객체지향 프로그래밍'이다.

객체지향 프로그래밍은 큰 문제를 작게 쪼개는 것이 아니라, 먼저 작은 문제들을 해결할 수 있는 객체를 만든 뒤에 이 객체들을 조합하여 큰 문제를 해결하는 상향식(bottom-up)해결법을 도입한 것이다. 일단 처음 한번만 독립성/신뢰성이 높은 객체를 만들어 놓기만 한다면, 이후에 그 객체를 재사용할 수 있으므로 개발기간과 비용, 복잡도를 대폭 줄이는 효과를 가지고 있는 것이다.

 

요약하여 보면 객체지향 프로그래밍은 절차지향 프로그래밍과는 달리 독립적인 역할을 하는 작은 단위의 객체들을 만들고, 이 객체들이 서로 관계를 맺으며 데이터를 처리하는 방식의 유연하고 확장성에 큰 장점이 있는 프로그래밍 패턴이라고 할 수 있다.

출처: 네이버블로그(네버블록)


첫 포스팅에서는 객체지향프로그래밍의 개요에 대해서 알아보았다.

객체지향프로그래밍의 이미지를 떠올려 본다면,
1) 어떤 물체를 찍어내는 틀(클래스)과  거기서 찍어 나온 다양한 물건들(인스턴스)을 생각해볼 수 있고,
2) 이것들은 복잡해진 데이터구조의 효과적인 처리를 위해 독립적이고 재사용이 가능하다는 특징을 가지고 있다는 것

을 떠올린다면 객체지향프로그래밍의 이해의 첫 단계로는 훌륭할 것이다!  

 

 

 

 

 

출처:  https://poiemaweb.com/js-object-oriented-programming

 

Object-Oriented Programming | PoiemaWeb

오늘날 많은 유명한 프로그래밍 언어(Java, C++, C#, Python, PHP, Ruby, Object-C)는 객체지향 프로그래밍을 지원한다.

poiemaweb.com

namu.wiki/w/%EA%B0%9D%EC%B2%B4%20%EC%A7%80%ED%96%A5%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

 

객체 지향 프로그래밍 - 나무위키

프로그램의 세부 구현을 외부로 드러나지 않도록 특정 모듈 내부로 감추는 것이다. 내부의 구현은 감추고 모듈 내에서의 응집도를 높이며, 외부로의 노출을 최소화하여 모듈 간의 결합도를 떨

namu.wiki

velog.io/@piecemaker/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-1.-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80

 

1. 객체 지향 프로그래밍이란?

객체 지향 프로그래밍이 무엇인지에 대한 개념을 알아보자.

velog.io