Java/Java Fundamental

[Java] 생성자 [Constructor] 및 this() 사용방법

novs 2024. 2. 10. 16:27
반응형

Constructor 생성자란, 객체를 생성과 동시에 초기화 할 수 있도록 도와주는 특별한 메서드이다. 생성자를 사용하지 않고, 생성한 객체에 직접 접근하여 값을 대입해 줄 수도 있지만 생성자를 사용하면 객체에 필요한 입력값을 “강제”할 수 있다는 장점이 있다.

이번 포스팅 에서는 생성자의 사용 방법에 대해 정리해 보고자 한다.

 

목차

#1 Constructor

#2 Constructor Overloading & this() keyword

- this() keyword를 사용한 중복 제거

#3 Default Constructor


#1 Constructor

생성자는 작성하고자 하는 클래스명과 동일하게 작성하며, 반환값을 가지지 않는다.

클래스명(매개변수){ ... }

 

인스턴스 호출 부분에서 작성한 매개변수와 함께 생성자를 호출하여 멤버변수를 초기화하면 된다.

클래스명 객체명 = new 생성자명(매개변수1, 매개변수2 ...);

 

 

다음은 몬스터이름[name] 레벨[level] 공격력[atk] 를 멤버변수로 가지는 Monster 클래스의 생성자를 정의한 예제이다. 

public class Monster {
    String name;
    int level;
    int atk;

    // Constructor - 클래스명과 동일하게 작성
    Monster(String name, int level, int atk) {
        this.name = name;
        this.level = level;
        this.atk = atk;
    }
}
public class MonsterMain {
    public static void main(String[] args) {
        Monster normalSlime = new Monster("normalSlime", 10, 1);
        System.out.println("name : " + normalSlime.name + ", level : " + normalSlime.level + ", atk : " + normalSlime.atk);
    }
}
name : normalSlime, level : 10, atk : 1

#2 Constructor Overloading & this() keyword

Constructor Overloading [생성자 오버로딩] 이란, 서로 다른 매개변수를 받는 생성자를 여러개 작성하는 문법이다. 반환값이 없다는 것을 제외하면 메서드 오버로딩 방식과 거의 동일하다. 

예를 들어 위에서 작성한 슬라임 객체를 생성할 때 이름[name]과 레벨[level]만을 매개변수로 받고 공격력[atk]은 선택 사항으로 남겨두고 싶을 수 도 있다.

다음은 이름, 레벨, 공격력을 모두 매개변수로 받는 생성자와, 생성자 오버로딩 방식을 사용해 이름, 레벨 만을 매개변수로 받는 생성자를 작성한 예제 코드이다.

공격력을 매개변수로 보내지 않으면, 자동으로 0으로 초기화된다.

package constructor;

public class Monster {
    String name;
    int level;
    int atk;

    // Constructor - 클래스명과 동일하게 작성
    Monster(String name, int level, int atk) {
        this.name = name;
        this.level = level;
        this.atk = atk;
    }

    // Constructor Overloadingg
    Monster(String name, int level) {
        this.name = name;
        this.level = level;
        this.atk = 0;
    }
}
public class MonsterMain {
    public static void main(String[] args) {
        Monster normalSlime = new Monster("normalSlime", 10, 1);
        Monster epicSlime = new Monster("epicSlime", 8);
        System.out.println("name : " + normalSlime.name + ", level : " + normalSlime.level + ", atk : " + normalSlime.atk);
        System.out.println("name : " + epicSlime.name + ", level : " + epicSlime.level + ", atk : " + epicSlime.atk);
    }
}
name : normalSlime, level : 10, atk : 1
name : epicSlime, level : 8, atk : 0

 

this() 키워드를 사용한 중복 제거 

생성자 오버로딩 방식으로 작성한 생성자는 코드의 중복이 발생하는 경우가 있다. 이 때 this() 문법을 사용하면 중복되는 코드를 제거할 수 있다. this() 는 생성자 내부에서 자신의 생성자를 호출하는 문법이다.

package constructor;

public class Monster {
    String name;
    int level;
    int atk;

    // Constructor - 클래스명과 동일하게 작성
    Monster(String name, int level, int atk) {
        this.name = name;
        this.level = level;
        this.atk = atk;
    }

    // Constructor Overloadingg
    // this() 중복 제거
    Monster(String name, int level) {
        this(name, level, 0);
    }
}

 

단, 유의할점은 this() 문법은 반드시 코드의 최상단 부분에 작성해야 한다. 그렇지 않으면 컴파일 에러가 발생한다.

    // Constructor Overloadingg
    // this() 중복 제거
    Monster(String name, int level) {
    	...
        System.out.println("slime object") // error
        this(name, level, 0);
        ...
    }

#3 Default Constructor

Default Constructor [기본 생성자] 란, 매개변수가 없는 생성자로 클래스 내부에 생성자가 하나도 존재하지 않는 경우에 자바에서 자동으로 생성해 주는 생성자이다. 굳이 이런 문법이 왜 필요한지 의문이 생길 수 있다. 그 이유는 자바는 무조건 객체를 생성과 동시에 생성자를 반드시 하나는 호출해 주어야 한다는 규칙이 있기에, 사용자 편의상 제공해 주는 기능이다. 

단, 생성자를 미리 정의한 경우에는 생성하지 않는다.

package constructor;

public class Monster {
    String name;
    int level;
    int atk;

    // default constructor
    Monster() {}
}

 

반응형