데이터와 기능을 한 곳에 묶어서 처리
클래스
속성과 메소드가 하나의 "객체"에 포함됨
(사람이 세계를 보고 이해하는 방법과 매우 흡사함)
코드를 추상화하여 직관적으로 생각할 수 있기 때문에, 이미 오래 전부터 프로그래밍 방법론으로 매우 빠르게 적용되었습니다.
클래스
와 인스턴스
라는 용어를 이해할 수 있다.new 키워드
의 사용법을 이해할 수 있다.class 키워드
의 사용법을 이해할 수 있다.캡슐화
상속
추상화
다형성
Prototype
이 무엇인지 이해할 수 있다클래스 상속의 원리
를 이해할 수 있다.Prototype chain
을 이해하고 설명할 수 있다. __proto__
속성(property)
이라는 용어는 '키-값 쌍'을 의미합니다.속성 추가/수정/삭제
방법객체 내에 메소드를 호출하는 방법
메소드 호출 방식을 이용할 때에는
화살표 함수
를 쓰지 않습니다.
하나의 모델이 되는 청사진을 만들고, 그 청사진을 바탕으로 한 객체(인스턴스)를 만드는 프로그래밍 패턴
객체를 생성하기 위한 아이디어 또는 청사진
일반명사
,대문자
로 시작
일반 함수 선언시, 함수명을
동사
로 시작하는 것이 이 둘을 구분하기에 좋다.
new 연산자
청사진을 바탕으로 한 객체
각각의 인스턴스는 클래스의 고유한 속성
과 메소드
를 갖게 됩니다.
새로운 인스턴스 객체를 만드는 방법
'인스턴스 객체'(자기 자신)
지금 단계에선 조금 어설프게 알아도 괜찮다.
// Class : 청사진을 만드는 함수
function House(kind) {}
// Instance : 인스턴스 생성(함수 실행 방법)
// '아파트', '빌라', '단독주택' 인스턴스 생성
// 즉시, 생성자 함수 실행 => 변수에 인스턴스 할당
let apartment = new House('apartment');
let villa = new House('villa');
let house = new House('house');
// Class 생성
function Apartment (brand, floor, color) {
/* 인스턴스가 만들어질 때 실행되는 코드 */
}
// Class 생성
class Apartment {
// 생성자 함수
constructor(brand, floor, color){
/* 인스턴스가 만들어질 때 실행되는 코드 */
}
}
인스턴스가 만들어질 때(초기화될 때) 실행되는 코드
인스턴스의 세부사항(속성)을 정의
함수에 인자
를 넣듯, 생성자 함수에 인자로속성
을 넣어준다.
리턴값
을 갖지 않음
해당 인스턴스 객체의 속성을 할당한다
인스턴스를 호출했을 때, 가장 먼저 실행되는 것이 constructor다.
클래스
에 속성과 메소드를 정의하고, 인스턴스
에서 사용함
정보
객체에 딸린 함수
// Class 생성
function Apartment (brand, floor, color) {
/* 인스턴스가 만들어질 때 실행되는 코드 */
this.brand = brand;
this.floor = floor;
this.color = color;
}
// Class 생성
class Apartment {
// 속성 정의
// 생성자 함수
constructor(brand, floor, color){
/* 인스턴스가 만들어질 때 실행되는 코드 */
this.brand = brand;
this.floor = floor;
this.color = color;
}
}
만들어지는 인스턴스 객체를 가리킴
prototype 키워드
// Class 생성
function Apartment (brand, floor, color) {
/* 인스턴스가 만들어질 때 실행되는 코드 */
this.brand = brand;
this.floor = floor;
this.color = color;
}
// Method 정의
Apartment.prototype.clean = function() {
// '아파트 청소'를 구현하는 코드
}
Apartment.prototype.maintain = function() {
// '하자 보수'를 구현하는 코드
}
constructor, this
// Class 생성
class Apartment {
// 속성 정의
// 생성자 함수
constructor(brand, floor, color){
/* 인스턴스가 만들어질 때 실행되는 코드 */
this.brand = brand;
this.floor = floor;
this.color = color;
}
// Method 정의
clean() {
// '아파트 청소'를 구현하는 코드
}
maintain() {
// '하자 보수'를 구현하는 코드
}
}
class
를 만들 때 쓰는 원형 객체
인스턴스
가 초기화될 때 실행하는 생성자 함수
인스턴스의 세부사항(속성)을 정의
함수에 인자
를 넣듯, 생성자 함수에 인자로속성
을 넣어준다.
함수가 실행될 때, 해당 scope마다 생성되는 고유한 실행 context(execution context)
new 키워드로 인스턴스를 생성했을 땐, 해당 인스턴스가 this의 값이 됨
// 속성과 메소드를 '인스턴스'에서 사용
let prugio = new Apartment('prugio', 30, 'blue');
let raemian = new Apartment('raemian', 33, 'green')
let hyundai = new Apartment('hyndai', 22, 'indianred');
데이터와 기능(속성과 메소드)을 한 객체에 묶는 것
보안 관련된 거라기 보단,
다른 코드가 내 코드에 영향을 미치지 않게 만들어 놓은 것.
A 객체가 B객체에 영향을 미치려면, 메소드를 호출시켜야 하는 것이지,
속성이나 메소드를 직접 공유하면 안 된다.
내부 데이터 or 구현에 대해 외부로 노출시키지 않게 만드는 것
인스턴스 B 메소드를 사용한다고 해서,
인스턴스 A 속성이 변하지 않는다는
확신을 갖고 개발을 할 수 있다
코드만 보고도 인스턴스 객체의 기능을 상상할 수 있게 작성하는 것
(코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아님)
인터페이스의 단순화
내부 구현은 아주 복잡한데 실제로 노출되는 부분은 단순하게 만든다.
부모 클래스의 특징을 자식 클래스가 물려받는 것
같은 이름을 가진 메소드라도 조금씩 다르게 작동하는 것
하나의 클래스에서 구현에 따라 인스턴스의 속성과 메소드가 다르다.
// ES5
function Car(brand, name, color){
this.brand = brand;
this.name = name;
this.color = color;
}
Car.prototype.drive = function(){
console.log(this.name + '가 운전을 시작합니다');
}
let avante = new Car('hyndai', 'avante', 'white');
avante.color; // 'white'
avante.drive(); // 'avante가 운전을 시작합니다'
// ES6
class Car {
constructor(brand, name, color) {
this.brand = brand;
this.name = name;
this.color = color;
}
drive(){
console.log(this.name + '가 운전을 시작합니다')
}
}
let avante = new Car('hyundai', 'avante', 'white');
avante.color;
avante.drive();
// Car: class
// this 객체: 이 예제에서는 avante === this
// constructor: 생성자 함수
// Car.protoype(prototype 객체): 여기에 속성이나 메소드를 정의함
// avante: 인스턴스