[Codestates] 객체 지향 프로그래밍 OOP

송현우·2022년 9월 21일
0

C언어 등 초기 프로그래밍 언어는 절차적 언어로, 순차적 명령을 조합했다.
객체 지향이라는 패러다임이 등장하고 데이터의 접근과 처리 과정에 대한 모형을 만들어내는 방식을 고안했다.
객체 지향 프로그래밍은 청사진을 만들고, 그를 통해 객체를 생성하는 디자인 패턴이다.


JS는 엄밀한 객체 지향 언어는 아니지만 클래스를 통해 객체 지향 패턴으로 코드를 작성할 수 있다.
class는 원본이 되는 객체이며, 이 원본을 바탕으로 만든 객체 instance라고 한다.


클래스와 인스턴스

클래스와 인스턴스는 다음과 같은 방식으로 생성한다.

Car 클래스를 생성한 모습이다. 인스턴스를 생성하기 위해 변수에 new 키워드를 통해 class를 할당한다.
ES6에 들어 class라는 키워드로도 생성 가능하다. Car 객체 안에 constructor라는 생성자 함수를 담는다.


클래스에 this를 통해 속성과 메소드를 정의할 수 있다.



객체지향 프로그래밍

객체 지향 프로그래밍의 원칙은 객체내에 데이터와 기능을 담아야 한다. 즉, 객체 지향 프로그래밍의 객체는 속성과 메소드가 존재하는 객체이다. 왜 이러한 원칙을 가지는가를 알기 위해서 객체 지향 프로그래밍의 컨셉을 알아야 한다.

1. 캡슐화 Encapsulation

코드를 작동 순서에 따라 절차적으로 작성하지 않고, 실제 구현하고자 하는 모습과 닮게 코드를 모아둔다. 속성과 데이터를 한 곳에 모아 구현하고, 내부의 데이터와 구현을 외부에 노출시키지 않는다. 외부에 노출 시키지 않는 것은 은닉화 개념으로 이를 통해 예상치 못한 속성의 참조, 변경이나 코드 흐름이 바뀌는 것을 방지한다. 엄격한 클래스는 속성을 설정하는 setter 함수와 불러오는 getter 함수로 속성에 직접 접근하는 것을 막는다.

2. 추상화 Abstraction

추상화란 구현이 복잡할지라도 외부의 인터페이스는 단순하게 만든다는 개념이다. 복잡한 인터페이스로 사용상 변화가 일어나는 것을 방지한다. 필요한 메소드만 사용자에게 제공하고, 단순하고 이해하기 쉬운 이름으로 정의한다.

3. 상속 Inheritance

기본 클래스(base class)에 구현되어있는 속성과 메소드가 파생 클래스(derived class)에도 필요할 경우 파생 클래스에 굳이 중복으로 작성하지 않고 부모의 속성과 메소드를 상속시킬 수 있다. 이를 통해 파생 클래스에 필요한 속성과 메소드만 추가하면 된다.

4. 다형성 Polymorphism

하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 작동한다. 기본 클래스에 선언된 메소드를 파생 클래스에서 사용하고자 할 때, 그 객체의 특성에 맞게 사용할 수 있다. 이 덕분에 같은 동작을 할 때 파생 클래스의 특성에 맞게 종류와 분기에 맞게 if/else 등으로 조건을 지정할 필요가 없다.

네 가지 컨셉은 각각의 얻을 수 있는 장점이 다르다.

  • 캡슐화를 통해 복잡한 코드를 지양하고 재사용성을 높힌다.
  • 추상화 역시 복잡한 코드를 지양하고, 사용의 단순성을 높혀 변화에 대한 영향을 최소화 한다.
  • 상속을 통해 불필요한 코드를 작성하는 일을 줄일 수 있다.
  • 다형성을 통해 동일한 동작을 하는 메소드를 객체 특성에 맞게 작성할 수 있다.


프로토타입

JS는 프로토타입 기반 언어이다. 모든 객체들이 속성과 메소드를 상속받기 위해 프로토타입 객체를 가진다. 프로토 타입 객체도 상위 프로토타입 객체로부터 속성이나 메소드를 상속받을 수 있다.prototype 속성도 하나의 객체이며 프로토타입 체인을 통해 상속하고자 하는 속성과 메소드를 담는다.


아래 Car라는 생성자 함수를 선언했다.

sonata 인스턴스 뒤에 constructor를 붙혀 콘솔에 출력시키면 그대로 Car() 생성자 함수를 반환한다.

프로토타입은 상속받은 멤버들이 정의된 곳이다. 모든 생성자 함수는 constructor 속성을 지닌 프로토타입을 가진다.


프로토타입 체인

프로토타입은 상속할 수 있기 때문에 별도의 구문을 추가시켜주면 기본 클래스 즉, 부모 클래스로부터 파생 클래스인 자식 클래스가 양 쪽의 속성과 메소드를 사용가능하다. 하나의 Person이라는 클래스를 생성했다.

Person 클래스 안에는 이름, 나이, 성별 등 일반적으로 모두 갖고 있는 속성을 담았다. 그렇다면 학생 클래스를 만들때 이러한 속성들을 모두 중복해서 적어야 하는가? 앞서 말했듯 별도의 구문을 추가하면 Person의 속성과 메소드를 사용할 수 있다.


extends, super()를 통해 상속받을 클래스와 상속받을 속성과 메소드를 정의한다. 브라우저의 DOM 역시 Object로 부터 상속받는다. document.createElement('div')를 통해 임의의 요소를 생성했다. 이 임의의 요소를 통해 __proto__를 사용하여 Objectr까지 도달할 수 있다. 콘솔을 통해 확인하면 된다.

최상위 클래스인 Object에 도달했다.


마무리

객체 지향 프로그래밍은 청사진을 통해 객체를 생성하는 디자인 패턴이다. 자신의 속성과 메소드를 상속할 수 있는 클래스, 그 클래스를 바탕으로 만드는 인스턴스를 통해 객체를 다룰 수 있다. 캡슐화, 추상화, 상속, 다형성 등의 컨셉으로 복잡한 코드를 최소화하고 단순성을 높힌다.

2개의 댓글

comment-user-thumbnail
2022년 9월 22일

별로 못했다

1개의 답글