클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

클래스와 객체 4 - 생성자 1 : 기본 생성자 본문

프로그래밍 언어/자바

클래스와 객체 4 - 생성자 1 : 기본 생성자

huenuri 2024. 8. 17. 10:03

이제 생성자 학습을 시작해본다. 오늘 최소한 생성자 단원까지 학습을 마치고 싶다. 금요일이라 놀고 싶은 마음이 많지만 그래도 공부를 조금은 해봐야지!


 

 

 

 

1. 생성자의 개념과 목적

생성자는 객체가 생성될 때 객체의 초기화를 위해 실행되는 메소드이다. 예를 들면, 얼굴 클래스로 얼굴 객체를 만들어낼 수 있다. 만약 생성자 없이 객체가 생성된다면, 생성된 얼굴 객체는 맨 얼굴일 것이다. 하지만 생성자를 실행하여 얼굴의 각 부위를 화장(초기화)하게 한다면, 예쁘게 화장된 얼굴 객체로 생성될 것이다. 또한 화장하는 얼굴 부분이나 색을 다르게 하는 생성자가 있다면, 서도 다른 모양의 얼굴 객체를 생성할 수 있다.

 

 

 

2. 생성자 선언 및 활용

생성자는 객체가 생성되는 순간에 자동으로 호출되는 메소드로서 객체에 필요한 조기화를 실행하는 코드를 담아야 한다.


 

 

두 개의 생성자를 가진 Circle 클래스

다음 코드는 2개의 생성자를 가진 Circle 클래스이다. 실행 결과는 무엇일까?

 

 

 

 

생성자 2개를 생성했는데 하나는 매개변수가 없는 생성자로, 다른 하나는 매개변수가 있는 생성자로 호출되어 결과값을 출력하고 있다.


 

 

 

생성자의 특징

 

1. 생성자의 이름은 클래스 이름과 동일하다

public class Circle {
	public Circle(int r, String n) { ... }	// 생성자
}

 

 

2. 생성자는 여러 개 작성(오버로딩) 할수 있다.

  • 매개변수의 개수와 타입만 다르다면 클래스 내에 생성자를 여러 개 둘 수 있다.
public class Circle {
	public Circle() { ... }					// 매개변수 없는 생성자
    public Cirlce(int r, String n) { ... }	// 2개의 매개변수를 가진 생성자
}

 

 

3. 생성자는 new를 통해 객체를 생성할 때 한번만 호출된다.

  • 객체 생성은 반드시 new를 통해서만 이루어지며, 생성자는 이때 자동으로 한번만 호출된다. 호출하고 싶을 때 아무 때나 호출할 수 있는 메소드가 아니다.
Circle pizza = new(10, "자바피바");		// 매개변수 있는 생성자 Circle 호출
Circle donut = new Circle();			// 생성자 Circle() 호출

 

 

4. 생성자에 리턴 타입을 지정할 수 없다

  • 리턴 타입이 없다고 해서 void를 리턴 타입으로 지정하면 안된다.
public Circle() { ... }		// 리턴 타입 선언하지 않음

 

 

5. 생성자의 목적은 객체가 생성될 때 필요한 초기 작업을 위함이다.

Circle pizza = new Circle(10, "자바피자");		// 생성자 Circle 호출

 

생성자는 객체가 생성될 때 필드 초기화, 필요한 메모리 확보, 파일 열기, 네트워크 연결 등 각체가 활동하기 전에 필요하 초기 준비를 하는데 이용된다.


 

 

 

 

생성자 선언 및 활용 연습

제목과 저자를 나타내는 title과 author 필드를 가진 Book 클래서를 작성하고, 생성자를 작성하여 필드를 초기화하라.

 

 

 

이렇게 메인 메소드 하나에다 작성을 해도 잘 출력이 되고 있다. 생성자를 2개를 만들어서 각각 호출해주었다.


 

 

 

 

 

3. 기본 생성자

기본 생성자(default constructor)란 매개변수와 실행 코드가 없어 아무 일도 하지 않고 단순 리턴하는 생성자이다. 디폴트 생성라고도 부르며 예를 들면 다음과 같다.

class Circle {
	public Circle() { }		// 기본 생성자. 매개변수 없고 아무일 없이 단순 리턴

 

 

1) 기본 생성자가 자동으로 생성되는 경우

생성자가 없는 클래스는 있을 수 없다. 객체가 생성될 때 반드시 생성자가 실행도ㅚ기 때문이다. 그러므로 생성자가 하나도 없는 경우, 컴파일러는 기본 생성자를 자동으로 생성한다. 이처럼 말이다.

Circle pizza = new Circle();	// 생성자 Circle() 호출

 

Circle 클래스에 생성자가 없기 때문에 이 문장은 컴파일 오류가 나는 것이 마땅하다. 하지만 자바 컴파일러는 기본 생성자를 삽입하여, new Circle() 이 실행될 때 생성자 Circle()이 호출되도록 한다. 컴파일러나 기본 생성자를 자동으로 생성한다고 해서 Circle.java 소스 파일이 다음과 같이 변하는 것은 아니다. 

 

 

 

 

 

 


 

 

 

 

2) 기본 생성자가 자동으로 생성되지 않은 경우

생성자가 하나라도 존재하는 클래스에서는 컴파일러가 기본 생성자를 삽입해주지 않는다. 

 

Circle pizza = new Circle(10);		// Circle(int r) 호출

 

이 문장은 매개변수를 가진 다음 생성자를 호출한다.

public Circle(int r) {
	radius = r;
}

 

그러나 다음 new  문장을 위한 생성자 Circle()은 작성되어 있지 않다.

 

Circle donut = new Circle();	// 컴파일 오류. 생성자 Circle() 없음

 

Circle 클래스에는 매개변수를 가진 생성자가 작성되어 있기 때문에 컴파일러는 기본 생성자를 만들어주지 않는다. 

 

 


 

 

 

 

학습을 마치고

어제 생성자 공부를 마치려고 했는데 저녁에 놀다 보니 공부에는 흥미가 떨어져 하지 못했다. 하지만 지난 8월 1일 부터는 매일 하루에 4번은 공부하고 있다. 오늘까지만 두 가지를 허용하고 이제는 진짜 공부에만 집중해야 할 것이다. 만약 취업을 한 다음에도 이런 방탕한 일상을 반복한다면 내게 희망이 남아있지 않을 테니까.

다음 포스트에서는 this 키워드에 대해서 학습해보려고 한다.