<객체 지향 프로그래밍? 함수 지향 프로그래밍? 그 중간 사이. - feat. 자바스크립트의 정체성>

강민수·2022년 4월 23일
0

근본 시리즈

목록 보기
4/7

이번 시간에는 최근 자바스크립트를 공부하면서 조금 정리해 보고 싶은 부분이 있어 이렇게 컴퓨터 앞에 앉게 되었다.

흔히들 자바스크립트를 객체 지향 프로그래밍이라고도 하고 함수 지향 프로그래밍이라고도 한다. 사실 말로만 들어서는 이게 뭔가 싶다. 그래서 필자 역시 이런 자바스크립트의 정체성에 대해 다시 한 번 짚고 넘어가야 될 것 같다는 생각이 들었다.

1.객체 지향 프로그래밍의 정의.

객체 지향 프로그래밍은 프로그램을 명령어 또는 함수의 목적으로 보는 전통적인 명령형 프로그래밍의 절차지향적 관점에서 벗어나 여러 개의 독립적 단위, 즉 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임을 말한다.

이를 이해하기 위해서는 본격적으로 객체 지향 프로그램의 속성에 대해 더 알아볼 필요가 있다. 속성은 다음과 같이 크게 4가지 정도로 축약된다.

2. 객체 지향 프로그래밍의 속성.

1) 추상화.

객체 지향 프로그래밍은 실세계의 실체(사물이나 개념)을 인식하는 철학적 사고를 프로그래밍에 접목하려는 시도에서 시작한다. 실체는 특징이나 성질을 나타내는 속성을 가지고 있다. 우리는 이를 통해 실체를 인식하거나 구별할 수 있다.

예를 들어, 본인에게 이름과 주민등록 번호가 부여되지 않았다고 생각해 보자. 그러면 대한민국 수많은 000씨 중에 한 명과 당신을 어떻게 구별하겠는가?

프로그래밍 역시 마찬가지다. 이것을 프로그래밍에 접목시켜서 발전한 것이 객체 지향 프로그래밍이다. 하지만, 사람에게는 다양한 속성을 가지고 있다. 예를 들어, 키, 체중, 나이, 전화 번호 등등.

이중에서 우리는 사람의 이름과 주민등록 번호라는 속성만 관심있다고 치자. 이처럼 다양한 속성 중에서 프로그램에 필요한 속성만을 간추려 내어 표현하는 것을 "추상화"라 한다.

이름과 주민등록 번호라는 속성을 갖는 person이라는 객체를 자바스크립트로 표현하면 다음과 같다.

// 이름과 주민번호를 갖는 객체. 

const person = {
	name: 'minsu',
  	registerNumber: 123456-789000
};
console.log(person); //{name: 'minsu', registerNumber: 123456-789000}
  

이처럼 필요한 속성만을 객체내부에 속성을 부여하는 것이 객체 지향 프로그래밍의 추상화라고 불리는 특징이다.

2) 캡슐화.

다음 특징은 캡슐화다. 캡슐처럼 뭔가 작게 만드는 것인가, 할 수도 있지만 그런 의미보다는 하나로 묶는다는 개념이 더 맞겠다.

캡슐화는 객체의 상태를 나타내는 프로퍼티와 프로퍼티를 참조하고 조작할 수 있는 동작인 메서드를 하나로 묶는 것을 말한다. 또, 캡슐화는 객체의 특정 프로퍼티나 메서드를 감출 목적으로 사용하기도 하는데 이를 정보 은닉이라 한다.

대부분의 객체 지향 프로그래밍 언어는 클래스를 정의하고 그 클래스를 구성하는 멤버(프로퍼티와 메서드)에 대하여 public, private, protected 같은 접근 제한자로 선언하여 공개 범위를 한정할 수 있다. public으로 선언된 프로퍼티와 메서드는 클래스 외부에서 참조할 수 있지만 private으로 선언된 경우는 클래스 외부에서 참조할 수 없다.

하지만, 자바스크립트는 public, private, protected 같은 접근 제한자를 제공하지 않는다. 따라서 객체의 모든 프로퍼티와 메서드는 기본적으로 외부에 공개되어 있다. 물론 이를 위해 추후 타입스크립트에서는 이런 접근 제한자 사용이 가능하다. 따라서 자바스크립트는 객체의 모든 프로퍼티와 메서드는 기본적으로 public하다.

다음 예제를 살펴보자.


function Person (name, age){
  this.name = name;//public
  let _age = age; //private
  //인스턴스 메서드
  this.sayHi = function(){
  console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
  }
}

const me = new Person('KIM', 22);
me.sayHi(); // Hi! My name is KIM. I am 22.
console.log(me.name); //KIM
console.log(me._age); //undefined

위 예제의 name 프로퍼티는 현재 외부로 공개 되어 있어서 자유롭게 참조하거나 변경이 가능하다. 즉, name은 public이다. 하지만, _age 변수는 Person 생성자 함수의 지역 변수이므로 Person 생성자 함수 외부에서 참조하거나 변경할 수 없다. 즉, _age 변수는 private하다.

이처럼 자바스크립트는 객체 지향적인 특성으로 캡슐화 역시 가지고 있다.

3) 상속.

상속은 객체 지향 프로그래밍의 핵심 개념이라고 해도 무방할 정도로 중요한 속성이자 개념이다. 즉, 흔히 말하는 물려받는 다는 표현이 맞다. 어떤 객체의 프로퍼티 또는 메서드를 다른 객체가 상속받아 그대로 사용하는 것이다.

