딥다이브 day5 (19 ~ 21)

kdev·2022년 8월 28일
0
post-thumbnail

19장

  • 객체지향 프로그래밍
    - 객체지향 프로그래밍은 프로그램을 명령어 또는 함수의 목록으로 보는 전통적인 명령형 프로그래밍의 절차지향적 관점에서 벗어나 여러 개의 독립적 단위, 즉 객체의 집합으로 프로그램을 표현하는 프로그래밍 패러다임
    - 속성: 실체(사물이나 개념)가 갖는 특징이나 성질
    - 추상화: 다양한 속성 중에서 프로그램에 필요한 속상만 간추려 내어 표현하는 것
    - 객체: 속성을 통해 여러개의 값을 하나의 단위로 구성한 복합적인 자료구조
    - 객체지향 프로그래밍은 독립적인 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임
    - 객체지향 프로그래밍은 객체의 상태를 나타내는 데이터와 상태 데이터를 조작할 수 있는 동작을 하나의 논리적인 단위로 묶어 생각한다.
    - 객체는 상태 데이터와 동작을 하나의 논리적인 단위로 묶은 복합적인 자료구조
    - 객체의 상태 데이터는 프로퍼티, 동작을 메서드라 부른다.

  • 상속과 프로토타입
    - 상속: 어떤 객체의 프로퍼티 또는 메서드를 다른 객체가 상속받아 그대로 사용하는 것

    -위와 같이 사용했을 떄, 동일한 생성자 함수에 의해 생성된 모든 인스턴스가 동일한 메서드를 중복 소유하게 되며, 이는 메모리의 불필요한 낭비이다.
    -상속을 통하여 불필요한 중복을 해결한다.
    -자바스크립트는 프로토타입을 기반으로 상속을 구현한다.

    -상속은 코드의 재사용이란 관점에서 매우 유용하다.

  • 프로토타입 객체
    -프로토타입 객체란 객체지향 프로그래밍의 근간을 이루는 객체 간 속성을 구현하기 위해 사용된다.
    -프로토타입을 상속받은 하위 객체는 상위 객체의 프로퍼티를 자신의 프로퍼티처럼 자유롭게 사용할 수 있다.
    -모든 객체는 [[Prototype]] 이라는 내부 슬롯을 갖고, 값은 프로토타입의 참조이다.
    -모든 객체는 하나의 프로토타입을 갖는다. 그리고 모든 프로토타입은 생성자 함수와 연결되어 있다. 즉 객체와 프로토타입과 생성자 함수는 연겨로디어 있다.

    -내부 슬롯에는 직접 접근할 수 없지만, proto 접근자 프로퍼티를 통해 자신의 내부슬롯이 가리키는 프로토타입에 간접적으로 접근할 수 있다.

  • proto 접근자 프로터티
    -모든 객체는 proto 접근자 프로퍼티를 통해 자신의 내부 슬롯에 간접적으로 접근할 수 있다.

    -위 그림은 person 객체의 프로토타입인 object.prototype이다.
    -접근자 프로퍼티를 통해 내부슬롯이 가리키는 객체에 접근한 결과를 나타낸 것이다.
    -proto 접근자 프로퍼티는 상속을 통해 사용된다.
    -proto 접근자 프로퍼티는 객체가 직접 소유하는 프로퍼티가 아니라 object.prototype의 프로퍼티이다.
    -모든 객체는 상속을 통해 Object.prototype.proto 접근자 프로퍼티를 사용할 수 있다.

    -내부 슬롯의 값, 즉 프로토타입에 접근하기 위해 접근자 프로퍼티를 사용하는 이유는 상호 참조에 의해 프로토타입 체인이 생성되는 것을 방지하기 위함이다.
    -프로토타입 체인은 단방향 링크드 리스트로 구현되어야 한다. 즉 프로퍼티 검색 방향이 한쪽 방향으로만 흘러가야 한다. 하지만 서로가 자신의 프로토타입이 되는 비정상적인 프로토타입 체인, 순환 참조하는 프로토타입 체인이 만들어지면 체인의 종접이 존재하지 않기 때문에 프로토타입 체인에서 프로퍼티를 검색할 때 무한 루프에 빠진다. 따라서 아무런 체크 없이 무조건적으로 프로토타입을 교체할 수 없도록 proto 접근자 프로퍼티를 통해 프로토타입에 접근하고 교체하도록 구현되어있다.
    -proto 접근자 프로퍼티를 코드 내에서 직접 사용하는 것은 권장하지 않는다.

  • 함수 객체의 prototype 프로퍼티
    -함수 객체만이 소유하는 prototype 프로퍼티는 생성자 함수가 생성할 인스턴스의 프로토타입을 가리킨다.
    -prototype 프로퍼티는 생성자 함수가 생성할 객체의 프로토타입을 가리킨다. 따라서 생성자 함수로서 호출할 수 없는 함수, non-constructor 인 화살표함수와 ES6 메서드 축약 표현으로 정의한 메서드는 prototype 프로퍼티를 소유하지 않으며 프로토타입도 생성하지 않는다.

    -생성자 함수로 호출하기 위해 정의하지 않은 일반함수도 prototype 프로퍼티를 소유하지만 객체를 생성하지 않는 일반 함수의 prototype 프로퍼티는 아무런 의미가 없다.
    -모든 객체가 가지고 있는 proto 접근자 프로퍼티와 함수 객체만이 가지고 있는 prototype 프로퍼티는 결국 동일한 프로토타입을 가리킨다. 하지만 이들 프로퍼티를 사용하는 주체가 다르다.

  • 프로토타입의 constructor 프로퍼티와 생성자 함수
    -모든 프로토타입은 constructor 프로퍼티를 갖는다. 이 constructor 프로퍼티는 prototype 프로퍼티로 자신을 참조하고 있는 생성자 함수를 가리킨다. 이 연결은 생성자 함수가 생성될 때, 즉 함수 객체가 생성될 때 이뤄진다.

  • 프로토타입의 생성 시점
    -프로토타입은 생성자 함수가 생성되는 시점에 더불어 생성된다.
    -프로토타입과 생성자 함수는 단독으로 존재할 수 없고 언제나 쌍으로 존재하기 때문이다.
    -생성자 함수는 사용자가 직접 정의한 사용자 정의 생성자 함수와 자바스크립트가 기본 제공하는 빌트인 생성자 함수로 구분할 수 있다.

  • 사용자 정의 생성자 함수와 프로토타입 생성 시점
    -생성자 함수로서 호출할 수 있는 함수, 즉 constructor는 함수 정의가 평가되어 함수 객체를 생성하는 시점에 프로토타입도 더불어 생성된다.

  • 빌트인 생성자 함수와 프로토타입 생성 시점
    -객체가 생성되기 이전에 생성자 함수와 프로토타입은 이미 객체화되어 존재한다. 이후 생성자 함수 또는 리터럴 표기법으로 객체를 생성하면 프로토타입은 생성된 객체의 [[Prototype]] 내부 슬롯에 할당된다.

  • 객체 생성 방식과 프로토타입의 결정
    -객체의 생성 방법은 객체 리터럴, Object 생성자 함수, 생성자 함수, Object.create 메서드, 클래스 가 있다.
    -생성하는 방식마다 세부적인 객체 생성 방식의 차이는 있으나, 추상 연산에 의해 생성되는 공통점이 있다.

  • 객체 리터럴에 의해 생성된 객체의 프로토타입

    -객체 리터럴에 의해 생성된 객체는 Object.prototype을 프로토타입으로 갖게 되며, 이로써 Object.prototype을 상속받는다.
    -객체는 constructor 프로퍼티와 hasOwnProperty 메서드 등을 소유하지 않지만 자신의 프로토타입인 Object.prototype의 constructor 프로퍼티와 hasOwnProperty 메서드를 자신의 자산인 것처럼 자유롭게 사용할 수 있다. 이는 객체가 자신의 프로토타입인 Object.prototype 객체를 상속받았기 때문이다.

  • Object 생성자 함수에 의해 생성된 객체의 프로토타입

    -객체 리터럴과 Object 생성자 함수에 의한 객체 생성 방식의 차이는 프로퍼티를 추가하는 방식에 있다. 객체 리터럴 방식은 객체 리터럴 내부에 프로퍼티를 추가하지만 Object 생성자 함수 방식은 일단 빈 객체를 생성한 이후 프로퍼티를 추가해야 한다.

  • 생성자 함수에 의해 생성된 객체의 프로토타입

  • 프로토타입 체인

    -자바스크립트는 객체의 프로퍼티에 접근하려고 할 때 해당 객체에 접근하려는 프로퍼티가 없다면 [[Prototype]] 내부 슬롯의 참조를 따라 자신의 부모 역할을 하는 프로토타입의 프로퍼티를 순차적으로 검색한다. 이를 프로토타입 체인이라 한다. 프로토타입 체인은 자바스크립트가 객체지향 프로그래밍 상속을 구현하는 매커니즘이다.
    -Object.prototype을 프로토타입 체인의 종점이라 한다.
    -Object.Prototype의 프로토타입, 즉 [[Prototype]] 내부 슬롯의 값은 null 이다.
    -프로토타입 체인은 상속과 프로퍼티 검색을 위한 매커니즘
    -스코프 체인은 식별자 검색을 위한 매커니즘

  • 오버라이딩과 프로퍼티 섀도잉
    -프로토타입이 소유한 프로퍼티: 프로토타입 프로퍼티
    -인스턴스가 소유한 프로퍼티: 인스턴스 프로퍼티
    -프로토타입 프로퍼티와 같은 이름의 프로퍼티를 인스턴스에 추가하면 프로토타입 체인을 따라 프로토타입 프로퍼티를 검색하여 프로토타입 프로퍼티를 덮어쓰는 것이 아니라 인스턴스 프로퍼티로 추가한다. 이때 오버라이딩이 일어나고 기존에 있던 프로토타입 메서드는 가려진다. 이처럼 상속 관께에 의해 프로퍼티가 가려지는 현상을 프로퍼티 섀도잉이라 한다.
    -오버라이딩: 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의하여 사용하는 방식
    -오버로딩: 함수의 이름은 동일하지만 매개변수의 타입 또는 개수가 다른 메서드를 구현하고 매개변수에 의해 메서드를 구별하여 호출하는 방식

  • 프로토타입의 교체
    -특징을 활용하여 객체 간의 상속 관계를 동적으로 변경할 수 있다. 프로토타입은 생성자 함수를 또는 인스턴스에 의해 교체할 수 있다.

  • 생성자 함수에 의한 프로토타입의 교체

  • 인스턴스에 의한 프로토타입의 교체

  • 생성자 함수에 의한 교체와 인스턴스에 의한 교체의 차이

  • instanceof 연산자
    -우변의 생성자 함수에 prototype에 바인딩된 객체가 좌변의 객체의 프로토타입 체인 상에 존재하면 true로 평가되고, 그렇지 않은 경우에는 false 로 평가된다.

    -instanceof 연산자는 프로토타입의 constructor 프로퍼티가 가리키는 생성자 함수를 찾는 것이 아니라 생성자 함수의 prototype에 바인딩된 객체가 프로토타입 체인 상에 존재하는지 확인한다.

