it공부 (개념)/javascript

Access Modifier(접근제어자)란? +@ 게터 와 세터, 타입스크립트 예제. (public, private, protected)

cantor 2023. 2. 8. 00:00

Modifier(제어자)?

 

    • Modify의 사전적 의미:

      바꾸다, 완하 하다, 한정하다.



  • 프로그래밍 언어의 Modifier:

    클래스구성요소의 기능 및 접근범위를 설정하는 문법 요소.

 

 

Access Modifier(접근제어자)

클래스 구성요소에 대한 접근범위를 한정하는 데 사용되는 제어자이다.

타입스크립트는 public, private, protected 이렇게 세 개의 접근제어자를 제공한다.
이 접근제어자들은 타입스크립트의 고유 구성요소로, 자바스크립트에는 포함되지 않는다.

public: 어디에서나 접근 가능하다.
protected: 선언된 클래스와 그 클래스를 상속받는 클래스내부에서만 접근할 수 있다.

private: 선언된 클래스 내부에서만 접근이 가능하다

 

접근 제어자/ 접근위치 클래스 내부 서브 클래스 인스턴스
public O O O
protected O O X
private O X X


추상클래스로 보여주는 접근제어자

abstract class Modifier {
    private priName = "private" // Modifier 클래스 내부에서만 번경가능
    protected proName = "protected" // 서브클래스 내부에서도 번경가능
    public pubName = "public" // 클래스 내부는 물론 외부에서도 번경가능
}

class TestClass extends Modifier {
    constructor(){
        super()
        this.priName = "Can not change" // 오류가 발생한다.
        this.proName = "subclass access" // 문제없이 번경가능
        this.pubName = "free access"     
    }
}

const testInstance = new TestClass();

testInstance.pubName = "public" // public은 인스턴스를통해 외부에서도 번경가능

 

위의 코드에서 priName은 Modifier 클래스의 "private" 요소이므로,
Modifier를 상속받은 TestClass에서는 값을 번경할 수 없다.

 

만약 값을 번경하는 코드를 작성할 시
다음과 같은 오류메시지가 출력된다.



인스턴스를 통해 접근할 수 있는 클래스 특성은

"public"제어자로 선언된 pubName뿐이다.

 

타입스크립트가 인스턴스를 통해 호출가능한것은 "pubName"뿐임을 보여주고있다.


타입스크립트를 벗어나면 접근제어자는 사라진다.

앞서 말했듯, private를 포함한 다른 접근제어자들은 자바스크립트에는 존재하지 않는다.
그래서 타입스크립트 컴파일러를 벗어날 경우, 아무런 제약이 존재하지 않는다.

 

자바스크립트 콘솔에서는 private으로 선언된 값도 인스턴스로 접근하여 번경이 가능하다.

자바스크립트엔 private이 없다.


Modifier가 사라진 자바스크립트 코드

// 위의 타입스크립트코드를 컴파일한 자바스크립트 코드

// private, public, protected키워드가 전부 사라져있다.

class Modifier {
    constructor() {
        this.priName = "private"; 
        this.proName = "protected"; 
        this.pubName = "public"; 
    }
}
class TestClass extends Modifier {
    constructor() {
        super();
        // this.priName = "Can not change" 
        this.proName = "subclass access"; 
        this.pubName = "free access";
    }
}
const testInstance = new TestClass();
testInstance.pubName = "public";

 

Getter and Setter (게터와 세터)

클래스 내부에서 private과 protected 제어자를 통해 선언된 특성들은
클래스외부에서 인스턴스. 특성이름을 통해 호출하거나 값을 번경하는 게 불가능하다.

하지만 클래스 함수를 이용하면 그러한 값들을 조작하거나 번경하는 것이 가능하다.

이러한 함수에 대한 일반적인 호칭이 바로 "게터" 그리고 "세터"이다.

값을 가져오는 함수 "get 혹은 getter"(게터)라 하고,
값을 번경하는 함수 "set 혹은 setter"(세터)라 한다.

클래스 내부에 정의된 값 조작 함수를 이용하면

private이나 protected로 선언된 값도 얼마든지 번경이 가능하다. 

타입스크립트 예제: private 클래스 변수를 수정하기

class TestClass {
    constructor(
        private priName = "private",
    ){}

    //게터 함수
    //priName의 값을 반환한다.
    
    getPrivate(){
        return this.priName
    }
    
    
    //세터 함수. 
    //입력값을 priName에 저장한다.
    
    setPrivate(name: string){
        this.priName = name
    }
}

const testInstance = new TestClass()

// testInstance.priName 으로 priName을 가져오거나
// testInstance.priName = "new value"와 같이 값을 번경할 수 없다.
// 하지만 게터와 세터를 통해선 모두 가능하다


console.log(testInstance.getPrivate())
testInstance.setPrivate("setter can change the private")
console.log(testInstance.getPrivate())




읽어주셔서 감사합니다.
오탈자나 오류. 궁금하신 점을 댓글로 남겨주세요.