사실 프로토 타입은 엄청 중요한 개념인만큼 여기서 전부 다 파해치기에는 시간이 부족하다. 따라서 여기서는 간단하게 어떤 구조와 개념인지만 알고 넘어가자. 추후 필자가 다시 정리해서 기고하겠다.

보통 클래스 기반 언어들은 객체 지향 프로그래밍의 상속을 구현할 때 보통 클래스 자체를 상속해서 자식 클래스에 생성자 함수를 통해 넘겨준다. 하지만, 자바스크립트는 약간 그 개념이 다르다. 자바스크립트는 프로토 타입이라는 개별 객체가 존재한다. 따라서 이 객체가 일종의 스토어 개념으로 부모의 프로퍼티를 가지고 있다. 따라서 생성자 함수를 통해 만들어진 새로운 자식 객체에 이 프로토 타입이 그대로 전달된다. 만약 자식 객체에서 부모의 프로퍼티를 이용하고 싶다면, 이 프로토타입을 호출하면 된다.


이처럼 결국 부모와 자식간의 상속을 통한 프로퍼티 공유가 가능하다는 점에서 자바스크립트 역시 객체 지향 프로그래밍의 속성을 가지고 있다.

4) 다형성

다형성은 특정 기능을 선언(설계)부분과 구현(동작)부분으로 분리한 후 구현부분을 다양한 방법으로 만들어 선택해서 사용할 수 있게 하는 기능이다.

쉽게 생각하면, 어떤 기능은 변하지 않는다. 하지만, 그 기능을 사용하는 사용처는 전부 달라질 수 있는 것이다. 말이 다소 모호하게 느껴질 수 있다고 생각이 들어, 이 부분은 실생활적인 예시로 들어보겠다.

자! 흔히 우리가 많이 사용하는 usb 허브 독이다. 이 포트 구성을 보면, 흔히 많이 쓰는 usb-a 타입 포트 3개. usb-c타입 1개가 전면부에 표시되어 있다. 뒤에는 hdmi단자와 다른 포트들이 있다. 여기서 usb-a포트를 통해 우리는 usb자체를 꼽아서 사용할 수 있다. 이외에도, 마우스, 프린터, 키보드 등등 usb-a 타입을 사용하는 기기들을 사용할 수 있다. 흔히 말하는 다형성이 딱 이 1:n의 관계의 구조다. 이제 좀 이해가 가시는 가?

그렇다면, 이게 객체지향 프로그래밍과 뭔 관계냐고 물으실 수 있다. 그러면 바로 코드로 보여드리겠다.

// 자바스크립트는 선언부분이 없습니다. // 그냥 선언부분이 있다가 생각하고 작성한다. 
// 합성을 이용해 구현부분을 사용하는 클래스 

function 허브독(선언부분) { // 이 부분을 선언부분이라고 가정하고 사용한다. 
  
선언부분.포트1(); 
선언부분.포트2(); } 
/** * ----------------------------------------------------- 
* 구현 부분 * 구현도 선언부분이 있다는 가정하에 선언부분에 맞춰 구현한다. 
* ----------------------------------------------------- 
*/ // 구현 부분 클래스 첫번째 묶음 
function 포트1() { // 구현 코드 } 

function 포트2() { // 구현 코드 } 
  

이렇게 허브독이라는 함수형 객체를 선언했다. 그리고 그 안에 일종의 선언부로 포트1과 포트2라는 함수를 설정해 줬다. 이 함수를 구현 부분에서 가져다가 쓴다. 이처럼 자바스크립트는 객체 내부에 쓰여진 함수 역시 가져다가 쓸 수 있다. 이를 다형성이라는 구조로 설명한다.

3. 그렇다면 자바스크립트는 객체 지향 프로그래밍 언어가 맞나요?

이 부분에 대한 답은 반은 맞고 반은 틀리다고 설명할 수 있다. 자바스크립트는 객체 지향 프로그래밍일 뿐만아니라, 명령형, 함수형 프로그래밍을 모두 지원하늘 멀티 패러다임 프로그래밍 언어이기 때문이다. 즉, 혼합 짬뽕이다. ㅎㅎ

하지만, 그렇다면 객체 지향적인 속성이 없냐고 묻는다면? 여기까지 읽으신 분이라면 분명 위의 설명한 대로 객체지향적인 속성을 가지고 있다는 것을 아실 수 있다. 하지만, 완전히 같다고는 또 보기어렵다. 이 부분에 대해서는 추후 더 자세히 기고해 보겠다. 아마도 자바스크립트가 동적타입 언어라는 특성을 가지는 자율성이 많은 언어의 특징이지 않을까 싶다.

자바스크립트는 또, 클래스 기반 객체 지향 프로그래밍 언어와 달리 프로토 타입 기반의 객체지향 프로그래밍 언어라고 보는 것이 맞다. 이는 앞서 간략히 설명했듯이, 일반적인 클래스 기반과 달리 상속의 측면에서 프로토 타입이라는 객체를 활용하기 때문이다. 이에 대해서는 추후 다시 기고하겠다.

4. 결론.

자바스크립트는 객체 지향 프로그래밍 언어는 맞다. 하지만, 그것만 있냐고 묻는다면, 그것은 아니다. 객체 지향적인 속성을 가진 채로 상황에 따라 자유롭게 자신의 색깔을 바꾸는 카멜레온처럼. 이 언어는 수시로 자신에게 맞는 특성을 가지는 언어라고 생각하는 것이 더 올바른 접근법이겠다.

profile
개발도 예능처럼 재미지게~

0개의 댓글