접근 제어 개념

객체에 포함된 멤버 변수 중에는 중요한 변수와 별로 중요하지 않은 변수가 있다. 예를 들어 Student 객체의 이름(name)은 외부에 공개해도 상관없지만 점수(score)를 공개하는 것은 문제가 될 수 있다. 이렇게 외부에 공개할 정보와 그렇지 않은 정보를 구분하여 외부로부터의 접근을 제어하기 위해 접근 제어를 사용하는 것이다.

 

접근 제어와 관련한 예약어 중에서 public은 해당 요소(클래스, 멤버 변수, 메소드)에 대한 모든 접근을 허용한다는 의미이며, 반대로 private은 모든 접근을 차단한다는 의미이다.

 

간단한 예제를 통해 public과 private의 의미를 확인해볼 것이다.

// 1. 클래스 선언부
public class Student {
	
    // 2. 멤버 변수
    public String name = "둘리";
    private int score = 83;
    
    // 3. 생성자 메소드
    Student() {	
    	System.out.println("---> Student 객체 생성");
    }
    
    // 4. 멤버 메소드
    public void printInfo() {
    	System.out.println(name + "의 점수 : " + score);
    }
}

 

score는 private 멤버 변수라 접근할 수 없음으로 위 처럼 에러가 발생하고, name 멤버 변수는 public 변수이기 때문에 접근이 가능하다.

Student 클래스의 생성자를 private으로 바꾸는 순간 Student클래스로부터 객체를 생성하는 모든 소스에 문제가 발생하게 된다. 이는 외부 클래스에서 Student 클래스의 생성자에 접근할 수 없게 되었기 때문이다.

 

물론 디자인 패턴 중에서 싱글톤 패턴(Singleton Pattern)같은 아주 특수한 상황에서 가끔 private 생성자를 사용하기도 한다. 하지만 이는 정말 특수한 경우이고 일반적으로는 생성자 앞에 private을 설정하지 않는다.

 

접근 제한과 관련된 예약어 중에는 protected와 default라는 것도 있다. 이 중에서 protected는 상속과 관련된 접근 제한 예약어로서 프로그램의 가독성을 떨어뜨리기 때문에 거의 사용하지 않는다. default는 패키지와 관련된 접근 제한이다.

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] 메소드 Method  (0) 2023.10.19
[JAVA] 패키지  (0) 2023.10.19
[JAVA] 클래스 Class (3)  (0) 2023.10.18
[JAVA] 클래스 Class (2)  (0) 2023.10.18
[JAVA] 클래스 Class (1)  (0) 2023.10.18

public 

public은 default값이다. 생략이 가능하다.

class User{
	public name : string = "kim";
    // public => 모든 자식들이 name을 이용가능하다.
    // public keyword는 생략 가능 default 값이다.
    // public <-> private
	constructor(a : string){
    	this.name = a; 
    }
    
    public 함수(){
    	console.log(this.name);
    };
}

let user1 = new User("park");
user1.name = "Lee";

 

public은 축약을 제공하기도 한다. 

class User{
	constructor( public name : string, public age : number){
    }
}

let user1 = new User("Yeonji", 22);
console.log(user1); // { name : "Yeonji", age : 22 }

 

private

class 내부에서만 사용이 가능하며, class 외부에서는 직접적으로 접근이 불가능하다. 또한, extends로 해당 class를 상속받은 자식 class도 사용이 불가능하다.

class User{
	private name : string = "kim";
    // private => class 내부에서만 사용가능하게 된다. 자식들이 직접 사용 불가능.
	constructor(a : string){
    	this.name = a; 
    }
    
    public ChangeName(a : string) : void{
    	this.name = a;
    };
}

let user1 = new User("park");
user1.name = "Lee"; // error 발생
user1.ChangeName("Lee"); // success

 

protected

protected는 private keyword와 같이 class{} 내부에서만 사용이 가능하다. 그러나 private과 반대로 extends로 상속받은 class 내부에서도 사용이 가능하다.

class Parent{
	protected x = 10;
    private y = 30;
}

class Baby extends Parent{
	doIt(){
    	this.x = 30; // success
        this.y = 20; // error
    }
}

 

static

static ketyword를 붙은 것은 자식에게 물려주지않음. 부모 class만 사용이 가능하다.

static은 private, public, protected와 동시에 사용이 가능하다.

class Person{
	static x = 10;
    y = 100;
}

let person1 = new Person();
console.log(person1); // x 는 보이지 않음

 

728x90

'Language > Typescript' 카테고리의 다른 글

[ Typescript ] Generic  (0) 2022.01.24
[ Typescript ] .ts 와 .tsx  (0) 2021.12.19
[ Typescript ] rest parameter type지정  (2) 2021.12.18
[ Typescript ] interface  (0) 2021.12.18
[ Typescript ] class type 지정  (0) 2021.12.18

+ Recent posts