IM 5일차

Gong Intaek·2021년 2월 26일
0

코드스테이츠

목록 보기
43/151
post-thumbnail

TIL


OOP? (Object-Oriented Programming)

객체지향 프로그래밍은 실제 세계에 기반한 모델을 만들기 위해 추상화를 사용하는 프로그래밍 패러다임이다.

라고 한다. 하지만 나는 객체를 활용한 프로그램 스타일 정도로 인식했다.

  • 사용해왔던 python이 이러한 방식을 지원함.
    • 그렇다. 지원하는 것이다. 즉 위방식을 얼마나 활용하였는지는 알 수 없다. class 라는 개념을 일부 활용 해봤던 경험은 있지만 oop라는 개념에 얼마나 접근했는지는 알수 없다.
    • fortran을 사용해 봤던 경험 하에 위에서 이야기 하는 방식을 어렴 풋하게 감을 잡을 수 있었다. 비슷한 기능을 활용하기 위해 여러번 작성해야했던 경험이 없지만은 않으니...

oop 의 기본 컨셉

Encapsulation

  • 외부에서 내부의 정보에 접근을 방지 하기 위한 은닉화
  • class 를 활용한 은닉화는 가시적으로는 보이지 않으나 접근은 가능함.
  • 클로저의 은닉화가 더 높은 은닉성을 보여줌
  • 내부의 함수와 정보를 묶는 것도 의미
  • Modularity와도 밀접하게 관계있다고 한다.

Inheritance

  • 개체의 속성을 부여하고 부여받는 것을 의미. 유사한 속성을 다시 정의할 필요없이 필요개체로부터 부여 받을수 있으므로 불필요한 작업을 줄일수 있다.

Abstraction

  • 추상화는 모호하다. 설명은 단호하게 하는데 받아들이기에는 모호하다. 커피머신이나 전화기를 바탕으로 설명을 하면 결국 인터페이스, 사용자가 받아들이는 부분만 단순화 해서 표현하고 내부는 감추는 것을 이야기한다.

    Objects in an OOP language provide an abstraction that hides the internal implementation details. [ref]

  • 대상의 세세한 정보 보다는 단순화 시키고 추상화한 속성이나 기능만 보여준다.

  • '사람이 식사를 하는 것을 생각하면 식사를 하는동안 이루어지는 영양분을 받아들이는 여러가지 매커니즘이 따라오겠지만, 그것을 식사라는 행위로 추상화 시켜서 제공한다.' 정도로 받아들여야 할 것 같다.

Polymorphism

다형성 뭔가 오락가락 한다. 생각으로는 이런 것 같다라고 생각은 들지만 그것이 정리가 되지 않는다. 커리큘럼에서는 하나의 기능이 다양한 요소에서 각기 행해지지만 그 결과가 개개 요소에 따라 다르게 발현되는 것을 이야기한다. 물론 그 기능은 상속받은 기능이며 기능의 형태는 하나임을 가정한다. 이렇게 이루어지는것을 다형성이라고 한다.

PROTOTYPE?

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을 가르키게 될 것이다.

constructor

  • 이름 그래도 생성자 새로운 인스턴스를 구성하면 내부요소를 조성하기 위해 준비된 개체. python 의 __init__ 같은 것. 이것도 생성자라는 것을 이제야 확인하였다. 이전에 사용시에는 초기화 시키는것만 생각 했었는데. 요는 클래스를 빵 굽는 틀이라고 했을 때 그 틀을 만드는 정보를 받고 그 틀을 구성하는 영역이라고 생각 할수 있다. 그리고 인스턴스는 그 틀을 통해서 만들어진 빵 정도가 될수 있겠다. 물론 무슨 빵을 만들지는 주어진 클래스가 영향을 줄테고.

prototype

  • 생성자로 생성하기 위한 원형 이라고 생각된다. 생성자로 정보를 받고반은 정보를 토대로 구성하게될 설계도를 생각 할수 있겠다.

class 사용법

es6 부터 class가 정의 되었다.
클래스를 정의하기 위해서는 두가지 방식이 있다.

class 선언

class test {
  ...
}

class 표현식

let test = class {
  ...
}
let test2 = class test3{
  ...
}

class 상속

그리고 이러한 클래스의 상속은 다음과 같이 사용할 수 있다.

class test {
  ...
  m1 () {
    ...
  }
}
// 상속 할 클래스 가 있을시
class test_son extends test {
   constructor (a,b,c,d){
     super(a,b,c)
     this.d=d
   }
  super.m1()
	m2 (){
      ...
    } 
}

과 같은 형태로 변수나 함수를 상속 할수 있다. 다만 아직은 생소하기에 익숙해지는데는 시간이 걸릴듯 하다.


prototype을 활용한 상속

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()); //찔러!!

  • class와 상속, prototype에대해 아는 것이 부족하다.
  • call, bind, apply에 대해 미숙하게 알고 있다.

오늘 한 일

  • 30분 산책
  • class와 상속, prototype에 대해 공부
  • call, bind, apply에 대해 공부

해 볼 것들

  • node.js를 이용한 서버관리나 서버와 클라이언트 간의 정보 교환 등 미리 공부할수 있는 부분에 집중해보는것도 좋은 선택이라고 생각한다.

  • scss 도 활용을 생각해보면 좋을것 같다.

  • typescript 공부 예제를 생각해보자

  • bind, call, apply 익숙해지기

  • prototype 을 활용한 상속에 익숙해지기


오늘은...

커리큘럼에 따라 객체 지향 프로그래밍에 관련된 내용을 공부 하였다. 기본적인 클래스 사용은 그나마 이전에 파이썬에서 사용하던것이 기초가 되어서 금방 적응하였으나 prototype 에 관련된 내용은 많이 헤메는것을 확인하였다. 특히나 this를 활용하는 부분에서 많이 부족함을 알게 되었다.

profile
개발자가 되기위해 공부중

0개의 댓글