[자바/JAVA] 생성자(Constructor)
kindof
·2021. 8. 2. 14:59
생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'입니다.
따라서 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용되죠.
사실 생성자는 자바를 사용한다면 누구나 무의식적으로 쓰는 개념입니다.
그럼에도 불구하고, 몇 가지 기본적인 개념에 대해서는 한 번 짚고 넘어가면 좋을 것 같아서 정리해보겠습니다.
1. 기본 생성자(Default Constructor)
자바 코드를 컴파일 할 때, 소스파일(*.java)의 클래스에 생성자가 하나도 정의되어 있지 않은 경우 컴파일러는 자동적으로 아래처럼 같은 내용의 기본 생성자를 추가하여 컴파일합니다.
class Data{
Data(){ } // Default Constructor
int value;
}
단, 컴파일러가 자동적으로 기본 생성자를 추가해주는 경우는 '클래스 내에 생성자가 하나도 없을 때'뿐인데, 만약 위의 Data 클래스를 아래와 같이 정의하면 컴파일 에러가 발생합니다.
따라서, 기본 생성자 이외에 다른 생성자를 만들기 위해서는 무조건 기본 생성자를 선언해줘야겠죠(상속 관계에 있는 클래스 같은 경우에는 super() 키워드를 쓰면 됩니다).
그렇다면 기본 생성자는 왜 필요할까요? 그 이유는 기본 생성자가 클래스 내에 정의된 변수를 Default Value로 선언해주기 때문입니다. 즉, Object는 null로, float과 double은 0.0으로, boolean을 false로 초기화해줍니다.
그래서 아래와 같은 코드를 작성하게 되면, 기본 생성자가 Integer 변수를 0으로 초기화해주는 것입니다.
public class Sample{
int num;
public static void main(String args[]){
System.out.println(new Sample().num); // 0
}
}
2. 매개변수가 있는 생성자(Parameterized Constructor)
위에서 말했던 것처럼, 매개변수를 이용해 생성자를 만드려면 기본 생성자를 먼저 만들어주는 것을 잊으면 안 됩니다.
매개변수가 있는 생성자는 말 그대로 클래스의 변수를 초기에 매개변수 값으로 할당하여 객체를 생성하고자 할 때 사용합니다.
만약, 이러한 생성자가 없다면 Setter로 일일이 인스턴스 변수들을 초기화해주는 번거로운 작업이 필요하겠죠?
3. this
'this'는 참조변수로 인스턴스 자신을 가리킵니다.
참조변수를 통해 인스턴스 멤버에 접근할 수 있는 것처럼, 'this'로 인스턴스 변수에 접근할 수 있습니다.
Car(String color, String gearType, int door){
this.color = color;
this.gearType = gearType;
this.door = door;
}
위 코드처럼 this를 인스턴스 변수 앞에 붙여줌으로써 인스턴스 변수와 매개변수로 정의된 지역변수를 서로 구분할 수 있습니다.
하지만, 'this'를 사용할 수 있는 것은 인스턴스 멤버 뿐입니다. static 메서드에서는 인스턴스 변수를 사용할 수 없는 것처럼, 'this' 역시 사용할 수 없습니다.
왜냐하면 static 메서드는 객체를 생성하지 않고도 호출될 수 있으므로 static 메서드가 호출된 시점에 인스턴스가 존재하지 않을 수도 있기 때문이죠.
이와 관련해서는 이전에 정리한 글이 있어서 참고하면 좋을 것 같습니다.
https://studyandwrite.tistory.com/90?category=1004638 (5. 변수의 스코프와 라이프타임 부분 참고)
이상으로 자바 생성자(Constructor)에 대한 기본적인 개념을 되짚어봤습니다.
감사합니다.
'Java & Kotlin' 카테고리의 다른 글
[JAVA] 자바 hashCode() (0) | 2021.11.20 |
---|---|
[Java] 자바 람다식과 함수형 인터페이스(Functional Interface) - (1) (0) | 2021.11.02 |
[자바/Java] 오버로딩(Overloading) (0) | 2021.08.02 |
[JAVA] 기본형 매개변수와 참조형 매개변수 (0) | 2021.07.11 |
[JAVA] public static void main? (0) | 2021.06.20 |