다른 객체에게 자신의 정보를 숨기고 자신의 동작, 기능, 연산만을 통해 접근을 허용하는 것
클래스 외부에서 특정 정보에 대한 접근을 막는다는 의미로, 객체지향 프로그래밍에서는 객체를 설계할 때 상태 정보를 은닉시킨다.(접근제어자 private 사용)
객체의 멤버변수에 직접 접근을 허용하게 되면 대입되는 값의 검증이 전혀 이루어지지 않기 때문에 부적합한 데이터가 대입될 수 있다.
해당 멤버 변수의 직접 접근을 허용하지 않고(private), 별도의 메서드를 정의해 멤버 변수에 대입하려는 값에 대한 검증을 추가해 방지할 수 있다.
인스턴스 자신을 참조하는 this 참조변수는 private 멤버 변수에 접근이 가능함(자기 자신에게 스스로 직접 접근 한다는 의미)
private로 은닉된 멤버변수에 접근하는 대표적인 방법은 멤버변수 각각에 대한 getter & setter 메서드를 설계해 접근하는 것이다.
// getter & setter 메서드 생성
public class PersonDTO {
private String name; // 직접 접근 차단을 위한 private 설정
private int age;
private String phone;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
public class GetterSetterTest {
public static void main(String[] args) {
PersonDTO dto = new PersonDTO();
// setter 메서드로 값을 저장
dto.setName("구름이");
dto.setAge(8);
dto.setPhone("010-8888-9999");
//getter 메서드로 값을 추출
System.out.println(
"이름 : " + dto.getName() + "\n" +
"나이 : " + dto.getAge() + "\n" +
"휴대폰번호 : " + dto.getPhone());
}
}
setter 메서드를 사용하지 않고 객체 생성시 생성자의 매개변수로 값을 넣어 초기화 할 수 있다.
(생성자 메서드를 통한 멤버변수 접근)
public class PersonDTO {
private String name; // 직접 접근 차단을 위한 private 설정
private int age;
private String phone;
//default생성자 정의
public PersonDTO() {}
// 객체 생성 및 초기화시 메개변수로 멤버변수에 맞는 값을 저장
public PersonDTO(String name, int age, String phone) {
this.name = name;
this.age = age;
this.phone = phone;
}
...
...
...
getter Method
}
생성자를 클래스에 직접 정의하면 default생성자는 생성되지 않기 때문에 default생성자도 필요에 따라 클래스에 함께 정의해야한다.
public class GetterSetterTest {
public static void main(String[] args) {
PersonDTO dto = new PersonDTO("구름이", 8, "010-8888-9999"); // 생성자에 정의한 매개변수에 값을 넣어 초기화
System.out.println(
"이름 : " + dto.getName() + "\n" +
"나이 : " + dto.getAge() + "\n" +
"휴대폰번호 : " + dto.getPhone());
}
}
getter메서드가 개별 멤버변수의 값에 접근한다면, toString메서드는 여러 개의 멤버변수 값에 접근할 수 있다.
public class PersonDTO {
private String name;
private int age;
private String phone;
//deault 생성자
public PersonDTO() { }
// 생성자를 통해 멤버변수 값을 초기화
public PersonDTO(String name, int age, String phone) {
this.name = name;
this.age = age;
this.phone = phone;
}
...중간 생략
//toString메서드 정의
@Override
public String toString() {
return "PersonDTO {" +
"name='" + name + '\'' +
", age=" + age +
", phone='" + phone + '\'' +
'}';
}
}
public class GetterSetterTest {
public static void main(String[] args) {
PersonDTO dto = new PersonDTO("구름이", 8, "010-8888-9999");
System.out.println(dto.toString()); //toString으로 저장한 값 출력
}
}
public class GetterSetterTest {
public static void main(String[] args) {
PersonDTO dto = new PersonDTO("구름이", 8, "010-8888-9999");
System.out.println(dto); // 컴파일러가 선언한 toString을 탐색해 출력
}
}
컴파일러에서 toString메서드를 호출하는 것으로 인식해 toString메서드가 호출된다.