강의내용정리/Java

[Java] 생성자

송병민 2025. 1. 20. 18:50

생성자

객체를 생성하고 이후 바로 초기값을 할당해야 하는 경우가 많다. 그래서 대부분의 객체 지향 언어는 객체를 생성하자마자 필요한 기능을 좀 더 편리하게 수행할 수 있도록 생성자라는 기능을 제공한다. 생성자를 사용하면 객체를 생성하는 시점에 즉시 필요한 기능을 수행할 수 있다.

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

 

생성자는 메서드와 비슷하지만 조금 다르다

  • 생성자의 이름은 클래스 이름과 같아야 한다
  • 생성자는 반환타입이 없다

생성자 호출

new 생성자이름(생성자에 맞는 인수 목록);
new MemberConstruct("user1", 15, 90);

생성자는 인스턴스를 생성하고 나서 즉시 호출된다. 생성자를 호출하는 방법은 new 명령어 다음 이름, 매개변수에 맞추어 인수를 전달한다. 그리고 new 키워드를 사용해서 객체 생성시 괄호() 도 포함해야한다.


생성자 장점

  • 중복 호출 제거
    • 생성자가 없으면 객체 생성 직후 어떤 작업을 수행하기 위해 메서드를 직접 한번 더 호출해야했다
    • 생성자를 사용해 객체 생성과 동시에 직후 필요한 작업을 한번에 처리할 수 있다
  • 제약
    • 객체를 생성할 때 직접 정의한 생성자가 있다면 반드시 호출해야 한다
    • 오버로딩된 생성자가 있다면 하나만 호출하면 된다
  • 필수값 입력을 보장
    • 제약으로 인해 객체 생성 시 데이터가 없는 유령 객체가 생성되는걸 원천 차단

※ 좋은 프로그램은 무한한 자유도가 주어지는 프로그램이 아니라 적절한 제약이 있는 프로그램이다


기본 생성자

  • 매개변수가 없는 생성자를 기본 생성자라고 함
  • 클래스에 생성자가 하나도 없으면 컴파일러에서 매개변수가 없고, 작동하는 코드가 없는 기본 생성자를 자동으로 만들어줌
  • 생성자가 하나라도 있으면 기본 생성자는 생성되지 않음
public class MemberDefault {
    String name;

    //기본 생성자
    public MemberDefault() {
    }
}

 기본 생성자를 자동으로 만들어주지 않는다면 생성자 기능이 필요하지 않은 경우에도 모든 클래스에 직접 기본 생성자를 정의해야 하기 때문에 생성자를 사용하지 않더라도 편의 기능을 제공한다


생성자가 필요한 이유

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

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);
        }
    }
}
  • 회원 객체를 생성한 후 name, age, grade 변수에 초기값을 설정
  • 멤버 생성이 될 때마다 반복됨

멤버를 생성하는 반복되는 코드를 메서드로 분리해보자

public class MethodInitMain2 {
    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;
    }
}
  • initMeber 메서드를 사용해서 반복 제거
  • initMeber 메서드에서 사용하는 변수는 MemberInit 객체 멤버변수기 때문에 MemberInit 객체에서 메서드를 제공하는 것이 좋아 보임
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;
    }
}

public class MethodInitMain3 {
    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);
        }
    }
}
  • initMember() 메서드는 Member 객체 초기값 설정 기능 제공 메서드

this

  • 메서드에서 멤버변수와 매개변수 중 매개변수가 코드 블럭의 더 안쪽에 있어 매개변수가 우선순위가 높다
  • initMember(String name, ...) 메서드에서 name을 사용하게 되면 매개변수 name에 접근한다
  • 멤버변수 name에 접근하기 위해서는 this를 사용한 this.name 이라고 써야한다
this.name = name; // 오른쪽의 name은 매개변수에 접근
this.name = "user"; // name 매개변수의 값 사용
x001.name = "user"; // this. 은 인스턴스 자신의 참조값, 따라서 인스턴스의 멤버변수에 접근
  • 매개변수의 이름과 멤버 변수의 이름이 같은 경우 this로 구분
  • this는 인스턴스 자신을 가리킴
  • 매개변수와 멤버변수의 이름이 다르다면 생략도 가능하다
    • 변수를 찾을 때 가까운 지역변수를 찾고, 없다면 멤버변수를 찾는다 (멤버변수도 없으면 오류)

 

'강의내용정리 > Java' 카테고리의 다른 글

[Java] 객체 지향 프로그래밍  (0) 2025.01.20
[Java] 기본형과 참조형  (0) 2025.01.13
[Java] 클래스와 객체  (0) 2025.01.13