본문 바로가기
Java

[ch06 클래스] 생성자

by 김차루 2022. 7. 20.

 

📆 2022년 07월 10일

⏰ 23시 00분 ~ 22시 00분

✍ 혼자 공부하는 자바(신용권) 

 

 

 


 

1. 생성자 & 객체 초기화

1) 생성자

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

 

2) 객체 초기화

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

 

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

 

2. 기본 생성자

- 클래스는 생성자가 반드시 존재하고 생성자를 하나 이상 가질 수 있다. 

- 클래스 내부에 생성자 선언을 생략했다면 컴파일러는 다음과 같이 중괄호{} 블록 내용이 비어 있는 기본 생성자를 바이트 코드에 자동 추가

//소스 파일(Car.java)
public class Car{

}

/*	컴파일⬇	*/

public class Car{
	public Car() { } //자동 추가
}

 

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

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

 

3. 생성자 선언

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

//생성자 블록
클래스 ( 매개변수선언, ... ){
	//객체의 초기화 코드
}

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

- 생성자 내부 : 객체 초기화 코드가 작성, 일반적으로 필드에 초기값을 저장하거나 메소드를 호출하여 객체 사용 전에 필요한 준비를 함

 

1) 매개 변수

- new 연산자로 생성자를 호출할 때 외부의 값을 생성자 블록 내부로 전달하는 역할

- 선언은 생략할 수도 있고 여러 개를 선언해도 좋음

//Example
public class Car{
	//생성자
    Car(String model, String color, int maxSpeed) { ... }
}

- 생성자가 명시적으로 선언되어 있을 경우, 반드시 선언된 생성자를 호출해서 객체를 생성

 

4. 필드 초기화

- 클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정

- 두 가지 방법으로 값 초기화 가능

 

1) 필드를 선언할 때 초기값을 주는 방법

- 동일한 클래스로부터 생성되는 객체들은 모두 같은 값을 갖게 된다. 

- 객체 생성 후 초기값을 변경할 수 있지만, 객체 생성 시점에는 필드의 값이 모두 같다.

public class Korean{
	//필드
	String nation = "대한민국",
    String name;
    String ssn;
    
    //생성자
    public Korean(String n, String s){
    	name = n;
        ssn = s;
    }
}

 

2) 생성자에서 초기값을 주는 방법

public Korean{
	this.name = name;
          //필드 //매개변수
    this.ssn = ssn;
    
}

- 필드와 매개 변수 이름은 동일한 이름으로 사용하는 것이 통상적이다.

- 하지만 동일하다면 생성자 내부에서 해당 필드에 접근할 수 없기 때문에 필드 앞에 'this.'을 붙인다.

❕❕this = 객체 자신의 참조

 

5. 생성자 오버로딩

- 외부에서 제공되는 다양한 데이터들을 이용해서 객체를 초기화하려면 생성자도 다양화될 필요가 있다.

- 다양한 방법으로 객체를 생성을 위해

 

생성자 오버로딩

매개 변수를 달리하는 생성자를 여러 개 선언하는 것

public class 클래스{
	클래스 ([타입 매개변수, ...]) {  //생성자의 오버로딩 - 매개 변수의 타입, 개수, 순서가 다르게 선언
    	...
    }
    
    클래스 ([타입 매개변수, ...]) {  //  (위와 같음)
    	...
    }
}

- 다음은 Car 클래스에서 생성자를 오버로딩한 예

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

 

❗❗생성자 오버로딩 시 주의할 점❗❗

- 매개 변수의 타입과 개수 그리고 선언된 순서가 똑같을 경우 매개 변수 이름만 바꾸는 것은 생성자 오버로딩이 아님

- 생성자 오버로딩이 많아질 경우, 생성자 간의 중복된 코드가 발생

   -----> 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법

 

6. 다른 생성자 호출 : this()

- 자신의 다른 생성자를 호출하는 코드

- 반드시 생성자의 첫 줄에서만 허용

 

- 예제

Car(String model){
	this.model = model;
    this.color = "은색";			//model, color, maxSpeed 중복
    this.maxSpeed = 250;
}

Car(String model, String color){
	this.model = model;
    this.color = color;
    this.maxSpeed = 250;
}

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

- this()를 이용

public class Car{

	String company = "현대자동차";
    String model;
    String color;
    int maxSpeed;
    
    Car(){
    
    }
    
    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;
    }
}

 

 

 

 

'Java' 카테고리의 다른 글

[ch06 클래스]  (0) 2022.08.04
[ch06 클래스] 객체 지향 프로그래밍  (0) 2022.07.19
[ch04 조건문과 반복문]  (0) 2022.07.18
[ch05 참조타입] 열거 타입  (0) 2022.07.11
[ch05 참조타입] 배열  (0) 2022.07.11