객체지향 프로그래밍
클래스(Class), 객체(Object), 인스턴스(Instance), 생성자(Constructor), es6 Class
- 클래스와 객체
- 클래스의 정의: 객체의 속성과 행위를 정의해 놓은것
- 클래스의 용도: 객체를 생성하는데 사용, 객체 생성에 사용되는 패턴 혹은 청사진일 뿐이며, new 연산자를 통한 인스턴스화 과정이 필요
- 객체의 정의: 실제로 존재하는 것
- 객체의 용도: 객체의 속성과 기능에 따라 다름
- 클래스를 정의하고 클래스를 통해 객체를 생성하는 이유는 설계도를 통해 제품을 만드는 이유와 같다 - 객체와 인스턴스
- 객체는 인스턴스를 포함하는 일반적인 의미
- 인스턴스화: 클래스로부터 인스턴스를 생성하는 것
- 클래스 > 인스턴스화 > 인스턴스(객체) - 객체의 구성요소
- 객체는 다수의 속성과 기능의 집합이며, 속성과 기능을 객체의 멤버라고 한다.
- 속성(property) : 멤버변수(variable), 특성(attribute), 필드, 상태(statue)
- 기능(function) : 메소드(method), 함수(function), 행위 - 인스턴스의 생성
- 클래스명 참조변수명 = new 클래스명();
- 클래스의 객체를 참조하기 위한 참조변수를 선언하고 객체를 생성 후, 객체의 주소를 참조변수에 저장한다.
- 인스턴스 초기화: 인스턴스 변수에 적절한 값을 저장하는 것이다. - 생성자 (Constructor)
- 인스턴스가 생성될 때 마다 호출되는 ‘인스턴스 초기화 메소드’
- 인스턴스 변수의 초기화 또는 인스턴스 생성 시 수행할 작업에 사용
- 몇가지 조건을 제외하고는 메소드와 같다
- 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.
- 생성자의 이름은 클래스의 이름과 같아야 한다
- 생성자는 리턴값이 없다
- this.name = name; 같은 프로퍼티 모아 놓은 Person() 같은 것들..
생성자 함수(Constructor)가 있을때, new 연산자를 써서 인스턴스(instance)를 만들면 생성자함수의 prototype 이라고 하는 프로퍼티가 인스턴스의 __proto__ 라는 프로퍼티에 전달 된다.
클래스 기반 vs 프로토타입 기반
자바스크립트는 프로토타입 기반 객체지향 언어이기 때문에
클래스가 필요없는 프로그래밍 스타일로 프로토타입 체인과 클로저 등으로 객체 지향 언어의 상속, 캡술화 등의 개념을 구현할 수 있다.
클래스 개념이 없고 별도의 객체 생성 방법이 존재한다.
자바스크립트에서 객체를 만드는 방법?
- 객체 리터럴
- new Object 생성자 함수
- 생성자 함수, 프로토타입
- es6 Class 함수 https://poiemaweb.com/es6-class



es6의 class
class Foo() {
// constructor 를 생략하면 초기화에 빈 객체를 생성
constructor(name) {
this.name = name;
}
}getter/setter
getter : 속성의 값을 얻어오는 메소드
클래스 프로퍼티에 접근할 때마다 클래스 프로퍼티의 값을 조작하는 행위가 필요할 때 사용, 메소드 이름 앞에 get 키워드를 사용해 정의함, 이 때 메소드 이름은 클래스 프로퍼티 이름 처럼 사용됨, getter는 이름 그대로 무언가를 취득할 때 사용하므로 반드시 무언가를 반환해야 함
setter: 속성의 값을 설정하는 메소드
클래스 프로퍼티에 값을 할당할 때마다 클래스 프로퍼티의 값을 조작하는 행위가 필요할 때 사용, 메소드 이름 앞에 set 키워드 사용하여 정의
static
정적 메소드, 인스턴스로 호출 할 수 없으며, 따라서 this도 사용할 수 없음
Math 객체의 메소드 처럼 어플리케이션 전역에서 사용할 유틸리티 함수를 생성할 때 주로 사용한다.
상속
- 의사 클래스 패턴 상속(클래스 기반 언어의 상속 방식을 흉내 내는 것)
Child.prototype = new Parent();
// 자식 생성자 함수의 프로토타입 객체를 부모 생성자 함수의 인스턴스로 교체
- 프로토타입 패턴 상속
// create 함수의 인수는 프로토타입이다.
var child = Object.create(Parent.prototype);
