객체지향 프로그래밍은 실제 세계에 기반한 모델을 만들기 위해 추상화를 사용하는 프로그래밍 패러다임이다.
라고 한다. 하지만 나는 객체를 활용한 프로그램 스타일 정도로 인식했다.
추상화는 모호하다. 설명은 단호하게 하는데 받아들이기에는 모호하다. 커피머신이나 전화기를 바탕으로 설명을 하면 결국 인터페이스, 사용자가 받아들이는 부분만 단순화 해서 표현하고 내부는 감추는 것을 이야기한다.
Objects in an OOP language provide an abstraction that hides the internal implementation details. [ref]
대상의 세세한 정보 보다는 단순화 시키고 추상화한 속성이나 기능만 보여준다.
'사람이 식사를 하는 것을 생각하면 식사를 하는동안 이루어지는 영양분을 받아들이는 여러가지 매커니즘이 따라오겠지만, 그것을 식사라는 행위로 추상화 시켜서 제공한다.' 정도로 받아들여야 할 것 같다.
다형성 뭔가 오락가락 한다. 생각으로는 이런 것 같다라고 생각은 들지만 그것이 정리가 되지 않는다. 커리큘럼에서는 하나의 기능이 다양한 요소에서 각기 행해지지만 그 결과가 개개 요소에 따라 다르게 발현되는 것을 이야기한다. 물론 그 기능은 상속받은 기능이며 기능의 형태는 하나임을 가정한다. 이렇게 이루어지는것을 다형성이라고 한다.
JavaScript는 흔히 프로토타입 기반 언어(prototype-based language)라 불립니다. 모든 객체들이 메소드와 속성들을 상속 받기 위한 템플릿으로써 프로토타입 객체(prototype object)를 가진다는 의미입니다.
라고 MDN의 Object_prototypes 문서는 시작한다. 나는 이를 javascript 속 명시화된 모든 요소들이 prototype 하에 존재 하고 이를 통해 연결될수 있다라고 받아들였다. javascript 의 모든 개체는 가장 상위에 Object prototype이 존재하고 이로 연결된다. 이를 통해 우리는
let a=12
숫자로 정의된 a를 a와 연결된 Object의 함수중 하나인 toString을 사용하여
a=a.toString() // '12'
문자화 시킬수 있다.
__proto__
, prototype, constructor__proto__
__proto__
는 아래 prototype을 가르키게 될 것이다.__init__
같은 것. 이것도 생성자라는 것을 이제야 확인하였다. 이전에 사용시에는 초기화 시키는것만 생각 했었는데. 요는 클래스를 빵 굽는 틀이라고 했을 때 그 틀을 만드는 정보를 받고 그 틀을 구성하는 영역이라고 생각 할수 있다. 그리고 인스턴스는 그 틀을 통해서 만들어진 빵 정도가 될수 있겠다. 물론 무슨 빵을 만들지는 주어진 클래스가 영향을 줄테고.es6 부터 class가 정의 되었다.
클래스를 정의하기 위해서는 두가지 방식이 있다.
class test {
...
}
let test = class {
...
}
let test2 = class test3{
...
}
그리고 이러한 클래스의 상속은 다음과 같이 사용할 수 있다.
class test {
...
m1 () {
...
}
}
// 상속 할 클래스 가 있을시
class test_son extends test {
constructor (a,b,c,d){
super(a,b,c)
this.d=d
}
super.m1()
m2 (){
...
}
}
과 같은 형태로 변수나 함수를 상속 할수 있다. 다만 아직은 생소하기에 익숙해지는데는 시간이 걸릴듯 하다.
let farmer = function () {
this.race = "사람";
this.weapon = ["부지깽이"];
this.armor = ["천옷"];
};
farmer.prototype.attack = function () {
return "찔러!!";
};
farmer.prototype.warcry = function () {
return "우와아아아";
};
let soldier = function () {
farmer.call(this);
this.weapon = ["창", "방패"];
this.armor = ["가죽 갑주"];
};
soldier.prototype = Object.create(farmer.prototype);
//Object.create 입력된 오브젝트를 복사하여 새 오브젝트를 제공 하는 함수
// 복사된 farmer.prototype 을 바탕으로하는 새오브젝트를 soldier.prototype 에 연결한다.
//이를 통해 farmer.prototype 내부에 정의된 변수들을 soldier에서 불로 올수 있게 된다.
// 클래스 내부 생성자 안에서 super로 내부 인자들을 상속하는 것을 대신할수 있는 부분이다.
// 클래스의 super와 다른점은 보유한 생성자 외부 함수도 (즉 매서드?) 이식된다는 점이다.
// 위 클래스부분에서 보다시피 그러한 메서드를 옮겨주기 위해서는
// 옮겨질 곳에서 super를 통해 정의 하는 부분이 필요하다.
// 다만 여기서 문제는 생성자마저 farmer.prototype 의 것과 같아진다는 점이다.
// 따라서 그 부분을 수정하기 위해 다음 구절이 필요하다.
soldier.prototype.constructor = soldier;
// 앞에서 이야기하다시피 새로 주어진 함수의 생성자로 돌리기위한 구절이다.
// farmer.prototype 의 생성자로 정의된부분을 soldier로 재정의 하면서 soldier 생성자로 돌려주게 된다.
let soldier1 = new soldier();
console.log(soldier1); // { race: '사람', weapon: [ '창', '방패' ], armor: [ '가죽 갑주' ] }
console.log(soldier1.attack()); //찔러!!
node.js를 이용한 서버관리나 서버와 클라이언트 간의 정보 교환 등 미리 공부할수 있는 부분에 집중해보는것도 좋은 선택이라고 생각한다.
scss 도 활용을 생각해보면 좋을것 같다.
typescript 공부 예제를 생각해보자
bind, call, apply 익숙해지기
prototype 을 활용한 상속에 익숙해지기
커리큘럼에 따라 객체 지향 프로그래밍에 관련된 내용을 공부 하였다. 기본적인 클래스 사용은 그나마 이전에 파이썬에서 사용하던것이 기초가 되어서 금방 적응하였으나 prototype 에 관련된 내용은 많이 헤메는것을 확인하였다. 특히나 this를 활용하는 부분에서 많이 부족함을 알게 되었다.