[Javascript] 생성자 함수(클래스), 객체와 객체 지향 프로그래밍 OOP(Object Oriented Programming)
객체
name과 value로 구성된 정렬되지 않은 property 혹은 method의 집합
객체 내에서의 변수를 '속성(Property)', 함수를 '메소드(Method)'라고 한다.
객체 리터럴
let user = {
name = 'dean';
age = '31';
}
생성자(Constructor) 함수
객체를 생성하는 함수를 생성자 함수라고 한다.
비슷한 객체를 여러개 만들어야 하는 상황에서 쓰는 것
붕어빵 틀이라고 생각하면 된다.
생성자는 객체(this)를 return 한다.
function User(name, age) {
this.name = name;
this.age = age;
}
let user1 = new User('Dean', 31);
let user2 = new User('정글러', 22);
let user3 = new User('후론트엔드', 1);
이 생성자 함수는 실제 다음 순서로 작동한다.
function User(name, age){
this = {} // 빈 객체 생성
this.name = name;
this.age = age;
return this // this를 반환
}
클래스
위 함수형 생성자를 클래스형으로 쓰면 다음과 같다. 기능은 같다. (ES6 이후 class가 추가됨)
class User {
constructor(name, age){
this.name = name;
this.age = age;
}
...
}
let user1 = new User('Dean', 31);
let user2 = new User('정글러', 22);
let user3 = new User('후론트엔드', 1);
객체 지향 프로그래밍
객체를 기준으로 코드를 구현 하는 것이다.
객체 지향 프로그래밍의 이유
서비스가 커지다보면 코드가 복잡해져 유지/보수가 힘들어진다. 이 때 알아보기 쉽게 만들어 유지/보수를 용의하게 하고 똑같이 반복되는 부분의 재활용이 필요하여 생긴 것이 객체 지향 프로그래밍(OOP)이다. OOP는 각각의 목적에 맞는 변수 및 함수들을 모아놓은 Categorizing의 결과라고 할 수 있다.
객체 지향 프로그래밍의 특성
은닉화, 캡슐화(Encapsulation)
변수와 함수를 하나로 묶고 필요에 따라 접근 권한을 나누어 외부에서 함부로 접근하지 못하게 제한하여 객체의 손상을 방지한다.
이에 따라 내부 구현 내용을 감추어 외부에서 확인 할 수 없도록 은닉할 수 있다.
추상화(Abstraction)
공통적인 변수와 함수들을 따로 묶어 객체를 정의하는 과정이다. 클래스화 하는 것이 추상화 하는 것이다.
다형성(Polymorphism)
같은 객체임에도 상황에 따라 다르게 동작 할 수 있다.
- 오버로딩(Overloading) : 같은 이름의 함수명을 가지면서 매개 변수의 타입과 개수를 다르게 만들어 쓸 수 있다.
int sum(int n1, int n2) {
return n1 + n2;
}
int sum(int n1, int n2, int n3) {
return n1 + n2 + n3;
}
- 오버라이딩(Overriding) : 부모 객체가 가지고 있는 함수를 자식 객체가 해당 함수를 재정의해서 사용할 수 있다.
class Person {
eat() {
console.log("밥 먹을거야");
}
}
class Kim extends Person {
eat() {
console.log("난 밥 싫어 라면 먹을거야");
}
}
let kim = new Kim();
kim.eat(); // 난 밥 싫어 라면 먹을거야
상속(Inheritance), 재사용
자식 객체가 부모 객체의 변수와 함수를 그대로 물려 받을 수 있는 것을 뜻한다.
단순히 물려받는 것이라면 의미가 없다. 기존의 로직을 수정하고 변경해서 파생된 새로운 객 체를 만들 수 있게 해준다.
상속은 생성자(=클래스)를 이용하며, 직접 property, method를 정의할 수도 있고, prototype을 이용할 수도 있다.
'프로그래밍 > Javascript & React' 카테고리의 다른 글
[Javascript] this 용법 정리 (0) | 2022.01.16 |
---|---|
[Javascript] 프로토타입(Prototype), 그래서 왜 쓰는데? (0) | 2022.01.15 |
[Javascript] Javascript 특징 및 웹 워커(멀티 스레드) (0) | 2022.01.14 |
[Javascript] 렉시컬 스코프(Lexical Scope), 스코프 체인(Scope Chain), 클로저(Closure) (0) | 2022.01.13 |
[21/11/27] TIL_onClick 무한 렌더링, (0) | 2021.11.27 |
댓글