본문 바로가기
Language/Java

[Java] 자바기초 - 생성자(Constructor)

by J4J 2020. 12. 14.
300x250
반응형

안녕하세요. J4J입니다.

 

이번 포스팅은 생성자에 대해 적어보는 시간을 가져보려고 합니다.

 

 

생성자란?

 

생성자는 객체를 생성하기 위해 선언을 할 때 변수들의 값들을 초기화 해주는 역할을 수행합니다.

 

자바에서는 객체를 생성할 때 new라는 키워드를 이용하여 객체를 생성하는데 동일 클래스에 대한 객체를 생성하더라도 생성자가 어떻게 정의되어 있는지에 따라 서로 다른 결과를 만들어 줄 수 있습니다.

 

생성자의 형태는 메서드의 형태와 유사하지만 메서드와 달리 결과 값을 리턴해주는 타입은 정의하지 않습니다.

 

그렇기 때문에 {접근지정자} {클래스명} ({파라미터}) {내용} 의 형태로 정의하여 작성을 할 수 있습니다.

 

다음 코드를 보도록 하겠습니다.

 

package contructor;

public class Book {
	// 변수
	String name;
	int price;
	
	// 생성자
	public Book () {
		System.out.println("name= " + name + " price= " + price + "인 Book 생성");
	}
	
	// 생성자
	public Book (String name, int price) {
		this.name = name; // this는 클래스 내부 변수를 의미, 즉 this.name은 Book클래스의 name변수를 지칭
		this.price = price;
		
		System.out.println("name= " + name + " price= " + price + "인 Book 생성");
	}
}

 

 

위의 코드는 name과 price를 변수로 가지고 있는 Book 클래스에 대한 생성자를 작성한 것입니다.

 

첫 번째 작성된 생성자는 파라미터 값이 따로 정의되어 있지 않기에 해당 생성자를 이용하여 객체를 생성할 경우 Book의 변수인 name과 price에는 자료형에 대한 디폴트 값이 들어가지게 됩니다.

 

반면에 두 번째 작성된 생성자를 이용하여 객체를 생성할 경우 name과 price에 입력한 값들이 매핑되어 해당 값들을 저장하고 있게 됩니다.

 

다음 코드에서 Book 객체를 생성해 봅시다.

 

package contructor;

public class Contructor1 {
	public static void main(String[] args) {
		Book book1 = new Book();
		Book book2 = new Book("자바 기초", 30000);
	}
}

 

실행 결과

 

 

위의 코드처럼 book1과 book2를 생성하고 실행을 시키면 이런 결과값이 나오게 됩니다.

 

new 키워드를 통해 객체를 생성하게 되면 클래스 내부에 정의되어 있는 생성자들은 자동으로 실행이 되기 때문에 name과 price 변수에 데이터를 넣어줄 수 있는 것은 넣어주고 작성되었던 문구들이 출력되는 것을 확인할 수 있습니다.

 

참 간단하죠?

 

하지만 생성자에서 주의해야 될 점이 한 가지가 있습니다.

 

 

디폴트 생성자

 

우선 다음 코드를 확인해 봅시다.

 

package contructor;

public class Flower {
	// 변수
	String name;
	String flowerLanguage;
}

 

 

우선 Flower라는 클래스에 생성자는 정의하지 않고 변수들만 선언해 보겠습니다.

 

그리고 다른 클래스에서 Flower 객체를 생성해보겠습니다.

 

package contructor;

public class Constructor2 {
	public static void main(String[] args) {
		Flower flower = new Flower();
	}
}

 

 

 

위와 같이 코드를 작성했을 때 분명 Flower에는 생성자가 정의된 것이 하나도 없는데 에러가 나지 않는 것을 확인하실 수 있습니다.

 

왜 그런걸까요?

 

그건 바로 디폴트 생성자라는 녀석 때문입니다.

 

디폴트 생성자란 클래스 내부에서 생성자를 하나도 정의하지 않았을 때 기본적으로 생성되어 있는 생성자를 의미합니다.

 

대표적으로 위의 Flower 클래스에서는 정의하지는 않았지만 아래와 같이 public Flower () {}라는 디폴트 생성자가 존재하고 있던 것입니다.

 

package contructor;

public class Flower {
	// 변수
	String name;
	String flowerLanguage;
	
	// 숨어 있던 디폴트 생성자
	public Flower () {}
}

 

 

어? 그러면 디폴트 생성자의 형태에 추가적인 내용을 작성하지 않을 거면 이 형태의 생성자는 따로 정의할 필요는 없겠네요?

 

이 대답은 No 입니다.

 

위에 디폴트 생성자가 무엇인지에 대해 말씀드릴 때 생성자를 하나도 정의하지 않았을 때 라는 전제조건이 있습니다.

 

즉, 생성자가 적어도 1개가 정의되어 있다면 디폴트 생성자는 없어진다는 의미입니다.

 

다음 코드를 확인해 봅시다.

 

package contructor;

public class Person {
	// 변수
	int age;
	double weight;
	
	// 생성자
	public Person(int age, double weight) {
		this.age = age;
		this.weight = weight;
	}
}

 

 

파라미터 값이 2개가 들어가 있는 Person이라는 클래스를 작성해봤습니다.

 

Person 코드

 

 

하지만 Person이라는 객체를 생성할 때 디폴트 생성자의 형태에 대한 레퍼런스를 작성한다면 에러가 나는 것을 확인할 수 있습니다.

 

이 말은 생성자가 적어도 1개가 정의되어 있기 때문에 디폴트 생성자는 사라졌다는 것을 의미합니다.

 

그럼 에러를 없앨 수 있는 방법이 무엇이 있을까요?

 

 

package contructor;

public class Person {
	// 변수
	int age;
	double weight;
	
	// 생성자
	public Person(int age, double weight) {
		this.age = age;
		this.weight = weight;
	}
	
	// 생성자
	public Person() {}
}

 

Person 코드

 

 

단순하게 위의 코드처럼 파라미터가 없는 생성자를 정의하면 에러가 없어지는 것입니다.

 

이처럼 디폴트 생성자에 대한 개념을 가지고 있지 않다면 처음 클래스를 생성하고 생성된 클래스를 사용할 때 잘 되던 코드들이 갑자기 안됨으로 써 당혹스러운 상황이 생길 수 있습니다.

 

그리고 생성자에서는 디폴트 생성자에 관련된 내용을 제외하면 헷갈릴만한 부분이 없기에 디폴트 생성자에 대한 개념을 확실히 인지하고 계시길 바랍니다.

 

 

 

이상으로 생성자에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

728x90
반응형

댓글