[Java] 생성자

1 분 소요

생성자란?

다음과 같이 Person과 PersonTest 클래스를 만들어보자

1
2
3
4
5
6
7
package constructor;

public class Person {
    String name;
    float height;
    float weight;
}

위와 같은 클래스를 만들었다면 PersonTest라는 클래스를 하나 더 만들어
personLee라는 인스턴스를 선언해보자

1
2
3
4
5
6
7
package constructor;

public class PersonTest {
    public static void main(String[] args){
        Person personLee = new Person()
    }
}

여기서 new Person() 의 Person()같은 함수를 생성자라고 한다.
클래스의 멤버 변수는 메서드에 의해 값이 변경될 수도 있지만, 처음 클래스를 생성할 때 값을
정해야 하는 경우도 있다. 생성자가 하는 일은 클래스를 처음 만들 때 멤버 변수나 상수를 초기화하는 것이다.

디폴트 생성자

생성자는 오직 클래스를 생성할때만 호출한다.
생성자 이름은 클래스 이름과 동일하고, 생성자는 반환값을 갖지 않는다.
하지만 우리가 처음 Person 클래스를 만든 코드를 보면 Person() 생성자가 따로 없다.
하지만 그럼에도 new Person()을 통해 객체를 만들어 줄 수 있었는데, 이는 컴파일러가
자동으로 생성자를 만들어주기 때문이다. 이렇게 자동으로 만들어주는 생성자를 디폴트 생성자(default constructor) 라고 하는데 이는 매개변수도 없고 구현코드가 없다.

생성자 만들기

필요한 경우 디폴트 생성자가 아닌 프로그래머가 임의로 만든 생성자를 사용할 수도 있는데, 이렇게 하면
인스턴스를 생성할때 반드시 특정 멤버변수의 값을 초기화하면서 하도록 할 경우에 직접 생성자를 구현하여
사용하게된다.

1
2
3
4
5
6
7
8
9
10
11
package constructor;

public class Person {
    String name;
    float height;
    float weight;

    public Person(String pname){
        name = pname;
    }
}

이렇게 선언하게 되면 반드시 name을 매개변수로 넣어주어야만 인스턴스의 멤버 변수값을 초기화함과 동시에
인스턴스가 만들어진다. 따라서 우리가 아까 만들었던 PersonTest 클래스는 오류를 나타내게 되는데,
이는 우리가 직접 생성자를 만들어줌으로써 컴파일러가 이제는 자동으로 디폴트 생성자를 만들게 되지 않기 때문이다. 따라서 오류가 나지 않도록 하려면 아래의 코드와 같이 name을 매개변수에 지정을 해주어야 한다.

1
2
3
4
5
6
7
package constructor;

public class PersonTest {
    public static void main(String[] args){
        Person personLee = new Person("이민재");
    }
}

만약 매개변수를 받아도 되고 안받아도 되도록 하고 싶다면, 우리가 직접 디폴트 생성자도 함께 있도록 추가해주면 된다. 이렇게 하면 생성자 두개중에서 하나를 선택하여 사용 할 수 있게된다.

1
2
3
4
5
6
7
8
9
10
11
12
package constructor;

public class Person {
    String name;
    float height;
    float weight;

    public Person(String pname){
        name = pname;
    }
    public Person(){}
}

생성자 오버로드

이렇게 위처럼 생성자가 두 개 이상 제공되는 경우를 생성자 오버로드(constructor overload) 라고 한다.
필요에 따라 매개변수가 다른 생성자를 여러 개 만들 수 있으며, 경우에 따라서는 아예 디폴트 생성자를 제공하지 않을 수 도 있다.

카테고리:

업데이트:

댓글남기기