객체지향프로그래밍 (Object-Oriented Programming ) 은
말 그대로 객체를 이용한 프로그래밍이란 뜻이다.
객체 지향 프로그래밍은 프로그램 구현에 필요한 객체를 파악하고
각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것을 말한다.
객체는 클래스라는 틀에서 생겨난 오브젝트 (instance)이다.
따라서 객체지향 프로그래밍은 객체와 객체간의 연결로 되어 있으며
각각의 객체안에 자료구조와 알고리즘이 들어있는 것이다.
결과적으로 그렇게 생성된 객체를 이용하여 문제를 해결하는 Bottom-up 방식으로 이루어진다.
class란, 위에서도 말했듯이 오브젝트가 생성되기 위한 틀이라고 할 수 있다.
특히 비슷한 오브젝트를 효율적으로 계속해서 찍어내는데에 잘 쓰일 수 있다.
함께 등장하는 constuctor 와 new 키워드가 있다, 함께 공부하면 효과가 좋다.
instance는 간단하다, class 로부터 생성되는 object 라고 생각하면 된다.
class 가 생성되고, 그 객체 안에 들어가는 각각의 object 가 바로 instance 이다.
class world { // <- class
constructor (b) {
this.a = "b"; // <- instance
}
}
new 키워드는, class 와 함께 사용된다고 생각하면 될것같다.
class 가 생성되고, 그 class라는 틀을 이곳저곳에서 사용하게 될텐데,
그때, 본체인 class를 가져가는것이 아니라, 새로운 class를 복제하여 사용한다.
이때 사용하는 키워드가 new이고, 그 뒤에는 class의 name 이 들어간다.
class world {
constructor (b) {
this.a = "b";
}
}
var hello = new world (c) // <- new
앞서 확인했던 1번 2번에 대해 어느정도 이해를 했고, 예시로 든 코드가 이해가 된다면
class의 사용법을 알 수 있을것이다. 대신, class 뿐만 아니라, constructor 와 this 키워드에 대해서도
어느정도 이해가 있어야 class 문법을 사용할 수 있다.
constructor: 상속받은 instance 를 표기하고, 가져오는 역할을 한다.
this: 객체 안에서, 새로 생성되는 class의 object를 만드는 역할을 한다.
현실세계의 모델이라.. 나는 게임으로 한번 만들어 보겠다.
내가 자주하던 게임이 있다, 바로 ' OverWatch (오버워치) ' 란 게임이다.
이 게임에서는 영웅이 기본공격과 각자의 고유의 스킬을 이용하여, 상대를 쓰러트리는 게임이다.
만약, 내가 이 게임에 대한 인벤사이트 (게임정보제공사이트) 를 제작해보고 싶어졌다.
그러려면 각 영웅에 대한 정보를 데이터베이스 식으로 정리하여 보관해야한다.
자, 그렇다면 우리는 class 를 이용하여 어떻게 작업을 해야할까?
$ 1. class 만들기
class hero { } // hero라는 class를 만들었다, class name의 앞은 소문자가 오게 한다.
$ 2. 영웅의 고유스킬 정보 삽입하기
class hero {
constructor (main, sub, ultimate) {
this.a = main;
this.b = sub;
this.c = ultimate;
}
}
var 둠피스트 = new hero ('라이징어퍼컷', '로켓펀치', '파멸의일격')
var 맥크리 = new hero ('섬광탄', '구르기', '황야의무법자')
var 겐지 = new hero ('질풍참', '튕겨내기', '용검')
...
var 라인하르트 = new hero ('화염강타', '돌진', '대지분쇄')
$ 3. 출력 확인
class hero {
constructor (main, sub, ultimate) {
this.a = main;
this.b = sub;
this.c = ultimate;
}
}
var 둠피스트 = new hero ('라이징어퍼컷', '로켓펀치', '파멸의일격')
var 맥크리 = new hero ('섬광탄', '구르기', '황야의무법자')
var 겐지 = new hero ('질풍참', '튕겨내기', '용검')
...
var 라인하르트 = new hero ('화염강타', '돌진', '대지분쇄')
console.log(둠피스트) // hero {a: "라이징어퍼컷", b: "로켓펀치", c: "파멸의일격"}
console.log(맥크리) // hero {a: "섬광탄", b: "구르기", c: "황야의무법자"}
console.log(겐지) // hero {a: "질풍참", b: "튕겨내기", c: "용검"}
...
console.log(라인하르트) // hero {a: "화염강타", b: "돌진", c: "대지분쇄"}
$ 1. 캡슐화 (encapsulation)
실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.
객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하는 것
코드가 묶여있어서 오류가 없어 편리하다.
데이터를 보이지 않고 외부와 상호작용을 할 때는 메소드를 이용하여 통신을 한다.
보통 라이브러리로 만들어서 업그레이드해 사용할 수 있다.
$ 2. 상속 (inheritance)
하나의 클래스가 가진 특징(함수, 데이터)을 다른 클래스가 그대로 물려받는 것
이미 작성된 클래스를 받아서 새로운 클래스를 생성하는 것
기존 코드를 재활용해서 사용함으로써 객체지향 방법의 중요한 기능 중 하나에 속한다.
$ 3. 추상화 (abstraction)
객체들의 공통적인 특징(기능, 속성)을 도출하는 것
객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다.
(클래스가 없는 객체지향 언어도 존재 ex.JavaScript)
$ 4. 다형성 (polymorphism)
약간 다른 방법으로 동작하는 함수를 동일한 이름으로 호출하는 것
동일한 명령의 해석을 연결된 객체에 의존하는 것
오버라이딩(Overriding), 오버로딩(Overloading)
오버라이딩(Overriding)
- 부모클래스의 메소드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의하는 것
오버로딩(Overloading)
- 같은 이름의 함수를 여러 개 정의한 후 매개변수를 다르게 하여 같은 이름을 경우에 따라 호출하여 사용하는 것
prototype은 자바스크립트의 객체지향을 지탱하고 있는 핵심 개념이기도 하고
자바스크립트를 일반적인 객체지향언어와 구분하는 중요한 개념이다.
prototype을 번역하자면 '원형' 이라는 뜻을 가지고 있다.
자바스크립트는 prototype을 통해 '상속'이라는 개념을 제공한다.
prototype의 의미는 무엇인가? 자동적으로 생성되는 속성 값이다.
즉, 객체들이 모두 그 prototype을 참조한다.
prototype을 사용하지 않으면, 우리가 생성한 객체가 constructor를 참조할 때 마다,
우리가 정의한 함수 부분을 반복적으로 출력해야 한다. 객체가 한 두 가지라면 상관이 없겠으나,
수 백 수 천 개라고 가정한다면 상당한 비효율이 발생할 것이다. 트래픽, 성능의 비효율 뿐만 아니라
코드 또한 지저분 해질 수 있다.
따라서 이러한 비효율의 발생을 방지하기 위해, 함수를 지정할 때 prototype이라는 고유의 속성 값을 지정해줌으로서, 객체를 생성할 때 마다 그 객체는 이미 지정된 prototype에 속한 함수 값만 참조하면
되게 되는 것이다. 이러한 과정을 통해서 성능을 절약할 수 있고, 수정 사항이 발생했을 때
즉각적으로 처리하기도 쉬워진다.