[ITWILL : JAVA]클래스 : 매개변수위치에 따른 차이(생성자 vs 메서드), private멤버변수 getter와 setter로 가져다쓰기

ITWILL학원 : 13강 JAVA BY 윤미영강사

1. 매개변수위치에 따른 차이

클래스 Book은 책제목과, 저자, 가격을 출력해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Book {
private String title;
private String author;
private int price;

public Book(String t, String a, int p){
title = t;
author = a;
price = p;
}

void showInfo(String title, String author, int price ){
System.out.printf("책 제목 : %s, 저자 : %s, 가격 : %,d%n", title, author, price);
}

void showInfo(){
System.out.printf("책 제목 : %s, 저자 : %s, 가격 : %d%n", title, author, price);
}

클래스 TestBook 이라는 새로운 클래스파일을 만들고 메인메서드를 실행해보자.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class TestBook {
public static void main(String[] args) {

//생성자파라미터를 통해서 값입력
Book book1 = new Book("운동하는여자", "양민영", 25000);
Book book2 = new Book("채식주의자", "한강", 13500);

//파라미터메서드를 통해서 값입력
Book book3 = new Book();
book3.showInfo("머니", "롭무어", 28000);

//배열생성
Book[] books = new Book[4];

//파라미터가 있는 배열값 넣는 방법2가지

//첫번째방법 : new 이용
books[0] = new Book("며느라기", "수신지", 50000);
//두번째방법 : 객체대입
books[1] = book1;
books[2] = book2;
books[3] = book3;


//배열의 모든값 출력하는 두가지방법
//for문 사용
for(int i=0; i<books.length; i++){
books[i].showInfo();
}

//for each문사용
for(Book b: books){
b.showInfo();
}
}
}
//출력값
책 제목 : 머니, 저자 : 롭무어, 가격 : 28,000

책 제목 : 며느라기, 저자 : 수신지, 가격 : 50000
책 제목 : 운동하는여자, 저자 : 양민영, 가격 : 25000
책 제목 : 채식주의자, 저자 : 한강, 가격 : 13500
책 제목 : null, 저자 : null, 가격 : 0

책 제목 : 며느라기, 저자 : 수신지, 가격 : 50000
책 제목 : 운동하는여자, 저자 : 양민영, 가격 : 25000
책 제목 : 채식주의자, 저자 : 한강, 가격 : 13500
책 제목 : null, 저자 : null, 가격 : 0

1-1 null값이 나오는 이유?

보이는 것처럼 생성자파라미터를 통해서 입력한 값들은 제대로 출력되지만 파라미터메서드를 통해서 입력한 값들은 null로 출력된다.

  • WHY?
    메서드는 파라미터의 값을 받았는데 넣어줄 곳이 없기때문에!

  • 그렇다면 메서드를 어떻게 바꾸면 될까?
    멤버변수를 파라미터값을 대입할수있게 코드를 추가해주면된다

1
2
3
4
5
6
void showInfo(String title, String author, int price ){
this.title = title;
this.author = author;
this.price = price;
System.out.printf("책 제목 : %s, 저자 : %s, 가격 : %,d%n", title, author, price);
}

1-2 어떤 방법이 좋은걸까?

생성자에 파라미터를 받는 방법과 메서드에 파라미터를 받아서 하는 방법 중 어느것이 더 좋은 것일까?

  1. 생성자파라미터
1
2
3
4
5
6
7
8
//1-1.생성자파라미터 생성
public Book(String t, String a, int p){
title = t;
author = a;
price = p;
}
//1-2.생성자파라미터 출력
Book book1 = new Book("운동하는여자", "양민영", 25000)
  1. 파라미터메서드
1
2
3
4
5
6
7
8
9
10
11
//2-1.파라미터메서드 생성
void showInfo(String title, String author, int price ){
this.title = title;
this.author = author;
this.price = price;
System.out.printf("책 제목 : %s, 저자 : %s, 가격 : %,d%n", title, author, price);
}

//2-2. 메서드 출력
Book book1 = new Book();
book3.showInfo("운동하는여자", "양민영", 25000);

둘 다 기능은 동일하지만 생성자파라미터를 쓰는 것이 더 좋다

  • WHY?
    생성자의 기능과 메서드의 기능에 맞게 충실하게 하는 것이 좋기때문이다
    생성자의 기능은 변수를 초기화하는 것이다.
    메서드는 이름에서도 알수있듯이 showInfo()이다. 하지만 파라미터메서드를 생성하면 변수도 초기화하고 출력까지하는 두가지 짬뽕기능을 가지게 된다.

  • 따라서 기능에 맞게 나눠서 코딩하는 것이 좋은 개발습관이다.

2. private 멤버변수값을 사용하는 방법

  • DAO : 주로 jsp model1에서 사용

  • DTO(Data Transfer Object) : 데이터가 포함된 객체를 한 시스템에서 다른 시스템으로 전달하는 작업을 처리하는 클래스이다.

    • 즉, 객체에서 정보가 중요하다. 즉 멤버변수가 중요한 클래스.
    • 정보전달이 중요한 DTO타입의 클래스들은 값을 생성해주는 getter, setter메서드를 만들어야한다
    • 자바빈으로 불리기도 함.
    • 주로 jsp model2에서 사용
    • vs 기능이 중요한 클래스, 라이브러리가 중요한 변수
  • VO(Value Object)

    • DTO와 비슷한 개념
    • 주로 스프링이용할때 사용
  • 멤버변수는 private을 설정하는 것이 데이터보안상 좋다.
    하지만 private을 쓰게되면 다른 클래스에서 가져가 쓸 수가 없다.
    이럴때 아래 두가지 메서드를 이용한다(개발자들의 약속이다).

2-1. getter메서드와 setter메서드

  • 멤버변수의 특정한 값을 가져오고 싶을땐 get멤버변수명().
  • 멤버변수의 특정한 값을 설정하고싶을땐 set멤버변수명().

이를 getter와 setter라고 부른다.

  • Getters and Setters 단축키 : Alt + Shift + S -> R
    • 또는 source탭 Generate Getters and Setters 클릭

2-2. getter와 setter 사용하는 방법

  • getter와 setter 사용하는 코드
1
2
3
4
5
6
//메인메서드안에서 get메서드쓰는 방법
System.out.println(book1.getTitle()); //값가져오기

//메인메서드안에서 set메서드쓰는 방법
book1.setPrice(20000); //값설정
System.out.println(book1.getPrice()); //값가져오기

2-3. getter와 setter 예시

Book 클래스파일은 아래와 같다.
제목과 저자 가격을 멤버변수로 가지고 있다.

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
32
33
34
public class Book {
private String title;
private String author;
private int price;

public Book(String t, String a, int p){
title = t;
author = a;
price = p;
}

void showInfo(){
System.out.printf("책 제목 : %s, 저자 : %s, 가격 : %d%n", title, author, price);
}

String getTitle(){
return title;
}
String getAuthor(){
return author;
}
int getPrice(){
return price;
}
void setTitle(String title){
this.title = title; //매개변수명과 멤버변수명이 같을때 this를 통해 멤버변수를 지정해줄수있다.
}
void setAuthor(String a){
author = a; //매개변수명과 멤버변수명이 다른경우 그냥 쓰면 된다.
}
void setPrice(int p){
price = p;
}
}

매개변수명과 멤버변수명이 같을때 this를 통해 멤버변수를 지정해줄수있다.

실행하는 메인메서드파일은 아래와 같다.

1
2
3
4
5
6
7
8
Book book1 = new Book("운동하는여자", "양민영", 25000);
System.out.println(book1.getTitle());
book1.setPrice(20000);
System.out.println(book1.setPrice());

//출력값
운동하는여자
20000