객체지향 프로그래밍
- 객체
- 객체의 상태를 나타내는 변수
- 객체의 행동을 나타내는 함수
객체 생성
객체 생성 방법
const object = { attr1: 'a', attr2: 'b', // 프로퍼티 func(a) { console.log(`${this.attr1}`); // this는 자기 자신 객체 가리킴 }, };
Factory Function
객체를 생성하는 함수를 따로 만들어 줌.
function createObject(attr1, attr2) { const object = { attr1: attr1, attr2: attr2, // 프로퍼티 func(a) { console.log(`${this.attr1}`); // this는 자기 자신 객체 가리킴 }, }; return object; } // 위에거 축약 function createObject(attr1, attr2) { const object = { attr1, attr2, // 프로퍼티 func(a) { console.log(`${this.attr1}`); // this는 자기 자신 객체 가리킴 }, }; return object; } obj1 = createObject('a', 'b') // 객체 편하게 생성 가능
Constructor Function (생성자 함수)
생성자 함수를 정의 & new 연산자 사용
function Object(attr1, attr2) { // 함수를 통해서 객체 생성 가능 this.attr1 = attr1; // this : constructor function으로 생성한 객체 this.attr2 = attr2; this.f = function(a) { .. }; } const obj = new Object('a', 'b') // 반드시 new를 붙여주어야 함.
Class
class를 정의하여 객체 생성 가능
class Object { constructor(attr1, attr2) { // 생성자 안에서는 프로퍼티 this.attr1 = attr1; this.attr2 = attr2; } f(a) { // 메서드는 생성자 밖에서 선언 ... } } const obj = new Object('a', 'b')
객체지향 프로그래밍
추상화
- 구체적인 존재를 간략화해서 나타내는 것
- 클래스명, 프로퍼티명, 메소드명을 잘 정하는 것이 중요
- 코드에 코멘트나 별도의 문서를 두어 잘 이해할 수 있도록 하는게 중요
캡슐화
객체의 특정 프로퍼티에 직접 접근하는 것을 막음
class object { constructor() { this.attr1 = "attr"; } set attr1(arg) { // setter, attr1 프로퍼티 값 수정할때 이상한 값 넣었는지 체크 if (arg === 'a') { this._attr1 = arg; // _가 붙은 프로퍼티에 값 넣어줌(숨긴 프로퍼티) } else { throw new Error('value error'); } } get attr1() { // getter 메서드 return this._attr1; // 리턴값은 원하는대로 수정 가능 // return `attr1 : ${_attr1}`; } } obj = new object(); obj.attr1 = 'a'; // setter 호출 console.log(obj.attr1) // getter 호출
상속
class object { constructor(a) { this.attr1 = a; } } class obj_child extends object { constructor(a, b) { super(a); // 상속 시에는 부모 클래스의 생성자를 super를 통해 반드시 호출 this.attr2 = b; } }
다형성
많은 형태를 갖는 성질
오버라이딩 : 원래 정의된 부모 클래스의 메소드를 덮어씌움
하나의 변수가 다양한 종류의 객체 접근 가능
class object { constructor(a) { this.attr1 = a; } f(a) { console.log("parent:"+a); } } class obj_child extends object { constructor(a) { super(a); } f(a) { console.log("child:"+a); } } let p_arr = [new object(10), new obj_child(10)]; p_arr.forEach((element) => { element.f(10); // object, obj_child 두개 다 접근 가능 });
클로저(Closure)
function createObject(a) {
let outera = a; // outera는 외부에서 사용 불가능
function f() { // f는 외부에서 호출 불가능
}
const obj = { // 객체 내부에서는 outera, f 사용하더라도 보존됨.
get a() {
return outera;
},
set a(newa) {
outera = newa;
}
}
}
- 클로저 : 어떤 함수와 그 함수가 참조할 수 있는 값들로 이루어진 환경을 하나로 묶은 것
- 즉, outera는 외부에서는 obj.a를 통해서만 읽을 수 있다.
JavaScript
부모 클래스의 메소드 사용
- super.메소드()
class obj {
constructor(a) {
this.a = a
}
f(a) {
console.log("parent->f")
}
}
class obj_child extends obj {
constructor(a) {
super(a);
}
f(a) {
super.f(a)
}
}
현재 변수의 클래스 확인
- instanceof 연산자 사용
- child가 parent를 상속한 경우
- child instanceof parent ⇒ True
- child instanceof child ⇒ True
- parent instanceof child ⇒ False
- instanceof를 활용한 분기문보다는 다형성을 활용하여 메소드 구성하는게 더 나음
변수 instanceof 클래스 // ==> 변수가 클래스인 경우에만 True
Static 프로퍼티 / Static 메서드
- 클래스에 직접적으로 달려있는 프로퍼티와 메서드
class Calculator {
static i = 0;
static sum(a, b) {
return a + b;
}
}
Calculator.i; // 0
Calculator.sum(3, 5); // 8
/* 프로퍼티 추가&변경 / 메서드 추가 가능 */
Calculator.i = 10;
Calculator.minus = function(a, b) {
return a - b;
}
'Language > JavaScript' 카테고리의 다른 글
[ JavaScript ] Json (0) | 2021.08.01 |
---|---|
[ JavaScript ] 웹 기초 (0) | 2021.07.31 |
[ JavaScript] 배열, 모듈 (0) | 2021.07.29 |
[ JavaScript ] 함수, 표기법, 예외 처리 (0) | 2021.07.29 |
[ JavaScript ] 데이터 타입 (0) | 2021.07.29 |