20장 strict mode

  • strict mode 란?
    - 오타나 문법 지식의 미비로 인한 실수를 잡아주는 역할, Lint와 유사한 역할

  • strict mode 사용하기
    - 함수 몸체 선두에 'use strict'; 를 추가한다.

  • 전역에 strict mode를 적용하는 것은 피하자
    - 외부 서드파티 라이브러리가 non-strict mode 인 경우도 있다.

  • 함수 단위로 strict mode를 적용하는 것은 피하자
    - 즉시 실행 함수로 감싼 스크립트 단위로 적용하는 것이 바람직하다.

  • strict mode가 발생시키는 에러
    - 암묵적 전역: 선언하지 않은 변수 참조 시 ReferenceError 발생
    - 변수 함수 매개변수의 삭제: delete 연산자로 변수, 함수, 매개변수를 삭제하면 SyntaxError 발생
    - 매개변수 이름의 중복: 중복된 매개변수 이름을 사용하면 SyntaxError 발생
    - with문의 사용: with 문을 사용하면 SyntaxError 발생

  • strict mode 적용에 의한 변화
    - 일반 함수의 this: 함수를 일반 함수로서 호출하면 this에 undefined가 바인딩된다. 생성자 함수가 아닌 일반 함수 내부에서는 this를 사용할 필요가 없기 때문이다.

    - arguments 객체: strict mode에서는 매개변수에 전달된 인수를 재할당하여 변경해도 arguments 객체에 반영되지 않는다.

