20200310 TIL

sangminnn·2020년 3월 10일
0

OOP

→ 객체지향 프로그래밍은 실세계에 존재하고 인지하고 있는 객체(Object)를 소프트웨어의 세계에서 표현하기 위해 객체의 핵심적인 개념 또는 기능만을 추출하는 추상화(abstraction)를 통해 모델링하려는 프로그래밍 패러다임을 말한다. 다시 말해, 우리가 주변의 실세계에서 사물을 인지하는 방식을 프로그래밍에 접목하려는 사상을 의미한다.

다른 언어들에서는 class 로 객체의 자료구조와 기능을 정의하고 생성자를 통해 인스턴스를 생성한다.(class 기반)

인스턴스는 class 에서 정의된 범위 안에서만 동작이 가능하기 때문에 안정성, 정확성 good

JS는 prototype 기반 객체지향 언어로, 별도의 객체 생성 방법이 3가지 있다.

  1. 객체 리터럴 - 단순하게 {} 로 변수를 선언해준다면 해당 변수는 객체라는 것을 인지함
  2. Object 생성자 함수 - js에는 내장 Object 생성자 함수가 존재하기때문에 new Object() 로 객체 생성 가능
  3. 생성자 함수 - function Person() { } 과 같은 방식으로 custom 생성자함수를 만들어주고, new Person() 으로 호출해줄 경우 호출 대상은 객체라고 인지한다.

보통 객체 안에 있는 변수(?)를 프로퍼티, 함수를 메서드라고 부르는 듯

함수를 만든다면 (?)(함수도 객체) 프로퍼티는 외부에서 접근하지 못한다.

→ 이 부분을 제작자가 사용자에게 보여주고 싶은 부분만 보여주는 캡슐화, 은닉화 라고 한다.

→ 대신 프로퍼티가 객체나 배열일 경우(배열 역시도 객체이기 때문) 에는 내부 프로퍼티를 변경할 수 있게된다.

++) 캡슐화 는 객체의 데이터를 외부에서 직접 접근하지 못하게 막고, 함수를 통해서만 조작이 가능하게 하는 작업이다.

추상화

→ 속성 위주가 아닌 동작 위주로 정의하는 작업을 하는 것

객체지향이라는 것이 위의 내용처럼 자주 사용하고자 하는 내용에 대한 추상화를 통해 상속(확장)을 활용하여 재사용성을 높혀 생산성을 높히고 생산 비용을 줄일수 있다는 점에서 강력함

클래스 - 같은 종류의 집단에 속하는 속성과 행위를 정의

객체 지향에서 상속이라는 개념은 어쩌면 당연한것이다. 클래스 라는 추상체는 비슷한, 어쩌면 같은 특징을 가진 부류들의 상위 개념을 만들어 그들을 모두 통칭, 대표할 수 있도록 하는 것이기 때문에

그 하위 개념에 있는 각각의 객체(?) 상위 개념과의 양방향 연결고리가 있을 수 밖에 없다.

(이를 상향식으로 생각하는게 클래스(확장), 하향식으로 생각한다면 상속의 개념인듯 하다.)???

→ 하위 개념의 입장에서는 상속, 상위 개념의 입장에서는 확장

+++) 위의 코드에서 super 메소드는 부모 클래스의 생성자를 호출하는 메소드이다. 부모 클래스를 Super Class, 자식 클래스를 Sub Class라고 부르기도 하기 때문에 부모와 관련된 키워드 역시 super를 사용하는 것이다.

+++) 자식 클래스가 부모 클래스의 속성을 덮어쓰게 할 수도 있는데, 이러한 작업을 오버라이딩(Overriding)이라고 한다.

다형성 - 클래스의 하위에 생기는 객체들은 각자의 custom? property나 동작이 존재할 것이기 때문에, 이들에 대한 내용을 미리 부모 클래스에 정해두는 것이다. 그렇다면 자식 클래스는 constructor 과정에서 부모의 틀을 받아와 자신의 내용에 대한 정보들로 custom 하는 과정을 통해 개별적인 특성을 띄게 된다.


