Programming language/Java

[Java]생성자(Constructor)

  • -
반응형

앞서 객체와 클래스에 대해 정리를 했었다.

그 중간에 인스턴스에 대한 언급이 있어서 혹여 설명이 필요한 분들이 있을까해서 다시 공부도 할겸 정리를 해본다.

인스턴스를 이해하기 위해서는 먼저 생성자에 대한 개념이 있어야 한다.


생성자(Constructor)


생성자는 객체가 생성될 때 실행되는 메소드이다.

자세하게 말하면 클래스가 인스턴스화 될 때 클래스의 멤버 변수(멤버 필드라고도 함)를 초기화해주는 기능을 한다.


모든 클래스는 (반드시)한 개 이상의 생성자를 가진다. 커피에서 원두같은 존재(?)라고도 할 수 있을 것 같다.


이러한 생성자는 우리가 선언을 하지 않을 경우 기본 생성자(Default)로 존재한다. 객체와 클래스에서 예시로 보였던 Cafe 클래스의 기본 생성자를 만들어봤다.

※생성자는 클래스와 같은 이름을 갖는다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package biz.test;
 
public class Cafe{
    
    String drink;   // 음료
    int pay;         // 가격    
    
    public Cafe(){ // 기본생성자 생성
        System.out.println("Cafe() Created.");
    }
 
    public void getOrder(String ordrink){    //음료 주문을 받는 메소드
        drink = ordrink;
        if( drink == "아메리카노" ){
            pay = 4000
        } else if( drink == "아인슈페너" ) {
            pay = 5500;
        } else if( drink == "자몽에이드" ) {
            pay = 5000;
        }
        System.out.println("주문하신 " +drink+ " 나왔습니다.");
        System.out.println("가격은 " +pay+ "원 입니다.");
    }    
}

cs


보면 알 수 있듯이 기본 생성자(public Cafe(){ })는 아무런 기능이 없다.

때문에 우리가 만들어주지 않는다면 화면 상에서는 보이지 않는다. 하지만 인스턴스화 된 객체를 사용하게 되면 기본 생성자가 실행되면서 멤버 변수는 기본 값으로 초기화된다.


1
2
3
4
5
6
7
8
9
10
package biz.test;
 
public class CafeGo{
        
    public static void main(String args[]) {                
        Cafe reSet = new Cafe();
        System.out.println("주문음료 : " + reSet.drink);
        System.out.println("판매금액 : " + reSet.pay);
    }
}
cs



여기서 기본 값은 각 자료형들의 디폴트 값으로 생각하면 된다.(int는 0, boolean은 false, string은 null 등)


그렇다면 기본 생성자가 아닌 우리의 입맛대로 초기화가 가능한 생성자를 만들어보자.

아래 그림을 따라 java파일에서 [마우스 오른쪽 클릭 > Source(Alt+Shift+S 단축키 사용가능) > Generate Constructor using Fields..]를 클릭한다.



MVC 패턴으로 설계를 하게되면 등장하는 DTO(VO)의 getter, setter를 생성할 때와 매우 유사한 창을 확인할 수 있다.

여기서 초기화를 원하는 멤버변수를 선택할 수 있고, public, private 등 접근영역을 지정해줄 수 있다.



OK를 누르면 아래와 같이 매개변수(drink, pay)가 있는 생성자가 만들어지는 것을 확인할 수 있다.

보면 리턴값이 없는데 메소드와 비슷해 보이는듯한 생성자는 리턴값이 없다.


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
package biz.test;
 
public class Cafe{
    
    String drink;    // 음료
    int pay;        // 가격            
    
    public Cafe(){
        System.out.println("Cafe() Created.");
    }
    
    public Cafe(String drink, int pay) {
        super();
        // TODO Auto-generated constructor stub
        this.drink = drink;
        this.pay = pay;    
    }
 
    public void getOrder(String ordrink){    //음료 주문을 받는 메소드
        drink = ordrink;
        if( drink == "아메리카노" ){
            pay = 4000
        } else if( drink == "아인슈페너" ) {
            pay = 5500;
        } else if( drink == "자몽에이드" ) {
            pay = 5000;
        }
        System.out.println("주문하신 " +drink+ " 나왔습니다.");
        System.out.println("가격은 " +pay+ "원 입니다.");
    }    
}
cs



