본문 바로가기
[김영한 자바 강좌] 정리/기본

[김영한의 실전 자바 (기본편)] 섹션4 - 생성자

by haeyoon 2024. 4. 22.

[생성자]

package construct;

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

1) 생성자가 없을 때

package construct;

public class MethodInitMain1 {
    public static void main(String[] args) {
        MemberInit member1 = new MemberInit();
        member1.name = "user1";
        member1.age = 15;
        member1.grade = 90;

        MemberInit member2 = new MemberInit();
        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);
        }
    }
}

 

2) initMember 생성자가 있을 때

package construct;

public class MethodInitMain1 {
    public static void main(String[] args) {
        MemberInit member1 = new MemberInit();
        initMember(member1, "user1", 15, 90);

        MemberInit member2 = new MemberInit();
        initMember(member2, "user2", 16, 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;
    }
}

1. this

package construct;

public class MemberInit {
    //멤버변수
    String name; // == this.name
    int age; // == this.age
    int grade; // == this.grade

    void initMember(String name, int age, int grade){ // 매개변수
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}

this를 사용해 자기자신의 인스턴스를 가르킨다.

 

Q. 멤버 변수와 메서드의 매개변수의 이름이 같으면 둘을 어떻게 구분해야할까?

  A. 그냥 name은 함수의 initMember 매개변수를 의미하는것이기때문에 this.namename을 대입해야한다,

package construct;

public class MethodInitMain2{
    public static void main(String[] args) {
        MemberInit member1 = new MemberInit();
        member1.initMember("user1", 15, 90);

        MemberInit member2 = new MemberInit();
        member2.initMember("user2", 16, 80);

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

 


2. 생성자

[코드]

package construct;

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

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

 

다음 부분이 바로 생성자이다.

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

 

생성자 VS 메서드

 - 생성자 이름 == 클래스 이름

 - 생성자는 반환타입이 없다

 - 나머지는 메서드와 동일

package construct;

public class ConstructMain1 {
    public static void main(String[] args) {
        //인스턴스 생성과 동시에 생성자 호출
        MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
        MemberConstruct member2 = new MemberConstruct("user2", 16, 80);

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

 인스턴스를 생성하고 즉시 해당 생성자를 호출한다.

//생성자 등장 전
MemberInit member = new MemberInit();
member.initMember("user1" , 15, 90);

//생성자 등장 후
MemberConstruct member1 = new MemberConstruct("user1", 15, 90);

3. 기본 생성자

기본생성자란?

매개변수가 없는 생성자

클래스에 생성자가 하나도 없으면 매개변수가 없고, 작동하는 코드가 없는 기본 생성자를 자동으로 만들어준다,

 

[코드]

해당 코드에서 MemberInit() 생성자를 자동으로 생성한다.

package construct;

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

    void initMember(String name, int age, int grade){
        this.name = name; //this를 사용해 자기자신의 인스턴스를 가르킴
        this.age = age;
        this.grade = grade;
    }
}
package construct;

public class MethodInitMain1 {
    public static void main(String[] args) {
        MemberInit member1 = new MemberInit();
        initMember(member1, "user1", 15, 90);
        
        System.out.println("이름: "+member1.name + "나이: "+member1.age + "성적: "+member1.grade);
    }
    static void initMember(MemberInit member, String name, int age, int grade){
        member.name = name;
        member.age = age;
        member.grade = grade;
    }
}

 

따라서 위 코드에서 다음처럼 생성자를 호출할 수 있다!

 MemberInit member1 = new MemberInit();

 


 

4. 생성자 오버로딩

[코드]

같은 이름의 생성자 생성

package construct;

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

    //생성자1
    MemberConstruct(String name, int age){
        this.name = name;
        this.age = age;
        this.grade = 50;
    }
    //생성자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;
    }
}
package construct;

public class ConstructMain2 {
    public static void main(String[] args) {
        MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
        MemberConstruct member2 = new MemberConstruct("user2", 16);

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

→ 출력: 

 

생성자 오버로딩을 통해 원하는 생성자를 호출한다!

 

[코드2]

생성자 코드에서 중복제거 

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

첫번째 생성자 내부에서 두번째 생성자를 호출하는 코드

 

+ this() 규칙!

생성자 코드의 첫줄에서만 사용할수있다!

    MemberConstruct(String name, int age) {
    	System.out.println("go");
        this(name, age, 50);
    }

다음과 같은 코드는 사용 불가!