[java] DTO 클래스 설계

송어·2023년 11월 12일

정보 은닉(Information Hiding)

다른 객체에게 자신의 정보를 숨기고 자신의 동작, 기능, 연산만을 통해 접근을 허용하는 것

클래스 외부에서 특정 정보에 대한 접근을 막는다는 의미로, 객체지향 프로그래밍에서는 객체를 설계할 때 상태 정보를 은닉시킨다.(접근제어자 private 사용)

객체의 멤버변수에 직접 접근을 허용하게 되면 대입되는 값의 검증이 전혀 이루어지지 않기 때문에 부적합한 데이터가 대입될 수 있다.

해당 멤버 변수의 직접 접근을 허용하지 않고(private), 별도의 메서드를 정의해 멤버 변수에 대입하려는 값에 대한 검증을 추가방지할 수 있다.

인스턴스 자신을 참조하는 this 참조변수는 private 멤버 변수에 접근이 가능함(자기 자신에게 스스로 직접 접근 한다는 의미)

Getter & Setter

private로 은닉된 멤버변수에 접근하는 대표적인 방법은 멤버변수 각각에 대한 getter & setter 메서드를 설계해 접근하는 것이다.

  • 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());
    }
}

toString()메서드

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으로 저장한 값 출력
    }
}

DTO객체에 toString메서드를 선언했다면 DTO의 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메서드가 호출된다.

DTO클래스 설계

잘 설계된 DTO클래스

  1. 모든 멤버변수 은닉(private)
  2. 디폴트 생성자 필수 선언
  3. 생성자 메서드 오버로딩 해 객체 초기화
  4. setter 메서드 생성(개별 값 저장)
  5. getter 메서드 생성(개별 값 접근)
  6. toString()메서드 선언(여러 멤버변수 접근)

0개의 댓글