[STUDY] JAVA 기초 복습 | 객체 지향 프로그래밍 | 잘 설계된 VO 클래스(객체)

Nimgnos·2024년 4월 22일

패스트캠퍼스

목록 보기
5/7
post-thumbnail

✏️ 강의 : [패스트캠퍼스] K-Digital Credit, Java&Spring 웹개발 종합반

1. 정보은닉(information hiding)이란?

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

  • 예제
    • 한 사람의 [회원] 정보를 저장할 [객체를 생성]하시오.
package fc.java.model;
public class PersonVO {
    public String name;
    public int age;
    public String phone;
}
package fc.java.part3;
public class PersonInfoHide {
    public static void main(String[] args) {
        // Q. 한 사람의 [회원] 정보를 저장할 [객체를 생성]하시오.
        Person vo = new Person();
        vo.name = "홍길동";
        vo.age = 5000; //정보 은닉 되지 않음
        vo.phone = "010-1234-5678";
        System.out.println(vo.name + "\t" + vo.age + "\t" + vo.phone);
    }
}
  • public으로 VO 생성 시 잘못된 값이 들어갈 수 있고, private로 정보 은닉 시 정보 접근이 막힘.


2. setter, getter 메서드 만들기

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

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

  • setter 메서드로 값을 저장하고 set + 멤버변수의 첫 영문을 대문자로 만들기
  • getter 메서드로 값을 얻어오고 get + 멤버변수의 첫 영문을 대문자로 만들기

  • 예제
    • setter, getter 메서드를 통해 PersonVO객체에 이름, 나이, 전화번호를 저장하고 출력하시오.(SetterGetterTest.java)
package fc.java.model;
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;
    }
    public String getPhone(){
        return phone;
    }
}
package fc.java.part3;
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(20);
        vo.setPhone("010-1111-1234");
        System.out.println(vo.getName() + "\t" + vo.getAge() + "\t" + vo.getPhone());
    }
}


3. 생성자를 이용한 초기화

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

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

  • 생성자 메서드로 값을 저장하고(초기화)
  • getter 메서드로 값을 얻어오고 get + 멤버변수의 첫 영문을 대문자로 만들기

  • 예제
    • 생성자 메서드를 통해 PersonVO객체에 이름, 나이, 전화번호를 저장하고 출력하시오.(ConstructorInit.java)
package fc.java.model;
public class PersonVO {
    private String name;
    private int age;
    private String phone;
    //생략된 생성자 메서드가 있다 => 기본생성자(default Constructor)
    public PersonVO(){
        //객체를 생성하는 코드는 내부에서 만들어진다.
        //객체의 초기화를 한다.
        this.name = "홍길동";
        this.age = 20;
        this.phone = "010-1234-1234";
    }
    //getter method
    public String getName(){
        return name; //this.name
    }
    public int getAge(){
        return age;
    }
    public String getPhone(){
        return phone;
    }
}
package fc.java.part3;
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());
        PersonVO vo1 = new PersonVO();
        System.out.println(vo1.getName() + "\t" + vo1.getAge() + "\t" + vo1.getPhone());
        //개발자가 원하는 값으로 초기화를 하는 방법?
    }
}

  • 기본생성자 초기화 값 하나만 사용할 수 있음
  • 개발자가 원하는 값으로 초기화를 하는 방법은?

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

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

  • 예제
    • 생성자 메서드를 통해 PersonVO객체에 원하는 이름, 나이, 전화번호를 저장하고 출력하시오.(ConstructorOverloading)
public class PersonVO {
    private String name;
    private int age;
    private String phone;
    //생략된 생성자 메서드가 있다 => 기본생성자(default Constructor)
    public PersonVO(){
        //객체를 생성하는 코드는 내부에서 만들어진다.
        //객체의 초기화를 한다.
        this.name = "홍길동";
        this.age = 20;
        this.phone = "010-1234-1234";
    }
    //생성자 오버로딩
    public PersonVO(String name, int age, String phone){
        this.name = name;
        this.age = age;
        this.phone = phone;
    }
    //getter method
    public String getName(){
        return name; //this.name
    }
    public int getAge(){
        return age;
    }
    public String getPhone(){
        return phone;
    }
}
public class ConstructorOverloading {
    public static void main(String[] args) {
        //Q. 생성자 메서드를 통해 PersonVO객체에 원하는 이름, 나이, 전화번호를 저장하고 출력하시오.
        PersonVO vo = new PersonVO();
        PersonVO vo1 = new PersonVO("박길동", 20, "010-1234-1234");
        PersonVO vo2 = new PersonVO("김길동", 30, "010-1234-5678");
        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());
    }
}

  • 기본생성자 + 생성자 오버로딩을 통해 PersonVO에 원하는 데이터를 넣고 출력할 수 있음.


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

