클래스, 인스턴스, 객체
클래스(Class)
- 객체를 만들어 내기 위한 설계도(틀)
- ES5 에서 클래스는 함수로 정의
function Person(name, age, nationality) {
// 인스턴스가 만들어질 때 실행되는 코드
// 속성
this.name = name;
this.age = age;
this.nationality = nationality;
// 클래스
Person.prototype.learn = function() {
}
}
- ES6 에서 클래스는 class 라는 키워드를 이용해서 정의
class Person {
constructor(name, age, nationality) {
// 인스턴스가 만들어질 때 실행되는 코드
// 속성
this.name = name;
this.age = age;
this.nationality = nationality;
}
// 클래스
learn() {
}
}
- 위의 함수는 생성자 함수라고 하며, 인스턴스가 만들어질 때 실행됨
- 생성자 함수는 return 값을 만들지 않음
객체 (Object)
- 소프트웨어 세계에 구현할 대상
- 클래스에 선언된 모양 그대로 생성된 실체
- 특징
- '클래스의 인스턴스'라고도 부름
- 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 가짐
인스턴스(Instance)
- 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체
- 객체를 소프트웨어에 실체화한 것 -> 실체화된 인스턴스는 메모리에 할당됨
- 특징
- 인스턴스는 객체에 포함된다고 볼 수 있다.
- 객체 지향 프로그래밍의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부름
- 어떤 원본(추상적인 개념)으로부터 생성된 복제본을 의미
- 인스턴스를 만들 때는 new라는 키워드를 사용
- 인스턴스가 초기화될 때 생성자 함수가 즉시 실행되고, 변수에 클래스의 설계를 가진 새로운 객체인 인스턴스가 할당됨
- 각각의 인스턴스는 클래스에서 정의된 고유한 속성과 메서드를 가짐
let sam = new Person('Sam', '23', 'Republic of Korea');
let emily = new Person('Emily', '27', 'France');
객체 지향 프로그래밍 (OOP)
객체 지향 프로그래밍이란?
- 클래스를 만들고, 클래스를 바탕으로 한 객체(인스턴스)를 만드는 프로그래밍 패턴
- 필요한 데이터를 추상화시켜 속성(상태)와 메서드(행위)를 가진 객체를 만들고 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법
- 자바스크립트는 객체 지향 언어는 아니지만 객체 지향으로 작성 가능
- 클래스는 객체를 만들기 위해 생성자(constructor) 함수를 포함 -> 생성자를 통해 속성을 넣으면 객체가 됨
- 절차 지향에 비해 재활용성이 높고, 코드 이해와 디버깅이 쉬운 편
OOP의 4가지 특징
1. 캡슐화 (Encapsulation)
데이터와 코드의 형태를 외부로부터 알 수 없게 하고, 데이터(속성)의 구조와 역할, 기능(메서드)을 하나의 캡슐 형태로 만드는 방법(정보 은닉)
- 캡슐화 방법
- 접근 제어자 private 사용 -> js에서 잘 사용되지 않음
- getter/setter를 활용한 메서드
let user = {
name: "John",
surname: "Smith",
get fullName() {
return `${this.name} ${this.surname}`;
},
set fullName(value) {
[this.name, this.surname] = value.split(" ");
}
};
// 주어진 값을 사용해 set fullName이 실행됩니다.
user.fullName = "Alice Cooper";
alert(user.name); // Alice
alert(user.surname); // Cooper
2. 추상화 (Abstraction)
클래스들의 공통적인 특성(속성, 메서드)들을 묶어서 표현하는 것
속성과 메서드의 이름만 노출시켜서 사용의 단순화
내부의 구현은 복잡하지만 실제로 노출되는 부분은 단순함
- 인터페이스
- 클래스 정의 시 속성과 메서드만 정의한 것
- 클래스에서 구현부가 빠졌다고 이해하면 편함
- 실질적인 구현은 구현한다고 선언하는 클래스에서 이루어짐
// TypeScript
interface Shape {
getArea(): number;
}
class Rect implements Shape {
width : number;
height: number;
constructor(width, height) {
this.width = width;
this.height = height;
}
} // error: Class 'Rect' incorrectly implements interface 'Shape'. Property 'getArea' is missing in type 'Rect'.
3. 상속 (Inheritance)
부모 클래스에 정의된 속성 및 메서드를 자식 클래스에서 상속받아 사용하는 것
extends, super라는 키워드 사용
4. 다형화 (Polymorphism)
똑같은 메서드여도 객체마다 다른 방식으로 구현될 수 있음
메시지에 의해 객체가 연산을 수행하게 될 때, 하나의 메시지에 대해 각 객체가 가지고 있는 고유한 방법으로 응답할 수 있는 능력
- 오버로딩 : 하나의 클래스 안에서 같은 이름의 메서드를 여러개 정의하는 것
- 오버라이딩 : 부모 클래스로부터 상속받은 메서드 내용을 변경하여 사용하는 것
참고 :
https://gmlwjd9405.github.io/2018/09/17/class-object-instance.html
https://xangmin.tistory.com/152
https://ko.javascript.info/property-accessors
https://hyunseob.github.io/2016/10/17/typescript-interface/
'Web' 카테고리의 다른 글
[JavaScript] 비동기 처리 asynchronous programming (0) | 2022.09.26 |
---|---|
[JavaScript] 프로토타입 (0) | 2022.09.22 |
[JavaScript] 고차 함수, 내장 고차 함수 (0) | 2022.09.20 |
[JavaScript] 원시 타입(Primitive Type)과 참조 타입(Reference Type) (0) | 2022.09.06 |
[CSS] CSS Selector (0) | 2022.09.04 |