자바 생성자와 this 키워드, 헷갈릴 땐 이렇게 정리!
생성자(Constructor)와 this 키워드, 헷갈리기 쉬운 개념이지만 사실 알고 보면 명쾌한 규칙이 있습니다.
안녕하세요! 자바를 배우면서 클래스와 객체 개념까지는 잘 이해했는데, 생성자랑 this 키워드에서 막히는 분들 많으시죠? 저도 처음엔 생성자 이름이 클래스랑 똑같은 이유가 뭔지, this는 왜 자꾸 붙이는지 이해가 안 갔어요. 근데 코드를 직접 짜면서 상황별로 정리해보니 머릿속이 딱 정리되더라고요. 오늘 이 글에서는 생성자와 this 키워드를 처음 접하거나 애매하게 알고 계신 분들을 위해 가장 쉬운 언어로 정리해볼게요!
목차
생성자란 무엇인가?
생성자(Constructor)는 객체가 생성될 때 자동으로 호출되는 메서드예요. 이 메서드는 클래스 이름과 같아야 하며, 리턴 타입이 없어요. 주로 객체의 초기값 설정이나 필드 초기화에 사용됩니다.
자바에서는 생성자를 명시적으로 작성하지 않으면 컴파일러가 기본 생성자(매개변수 없는 생성자)를 자동으로 추가해줍니다. 하지만 우리가 직접 생성자를 정의하면, 자바는 기본 생성자를 생성하지 않아요. 따라서 필요하다면 우리가 직접 기본 생성자도 만들어야 해요.
기본 생성자와 매개변수 생성자
생성자는 크게 두 가지로 나눌 수 있어요. 기본 생성자와 매개변수 생성자. 각각의 역할과 차이를 표로 정리해볼게요.
종류 | 설명 | 예시 |
---|---|---|
기본 생성자 | 매개변수가 없음, 보통 기본값 설정에 사용 | public Car() { } |
매개변수 생성자 | 값을 외부에서 받아 초기화할 수 있음 | public Car(String color) { this.color = color; } |
생성자 오버로딩 이해하기
오버로딩(Overloading)이란 같은 이름의 메서드나 생성자를 매개변수만 다르게 여러 개 정의하는 걸 말합니다. 생성자에서도 오버로딩을 사용하면 다양한 방식으로 객체를 생성할 수 있어요.
- 매개변수 개수가 다를 때
- 매개변수 타입이 다를 때
- 순서가 다른 경우
예를 들어 Car 클래스에서 색상만 받거나, 색상과 속도를 같이 받을 수도 있죠:
public Car() {
this.color = "검정";
this.speed = 0;
}
public Car(String color) {
this.color = color;
this.speed = 0;
}
public Car(String color, int speed) {
this.color = color;
this.speed = speed;
}
this 키워드의 진짜 의미
자바에서 this
는 현재 객체 자신을 의미해요. 필드 이름과 지역 변수 이름이 같을 때 구분하기 위해 사용하죠. 특히 생성자에서 매개변수 이름을 필드와 동일하게 할 때 자주 사용됩니다.
public class Car {
String color;
public Car(String color) {
this.color = color; // 필드와 매개변수 이름이 같을 때 구분
}
}
this를 쓰지 않으면 지역 변수인 매개변수가 우선적으로 인식되기 때문에, 필드가 원하는 값으로 초기화되지 않을 수 있어요. 따라서 구분을 확실히 하기 위해 반드시 사용해야 합니다.
this()로 다른 생성자 호출하기
자바에서는 this()를 사용해서 같은 클래스 안의 다른 생성자를 호출할 수 있어요. 이렇게 하면 중복된 초기화 코드를 줄일 수 있어서 훨씬 효율적이죠. 다만 주의할 점은 반드시 생성자 내부 첫 줄에 와야 한다는 겁니다.
구문 | 설명 |
---|---|
this() |
기본 생성자 호출 |
this("blue") |
다른 생성자에 매개변수 전달하며 호출 |
public Car() {
this("흰색"); // 다른 생성자 호출
System.out.println("기본 생성자 실행");
}
public Car(String color) {
this.color = color;
System.out.println("색상 지정 생성자 실행");
}
생성자와 this 관련 흔한 실수들
- 생성자 이름을 메서드처럼 작성함 (리턴 타입 붙이기 실수)
- this 키워드 누락으로 필드 초기화 안 됨
- this() 호출 위치가 생성자 첫 줄이 아님
- 오버로딩 시 매개변수 혼동으로 에러 발생
네, 생성자는 리턴 타입이 없고, return 문을 사용할 수 없습니다. 리턴 값이 필요하다면 일반 메서드를 사용해야 해요.
생성자는 객체 초기화 전용이기 때문에 return을 쓰면 컴파일 에러가 납니다.
this는 현재 객체 자신을 가리키는 참조이고, this()는 같은 클래스의 다른 생성자를 호출하는 키워드입니다.
둘은 완전히 다른 용도로 사용되니 헷갈리지 마세요!
네, 가능합니다. 매개변수의 개수, 타입, 순서가 다르면 생성자를 여러 개 만들 수 있어요.
필요한 만큼 생성자를 오버로딩해서 유연한 객체 생성을 할 수 있어요.
네, 가능합니다. 생성자 내부에서 다른 메서드를 호출해 객체 초기화를 도울 수 있어요.
필드 값을 설정하거나 초기 상태를 다듬기 위해 메서드 호출을 자주 사용합니다.
생성자를 명시하지 않아도 자바는 기본 생성자를 자동으로 만들어줍니다. 하지만 생성자를 한 개라도 직접 정의하면 자동 생성은 되지 않아요.
직접 생성자를 정의했다면, 기본 생성자도 명시적으로 작성해주는 습관을 들이세요.
생성자와 this 키워드, 처음엔 참 헷갈리지만 개념만 딱 잡히면 오히려 코딩이 더 쉬워집니다. 오늘 설명한 내용을 토대로 클래스에 여러 생성자를 만들어보고, this와 this()도 써보세요. 머리보다 손이 먼저 익숙해지는 순간 이해가 훨씬 쉬워지거든요! 혹시 막히는 부분이 있거나 공유하고 싶은 꿀팁이 있다면 댓글로 함께 나눠주세요. 😊
'프로그래밍 > 자바[JAVA]' 카테고리의 다른 글
11장. 캡슐화와 정보 은닉: 객체지향 프로그래밍의 핵심 (0) | 2025.05.09 |
---|---|
10장. 필드와 메서드의 접근제어자! 필드와 메서드는 어떻게 보호할까? (1) | 2025.05.06 |
8장. 클래스와 객체 개념! 진짜 쉽게 설명해드립니다! (1) | 2025.05.06 |
7장. 자바 입출력 완전 정복: Scanner부터 System.out까지 (0) | 2025.05.06 |
6장. 자바 메서드 완전 정복: 정의, 호출, 매개변수, 반환값까지 (0) | 2025.05.05 |