JavaScript OOP에서 상속 시 발생하는 private 속성의 문제점

private 속성이 상속되지 않는다는 점은 예상치 못한 문제를 야기할 수 있습니다. 예제를 통해 살펴보겠습니다. 다음과 같은 private 속성을 가진 부모 클래스가 있다고 가정해 봅시다:

javascriptclass User {
  #age;
  
  setAge(age) {
    this.#age = age;
  }
  getAge() {
    return this.#age;
  }
}

자식 클래스에서 나이를 1 증가시키는 메서드를 만들려고 한다고 가정해 봅시다. 그러나 부모의 private 속성을 수정하려는 시도는 오류를 발생시킵니다:

javascriptclass Student extends User {
  incAge() {
    this.#age++; // 오류
  }
}

자식 클래스 내에서 private 속성 #age를 선언하면 오류가 사라집니다:

javascriptclass Student extends User {
  #age;
  
  incAge() {
    this.#age++;
  }
}

바로 여기에 함정이 숨어 있습니다! 사실 우리는 두 개의 private 속성을 생성한 것입니다: 하나는 부모에, 다른 하나는 자식에. 그리고 이 둘은 완전히 독립적으로 동작합니다. 이는 부모의 메서드들은 자신의 속성을 변경하고, 자식의 메서드들은 자신의 속성을 변경한다는 것을 의미합니다.

이 문제는 사실 해결 방법이 있습니다. 단순히 부모의 private 속성을 부모의 메서드를 통해 조작하면 됩니다. 이를 바탕으로 코드를 다시 작성해 봅시다:

javascriptclass Student extends User {
  incAge() {
    let age = this.getAge();
    age++;
    this.setAge(age);
  }
}

다음과 같이 간략화할 수 있습니다:

javascriptclass Student extends User {
  incAge() {
    this.setAge(++this.getAge());
  }
}
Задание 1

다음 코드에서 자식 클래스는 부모 클래스의 메서드를 재정의합니다. 이 코드의 문제점을 수정하세요:

javascriptclass User {
  #name;
  
  setName(name) {
    this.#name = name;
  }
  getName() {
    return this.#name;
  }
}

class Employee extends User {
  setName(name) {
    if (name.length > 0) {
      this.#name = name;
    }
  }
}