본문 바로가기

Programming/Java

[JAVA] 생성자

우선 객체를 만들 때

클래스가 정의되어 있어야 한다. 

클래스는 데이터들을 생성하기 위해 미리 구조를 선언(정의) 한 것으로

우리가 줄곧 사용해왔던 main메서드를 이루고 있는 것도 하나의 클래스이다.

클래스를 정의하면 객체를 main메서드에서 호출해야 하는데

호출하는 방식은

Car c1 = new Car();

Car라는 클래스를 정의했다고 가정해보자

그렇다면 그 클래스를 호출하는 방법은 이런 식이다.

왜 이 말을 하냐면 new뒤에 Car가 생성자를 호출하는 것이기 때문이다.

클래스를 봐보자

Class Car{
    int door;
    String color;
    
    void info(){
    	System.out.println(color+"색에 문"+door+"이 달려있다");
    }
    Car(){
    
    }
	
}

이 클래스의 메서드를 호출하는 방법은

c1.info();이다.

그러면 콘솔 창에

null색에 0이 달려있다.

가 나올 것이다.

 

당연한 결과다 변수 door, color을 초기화해주지 않았기 때문에 둘 다 기본값을 가지고 있는 거다.

저 클래스와 메서드 사이에 있는 공간을 필드, 속성, 멤버 변수라고 하고 전 클래스 안에서 사용할 수 있는 변수를

선언한 것이다.

생성자의 역할은 멤버 변수를 초기화해주는 것이다.

자바에서는 생성자를 기본으로 만들어 준다.

이해를 돕기 위해 기본 생성자를 작성해봤다.

Class Car{
    int door;
    String color;
    
    void info(){
    	System.out.println(color+"색에 문"+door+"이 달려있다");
    }
    
    
}
Class Test01{
	public static void main (String[] args){
    	Car c1 = new Car("balck",4);
    }
}

 

이처럼 main메서드에서 매개변수를 가지고 있는 생성자를 호출하면 어떻게 될 것 같은가

정답은 에러가 난다. 왜냐하면 저 매개변수를 가지고 있는 생성자가 Car클래스에는 없기 때문이다.

그래서 저 매개변수를 받는 생성자를 우리가 따로 생성해줘야 한다.

Class Car{
    int door;
    String color;
    
    void info(){
    	System.out.println(color+"색에 문"+door+"이 달려있다");
    }
    Car(String color, int door){
    	this.color=color;
        this.door=door;
    }
    
    
}
Class Test01{
	public static void main (String[] args){
    	Car c1 = new Car("balck",4);
        Car c2 = new Car();
    }
}

이렇게 생성자를 만들어 주면 에러를 해결해 c1.info(); 를 호출하면

"balck색에 문 4가 달려있다" 이렇게 출력될 것이다.

바로 아래 기본 생성자를 호출하는 것을 작성해놓았는데 이 코드는 에러가 날 것이다.

의아할 것이다 아니 자바에서 기본 생성자를 만들어 준다고 했는데 왜 에러가 나냐

맞다 자바에서 기본 생성자를 만들어 주지만 우리가 생성자를 하나라도 생성했을 때는 자바는 기본 생성자를 만들어 주지 않는다.

 

그래서 우리가 따로 기본 생성자를 추가로 만들어줘야 한다.

this.color은 가볍게 설명하자면 멤벼변수name을 가리키고 멤버 변수 name에 매개변수 name을 넣는다는 코드다.

this를 써주지 않으면 뭐가 뭔지 구분이 안 가니까 구분을 위해 써준 거라고 보면 된다.

 

this()는 다른 생성자를 호출할 때 사용한다.

class Car{
	String color;
    String gearType;
    int door; 
    
    Car(){
        this("white", "auto", 4); // Car(String color, string gearType, int door)를 호출
    }
    
    Car(String color){
        this(color, "auto", 4);
    }
    
    Car(String color, String gearType, int door){
        this.color = color; 
        this.gearType = gearType;
        this.door = door;
    }
}

코드를 보면 기본 생성자 Car을 호출했을 때 3개의 매개변수를 갖는 Car생성자를 호출하고

this("white", "auto",4); 가 Car(String color, String gearType, int door)로 들어간다 그래서 white, auto,4가 출력될 것이다.