객체 지향 프로그래밍

future·2021년 1월 14일
0

JavaScript

목록 보기
4/10
post-thumbnail

📎 객체 지향 프로그래밍(OOP)이란?

객체 지향 프로그래밍(Object Oriented Programming)은 프로그래밍에 필요한 데이터를 속성행위를 가진 객체(Object)로 만들어 상호작용 시키는 프로그래밍 방법이다. 객체 지향 프로그래밍에서 모든 것은 자급자족 가능한 객체로 분류된다.

📎 객체 지향 프로그래밍을 사용하는 이유

  • 코드의 재사용성을 높여준다.
  • 코드의 변경 및 유지보수가 용이하다.
  • 상속을 받을 경우 중복되는 코드를 겹치지 않게 해준다.

📎 객체 지향 프로그래밍의 기본 구성 요소

예시)
동물들끼리 달리기 시합을 한다고 하자.
동물 중에는 강아지, 사슴, 치타가 있다.
결승선에 들어오면 각 동물들의 속도를 알 수 있다.
  • 클래스 (Class)

    Object를 만들기 위한 형태(원형)라고 할 수 있다. Object를 생성하기 위해서는 속성과 행위를 정의해야 한다. 예시에서 동물의 특징(속성)과 행위를 정의한 객체가 바로 클래스이다.

  • 객체 (Object)

    Class의 인스턴스이다. Object는 위에서 정의해준 클래스의 속성과 행위를 가진 것을 토대로, 자기자신만의 속성과 행위를 가진다. 예시에서 Object는 '강아지', '사슴', '치타'가 된다.

  • 메서드 (Method)

    Class로부터 만들어진 객체를 사용하는 방법이다. 예시에서 각 동물들이 결승선에 들어오면 속도를 알 수 있는 행위가 메서드라고 볼 수 있다.

📎 객체 지향 프로그래밍의 주요 특성

  • Encapsulation (캡슐화)

    관련된 속성과 기능의 모음을 한 캡슐(클래스)에 모은다. 코드를 수정하지 않고 재활용하는 것이 수월하다는 점이 캡슐화의 목적이다.

  • Inheritance (상속)

    부모 클래스의 specification(속성&기능)을 그대로 물려받아 사용할 수 있다. 또한 기능의 어떠한 부분을 수정하고 싶을 경우, 상속 받은 자식 클래스에서 해당 기능만 수정하여 사용할 수 있다.

  • Abstraction (추상화)

    사용자로부터 불필요한(복잡한) 정보는 숨기고 중요한 정보만을 표시한다. 추상화를 통해서는 복잡성을 최소화 시킬 수 있다. 공통되는 속성과 기능을 객체 지향에서는 클래스를 정의하는 것과 비슷하다고 볼 수 있다.

  • Polymorphism (다형성)

    이름 그대로 다양한 형태를 가지는 특성이다. 다형성에서는 행동을 공유하고, 공유된 행동을 특정한 것으로 대체할 수 있도록 객체를 설계한다. 이를 가능하게 하기 위해 Inheritance(상속)을 사용한다.

📎 자바스크립트에서 Object를 생성하는 방식 (Instantiation Patterns)

클래스가 나오기 전 자바스크립트에서는 Instantiation Patterns을 이용하여 인스턴스(객체)를 만들었다고 한다. Instantiation Patterns은 크게 네 가지 방식으로 분류할 수 있다.

  • Functional Instantiation

    간단히 말해 함수를 사용하여 찍어내는 방식이다. 먼저 함수를 만든 후 함수 내에 빈 객체를 선언해주고, 해당 객체에 속성 및 메서드를 할당해준다. 이후 해당 객체를 리턴한다. Functional Instantiation을 사용할 경우, 함수를 호출할 때마다 생성된 메서드에 접근할 수 있다.
코드 설명
  • Functional Shared Instantiation

    이전의 Functional Instantiation 방식은 새 객체를 생성할 때마다 모든 메서드를 선언된 함수에 복제하기 때문에 각 객체들이 가진 메서드의 갯수만큼의 메모리를 차지하게 된다. 이를 방지하기 위하여 사용되는 Functional Shared Instantiation 방식은 모든 객체 간의 메서드를 공유함으로써, 특정 객체 속 메서드의 메모리 주소만을 참조하기 때문에 보다 효율적인 메모리 사용을 할 수 있다.
코드 설명
  • Prototypal Instantiation

    prototype chain을 사용하여 객체를 생성하는 방식이다. Functional Shared Instantiation와 거의 동일하지만, 빈 객체 대신 Object.create() 메서드를 사용하여 지정된 prototype 객체 및 속성을 가지는 새로운 객체를 생성하게 된다.
코드 설명
  • Pseudoclassical Instantiation

마찬가지로 prototype chain을 사용한다. 새 객체를 찍어낼 때 new 키워드를 사용하며, Prototypal Instantiation 방식을 통해 생성되는 대부분의 기능을 제공한다. Pseudoclassical Instantiation은 새 변수를 선언 후 Object.create()를 할당하는 대신 this를 사용한다. Pseudoclassical은 네 방식 중 가장 많이 쓰는 방식이기 때문에 꼭 기억해야 한다.

코드 설명

📎 자바스크립트에서 Prototype이란?

prototype은 객체의 형태(원형)이라고 볼 수 있다. 객체는 속성을 가지는데 prototype에 담겨있는 속성들은 생성자를 통해서 새로운 객체가 만들어질 때 해당 객체에 연결된다. 자바스크립트에서는 함수와 new 키워드를 통해 클래스 흉내를 낼 수 있다.

function animals() {
  this.ears = 2;
  this.legs = 4;
}

const dog = new animals();
const cheetah = new animals();

console.log(dog.ears);		// 2
console.log(dog.legs);		// 4
console.log(cheetah.ears);	// 2
console.log(cheetah.legs);	// 4
  • 객체 dogcheetah는 공통된 속성을 가지고 있지만, 출력 시 ears와 legs가 두 개씩 총 네 번 할당된다. 이런 경우 객체를 생성하는 횟수가 많아질수록 그만큼의 많은 데이터가 할당이 된다.
function animals() {}

animals.prototype.ears = 2;
animals.prototype.legs = 4;

const dog = new animals();
const cheetah = new animals();

console.log(dog.ears);		// 2
console.log(cheetah.legs);	// 4
  • 보이지는 않지만 animals.prototype이라는 빈 객체가 존재하고, 여기에 속성들을 넣어둔다. new 키워드와 함수 animals를 이용하여 생성된 객체 dogcheetah는 저 빈 객체에 들어있는 속성들을 가져다가 사용할 수 있다.

도움된 글

profile
get, set, go!

0개의 댓글