이력
- 2022.03.22 6절까지 포스팅
- 2022.03.24 10절까지 포스팅
모든 내용을 상세히 담으려 하지 않았습니다.
제가 모르는 부분이나, “이런 것도 있었어?” 하는 부분, 중요하다고 생각되는 부분,
다시 한번 되새기고 싶은 부분만 기록했습니다.
읽어주셔서 감사합니다.
28.1 객체 지향 프로그래밍 개요
1
2
3
4
5
6
7
| function sports() {
this.value = 123;
function getValue() {
return this.value;
}
return getValue();
}
|
- 위와 같은 형태의 코드는 sports를 호출하지 않으면 getValue()가 생성되지 않으므로 효율적입니다. 하지만 sports를 호출할 때 마다 getValue 함수를 Function 오브젝트로 생성합니다.
1
2
3
4
5
6
7
| function sports() {
this.value = 123;
getValue: function() {
return this.value;
}
return getValue();
}
|
- 위와 같은 형태의 코드는 렌더링 될 때 sports 안의 getValue에 의해 function 오브젝트를 생성합니다. 사호출하지 않더라도 생성되므로 비효율적입니다. 하지만 호출할때 마다 생성하지는 않습니다.
- 두 형태의 장단점을 고려하여 설계(개발)해야 합니다.
28.2 객체 지향의 주요 개념#
28.3 오브젝트에 오브젝트 연결#
- js에서 네이티브 오브젝트를 제외하고 프로퍼티를 포함시킬 수 있는 오브젝트는 {name: value} 형태와 Function 오브젝트입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| var baseball = {
value: 123,
getValue: function() {
return this.value;
}
}
var sports = {
value: 456,
getValue: function() {
return this.value;
},
baseball: baseball
}
js.log(sports.getValue());
// 456
js.log(sports.baseball.getValue());
// 123
debugger;
|
28.4 오브젝트에 인스턴스 연결#
1
2
3
4
5
6
7
8
9
10
11
12
13
| function Swim() {
this.value = 123;
}
Swim.prototype.getValue = function() {
return this.value;
}
var sports = {
player: 1,
swim: new Swim()
}
js.log(sports.swim.getValue());
// 123
|
28.5 오브젝트 병합#
- 프로퍼티를 사용하여 구조적으로 오브젝트를 연결하면 경로를 지정하여 함수를 호출해야 합니다. 오브젝트를 병합하면 프로퍼티를 사용하여 구조적으로 접근하지 않고 this로 메소드를 호출하거나 프로퍼티 값을 얻을 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| var baseball = {
value: 123,
getValue: function() {
return this.value;
}
}
var sports = {
value: 456,
setValue: function(param) {
this.value = param;
}
}
js.log(sports.value);
for (var name in baseball) {
sports[name] = baseball[name];
}
js.log(sports.getValue());
|
28.6 Object.create()로 오브젝트 상속#
구분 | 타입 | 데이터(값) |
---|
object | Object | Object |
파라미터 | Object | 오브젝트 |
파라미터 | Object | 프로퍼티(옵션) |
반환 | Object | 생성한 인스턴스 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| var baseball = {
value: 123,
getValue: function() { return this.value};
setValue: function(param) { this.value = param}
}
var sports = Object.create(baseball, {
value: {
value: 456,
writable: true
},
getValue: {
value: function() {return this.value}
}
};
debugger;
js.log(sports.getValue());
// 456
sports.setValue(789);
js.log(sports.getValue());
// 789
|
1
2
3
4
5
6
7
8
9
10
| 상속 구현 순서 및 방법
1. 새로운 Object 인스턴스를 생성합니다.
- {nameL value} 형태의 인스턴스를 생성합니다. __proto__도 같이 생성합니다.
2. 두 번째 파라미터인 프로퍼티를 인스턴스 프로퍼티로 설정합니다.
- 인스턴스 프로퍼티이므로 구조적으로 __proto__ 위에 설정됩니다.
3. 첫 번째 파라미터인 baseball 오브젝트를 인스턴스로 생성합니다.
- baseball 오브젝트를 생성할 때 빌트인 Object의 prototype에 연결된 __proto__에 설정됩니다.
4. 생성한 인스턴스를 __proto__에 설정합니다.
- 3번에서 생성한 인스턴스가 1번에서 생성한 인스턴스의 __proto__를 지울 수 있습니다. 하지만 둘다
빌트인 Object의 prototype에 연결된 프로퍼티로 생성되므로 문제가 되지 않습니다.
|
28.7 프로토타입 체인#
- 다수의 인스턴스가 prototype을 매개체로 연결된 형태를 프로토타입 체인 이라고 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
| function Soccer() {
this.member = 123;
}
Soccer.prototype.getMember = function() {
return this.member;
}
function Sports() {
this.member = 456;
}
Sports.prototype = new Soccer();
var sportsObj = new Sports();
js.log(sportsObj.getMember());
debugger
|
1
2
3
4
5
6
7
8
9
| Fcuntion 오브젝트 상속
1. Soccer Function 오브젝트를 생성합니다.
2. Sports Function 오브젝트를 생성합니다.
3. Soccer Function 오브젝트의 prototype에 프로퍼티를 연결합니다.
- prototype에 할당하는 것은 실행단계에서 수행됩니다. 따라서 이 단계 앞에서 new Soccer()를 실행하여
인스턴스를 생성하더라도 getMember를 호출할 수 없습니다.
4. Sports 오브젝트의 prototype에 new 연산자로 Soccer 인스터스를 생성하여 설정합니다.
5. Sports 인스턴스를 생성하여 sportsObj에 할당합니다.
슈퍼 클래스와 서브 클래스는 객체 지향 용어로 서브 클래스에서 슈퍼 클래스를 상속받습니다. Sports 오브젝트에서 Soccer 오브젝트를 상속받으므로 Soccer 오브젝트가 슈퍼 오브젝트(클래스)되고 Sports 오브젝트가 서브 오브젝트(클래스)가 됩니다.
|
- 변수 검색은 함수 밖으로 나가지만, 검색 우선수위는 인스턴스를 벗어나지 않습니다.
28.8 슈퍼 오브젝트 메소드 호출#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| function Soccer() {
this.member = 123;
}
Soccer.prototype.getMember = function() {
return this.member + ': Soccer';
}
function Sports() {
this.member = 456;
}
Sports.prototype = new Soccer();
Sports.prototype.getMember = function() {
return 'sports';
}
var sportsObj = new Sports();
js.log(sportsObj.getMember());
js.log(Soccer.prototype.getMember.call(sportsObj));
// sports
// 456: Soccer
|
1
2
3
4
5
6
7
| 실행 순서, 방법
1. Soccer Function 오브젝트를 생성합니다.
2. Sports Function 오브젝트를 생성합니다.
3. Soccer Function 오브젝트의 prototype에 프로퍼티를 연결합니다.
4. Sports 오브젝트의 prototype에 new 연산자로 Soccer 인스턴스를 생성하여 설정합니다.
5. Sports Function 오브젝트의 prototype에 프로퍼티를 연결합니다.
6. Sports 인스턴스를 생성하여 sportsObj에 할당합니다.
|
- 생각해 볼 것이 세 가지 있습니다.
- a. Soccer.prototype의 getMember를 호출하지만 sportsObj의 인스턴스 프로퍼티 값을 사용한다는 것입니다. 함수명은 동일 하지만 처리가 다른 함수를 가진 오브젝트들이 있을경우 사용할 수 있습니다
- b. 호출된 메소드가 속한 오브젝트의 프로퍼티를 사용하려면 인스턴스를 생성해 호출해야 된다는 것입니다.
- c. 따라서 아래의 코드는 프로퍼티를 사용할 수 없으므로 undefined를 반환합니다.
1
2
3
4
| Soccer.prototype.getMember();
Soccer.prototype.getMember.call();
Soccer.prototype.getMember.call(Soccer);
Soccer.prototype.getMember.call(Sports);
|
28.9 Object.create()로 Function 오브젝트 상속#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| function Soccer() {
this.member = 123;
}
Soccer.prototype.getMember = function() {
return this.member;
}
function Sports() {
this.member = 456;
}
Sports.prototype = Object.create(Soccer.prototype, {
setMember: {
value: function(param) { this.member = param}
}
});
debugger;
Sports.prototype.constructor = Sports;
var sportsObj = new Sports();
sportsObj.setMember(789);
js.log(sportsObj.getMember());
// 789
// Soccer에 있는 getMember를 호출하더라도 sportsObj에 있는 member를 참조하게 되어 789 출력
|
- Object.create 함수를 생성자 함수를 호출하지 않으므로 필요하다면 의도적으로 호출해야 합니다.
1
2
3
4
5
6
7
8
9
10
11
| function Soccer(param) {
this.member = param;
}
function Sports(superParam) {
Soccer.call(this, supoerParam);
}
Sports.prototype = Object.create(Soccer.prototye, {});
var sportsObj = new Sports(123);
js.log(sportsObj.member);
// 123
|
- Object.create 함수를 생성자 함수를 호출하지 않으므로 필요하다면 의도적으로 호출해야 합니다.
28.10 상속에 대한 필자 생각#
- 자바스크립트는 웹 페이지가 바뀔 때마다 렌더링하므로 소스 코드가 길면 길수록 렌더링 시간이 걸립니다. 상속 구조는 렌더링할 때 new 연산자로 인스턴스를 생성하므로 인스턴스 사용여부에 관계 없이 생성합니다. 반면 함수가 호출되었을 때 인스턴스를 생성하면 처음 렌더링 시간을 단축할 수 있습니다. 함수를 호출하지 않으면 인스턴스를 생성하지 않으므로 불필요한 처리를 줄일 수 있습니다.
- 업무 처리, 데이터 처리가 중심인 서버용 프로그램은 자주 변경되지 않고 사전 컴파일을 하므로 상속구조를 만드는 것이 효율적입니다. 반면 웹은 UI/UX 개선을 위해 자주 자바스크립트 프로그램을 변경합니다. 이때마다 상속 구조를 체크, 변경하는 것은 비효율적입니다. 상속 구조로 묶어 놓으면 유연성이 떨어집니다.
- 자바스크립트의 스크립트 언어 장점을 활용하면 효율적입니다. 함수 안으로 들어가지 않는 특징을 활용하면 효율을 높일 수 있습니다. 상속 구조로 묶어 놓은 것은 생각해 볼 필요가 있습니다.