[JAVA] 김영한의 실전 자바 ; 생성자

선뀰·2023년 12월 27일
0

JAVA

목록 보기
12/25

생성자

객체를 생성하는 시점에 어떤 작업을 하고 싶다면 생성자를 이용하면 된다.

public static void main(String[] args) {
      MemberInit member1 = new MemberInit();
      MemberInit member2 = new MemberInit();
      initMember(member1, "user1", 15, 90);
      initMember(member2, "user2", 16, 80);
      member2.name = "user2";
      member2.age = 16;
      member2.grade = 80;

      MemberInit[] members = {member1, member2};
      for (MemberInit s : members) {
          System.out.println("이름 : " + s.name + "나이 : " + s.age + "성적 : " + s.grade);
      }

  }
  // 자기 자신의 데이터를 변경하는것이 좋다.
  static void initMember(MemberInit member, String name, int age, int grade) {
      member.name = name;
      member.age = age;
      member.grade = grade;
  }

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;
    }
}

멤버 변수와 메서드의 매개변수의 이름이 같으면 어떻게 구분해야 할까?
멤버 변수보다 매개변수가 코드 블럭의 더 안쪽에 있기 때문에 매개변수가 우선순위를 가진다.
멤버 변수에 접근하려면 this.를 사용하면 된다. 인스턴스 자신의 참조값을 가리킨다.
인스턴스 자신의 참조값을 가리킨다.

= 매개변수의 이름과 멤버 변수의 이름이 같은 경우 this를 사용해서 둘을 명확하게 구분해야 한다. this는 인스턴스 자신을 가리킨다.

this.nameField = nameParameter; this가 생략되어 있을수도 있다.
IDE가 멤버 변수와 지역 변수를 색상으로 구분해주기 때문에 굳이 사용하지 않아도 된다.

생성자 - 도입

객체를 생성하고 이후에 바로 초기값을 할당해야 하는 경우가 많다.
생성자를 사용하면 객체를 생성하는 시점에 즉시 필요한 기능을 수행할 수 있다.

initMember()와 같이 메서드와 유사하지만 몇가지 다른 특징이 있다.
생성자는 대문자로 시작하고, 반환타입(void, int 등) 이 없다.

기본 생성자

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

MemberConstruct member2 = new MemberConstruct("user2", 16, 80);
이렇게 하면 인스턴스를 생성하고, 즉시 해당 생성자를 호출한다. 객체를 생성하면서 동시에 생성자를 호출한다.

생성자 장점

  • 중복 호출 제거
    메서드를 한번 더 호출하지 않고, 객체를 생성하면서 동시에 생성 직후에 필요한 작업을 한번에 처리할 수 있다.

객체를 생성할 때 직접 정의한 생성자가 있다면 직접 정의한 생성자를 반드시 호출해야 한다는 점이다. 필수값 입력을 보장할 수 있다.

생성자 제약

생성자 호출이 필수이다. 생성자를 호출하지 않으면 컴파일 오류가 발생한다.

생성자 - 오버로딩과 this()

생성자도 오버로딩처럼 매개변수만 다르게 하여 생성자를 제공할 수 있다.

MemberConstruct(String name, int age)
MemberConstruct(String name, int age, int grade)


MemberConstruct(String name, int age) {
        this.name = name;
        this.age = age;
        this.grade = 50;
    }

꼭 필요한 경우에는 grade가 있는 생성자를 호출하면 되고, 그렇지 않은 경우
grade가 없는 생성자를 호출하면 된다.
호출할 때 직접 정의한 생성자를 통해 -> 50점이 된다.

기본 생성자

생성자를 만들지 않았는데, 생성자를 호출
매개변수가 없는 생성자를 기본 생성자라 한다. 클래스에 생성자가 하나도 없으면, 자바 컴파일러는 매개변수가 없고, 작동하는 코드가 없는 기본 생성자를 자동으로 만들어준다. 생성자가 하나라도 있다면 자바는 기본 생성자를 만들지 않는다.

생성자 기능을 사용하지 않는 경우도 많기 때문에 편의 기능을 제공하는 것이다.

public class MemberInit {
	String name;
    int age;
    int grade;
    
    MemberInit() { // 생성자 필요
    }
}

- 정리
생성자가 없으면 기본 생성자가 제공된다.
생성자는 반드시 호출되어야 한다.
생성자가 하나라도 있으면 기본 생성자가 제공되지 않는다. -> 개발자가 정의한 생성자를 직접 호출해야 한다.

생성자를 호출할 수 있다.

  • this()
    this() 라는 기능을 사용하면 생성자 내부에서 자신의 생성자를 호출할 수 있다. this는 자신의 참조값을 가리킨다. 자신의 생성자를 호출한다고 생각하면 된다.
    하지만 this()는 생성자 코드의 첫줄에만 작성할 수 있다.
MemberConstruct(String name, int age) {
        // 자기 자신의 생성자를 호출한다. 그래서 중복을 피할 수 있다.
        this(name, age, 50);
    }

    // 생성자이다. 대문자로 시작하고, 반환타입(void, int 등)이 없다.
    MemberConstruct(String name, int age, int grade){
        // 출력만 확인할 수 있도록
        System.out.println("생성자 호출 : " + name + ", age = " + age + ", grade = " + grade);
        this.name = name;
        this.age = age;
        this.grade = grade;
    }

이 코드는 첫번째 생성자 내부에서 두번째 생성자를 호출한다.

생성자는 객체 생성 직후 객체를 초기화 하기 위한 특별한 메서드로 생각할 수 있다.

문제풀이

  • Book과 생성자
profile
공부 기록

0개의 댓글