Java

생성자

공부처음하는사람 2024. 5. 15. 00:41

 

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

 

생성자가 왜 필요한가?

객체를 생성하고 나면 변수에 초기값을 설정하게 된다.

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

 

이 코드에는 회원의 초기값을 설정하는 부분이 계속 반복된다. 메서드를 사용해서 반복을 제거해봤다.

 

package construct;

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

}

 

Member에 초기값 설정을 하는 메서드를 추가해 코드 중복을 줄였다.

여기까지는 이전에 했던 내용을 복습하는 느낌이다.

 

생성자 도입

위 코드에서는 객체에 초기값을 설정해야하기 때문에 initMember( ) 메서드를 매번 만들어야 한다.

생성자를 사용하면 객체를 생성하자마자 즉시 필요한 기능을 좀 더 편리하게 수행할 수 있다.

 

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

 

생성자를 생성한 코드이다.

생성자는 메서드와 비슷한 모습을 하고있는데, 조금 다른 특징이 있다.

1. 생성자 이름은 클래스 이름과 같아야 한다.

2. 생성자는 반환타입이 없다.

 

생성자는 인스턴스를 생성하고 난 후 즉시 호출된다.

        MemberConstruct member1 = new MemberConstruct("user1", 15, 90);

 

new 다음 생성자의 이름과 매개변수에 맞춰 전달하면 된다.

 

참고로 이전에 인스턴스를 생성했을 때도 위와 비슷한 형태로 코드가 작성되었는데,

new (); 처럼 괄호가 비어있는 상태에서는 우리가 data class에 생성자를 만들지 않았을 땐 자바가 기본 생성자를 자동으로 만들어준다.

반대로 생성자를 만들었을 때엔 기본 생성자가 만들어지지 않으므로 별도로 개발자가 기본 생성자를 만들어줘야한다.

 

생성자의 장점

생성자를 만들면 이 값을 매개변수와 맞춰 필수로 입력해야한다. 그렇지 않으면 컴파일에러가 나기 때문에 실행할 수 없다.

직접 정의한 생성자를 반드시 호출하자! 컴파일에러는 좋은 에러이다~

장점 부분은 이해가 되었으므로 생략하겠다.

 

 

생성자 - 오버로딩, this

생성자도 메서드 오버로딩처럼 사용할 수 있다.

package construct.ex;

public class Book {

    String title; //제목
    String author; //저자
    int page; //페이지 수

    //코드 완성

    Book() {
        this("", "", 0);
    }

    Book(String title, String author) {
        this(title, author, 0);
    }

    Book(String title, String author, int page) {
        this.title = title;
        this.author = author;
        this.page = page;
    }

    void displayInfo() {
        System.out.println("제목: " + title + ", 저자: " +author+ ", 페이지: " + page);
    }
}

 

위 코드에 this(title, author, 0) 부분은 this( ) 라는 기능을 사용하면 생성자 내부에서 자신의 생성자를 호출할 수 있다.

this는 인스턴스 자신의 참조값을 가리킨다.

*참고로 this( ) 는 생성자 코드 첫 줄에서만 사용이 가능하다.

package construct.ex;

public class BookMain {
    public static void main(String[] args) {
        // 기본 생성자 사용
        Book book1 = new Book();
        book1.displayInfo();

        // title과 author만을 매개변수로 받는 생성자
        Book book2 = new Book("Hello Java", "Seo");
        book2.displayInfo();

        // 모든 필드를 매개변수로 받는 생성자
        Book book3 = new Book("JPA 프로그래밍", "kim", 700);
        book3.displayInfo();
    }
}

 

실행 결과

제목: , 저자: , 페이지: 0

제목: Hello Java, 저자: Seo, 페이지: 0

제목: JPA 프로그래밍, 저자: kim, 페이지: 700

 

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

 

 


 

밤낮을 바꾸게 되어서 그런가 오늘 시간이 굉장히 널널했는데 공부에 집중하기 힘들었다.

내일부턴 좀 나아질 것 같으니 내일 좀 더 집중해서 해봐야겠다ㅏㅏ..

 

인스타 유튜브 등등,, 도파민 중독에서 벗어나고자 전부 삭제하고 웹도 차단시켰다. 

아무도 나를 막을 수 없으셈

'Java' 카테고리의 다른 글

final  (0) 2024.06.06
접근 제어자  (0) 2024.05.28
객체 지향 프로그래밍  (1) 2024.05.08
기본형과 참조형  (0) 2024.05.07
클래스 - 배열  (1) 2024.05.07