JavaScript 객체지향 프로그래밍 객체 생성

    2018-04-23 16:34:06 작성

    객체 생성

    Object 생성자나 객체 리터럴을 이용해서 객체를 생성하면 객체 하나를 생성할때는 편리하지만,
    같은 인터페이스를 가진 객체를 여러개 만들때는 중복된 코드가 매우 많아 진다는 점입니다.
    이문제를 해결하기 위해 몇가지 팩터리 패턴을 사용합니다.

    • 팩터리 패턴

      특정 인터페이스의 객체를 생성하는 과정을 함수로 추상화 했습니다.

      코드중복은 해결했지만, 생성한 객체가 어떤 타입인지 알 수 없는 문제가 있습니다.
      이 문제는 생서자 패턴으로 해결할 수 있습니다.

    • 생성자 패턴

      Function 객체를 다룰때 소개했던 패턴입니다.

      Person의 새 인스턴스를 만들때에는 new 연산자를 사용합니다.
      new 연산자를 사용하여 객체를 생성하면 내부적으로 다음과 같은 과정이 이루어집니다.

      1. 객체를 생성합니다.
      2. 생성자의 this값에 새 객체를 할당합니다.
      3. 생성자 내부 코드를 실행합니다.(객체에 프로퍼티를 추가)
      4. 새 객체를 반환합니다.

      함수로의 생성자

      생성자 함수와 다른 함수의 차이는 어떻게 호출하느냐 입니다.
      new 연산자와 함께 호출한 함수는 생성자 처럼 동작 하는 것이지
      new 연산자 없이 호출한 함수는 일반 함수에서 예상하는것과 똑같이 동작합니다.

      생성자 패턴의 문제점

      생성자 패턴은 인스턴스마다 메서드가 생성된다는 점입니다.
      생성자 패턴 첫번째 예제에서 person1과 person2 모두 sayName 메서드가 있지만
      이들 function은 같은 인스턴스는 아닙니다.
      자바스크립트에서 함수는 객체 이기 때문에 논리적으로 다음과 같습니다.

      같은 동작을 하는 function의 인스턴스가 따로 존재하는 점은 상식적이지 않습니다.
      다음과 같이 함수 정의를 생성자 밖으로 보내면 이런 제한을 우회할 수 있습니다.

      이렇게 하면 중복문제는 해결되지만,
      일부 객체에서 사용하는 함수를 전역에 놓음으로써 스코프를 어지럽히는 단점이 있습니다.
      이 문제는 프로토타입 패턴으로 해결할 수 있습니다.