외부 클래스에서 필드, 생성자, 메소드에 접근 제한을 두기 위해 자바에서 접근 제한자(Access Modifier)를 제공한다.
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;
}
class B {}
클래스를 선언할 때, public
을 생략하면 클래스는 default
접근 제한을 가진다. default
접근 제한을 가지면 같은 패키지내에서만 사용 가능하고, 다른 패키지에서는 접근할 수 없다.
생성자를 선언할때 접근 제한자를 생략하면 default
접근 제한을 가진다. 같은 패키지에서는 아무런 제한 없이 생성자를 호출할 수 있으나, 다른 패키지에서는 생성자를 호출할 수 없다.
public class C {
String id;
C(String id){ // default
this.id = id;
}
}
default
접근 제한은 접근 제한자를 생략했을 때이다. 같은 패키지에서만 필드와 메소드에 접근이 가능하고, 다른 패키지에서는 접근이 불가능 하다.
default
와 마찬가지로 같은 패키지에 속하는 클래스에서 생성자를 호출할 수 있도록 한다. 하지만, 다른 패키지에 속한 클래스가 자신의 자식 클래스라면 생성자를 호출할 수 있다.
public class C {
String id;
protected C(String id) {
this.id = id;
}
}
다른 패키지의 자식 클래스에서 생성자를 호출할땐 super()
로 호출 해야 한다.
protected
접근 제한은 같은 패기지 안에서만 필드와 메소드에 접근이 가능하지만, 다른 패키지의 클래스가 해당 클래스의 자식 클래스일때에는 접근 가능하다.
클래스 외부에서 같은 패키지건 다른 패키지건 상관없이 생성자를 호출할 수 없다. 클래스 내부에서만 생성자 호출이 가능하다.
public class C {
String id;
private C(String id) {
this.id = id;
}
}
private
접근 제한은 동일한 패키지이건 다른 패키지이건 외부 클래스에서 접근할 수 없다. 오로지 클래스 내부에서만 사용할 수 있다.
객체의 데이터를 외부 클래스에서 마음대로 변경할 경우 객체의 무결성(결점이 없는 성질)이 깨질 수 있다.
ex ) 음수가 될 수 없는 값, 단위가 있는 값
그래서 private
으로 선언하고 Getter
와 Setter
메소드를 통해 외부에서 데이터에 접근하도록 유도한다.
외부에서 객체의 데이터를 읽을 때 사용한다. 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
메소드를 사용한다.
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 단축키를 사용해서 getter
와 setter
메소드를 쉽게 생성할 수 있다.