Execution Context

함수 객체화 → 함수를 vo, sc, this 세가지 프로퍼티를 가진 객체로 만든다.

엔진은 스코프 체인을 통해 렉시컬 스코프를 파악한다. 함수가 중첩 상태일 때 하위함수 내에서 상위함수의 스코프와 전역 스코프까지 참조할 수 있는데 이것는 스코프 체인을 검색을 통해 가능하다. 함수가 중첩되어 있으면 중첩될 때마다 부모 함수의 Scope가 자식 함수의 스코프 체인에 포함된다. 함수 실행중에 변수를 만나면 그 변수를 우선 현재 Scope, 즉 Activation Object에서 검색해보고, 만약 검색에 실패하면 스코프 체인에 담겨진 순서대로 그 검색을 이어가게 되는 것이다. 이것이 ( * 스코프 체인 * ) 이라고 불리는 이유이다.

Global Object, Activate Object 두가지 객체로 이루어진다.

전역 객체 (Global Object)

→ 컨트롤이 진입하면 전역 실행 컨텍스트가 생성

객체의 프로퍼티 3가지 - Variable Object( 변수 객체 ), Scope Chain, this value

실행 컨텍스트 생성 → Scope Chain 생성 및 초기화 → 변수 객체화( 전역 코드는 VO 로 GO 를 가르킨다. )

활성 객체 (Activatation Object)

생성된 함수 객체는 [[Scopes]] 프로퍼티를 가지게 된다. [[Scopes]] 프로퍼티는 함수 객체만이 소유하는 내부 프로퍼티(Internal Property)로서 함수 객체가 실행되는 환경을 가리킨다. 따라서 현재 실행 컨텍스트의 스코프 체인이 참조하고 있는 객체를 값으로 설정한다.

내부 함수의 [[Scopes]] 프로퍼티는 자신의 실행 환경(Lexical Enviroment)과 자신을 포함하는 외부 함수의 실행 환경과 전역 객체를 가리키는데 이때 자신을 포함하는 외부 함수의 실행 컨텍스트가 소멸하여도 [[Scopes]] 프로퍼티가 가리키는 외부 함수의 실행 환경(Activation object)은 소멸하지 않고 참조할 수 있다. 이것이 클로저 이다.

→ 외부 함수의 실행 컨텍스트가 소멸하여도, Scopes 프로퍼티가 가리키는 외부 함수의 실행 환경(AO)은 소멸하지 않고 참조할 수 있다는 것이 클로저 ?

→ 실행 컨텍스트의 경우 스택 개념으로 해결 순서가 차례대로 쌓이는 개념이다. 해당 일을 처리하면 LIFO(Last n First Out) 개념에 따라 사라지게 되는데, 이렇게 사라져도 Activation Object는 사라지지 않기때문에 참조할 수 있다는 말 같음. 이것이 클로저...?

??? var 키워드로 선언된 변수는 선언 단계와 초기화 단계가 한번에 이루어진다.

→ 그러면 let, const 로 선언하는 경우에는 다른가 ?

함수 코드의 스코프 체인의 생성과 초기화는 우선 Activation Object에 대한 레퍼런스를 스코프 체인의 선두에 설정하는 것으로 시작된다.

→ scope chain 의 첫번째 순서로 해당 함수의 scope를 넣어준다는 말

그 후, Caller(전역 컨텍스트)의 Scope Chain이 참조하고 있는 객체가 스코프 체인에 push된다. 따라서, 이 경우 함수 foo를 실행한 직후 실행 컨텍스트의 스코프 체인은 Activation Object(함수 foo의 실행으로 만들어진 AO-1)과 전역 객체를 순차적으로 참조하게 된다.

→ scope chain 의 다음 단계로 해당 함수에 대한 다음 함수스코프가 존재하지 않을 경우, Global Scope가 push 된다.


일단은 의식의 흐름대로 적은 TIL 로 계속 올리고 주말에 다시 정리하는게 좋겠다.

profile
생각하며 코딩하려고 노력하는 개발자가 되겠습니다.

0개의 댓글