Java 문법

6-3클래스(생성자)

개발하는지호 2023. 9. 30. 03:58

생성자 : 생성자는 new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.

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

 

-생성자를 실행하지 않고는 클래스로부터 객체를 만들 수 없다.

-new 연산자에 의해 생성자가 성공적으로 실행되면 힙(heap) 영억에 객체가 생성되고 객체의 번지가 리턴된다.

-리턴된 객체의 번지는 클래스 변수에 저장된다.

 

기본 생성자

모든 클래스는 생성자가 반드시 존재하며, 생성자를 하나 이상 가질 수 있다. 우뤼가 클래스 내부에 생성자 선언을 생략했다면 컴파일러는 다음과 같이 중괄호 {} 블록 내용이 비어 있는 기본 생성자(default constructor)를 바이트 코드에 자동 추가한다.

 

[public] 클래스() { }

 

-클래스가 public class로 선언되면 기본 생성자에도 public이 붙지만, 클래스가 public 없이 class로만 선언되면 기본 생성자에도 public이 붙지 않습니다.

 

생성자 선언

기본 생성자 대신 우리가 생성자를 명시적으로 선언하려면 다음과 같은 형태로 작성하면 된다.

클래스( 매개변수 선언 ....) {

   //객체의 초기화 코드

} -> 생성자 블록

 

- 매개 변수 선언은 생략할 수도 있고 여러 개를 선언해도 된다. 매개 변수는 new 연산자로 생성자를 호출할 때 외부의 값을 생성자 블록 내부로 전달하는 역할을 한다.

 

public class Car {

   //생성자

   Car(String model, String color, int maxSpeed){....}

}

 

*클래스에 생성자가 명시적으로 선언되어 있을 경우에는 반드시 선언된 생성자를 호출해서 객체를 생성해야만 한다.

 

필드 초기화

클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정된다. 만약 다른 값으로 초기화 하고 싶다면 두 가지 방법이 있다.

 

첫째, 필드를 선언할 때 초기값을 주는 방법이다. -> 동일한 클래스로부터 생성되는 객체들은 모두 같은 값을 갖게 된다.

둘째, 생성자에서 초기값을 주는 방법이다. ->  객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화되어야 한다면 생성자에서 초기화해야 한다.

 

*this 사용

매개 변수의 이름이 너무 짧으면 코드의 가독성이 좋지 않기 때문에 가능하면 초기화시킬 필드 이름과 비슷하거나 동일한 이름을 사용하는 것이 좋다. 일반적으로 필드와 동일한 이름을 갖는 매개 변수를 사용한다.

 

그러나, 이 경우 필드와 매개 변수 이름이 동일하기 때문에 생성자 내부에서 해당 필드에 접근할 수 없습니다. 왜냐하면 동일한 이름의 매개 변수가 사용 우선순위가 높기 때문이다. 해결 방법은 필드 앞에 'this.'를 붙이면 된다. this는 객체 자신의 참조인데, 우리가 우리 자신을 '나'라고 하듯이 객체가 객체 자신을 this라고 한다. 'this.필드'는 this라는 참조 변수로 필드를 사용하는 것과 동일하다.

ex)

public Korean(String name, String ssn) {

  this.name = name;

  this.ssn = snn;

 

}

 

생성자 오버로딩

생성자 오버로딩이란 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 말한다.

ex)

public class Car {

  Car() {...}

  Car(String model) {...}

  Car(String model, String color) {...}

  Car(String model, String color, int maxSpeed) {...}

}

 

다른 생성자 호출: this()

생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있다. 매개 변수의 수만 달리하고 필드 초기화 내용이 비슷한 생성자에서 이러한 현상을 많이 볼 수 있다.  이 경우에는 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선할 수 있다.

 

*this()는 자신의 다른 생성자를 호출하는 코드로 반드시 생성자의 첫 줄에서만 허용된다.

ex)

public class Car {

  //필드

  String company = "현대자동차";

  String model;

  String color;

  int maxSpeed;

 

  Car() {

  }

 

  Car(String model) {

     this(model, "은색", 250)

  }

  Car(String model) {

     this(model, "은색", 250)

  }

  Car(String model, String color) {

     this(model, color, 250)

  }.  

  Car(String model, String color, int maxSpeed) {

     this.model = model;

     this.color = color;

     this.maxSpeed = maxSpeed;

  }

}