[Java] 4.4.2 생성자 중복 정의, this, this()

4.4.2 생성자 중복 정의, this, this()

앞에서 설명한 것처럼 개체를 생성할 때는 new 키워드와 함께 생성할 개체 형식 명과 생성자 메서드의 입력 인자를 전달합니다. 특히 생성자 메서드는 다른 메서드처럼 메서드 중복 정의 대상이므로 생성에 필요한 인자 종류를 다르게 정의할 수 있습니다.

예를 들어 회원을 클래스로 정의하고 멤버 필드로 회원 아이디, 이름, 나이를 캡슐화한다고 가정합시다. 이 때 아이디만 입력 인자로 받는 생성자, 아이디와 이름을 입력 인자로 받는 생성자, 아이디와 이름과 나이를 입력 인자로 받는 생성자를 정의하여 필요에 따라 원하는 형태의 개체를 생성할 수 있다는 것입니다.

그리고 멤버 메서드 내부에서 입력 인자와 멤버 필드의 이름이 같을 때 this 키워드를 이용하면 멤버 필드에 접근할 수 있습니다. 그리고 생성자에서 this()를 통해 다른 생성자를 호출할 수도 있습니다.

[소스 4.11] 생성자 중복 정의 및 this, this() 사용 예

public class Member {
    String id;
    String name;
    int age;
    public Member(String id){
        this(id,"",0);
    }
    public Member(String id,String name){
        this(id,name,0);
    }
    public Member(String id,String name,int age){
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public String getId(){
        return id;
    }
    public String getName(){
        return name;
    }
    public int getAge(){
        return age;
    }
}
public class Program {
    public static void main(String[] args){
        Member m1 = new Member("abc");
        Member m2 = new Member("def","강감찬");
        Member m3 = new Member("ghe","홍길동",27);
        viewMember(m1);
        viewMember(m2);
        viewMember(m3);
    }

    private static void viewMember(Member member) {
        String id = member.getId();
        String name = member.getName();
        int age = member.getAge();
        System.out.println("아이디:"+id +" 이름:"+name+" 나이:"+age);
    }
}

실행 결과

아이디:abc 이름: 나이:0
아이디:def 이름:강감찬 나이:0
아이디:ghe 이름:홍길동 나이:27

만약 생성자 메서드를 정의하지 않으면 매개 변수가 없는 기본 생성자가 자동으로 만들어지며 이를 디폴트 생성자라 부릅니다.

[소스 4.12] 생성자 메서드를 정의하지 않을 때 디폴트 기본 생성자가 동작하는 예

public class Unit {
    public void play(){
        System.out.println("운동하다.");
    }
}
public class Program {
    public static void main(String[] args){
        Unit unit = new Unit();
        unit.play();
    }
}

실행 결과

운동하다.

물론 기본 생성자(매개 변수가 없는 생성자)를 정의할 때도 개체 생성할 때 인자를 전달하지 않는 기본 생성을 할 수 있습니다.

[소스 4.13] 기본 생성자를 정의한 후 개체를 기본 생성 요청하는 예

public class Unit {
    String name;
    public Unit(){
        this("이름 없음");
    }
    public Unit(String name){
        this.name = name;
    }
    public void play(){
        System.out.println(name+" 운동하다.");
    }
}
public class Program {
    public static void main(String[] args){
        Unit unit = new Unit();
        unit.play();
    }
}

실행 결과

이름 없음 운동하다.

하지만 생성자 메서드를 하나라도 정의하면 디폴트 생성자는 만들어지지 않습니다. 따라서 매개 변수가 있는 생성자 메서드만 정의한 클래스 형식의 개체를 생성할 때는 반드시 인자를 전달하여 개체를 생성해야 합니다.

[소스 4.14] 매개 변수 있는 생성자 메서드만 정의한 개체를 기본 생성 요청시 오류

public class Unit {
    String name;
    public Unit(String name){
        this.name = name;
    }
    public void play(){
        System.out.println(name+" 운동하다.");
    }
}
public class Program {
    public static void main(String[] args){
        Unit unit = new Unit();
        unit.play();
    }
}

오류 내용

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	The constructor Unit() is undefined
	at Program.main(Program.java:4)