[1] getter/setter 하이재킹

// 데코레이터 함수 정의
function logProperty(target: any, key: string) {
    // 현재 클래스의 프로퍼티에 접근하는 데코레이터 로직
    let value = target[key];

    const getter = function () {
        console.log(`Getting value: ${value}`);
        return value;
    };

    const setter = function (newValue: any) {
        console.log(`Setting value: ${newValue}`);
        value = newValue;
    };

    // 실제로 프로퍼티를 수정
    Object.defineProperty(target, key, {
        get: getter,
        set: setter,
        enumerable: true,
        configurable: true,
    });
}

// 클래스 정의
class ExampleClass {
    // 멤버 변수에 데코레이터 적용
    @logProperty
    public myProperty: string;

    constructor(value: string) {
        this.myProperty = value;
    }
}

// 인스턴스 생성
const instance = new ExampleClass('Initial Value');

// 데코레이터에 의해 프로퍼티 값에 접근 및 수정 시 로그 출력
console.log(instance.myProperty); // Getting value: Initial Value
instance.myProperty = 'New Value'; // Setting value: New Value
console.log(instance.myProperty); // Getting value: New Value