[자바] 생성자, this

brand_mins·2024년 1월 16일

Java

목록 보기
42/47

1. this

  • 자신의 참조값을 나타낸다.
package constract;

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

    //추가
    void initMember(String name, int age, int grade) {
        this.name = name; // 멤버 변수의 데이터를 넣고 싶을때 앞에 this사용.
        this.age = age;
        this.grade = grade;
    }
}
  • 멤버 변수와 메서드의 매개변수 이름이 같을때 어떻게 구분?
  • 매개변수 우선순위에 따라 안쪽 블록 우선적으로 사용한다.
    즉, initMember 메서드의 변수들을 클래스의 멤버변수에 참조값을 대입한다.
  • 즉, this는 자기 자신의 인스턴스라고 보면 된다.
  • this는 멤버 변수에 접근하기 위해 구분하려고 만든 생성자.

1) this 생략

  • 필드 이름과 매개변수 이름이 같을때는 this을 생략할 수 있다.
package constract;

public class MemberThis {
    String nameField;

    void initMember(String nameParameter) {
        nameField = nameParameter;
    }
}
  • nameField는 지역변수에서 같은 이름이 있는지 찾고 없으면 멤버변수에서 찾는다.
  • nameParameter는 지역변수에서 같은 이름이 있는지 찾기. 있으면 매개변수 사용.

2. 생성자

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;
}
  • 생성자의 이름은 클래스 이름과 같아야 한다. (불일치시 컴파일오류)
  • 생성자의 반환 타입은 존재하지 않는다.(예: void)
  • 나머지 메서드는 같다.
new 생성자/클래스 이름(생성자에 맞는 인수목록)
  • 위 코드처럼 생성한다면 즉시 해당 생성자를 호출할 수 있다.
  • new 키워드를 사용해서 객체를 생성할때 마지막 괄호를 쓰는 이유도 생성자를 호출해야 하기 때문에 사용된다.
  • 생성자를 사용하면 필수값 입력을 보장할 수 있다.

1) 기본 생성자

  • 매개변수가 없는 생성자
  • 클래스에 생성자가 하나도 없으면 기본생성자를 자동으로 만들어준다.
  • 하나라도 있으면 기본생성자를 만들지 않는다.
package construct;

public class MemberDefault {
    String name;

    // 생성자 추가
    MemberDefault() {
        System.out.println("생성자 호출");
    }


}

왜 자동으로 기본 생성자를 만들까?
자바에서 기본 생성자를 만들어 주지 않으면 개발자가 직접 정의해야함.

2) 오버로딩과 this

  • 메서드 오버로딩처럼 매개변수만 다르게 해서 여러 생성자 제공
package construct;

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

package construct;

public class ConstructMain2 {
    public static void main(String[] args) {
        // 즉, 메모리에 먼저 생성해서 값을 호출하고 member1 인스턴스에 대입한다.
        MemberConstruct member1 = new MemberConstruct("user1",15,90); // 괄호에 생성자 객체를 불러와라.
        MemberConstruct member2 = new MemberConstruct("user2", 16); // grade를 입력하지 않으면 grade를 입력하지 않는 생성자 호출하여 입력

        MemberConstruct[] members = {member1, member2};

        for(MemberConstruct s : members) {
            System.out.println("이름: " + s.name + ", 나이: " + s.age + ", 성적: " + s.grade);
        }
    }
}
profile
IT 개발자가 되기 위한 기록

0개의 댓글