Java - VO

Dev_eun·2024년 1월 2일

Java

목록 보기
14/16

잘 설계된 VO 클래스 (객체)

  • 여기에서는 VO와 DTO를 구분하지 않았지만 엄밀히 말하면 VO는 setter method를 갖지 않는다.

정보은닉(Information Hiding)이란?

  • 다른 객체에게 자신의 정보를 숨기고 자신의 동작, 기능, 연산만을 통해 접근을 허용하는 것으로, 클래스 외부에서 특정 정보에 접근을 막는다는 의미

  • 객체 모델링 (설계) - 객체 생성 - 객체 사용 (접근) 순서

  • 객체지향 프로그래밍에서는 객체를 설계할 때 상태정보정보은닉 시킨다.

  • private -> 접근 불가능 -> 데이터를 넣고 뺄 수가 없다. -> 어떻게 해야 하는가?

정보은닉 된 정보에 접근하는 방법

  1. setter, getter 메서드를 통해서 접근 가능
  2. 생성자 메서드를 통해서 접근 가능 (객체 초기화)

setter, getter 메서드 만들기

정보은닉 된 정보에 setter, getter 메서드를 통해서 접근하기

public class PersonVO {
    private String name;
    private int age;
    private String phone;

    // setter method
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }

    // getter method
    public String getName() {
        return name; // this.name
    }
    public int getAge() {
        return age; // this.age
    }
    public String getPhone() {
        return phone; // this.phone
    }
}
// setter 메서드로 값을 저장하기
p.setName(“홍길동”); 
p.setAge(50);
p.setPhone(010-1111-1111);

// getter 메서드로 값을 얻기
String name = p.getName(); 
int age = p.getAge();
String phone = p.getPhone();

생성자를 이용한 객체 초기화

정보은닉 된 정보에 생성자 메서드를 통해서 접근하기 (객체 초기화)

public class PersonVO {
    private String name;
    private int age;
    private String phone;

    // 생략된 생성자 메서드가 있다. -> 기본생성자 (default constructor)
    public PersonVO() {
        // 객체를 생성하는 코드는 내부에서 만들어진다.
        // 객체의 초기화를 한다.
        this.name = "홍길동"; // this. 는 생략 가능
        this.age = 50;
        this.phone = "010-1111-1111";
    }
    
    // setter method 생략

    // getter method
    public String getName() {
        return name; // this.name
    }
    public int getAge() {
        return age; // this.age
    }
    public String getPhone() {
        return phone; // this.phone
    }
}
// 생성자 메서드로 값을 저장하기 (초기화)
PersonVO p = new PersonVO();

// getter 메서드로 값을 얻기
String name = p.getName(); 
int age = p.getAge();
String phone = p.getPhone();
  • 객체 생성 시 원하는 값으로 초기화하기

  • 생성자 메서드를 오버로딩(Overloading)해서 초기화 가능

  • 생성자 메서드를 하나라도 오버로딩하면 기본 생성자 메서드는 만들어지지 않는다.
    -> 기본 생성자 메서드도 필요하다면 명시적으로 직접 만들어야 한다.

public class PersonVO {
    private String name;
    private int age;
    private String phone;

    public PersonVO() {
        // 초기화 없음
    }

    // 생성자 오버로딩에서 초기화
    public PersonVO(String name, int age, String phone) {
        this.name = name;
        this.age = age;
        this.phone = phone;
    }

    // setter 메서드 생략

    // getter method
    public String getName() {
        return name; // this.name
    }
    public int getAge() {
        return age; // this.age
    }
    public String getPhone() {
        return phone; // this.phone
    }
}
// 생성자 메서드로 값을 저장하기 (초기화)
PersonVO p = new PersonVO("홍길동", 50, "010-1111-1111");

// getter 메서드로 값을 얻기
String name = p.getName(); 
int age = p.getAge();
String phone = p.getPhone();

toString() 메서드로 객체 값 출력하기

  • 객체가 가지고 있는 값 전체문자열 형태로 넘겨 주기

  • toString() 메서드를 이용하여 객체가 가지고 있는 모든 값을 리턴

public class PersonVO {
    private String name;
    private int age;
    private String phone;

    public PersonVO() {
        // 초기화 없음
    }

    // 생성자 오버로딩에서 초기화
    public PersonVO(String name, int age, String phone) {
        this.name = name;
        this.age = age;
        this.phone = phone;
    }

    // setter, getter 메서드 생략
    
    // toString() 메서들로 객체의 모든 값 리턴
    public String toString() {
        return name + "\t" + age + "\t" +phone;
    }
}
// 생성자 메서드로 값을 저장하기 (초기화)
PersonVO p = new PersonVO("홍길동", 50, "010-1111-1111");

// toString() 메서드로 값을 얻기
// getter method 3번 호출
System.out.println(vo.getName() + "\t" + vo.getAge() + "\t" + vo.getPhone());

// toString() 1번 호출 -> 더 효율적
System.out.println(vo.toString());
System.out.println(vo); // vo.toString() 을 찾아서 리턴한다.

잘 설계된 VO 클래스 설계해보기

  • 잘 설계된 VO 클래스란?
  1. 모든 상태정보를 정보은닉 하기 (private)
  2. 디폴트 생성자를 반드시 만들기
  3. 생성자 메서드를 오버로딩하여 객체 초기화하기
  4. setter 메서드를 만들기 (값을 저장하는 용도)
  5. getter 메서드를 만들기 (값을 얻는 용도)
  6. toString() 메서드를 만들기 (객체가 가지고 있는 전체 값을 출력하는 용도)
package fc.java.model;

// 멤버변수만 만들고 IntelliJ의 Generate 기능을 사용하면 손쉽게 Constructor, Getter, Setter, toString()까지 만들 수 있다.
public class MovieVO {
    private String title;
    private int day;
    private String major;
    private String part;
    private float time;
    private int level;
    
    // 디폴트 생성자
    public MovieVO() {
    }

    // 생성자 오버로딩
    public MovieVO(String title, int day, String major, String part, float time, int level) {
        this.title = title;
        this.day = day;
        this.major = major;
        this.part = part;
        this.time = time;
        this.level = level;
    }

    // getter, setter 메서드
    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }

    public String getPart() {
        return part;
    }

    public void setPart(String part) {
        this.part = part;
    }

    public float getTime() {
        return time;
    }

    public void setTime(float time) {
        this.time = time;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }
    
    // toString() 메서드
    @Override
    public String toString() {
        return "MovieVO{" +
                "title='" + title + '\'' +
                ", day=" + day +
                ", major='" + major + '\'' +
                ", part='" + part + '\'' +
                ", time=" + time +
                ", level=" + level +
                '}';
    }
}
package fc.java.part3;

import fc.java.model.MovieVO;

public class BestVOModeling {
    public static void main(String[] args) {
        // Q. 잘 설계된 영화 객체(MovieVO)를 설계하고 데이터를 저장한 후 출력하시오.
        MovieVO vo = new MovieVO("아바타", 20221214, "제이크 설리", "액션", 192.0f, 12);

        System.out.println(vo);
        System.out.println(vo.getLevel());
    }
}
profile
차근차근

0개의 댓글