본문 바로가기
언어/Java

생성자

by 넬준 2022. 5. 11.

생성자를 한 문장으로 정리하면 다음과 같다.

인스턴스를 생성할 때 인스턴스 변수를 초기화하기 위해 호출되는 메서드

 

생성자가 인스턴스를 생성하는 것이 아니라, 인스턴스 변수 초기화의 역할을 한다.

인스턴스 생성은 new 키워드의 역할이다.

 

 

Test test = new Test();

 

new 키워드로 다음 과정이 진행된다.

-> Heap메모리에 Test 클래스 인스턴스를 저장할 공간을 할당받고. 인스턴스를 생성한다. 그리고 해당 공간의 참조값(주소)을 리턴하고, 올바른 매개변수 형식의 Test 클래스 생성자를 호출한다.

 

생성자가 호출되면 생성자 내부로직에 의해 인스턴스 변수가 초기화된다.

스택 영역에 위치한 test변수에는 new 키워드가 리턴한 참조값이 저장된다.

 

 

필드 초기화

인스턴스가 생성될 때 각 멤버필드는 자신의 자료형에 맞게 기본값으로 초기화가 된다.

 

자료형 기본값 자료형 기본값
byte 0 short 0
int 0 long 0L
float 0.0f double 0.0
char '\u0000' boolean false
기본자료형을 제외한 모든 참조자료형 : null

 

기본값이 아닌 원하는 값으로 초기화할 때에는 2가지 방식이 있다.

 

첫 번째는 필드 선언 시에 직접 원하는 값을 대입하는 방식이다.

두 번째는 생성자 내부에 원하는 값을 필드에 대입할 수 있는 로직을 작성하는 것이다.

 

public class Person {
    String firstName = "길동";
    String lastName;

    public Person(String lastName) {
        this.lastName = lastName;
    }
}

 

firstName 필드는 선언 시 직접 초기값을 대입했고, lastName 필드는 생성자를 이용해 외부의 값을 받아와 초기값을 세팅하도록 작성했다.

 

이렇게 되면 Person 클래스의 모든 인스턴스에서 firstName 필드는 전부 "길동"으로 초기화 되고, lastName 필드는 생성자 호출 시의 매개변수 값에 따라 초기화된다.

 

 

생성자의 비밀

만일 클래스에 아무런 생성자가 작성되어 있지 않다면, 컴파일러가 자동으로 기본 생성자(매개변수가 없는 생성자)를 생성한다. (바이트 코드에 추가!)

 

따라서 따로 개발자가 직접 생성자를 작성하지 않아도 기본생성자를 호출할 수 있다.

 

 

생성자 오버로딩

생성자도 메서드와 마찬가지로 오버로딩이 가능하다.

같은 이름의 생성자여도 매개변수 타입, 갯수, 순서가 다르면 서로 다른 생성자로 컴파일러가 인식한다.

 

여기서 주의할 점이 있다.

 

만일 클래스에 기본 생성자가 아닌 매개변수를 가진 생성자를 선언했다면, 더 이상 생성자의 비밀에서 말한 것처럼 컴파일러가 자동으로 기본생성자를 만들어주지 않는다.

 

따라서 매개변수를 가진 생성자만 만들고 기본생성자를 만들지 않았다면, 기본생성자를 호출할 수 없다. 

필요한 경우 직접 작성해야 한다.

 

 

this(필요 시 매개변수)

같은 클래스 내에 오버로딩된 생성자들을 호출할 때 사용할 수 있다.

보통 각 생성자에서 인스턴스 변수 초기화 로직이 중복된 경우, 이를 줄이기 위해 사용한다.

this()는 생성자 첫 줄에서만 사용할 수 있다.

 

public class Student {
    String name;
    int age;
    String address;
    String school;

    public Student() {
        //작성하지 않았을 시 기본값
        this.name = "김아무개";
        this.age = 20;
        this.address = "대한민국";
        this.school = "한국대학교";
    }
    public Student(int age, String address) {
        this.age = age;
        this.address = address;
    }
    public Student(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }
    public Student(String name, int age, String address, String school) {
        this.name = name;
        this.age = age;
        this.address = address;
        this.school = school;
    }
}

 

위 코드에서 this()를 사용하면 다음과 같이 중복된 코드를 없앨 수 있다.

 

public class Student {
    String name;
    int age;
    String address;
    String school;

    public Student() {
        //작성하지 않았을 시 기본값
        this("김아무개", 20, "대한민국", "한국대학교");
    }
    public Student(int age, String address) {
        this.age = age;
        this.address = address;
    }
    public Student(String name, int age, String address) {
        this(age, address);
        this.name = name;
    }
    public Student(String name, int age, String address, String school) {
        this(name, age, address);
        this.school = school;
    }

}

 

여기서 쓰인 this 키워드는 인스턴스 변수와 매개변수 이름이 같을 때 구분하기 위해 사용한 것으로,

this.을 추가함으로써, 해당 변수가 인스턴스 변수임을 알 수 있다.

this는 자신의 인스턴스를 가리키는 키워드이다.

 

 


참고

https://data-make.tistory.com/202

https://bit.ly/39RWYeV

'언어 > Java' 카테고리의 다른 글

OOP의 특성 - 2. 다형성  (0) 2022.05.13
OOP의 특성 - 1. 상속  (0) 2022.05.12
static  (0) 2022.05.10
Wrapper Class  (0) 2022.05.10
Class 클래스  (0) 2022.04.01

댓글