21장 빌트인 객체

  • 자바스크립트 객체의 분류
    - 표준 빌트인 객체
    표준 빌트인 객체는 ECMAScript 사양에 정의된 객체를 말하며 애플리케이션 전역의 공통 기능을 제공한다.
    - 호스트 객체
    호스트 객체는 ECMAScript 사양에 정의되어 있지 않지만 자바스크립트 실행환경에서 추가로 제공하는 객체를 말한다.
    - 사용자 정의 객체
    사용자 정의 객체는 표준 빌트인 객체와 호스트 객체처럼 기본 제공되는 객체가 아닌 사용자가 직접 정의한 객체

  • 표준 빌트인 객체
    - 자바스크립트는 Object, String, Number, Boolean, Symbol, Date, Math, RegExp, Array, Map/Set, WeakMap/WeakSet, Function, Promise, Reflect, Proxt, JSON, Error 등 40여개의 표준 빌트인 객채를 제공한다.

  • 원시값과 래퍼 객체
    - 문자열, 숫자, 불리어 값에 대해 객체처럼 접근하면 생성되는 임시 객체를 래퍼 객체라고 한다.

  • 전역 개체
    - 코드가 실행되기 이전 단계에 자바스크립트 엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체이며, 어떤 객체에도 속하지 않은 최상위 객체이다.

  • 빌트인 전역 프로퍼티
    - Infinity 프로퍼티: 무한대를 나타내는 숫자값 Infinity를 갖는다.
    - NaN: NaN 프로퍼티는 숫자가 아님을 나타내는 숫자값 NaN을 갖는다.
    - undefined: undefined 프로퍼티는 원시 타입 undefined를 값으로 갖는다.

  • 빌트인 전역 함수
    - eval: eval 함수는 자바스크립트 코드를 나타내는 문자열을 인수로 받는다. 전달받은 문자열 코드가 표현식이라면 eval 함수는 문자열 코드를 런타임에 평가하여 값을 생성하고, 전달 받은 인수가 표현식이 아닌 문이라면 eval 함수는 문자열 코드를 런타임에 실행한다. 문자열 코드가 여러 개의 문으로 이루어져 있다면 모든 문을 실행한다.


    - 인수로 전달받은 문자열 코드가 여러 개의 문으로 이루어져 있다면 모든 문을 실행하고 마지막 결과값을 반환한다.

    	- isFinite: 전달받은 인수가 정상적인 유한수인지 검사하여 boolean 값 반환, 이때 인수가 NaN으로 평가되면 false 를 반환
    	- isNaN: 전달받은 인수가 NaN인지 검사하여 결과를 boolean 값으로 반환, 전달받은 인수의 타입이 숫자가 아닌 경우 숫자로 타입을 변환한 후 검사를 수행.
    	- parseFloat: 전달받은 문자열 인수를 부동 소수점 숫자, 즉 실수로 해석하여 반환.
    	- parseInt: 전달받은 문자열 인수를 정수로 해석하여 반환
    	- encodeURI / decodeURI: encodeURI 함수는 완전한 URI를 문자열로 전달받아 이스케이프 처리를 위해 인코딩한다. URI는 인터넷에 있는 자원을 나타내는 유일한 주소. URI의 하위개념으로 URL, URN이 있다.


    - encodeURIComponent / decodeURIComponent: URI 구성 요소를 인수로 전달받아 인코딩 / 디코딩한다.

0개의 댓글