Chapter6. 클래스_3

박경희·2023년 6월 1일
0

공부를 해보자

목록 보기
9/38

6-3 생성자

  • 생성자는 new 연산자로 호출되는 중괄호{} 블록이다.

  • 객체 생성 시 초기화를 담당하며, 모든 클래스에 반드시 하나 이상 존재해야 한다.

  • 때문에 클래스 내부에 선언을 생략하면 기본 생성자가 자동으로 추가된다.

  • 그러나 클래스에 명시적으로 선언한 생성자가 1개라도 있으면 컴파일러는 기본 생성자를 추가하지 않는다.

  • 명시적으로 생성자를 선언하는 이유는 객체를 다양한 값으로 초기화하기 위해서이다.

객체체 초기화

  • 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것이다.

생성자 선언

  • 생성자는 메소드와 비슷한 모양을 가지고 있으나, 리턴 타입이 없고 클래스 이름과 동일하다.

->손코딩

Car2 myCar = new Car2("그랜저", "검정", 300);

만약 위와같이 Car2 생성자를 호출할 때 3개의 매개값을 제공받는다고 하면,
세 매개값을 생성자가 받기 위해 매개 변수를 선언해야 한다.

public class Car2 {
    //생성자
    Car2(String model, String color, int maxspeed) {
    }
}

이렇게 변수를 선언해 주어야 생성자를 호출할 때 매개값을 받을 수 있다.

  • 클래스에 생성자가 명시적으로 선언되어 있을 경우에는 반드시 선언된 생성자를 호출해서 객체를 생성해야만 한다. 여기서는 기본 생성자(Car2())를 호출해서 객체를 생성할 수 없고 Car2(String model, String color, int cc)를 호출해서 객체를 생성해야 한다.

필드 초기화

  • 클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정된다. 만약 다른 값으로 초기화 하고 싶다면
  1. 필드를 선언할 때 초기값을 준다.
  2. 생성자에서 초기값을 준다.

1.번 사용시 동일한 클래스로부터 생성되는 객체들은 모두 같은 값을 갖게 된다.
2.번은 객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화되어야 한다면 생성자에서 초기화를 해야한다.
ex)국가(대한민국)는 같고 나이와 주민번호가 다르다면 국가는 1번방법을 사용하고 나이와 주민번호는 2번을 사용해 생성 시점에 각각에 맞는 값들로 초기화 해주면 된다.
-> 손코딩

public class Korean {
    //필드
    String nation = "대한민국";
    String name;
    String ssn;

    //생성자

    /* public Korean(String n, String s) {
         name = n;
         ssn = s;
         }*/
         
//    매개 변수의 이름이 너무 짧으면 코드의 가독성이 좋지 않기 때문에 
//    가능하면 초기화 시킬 필드 이름과 비슷하거나 동일한 이름을 사용하는게 좋다.
//    그러나 이렇게되면 필드와 매개변수 이름이 동일하기 때문에 
//    생성자 내부에서 해당 필드에 접근할 수 없다. 
//    그 이유는 동일한 이름의 매개 변수가 사용 우선순위가 높기 때문이다.
//    그래서 this를 사용하여 객체 자신의 참조를 사용해 구분을 지어주는 것이다.
//    'this.필드'는 참조 변수로 필드를 사용하는 것과 동일하다. 

//	   따라서 아래와 같이 만드는게 좋다.

    public Korean(String name, String ssn) {
        this.name = name;
        this.ssn = ssn;
    }

->this를 작성하는 방법은 코드를 계속 따라 치면서 '써야되는구나'정도 생각하고 있었는데 좀 더 명확하게 this의 사용방법이 이해가 됐다.

생성자 오버로딩

  • 다양한 방법으로 객체를 생성할 수 있도록 하는 것.
  • 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 말한다.

다른 생성자 호출 : this()

  • 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있다.
    이 경우 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고
    나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선할 수 있다.
  • 생성자에서 다른 생성자를 호출할 때에 this()코드를 사용한다.

마무리

  • 매개 변수 : 생성자 호출 시 값을 전달받기 위해 선언되는 변수
  • 오버로딩 : 매개 변수를 달리하는 생성자를 여러 개 선언하는 것.
  • this() :객체 자신의 또 다른 생성자를 호출할 때 사용.
  • 손코딩으로 중복코드 줄이기 ok.

*참고 혼자공부하는자바 신용권 지음 한빛미디어.

0개의 댓글