[생성자] Book과 생성자

Yeonbi_Kim·2024년 7월 19일
post-thumbnail

BookMain 코드가 작동하도록 Book클래스를 완성하시오

특히 Book 클래스의 생성자 코드에 중복이 없도록 주의하라.

문제에 주어진 BookMain 코드

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

}

<문제풀이>

<Book 클래스>

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

<결과값>

제목: . 저자: , 페이지:0
제목: Hello Java, 저자: Seo, 페이지: 0
제목: JPA 프로그래밍, 저자: kim, 페이지: 700

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


1. 전체적인 코드 구조 요청

코드의 구조는 다음과 같습니다:

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

package construct.ex;

public class Book {
    String title; // 제목
    String author; // 저자
    int page; // 페이지 수
    
    // 기본 생성자
    Book() { 
        this("", "", 0);
    }
    
    // title과 author만을 매개변수로 받는 생성자
    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);
    }
}

2. 특정 부분의 기능 묻기

질문 예시: Book 클래스의 Book(String title, String author) 생성자가 어떤 기능을 하는지 설명해 주세요.

답변: Book(String title, String author) 생성자는 책의 제목(title)과 저자(author)만을 매개변수로 받아 객체를 초기화합니다. 페이지 수(page)는 0으로 설정됩니다. 내부적으로 this(title, author, 0)을 호출하여 세 번째 생성자를 사용합니다.

3. 입력과 출력 분석 요청

질문 예시: BookMain 클래스의 main 메서드에서 book1, book2, book3 객체를 만들고 호출할 때 입력과 출력이 어떻게 되나요?

답변:

  • Book book1 = new Book();
    • 입력: 없음 (기본 생성자)
    • 출력: 제목: , 저자: , 페이지: 0
  • Book book2 = new Book("Hello Java", "Seo");
    • 입력: 제목 "Hello Java", 저자 "Seo"
    • 출력: 제목: Hello Java, 저자: Seo, 페이지: 0
  • Book book3 = new Book("JPA 프로그래밍", "kim", 700);
    • 입력: 제목 "JPA 프로그래밍", 저자 "kim", 페이지 700
    • 출력: 제목: JPA 프로그래밍, 저자: kim, 페이지: 700

4. 에러 처리 방법 문의

질문 예시: 이 코드에서 에러가 발생할 수 있는 부분과 그 처리 방법을 설명해 주세요.

답변: 현재 코드에서는 명시적인 에러 처리 로직이 없습니다. 그러나 다음과 같은 부분에서 에러가 발생할 수 있습니다:

  • 잘못된 패키지 선언이나 import 문제.
  • Book 클래스의 생성자에서 this() 호출 시 잘못된 인자 전달.

에러 처리를 위해 try-catch 블록을 사용하여 예외를 처리할 수 있습니다.

5. 코드 최적화와 리팩토링 조언 요청

질문 예시: 이 코드를 최적화하거나 리팩토링할 수 있는 방법이 있을까요?

답변:

  • displayInfo() 메서드를 더 가독성 좋게 출력할 수 있습니다.
  • 모든 생성자에서 this()를 사용하여 코드 중복을 최소화했습니다. 이는 이미 최적화된 형태입니다.
void displayInfo() {
    System.out.println(String.format("제목: %s, 저자: %s, 페이지: %d", title, author, page));
}

6. 코드와 관련된 용어나 개념 설명 요청

질문 예시: this 키워드의 역할을 설명해 주세요.

답변: this 키워드는 현재 객체의 참조를 나타냅니다. 이를 통해 객체의 필드와 메서드를 참조할 수 있습니다. 생성자 내부에서 this()를 사용하면 현재 클래스의 다른 생성자를 호출할 수 있습니다. 이는 생성자 간 코드 중복을 줄이고 일관된 객체 초기화를 돕습니다.

0개의 댓글