Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발 한번 해블로그

[Java] 14. 잘 설계된 VO 클래스 본문

Java

[Java] 14. 잘 설계된 VO 클래스

hide on bush 2023. 12. 8. 12:03

게시물 중에서 모델들이 있었는데 그럼 과연 잘 설계된 클래스는 어떤 클래스인지 알아보장

1. 정보 은닉

- 정보 은닉이란 다른 객체에서 자신의 정보를 숨기고 자신의 동작, 기능, 연산만을 통해 접근을 허용하는 것으로 클래스 외부에서 특정 접근을 막는다는 의미이다.
- public : 정보은닉 X / private : 정보은닉 O

그럼 우리는 정보 은닉된 데이터를 어떻게 접근하는교?


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

1) setter, getter 메서드를 통해서 접근 가능

- setter : 매개변수를 받아 상태정보에 저장
- getter : setter에 저장된 정보를 불러오는 것

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

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getPhone() {
        return phone;
    }
}
import fc.java.model.PersonVO;

public class SetterGetterTest {
    public static void main(String[] args) {
        //Q. setter, getter 메서드를 활용해 PersonVO 객체에 이름, 나이, 전화번호 저장 및 출력
        PersonVO vo=new PersonVO();
        vo.setName("홍길동");
        vo.setAge(50);
        vo.setPhone("010-2345-6789");
        System.out.println(vo.getName()+"\t"+vo.getAge()+"\t"+vo.getPhone());
    }
}

코드를 보면 setter,getter 쓰기 힘들겠다.. 라고 생각할 수 있지만 마우스 오른쪽을 클릭해 Generate에 들어가면 다양한 기능들이 있음! 그중 setter만 할건지, getter만 할건지, setter와 getter 둘 다 할건지 선택할 수 있음!(굳굳 ^^)

 

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

- 객체 생성 후 초기화를 하고 객체를 생성하여 생성자 메서드로 값을 저장(초기화: PersonVO p=new PersonVO();)를 한다
- getter 메서드로 값을 받는다!

package fc.java.model;

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

    //생략된 생성자 메서드가 있음(기본 생성자_디폴트)
    public PersonVO(){
        this.name="홍길동";
        this.age=50;
        this.phone="010-1111-1111";
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getPhone() {
        return phone;
    }

}
import fc.java.model.PersonVO;

public class ConstructorInit {
    public static void main(String[] args) {
        //Q 생성자 메서드를 통해 PersonVO객체에 이름, 나이, 전화번호
        PersonVO vo=new PersonVO();
        System.out.println(vo.getName()+"\t"+vo.getAge()+"\t"+vo.getPhone());
    }
}

 

3) 객체 생성시 원하는 값으로 초기화하기

- 생성자 메서드를 오버로딩해서 초기화 가능하다(디폴트 생성자를 안쓰고 오버로딩 생성자만 쓰기!)
- 주의할 점은 생성자의 오버로딩이 있으면 컴파일러가 기본 생성자를 만들지 않는다. 그래서 반드시 기본 생성자를 명시적으로 만들어줘야함

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

    //생략된 생성자 메서드가 있음(기본 생성자_디폴트)
    public PersonVO(){
        this.name="홍길동";
        this.age=50;
        this.phone="010-1111-1111";
    }

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

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getPhone() {
        return phone;
    }
}
import fc.java.model.PersonVO;

public class ConstructorOverloading {
    public static void main(String[] args) {
        //Q. 생성자 메서드를 통해 PersonVO객체에 원하는 이름, 나이, 전화번호 저장 및 출력
        PersonVO vo=new PersonVO();
        PersonVO vo1=new PersonVO("나길동", 60, "010-2222-2222");
        PersonVO vo2=new PersonVO("조길동", 50, "010-3333-3333");
        System.out.println(vo.getName()+"\t"+vo.getAge()+"\t"+vo.getPhone());
        System.out.println(vo1.getName()+"\t"+vo1.getAge()+"\t"+vo1.getPhone());
        System.out.println(vo2.getName()+"\t"+vo2.getAge()+"\t"+vo2.getPhone());

    }
}

 

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

- 객체가 가지고 있는 값 전체를 문자열 형태로 넘겨주는 것

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

    public PersonVO(){
        this.name="홍길동";
        this.age=50;
        this.phone="010-1111-1111";
    }

    public PersonVO(String name, int age, String phone){
        this.name=name;
        this.age=age;
        this.phone=phone;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getPhone() {
        return phone;
    }
    
    //toString추가
    public String toString(){
        return this.name+"\t"+this.age+"\t"+this.phone; //this. 생략가능
    }
}
import fc.java.model.PersonVO;

public class ConstructorToStringPrint {
    public static void main(String[] args) {
        // 생성자 메서드를 통해 PersonVO 객체에 원하는 이름, 나이, 전화번호를 저장하고 toString으로 출력
        PersonVO vo=new PersonVO("홍길동", 50, "010-1111-1111");
        System.out.println(vo.toString());
        System.out.println(vo); //vo.toString()을 자동으로 찾음
    }
}

3. 그럼 이제 잘 설계된 VO 클래스란?

1) 모든 상태 정보를 정보은닉(private)
2) 디폴트 생성자를 반드시 만들기(원래는 만들지 않지만 사용하거나 사용하지않더라도 만들어 놓는 습관,,!)
3) 생성자 메서드를 오버로딩하여 객체 초기화하기
4) setter, getter 메서드 만들기
5) toString() 메서드 만들기


굳,, 여기까지 뭔가 스무스하게 왔는데 지금 다시 보니까 헷갈리는거 같기도,, 이상하게 이 부분 강의들을때는 도파민돌아서 그런지 한번만 들어도 이해가 술술,,, 근데 지금 다시 쓰면서 복습하니까 반절정도만 아는거같기도,,낄낄 ,,