본문 바로가기
TIL

자바스크립트 접근 제한자

by 은지:) 2024. 3. 9.
728x90
반응형

public, private, protected


 

 

 

public : 외부에서 접근 가능 (자바스크립트는 이게 디폴트임)

private : # <= 외부에서 접근 불가능, 자식 class도 접근 못함

protected : 다른 객체나 클래스의 서브클래스에서만 접근할 수 있도록 멤버를 제한함, 자바스크립트에는 없음

 

 

class Car {
  #speed = 0; // private 필드

  accelerate() {
    this.#speed += 10;
    console.log(`Accelerating. Current speed: ${this.#speed} km/h`);
  }

  brake() {
    this.#speed -= 5;
    console.log(`Braking. Current speed: ${this.#speed} km/h`);
  }
}

const myCar = new Car();
myCar.accelerate(); // "Accelerating. Current speed: 10 km/h" 출력
myCar.brake(); // "Braking. Current speed: 5 km/h" 출력
console.log(myCar.#speed); // SyntaxError: Private field '#speed' must be declared in an enclosing class

 

#speed : class 내부에서 사용하는 건 가능한데 외부에서 직접적으로 쓰는 건 안됨

 

 

 

 

protected : 다른 객체나 클래스의 서브클래스에서만 접근할 수 있도록 멤버를 제한함, 자바스크립트에는 없음

 

자바스크립트에서 흉내내서 써달라고 chat GPT한테 부탁했는데

class Car {
  #speed = 0; // private 필드

  accelerate() {
    this.#speed += 10;
    console.log(`Accelerating. Current speed: ${this.#speed} km/h`);
  }

  brake() {
    this.#speed -= 5;
    console.log(`Braking. Current speed: ${this.#speed} km/h`);
  }

  // protected 메서드
  #checkSpeed() {
    if (this.#speed > 120) {
      console.log("Warning: Speed limit exceeded!");
    }
  }

  // public 메서드에서 protected 메서드 호출
  drive() {
    this.#checkSpeed();
    console.log("Driving...");
  }
}

// Car를 상속받는 하위 클래스
class SportsCar extends Car {
  // 상위 클래스의 private 필드에 접근하여 조작하는 메서드
  speedUp() {
    this.#speed += 20; // 부모 클래스의 private 필드에 직접 접근할 수 없으므로 오류 발생
    console.log(`Speeding up. Current speed: ${this.#speed} km/h`);
  }
}

const myCar = new Car();
myCar.accelerate(); // "Accelerating. Current speed: 10 km/h" 출력
myCar.drive(); // "Driving..." 출력

const mySportsCar = new SportsCar();
mySportsCar.accelerate(); // "Accelerating. Current speed: 10 km/h" 출력
mySportsCar.speedUp(); // TypeError: Cannot read private member #speed from an object whose class did not declare it

 

이렇게 줌

근데 이건 그냥 private 예시라서 하위에서 상위 접근 못하는 코드임

 

물어보니까

자바스크립트는 이거 구현 못하는 듯

 

 

그냥 c++ 코드 요구함

 

#include <iostream>

class Car {
protected:
    int speed = 0;

public:
    void accelerate() {
        speed += 10;
        std::cout << "Accelerating. Current speed: " << speed << " km/h\n";
    }

    void brake() {
        speed -= 5;
        std::cout << "Braking. Current speed: " << speed << " km/h\n";
    }
};

class SportsCar : public Car {
public:
    void speedUp() {
        speed += 20; // protected 멤버에 접근 가능
        std::cout << "Speeding up. Current speed: " << speed << " km/h\n";
    }
};

int main() {
    SportsCar mySportsCar;
    mySportsCar.accelerate(); // "Accelerating. Current speed: 10 km/h" 출력
    mySportsCar.speedUp();    // "Speeding up. Current speed: 30 km/h" 출력
    mySportsCar.brake();      // "Braking. Current speed: 25 km/h" 출력

    return 0;
}

 

자식 클래스도 speed 접근 가능함

오버라이딩하는 형태임

 

 

 

728x90
반응형

'TIL' 카테고리의 다른 글

useState 와 useReducer  (0) 2024.04.08
Iterator 패턴  (0) 2024.03.19
리액트 - 순수 함수  (0) 2024.03.05
Facade Pattern  (0) 2024.03.05
추상화 팩토리 패턴  (1) 2024.02.06

댓글