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 |
댓글