만약 기본 생성자를 직접 만든 경우가 아니고(화면에 생성자가 보이지 않는 즉, 정의하지 않았을 경우) 위와 같이 생성자를 만들게 되면 기본생성자는 소멸되는데, 아래와 같은 경우 에러가 발생한다.


1
2
3
4
5
6
7
8
9
10
11
package biz.test;
 
public class CafeGo{
        
    public static void main(String args[]) {        
        
        Cafe mydrink = new Cafe();
        mydrink.getOrder("아인슈페너");
        mydrink.getOrder("자몽에이드");
    }
}
cs


java.lang.Error: Unresolved compilation problem: The constructor Cafe() is undefined

의미는 Cafe()라는 생성자가 정의되어 있지 않다는 것이다. 

☞ 매개변수가 없는 Cafe()는 기본 생성자로 존재했었다. 하지만 매개변수를 정의한 생성자를 만들게 되면서 기본 생성자는 소멸되었다.


해결은 기본 생성자(매개변수가 없는)를 생성해주면 된다. 혹은 인스턴스 과정에서 매개변수를 넣어주거나.


이제 생성자를 사용해보자.

코드를 조금 수정했다. 해당 코드는 Cafe에서 각각 다른 음료와 돈을 요청받아 처리하는 내용이다.

먼저 Cafe 클래스.


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
package biz.test;
 
public class Cafe{
    
    String drink;    // 음료
    int pay;        // 가격            
    
    public Cafe(){
        System.out.println("Cafe() Created.");
    }    
 
    public Cafe(String drink, int pay) {
        this.drink = drink;
        this.pay = pay;
    }
 
    public void calculate(){    //음료 주문을 받는 메소드
        if( drink == "아메리카노" ){
            pay = pay - 4000
        } else if( drink == "아인슈페너" ) {
            pay = pay - 5500;
        } else if( drink == "자몽에이드" ) {
            pay = pay - 5000;
        }        
    }    
}
cs


앞서 정의한 두 개의 매개변수를 가진 Cafe 생성자를 사용해서 멤버 변수를 초기화시켜보자.(line 10~18)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package biz.test;
 
public class CafeGo{
        
    public static void main(String args[]) {            
        Cafe reSet = new Cafe();
        System.out.println("주문음료 : " + reSet.drink);
        System.out.println("판매금액 : " + reSet.pay);
        
        Cafe dongme = new Cafe("아메리카노"10000);        
        dongme.calCulate();
        System.out.println("주문하신 " +dongme.drink+ " 나왔습니다.");
        System.out.println("잔돈 " +dongme.pay+ "원 드리겠습니다.");
        
        Cafe ashin = new Cafe("자몽에이드"6000);
        ashin.calCulate();
        System.out.println("주문하신 " +ashin.drink+ " 나왔습니다.");
        System.out.println("잔돈 " +ashin.pay+ "원 드리겠습니다.");        
    }
}
cs


기본 생성자인 Cafe()는 매개 변수가 없으므로 멤버 변수인 drink와 pay는 기본 값을 갖는다.

매개변수를 갖는 Cafe() 클래스는 dongme와 ashin에 의해 다른 값들로 초기화 된다. 이를 생성자 오버로딩[각주:1]이라고 한다. 

결과는 아래와 같다.



인스턴스와 생성자를 같이 정리해서 올리려고 했는데 생각보다 길어져서 다음에 올려야겠다...


+ 피드백은 언제나 환영입니다 :)


  1. 생성자의 이름은 같지만 매개변수의 타입과 갯수는 다르게 사용하는 것. [본문으로]
반응형

'Programming language > Java' 카테고리의 다른 글

[Java]JVM 메모리 구조  (0) 2018.08.12
[Java]인스턴스(Instance)  (0) 2018.08.09
[Error]java.lang.ArrayIndexOutOfBoundsException  (0) 2018.08.09
[Java]객체와 클래스  (0) 2018.08.03
[Java]인터페이스(Interface)  (0) 2018.07.20
Contents

포스팅 주소를 복사했습니다.

이 글이 도움이 되었다면 공감 부탁드립니다.