Tiny Bunny [JAVA] 멘토씨리즈 자바_SECTION.09 - 솜님의 블로그
솜님의 블로그
작성일
2024. 7. 22. 09:08
작성자
겨울솜사탕

생성자의 특징

생성자란?

클래스를 구성하는 구성요수 중 하나인 생성자는, 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.

객체를 생성하고 초기화하기 위해서는 반드시 생성자를 호출해야 한다.

따라서 객체를 생성해야 하는 라이브러리용 클래스는 모두 생성자를 가지고 있다.

 

생성자는 일반 메서드와 달리 반환 타입이 없으며, 메서드 이름은 클래스 이름과 동일하다.

생성자의 기본 구조는 아래와 같다.

클래스명(매개변수1, 매개변수2){

}

 

생성자 호출 위치

일반 메서드들과는 다르게, 생성자는 호출할 수 있는 곳이 정해져 있다.

생성자는 클래스 기반으로 객체를 생성할 때, 객체를 초기화 하는 담당이므로 객체를 생성할 때만 호출할 수 있다.

 

생성자 호출 방법

생성자를 호출할 때는 new 키워드를 함께 사용한다.

* new 키워드는 생성자와 함께 객체를 생성하는 중요한 역할을 하는 연산자이다.

 

생성자를 통해 객체를 생성하는 방법은 다음과 같다.

클래스명 객체명 = new 클래스명();

여기서 new 클래스명(); >> 이 메서드가 바로 생성자이다!

 

public class Snack{ // 클래스 선언
	int price;
    
    void info(){
    	System.out.println("과자의 가격은 " + price + "원입니다."); 
    }
}

public class EX09_02{ //클래스 선언
	public static void main(String[] args){
    	Snak chip = new Snack(); // 객체 생성 및 초기화
        chip.price = 2000; // 객체 필드 설정
        chip.info(); // 객체 메서드 호출
    }
}

 

위 코드를 실행했을 때, 실행 결과는

: 과자의 가격은 2000원입니다.

 

 

기본 생성자

자바의 모든 클래스에는 하나 이상의 생성자가 정의되어 있어야 한다.

클래스를 생성하면서 개발자가 직접 생성자를 선언하지 않았지만, 자바 컴파일러가 기본 생성자를 자동으로 제공해 준다.

다만 우리가 보는 코드에는 생략되어 있다.

우리가 직접 생성자를 선언하지 않으면, 컴파일러가 자동으로 생성자를 추가해서 객체 생성에 활용한다.

이를 '기본 생성자' 라고 부른다.

클래스명(){ // 매개변수도 없음
	// 안에는 텅텅 비어있음
}

기본 생성자는 매개변수가 별도로 없으며, 중괄호{} 블록 안에도 코드가 없는 비어있는 생성자를 말한다.

만약 개발자가 직접 생성자를 선언한다면, 컴파일러는 선언된 생성자를 사용한다.

 

생성자 선언 이유

생성자는 객체를 생성함과 동시에 객체를 초기화 할 수 있다.

생성자를 통해 객체를 초기화 한다는 것은 필드와 메서드를 호출하는 등 객체를 사용하기 위해 객체를 메모리에 올린다는 의미가 있다.

public class Snack{ // 클래스 선언
	int price;
    
    Snack(int p){ // 직접 선언한 생성과
    	price = p; // 매개변수로 받은 값을 필드 price에 대입
    }
    
    void info(){
    	System.out.println("과자의 가격은" + price + "원입니다.")
    }
}

 

생성자에 매개변수로 int p를 받아서 필드 price에 값을 대입해 주었다.

 

생성자를 통한 필드 초기화

생성자를 통하지 않고, 클래스에서 필드를 선언할 때 필드를 초기화 할 수 있다.

public class Snack{
	int price = 2000;
}

위와 같은 클래스로 객체를 만들 경우 모든 과자의 가격이 2,000원으로 생성된다.

하지만 과자마다 가격이 다르다면 생성자를 통해 가격을 전달하고 객체를 생성하는 것이 조금 더 효율적일 수 있다.

 

Snack potatochip = new Snack(2000);

Snack chocolate= new Snack(1800);

 

 

 

생성자 오버로딩

오버로딩

생성자에 전달할 매개변수가 부족하면, 객체를 생성할 수 없다. 선언된 생성자의 형태에 맞게 매개변수를 전달해 줘야 하기 때문이다.

자바는 상황에 따라 매개변수 없이 또는 1개, 2개 등 외부에서 제공할 수 있는 데이터만큼 매개변수로 전달하여 객체를 생성할 수 있도록 여러개의 생성자를 선언하는 것을 허용하고 있다.

이를 생성자 오버로딩이라고 한다.

 

 

this와 this()

this : 객체 자기 자신 스스로 참조

this 참조 변수는 인스턴스가 바로 자기 자신을 참조하는 데 사용하는 변수이다.

this를 필드에 붙여서 사용하면, 중괄호{} 안에서도 같은 이름의 매개변수와 필드를 구분해 사용할 수 있다.

this.필드 = 매개변수명;

 

this 키워드를 사용하면, 우리는 생성자를 다음과 같이 작성할 수 있다.

class Student{
	String name;
    int age;
    int studentID;
    
    Student(String name, int age, int studentID){
    	this.name = name;
        this.age = age;
        this.studentID = studentID;
    }
}

일반적으로 특정 필드에 값을 대입하기 위해 매개변수를 전달받는 경우, 필드와 같은 이름의 배개변수를 사용합니다.

 

 

this()

매개변수를 2개 받는 생성자와 매개변수를 3개 받는 생성자는 사실 코드가 중복되고 있다.

중복되는 코드를 this() 메서드를 활용해 줄일 수 있다.

 

this(매개변수1, 매개변수2,...)

Phone(String brand, int series){ //매개변수를 2개 받는 생성자
	this.brand = brand;
    this.series = series;
}

Phone(String brand, int series, String color){ // 매개변수를 3개 받는 생성자
	this(brand, series);
    this.color = color;
}

* this() 메서드는 반드시 생성자의 첫 줄에서만 사용할 수 있다.