💡 toString() : 객체가 가진 모든 상태정보값을 문자열(String) 형태로 리턴해주는 메서드

  • 예제
  • 생성자 메서드를 통해 PersonVO객체에 원하는 이름, 나이, 전화번호를 저장하고 toString() 메서드로 출력하시오.(ToStringPrint.java)
public class PersonVO {
    private String name;
    private int age;
    private String phone;
    //생략된 생성자 메서드가 있다 => 기본생성자(default Constructor)
    public PersonVO(){
        //객체를 생성하는 코드는 내부에서 만들어진다.
        //객체의 초기화를 한다.
        this.name = "홍길동";
        this.age = 20;
        this.phone = "010-1234-1234";
    }
    //getter method
    public String getName(){
        return name; //this.name
    }
    public int getAge(){
        return age;
    }
    public String getPhone(){
        return phone;
    }
    public String toString(){
        return name + "\t" + age + "\t" + phone;
    }
}
public class ToStringPrint {
    public static void main(String[] args) {
        // Q. 생성자 메서드를 통해 PersonVO객체에 원하는 이름, 나이, 전화번호를 저장하고 toString() 메서드로 출력하시오.
        PersonVO vo = new PersonVO("홍길동", 35, "010-1234-5678");
        //getter 사용
        System.out.println(vo.getName() + "\t" + vo.getAge() + "\t" + vo.getPhone());
        //toString 사용
        System.out.println(vo.toString());
        System.out.println(vo); //vo.toSting() toString 생략 가능
    }
}

  • toString()을 사용했을 때 getter에서 하나씩 값을 가져오는 것보다 편리함.


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

  • 예제
    • 위에서 설명한 형태로 잘 설계된 영화(MovieVO)객체를 설계하고, 데이터를 저장한 후 출력하시오.(BestVOModeling.java)
    • Generate 사용하여 생성자, 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;
    }
    public String getTitle() {
        return title;
    }
    public int getDay() {
        return day;
    }
    public String getMajor() {
        return major;
    }
    public String getPart() {
        return part;
    }
    public float getTime() {
        return time;
    }
    public int getLevel() {
        return level;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public void setDay(int day) {
        this.day = day;
    }
    public void setMajor(String major) {
        this.major = major;
    }
    public void setPart(String part) {
        this.part = part;
    }
    public void setTime(float time) {
        this.time = time;
    }
    public void setLevel(int level) {
        this.level = level;
    }
    @Override
    public String toString() {
        return "MovieVO{" +
                "title='" + title + '\'' +
                ", day=" + day +
                ", major='" + major + '\'' +
                ", part='" + part + '\'' +
                ", time=" + time +
                ", level=" + level +
                '}';
    }
}
public class BestVOModeling {
    public static void main(String[] args) {
        //Q. 잘 설계된 영화(MovieVO) 객체를 설계하고, 데이터를 저장한 후 출력하시오.
        MovieVO vo = new MovieVO("아바타", 20211201, "제이크 설리", "액션", 192.0f, 12);
        System.out.println(vo.toString());
        System.out.println(vo.getTitle()); //개별로 뽑고 싶으면 getter 사용
    }
}


💡 핵심 정리

  • 다른 객체에게 자신의 정보를 숨기고 클래스 외부에서 특정 정보에 접근을 막는다는 의미를 무엇이라 하는가?
    ➡️ 정보은닉(information hiding)
  • 정보은닉 된 정보에 접근하는 방법 중 값을 저장하는 메서드를 무엇이라 하는가?
    ➡️ setter 메서드
  • 정보은닉 된 정보에 접근하는 방법 중 값을 얻어오는 메서드를 무엇이라 하는가?
    ➡️ getter 메서드
  • 정보은닉 된 정보에 접근하는 방법 중 객체를 초기화를 통해 접근하는 메서드는 무엇인가?
    ➡️ 생성자 메서드
  • 객체가 가지고 있는 값 전체를 문자열 형태로 넘겨주기 위해서 만드는 메서드는 무엇인가?
    ➡️ toString()
profile
먹고 기도하고 코딩하라

0개의 댓글