[java] 생성자 완벽하게 이해하기! (with. this)

세상을 바꾸는 개발자·2023년 7월 19일
0

생성자

객체를 생성할 때 호출되는 인스턴스 초기화 메서드

  • new 키워드와 함께 호출
    - Person person1 = new Person();
  • 일반 멤버 변수의 초기화나 객체 생성 시 실행돼야 하는 작업 정리
  • 클래스 이름과 동일
  • 리턴 타입이 없음

기본 생성자(default constructor)

  • 파라미터가 없고 구현부가 비어있음
  • 생성자 코드가 없으면 컴파일러가 기본 생성자 제공
public class DefaultPerson {
    String name;
    int age;
    boolean isHungry;
    
    //public DefaultPerson() {} -- 생략된 기본 생성자

    public static void main(String[] args){
        DefaultPerson person = new DefaultPerson();
        person.name = "홍길동";
        person.age = 10;
        person.isHungry = false;
    }
}

파라미터가 있는 생성자

  • 생성자 호출 시 값을 넘겨줘서 초기화
  • 파라미터가 있는 생성자를 만들면 기본 생성자는 추가되지 않음
public class ParameterPerson {
    String name;
    int age;
    boolean isHungry;

    public ParameterPerson(String n, int a, boolean i) {
        name = n;
        age = a;
        isHungry = i;
    }

    public static void main(String[] args){
        ParameterPerson person1 = new ParameterPerson("홍길동", 10, false);

        ParameterPerson person2 = new ParameterPerson(); //기본 생성자가 추기 되지 않았으므로 오류
    }
}

this

this는 this.this()로 구분하여 사용한다.

public class ParameterPerson {
    String name;
    int age;
    boolean isHungry;

    public ParameterPerson(String name, int age, boolean isHungry) {
        this.name = name;
        this.age = age;
        this.isHungry = isHungry;
    }
}

this.

  • 객체 참조 변수로써 객체 자신을 가리킴
  • 변수 이름은 가독성이 좋아야해서 이름을 작성하다보면 멤버 변수와 같아질 때가 있는데,
    이름이 같을 경우에 this를 사용한다.
  • 이름이 같지 않더라도 명시적으로 멤버임을 알리고 싶을 경우 this를 붙여도 된다.
  • static 영역에서는 객체와 상관이 없으므로 this 사용이 불가하다.

this()

  • 생성자도 오버로딩 가능
    - 객체 생성 시 멤버 변수만 초기화 진행 -> 생성자 별 코드의 중복 발생
    • this.name = name; 중복 발생
    • this(name, 0); 으로 호출
  • 반드시 첫 줄에서만 호출 가능
    - System.out.println(); 아래에서 this();하면 오류 발생
public class OverloadConstructorPerson {
    String name;
    int age;

    public OverloadConstructorPerson(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public OverloadConstructorPerson(String name) {
        this.name = name; // 중복 코드
        this(name, 0); //중복 해결 : 위의 생성자를 호출
    }
    
    public static void main(String[] args){
    }
}
profile
초심 잃지 않기

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

소중한 정보 잘 봤습니다!

답글 달기