생성자

한라봉봉·2023년 12월 15일

JAVA

목록 보기
6/16

생성자가 필요한 이유

this

메서드 안에서는 매개 변수가 우선순위를 가진다. 따라서 클래스 내에서 멤버변수와 이름이 같으면 메서드안에서는 매개변수에 접근하게 된다.
멤버 변수에 접근하려면 this. 라고 해주면된다. this는 인스턴스 자신의 참조값을 가리킨다.
모든 멤버변수 접근시 this를 사용할 필요는 없다. 확실한 구분을 위한 것이기 때문에 꼭 필요한 경우에만 사용하고 변수명을 다르게해도 충분하다.

public class MemberInit {
    String name;
    int age;
    int grade;

    //추가
    void initMember(String name, int age, int grade) {
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}

생성자 도입

프로그래밍을 하다보면 객체를 생성하고 바로 초기값을 할당해야하는 경우가 많다.
대부분 객체지향 언어는 생성하자마자 기능을 즉시 사용할수 있도록 생성자라는 기능을 제공한다.
1. 클래스 이름과 같아야 한다.
2. 생성자는 반환타입이 없다.

생성자 호출

생성자는 인스턴스를 생성하고 나서 즉시 호출된다. 생성자를 호출하는 방법은 new 명령어 다음에 생성자 이름과 매개변수에 맞추어 인수를 전달하면 된다.
new 생성자이름(생성자에 맞는 인수 목록)
new 클래스이름(생성자에 맞는 인수 목록)

new 키워드를 사용해서 객체를 생성할때 마지막에 괄호()도 포함해야 하는 이유가 생성자때문이다. 객체를 생성하면 동시에 생성자를 호출한다는 의미를 포함한다.

생성자 장점

  1. 중복 호출 제거
    생성자 덕분에 객체를 생성하면서 동시에 필요한 작업을 한번에 처리할 수있게 되었다.
//생성자 등장전
MemberInit member = new MemberInit();
member.initMember("user1", 15, 90);

//생성자 등장 후
MemberConstruct member = new MemberConstruct("user1", 15, 90);
  1. 제약 -생성자 호출 필수
    위 생성자 등장전 코드의 경우, member.initMember("user1", 15, 90); 라인없이도 프로그램이 동작한다. 그럼 데이터가 없는 상태이므로 시스템에 큰 문제가 발생할 수있다.(정보없는 유령 회원)

생성자의 진짜 장점은 객체를 생성할 때 직접 정의한 생성자가 있다면 직접 정의한 생성자를 반드시 호출해야 한다는 점이다. 참고로 생성자를 오버로딩하여 여러개 정의할 수 있는데, 이경우 하나만 호출하면 된다.

  MemberConstruct(String name, int age) {....}

메인

 MemberConstruct member2 = new MemberConstruct(); // 컴파일 오류 발생

컴파일 오류는 IDE 에서 즉시 확인할 수있는 좋은 오류이다.

기본생성자

  1. 매개변수가 하나도 없는 생성자를 기본생성자라 한다.
  2. 클래스에 생성자가 하나도 없으면 자바컴파일러는 매개변수가 없고, 작동하는 코드가 없는 기본생성자를 자동으로 만들어준다.
  3. 생성자가 하나라도 있으면 자바 컴파일러는 기본생성자를 만들지 않는다.
  4. 기본 생성자는 클래스와 같은 접근제어자를 갖는다. 여기서는 public.
public class MemberDefault {
    String name;

    public MemberDefault(){ //아래 생성자 정의를 했으므로 필요하면 기본생성자 직접 정의해야함
        System.out.println("기본 생성자");
    }

    public MemberDefault(String name){
        System.out.println(name+" 직접 정의 생성자");
    }

생성자 오버로딩과 this()

이 코드는 첫번째 생성자 내부에서 두번째 생성자를 호출한다.
this()를 사용하면 생성자 내부에서 다른 생성자를 호출할 수 있다.

public class MemberConstruct {
    String name;
    int age;
    int grade;

    //추가
    MemberConstruct(String name, int age) {
        this(name, age, 50); //변경
    }

    MemberConstruct(String name, int age, int grade) {
        System.out.println("생성자 호출 name=" + name + ",age=" + age + ",grade=" + grade);
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}

this() 규칙

this()는 생성자 코드 첫줄에만 작성할 수 있다. 아래 코드는 규칙위반으로 컴파일 오류가 발생한다.

    MemberConstruct(String name, int age) {
            System.out.println("go");
        this(name, age, 50); 
    }
profile
백엔드 개발공부 로그를 기록합니다

0개의 댓글