접근 제한자

클로이·2020년 9월 6일
0

🪐 접근 제한자

외부 클래스에서 필드, 생성자, 메소드에 접근 제한을 두기 위해 자바에서 접근 제한자(Access Modifier)를 제공한다.

1. public

클래스를 선언할 때

public class A {}

클래스를 선언할 때 public 접근 제한자를 붙이면 같은 패키지 뿐만 아니라 다른 패키지에서도 아무런 제한 없이 사용할 수 있다. 라이브러리 클래스로 개발되어야 한다면, public 접근 제한을 가져 다른 클래스에서도 사용할 수 있도록 해야한다.

생성자

기본적으로 클래스가 public이면 생성자도 public이다. public접근제한은 모든 패키지에서 아무런 제한 없이 생성자를 호출할 수 있다.

public class C {
	String id;
	public C(String id) {
    		this.id = id;
    	}
};
public class Main {
	public static void main(String[] args) {
		C c1 = new C("user");
	}

}

필드와 메소드

public접근 제한은 모든 패키지에서 아무런 제한 없이 필드와 메소드에 접근이 가능하도록 해준다. 필드와 메소드가 public일 경우 클래스도 반드시 public 접근 제한을 가져야 한다.

public class Person {
	public String name;
	private int weight;
	private int height;
}

2. default

클래스를 선언할 때

class B {} 

클래스를 선언할 때, public을 생략하면 클래스는 default접근 제한을 가진다. default 접근 제한을 가지면 같은 패키지내에서만 사용 가능하고, 다른 패키지에서는 접근할 수 없다.

생성자

생성자를 선언할때 접근 제한자를 생략하면 default 접근 제한을 가진다. 같은 패키지에서는 아무런 제한 없이 생성자를 호출할 수 있으나, 다른 패키지에서는 생성자를 호출할 수 없다.

public class C {
	String id;
    	C(String id){	// default
        	this.id = id;
        }
}

필드와 메소드

default접근 제한은 접근 제한자를 생략했을 때이다. 같은 패키지에서만 필드와 메소드에 접근이 가능하고, 다른 패키지에서는 접근이 불가능 하다.

3. protected

생성자

default와 마찬가지로 같은 패키지에 속하는 클래스에서 생성자를 호출할 수 있도록 한다. 하지만, 다른 패키지에 속한 클래스가 자신의 자식 클래스라면 생성자를 호출할 수 있다.

public class C {
	String id;
    	protected C(String id) {
    		this.id = id;
    	}
}

다른 패키지의 자식 클래스에서 생성자를 호출할땐 super()로 호출 해야 한다.

필드와 메소드

protected접근 제한은 같은 패기지 안에서만 필드와 메소드에 접근이 가능하지만, 다른 패키지의 클래스가 해당 클래스의 자식 클래스일때에는 접근 가능하다.

4. private

생성자

클래스 외부에서 같은 패키지건 다른 패키지건 상관없이 생성자를 호출할 수 없다. 클래스 내부에서만 생성자 호출이 가능하다.

public class C {
	String id;
    private C(String id) {
    	this.id = id;
    }
}

필드와 메소드

private접근 제한은 동일한 패키지이건 다른 패키지이건 외부 클래스에서 접근할 수 없다. 오로지 클래스 내부에서만 사용할 수 있다.

그럼 private 필드와 메소드는 어떻게 사용할까??

객체의 데이터를 외부 클래스에서 마음대로 변경할 경우 객체의 무결성(결점이 없는 성질)이 깨질 수 있다.
ex ) 음수가 될 수 없는 값, 단위가 있는 값

그래서 private으로 선언하고 GetterSetter메소드를 통해 외부에서 데이터에 접근하도록 유도한다.

Getter

외부에서 객체의 데이터를 읽을 때 사용한다. getter메소드 내에서 필드값을 가공한 후 외부로 전달할 수도 있다.

private int age;
private String name;

public int getAge(){
	return this.age;
}

public String getName() {
	return this.name + "님";
}

만약 필드의 타입이 boolean일 경우 get대신 is를 붙여준다.

private boolean start;

public boolean isStart(){
	return this.start;
}

Setter

외부에서 데이터의 값을 변경할 때 setter메소드를 사용한다.

public class Person {
	private String name;
	private String address;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddress() {
		return address;
	}
    // 아래와 같이 입력값을 검증할 수도 있다.
	public void setAddress(String address) {
		if(address.length() < 10) {
			this.address = null;
		} else {
			this.address = address;
		}
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

Ctrl+Alt+S -> R 단축키를 사용해서 gettersetter메소드를 쉽게 생성할 수 있다.


참고

profile
개발자가 되고싶어요

0개의 댓글