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

    반응형

    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() {}
    }

     

    반응형

    댓글

    Designed by JB FACTORY