안녕하세요. 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이라는 객체를 생성할 때 디폴트 생성자의 형태에 대한 레퍼런스를 작성한다면 에러가 나는 것을 확인할 수 있습니다.
이 말은 생성자가 적어도 1개가 정의되어 있기 때문에 디폴트 생성자는 사라졌다는 것을 의미합니다.
그럼 에러를 없앨 수 있는 방법이 무엇이 있을까요?
package contructor;
public class Person {
// 변수
int age;
double weight;
// 생성자
public Person(int age, double weight) {
this.age = age;
this.weight = weight;
}
// 생성자
public Person() {}
}
단순하게 위의 코드처럼 파라미터가 없는 생성자를 정의하면 에러가 없어지는 것입니다.
이처럼 디폴트 생성자에 대한 개념을 가지고 있지 않다면 처음 클래스를 생성하고 생성된 클래스를 사용할 때 잘 되던 코드들이 갑자기 안됨으로 써 당혹스러운 상황이 생길 수 있습니다.
그리고 생성자에서는 디폴트 생성자에 관련된 내용을 제외하면 헷갈릴만한 부분이 없기에 디폴트 생성자에 대한 개념을 확실히 인지하고 계시길 바랍니다.
이상으로 생성자에 대해 간단하게 알아보는 시간이었습니다.
읽어주셔서 감사합니다.
'Language > Java' 카테고리의 다른 글
[Java] 자바기초 - 추상클래스와 인터페이스(abstract/interface) (0) | 2020.12.21 |
---|---|
[Java] 자바기초 - 접근 제한자 (0) | 2020.12.16 |
[Java] 자바기초 - Wrapper Class (0) | 2020.12.13 |
[Java] 자바기초 - 형 변환(Promotion/Casting) (0) | 2020.12.11 |
[Java] 자바기초 - 자료형 (2) | 2020.12.10 |
댓글