자바를 배우다 보면 비슷하게 생긴 this와 this()를 자주 마주치게 됩니다.
이 둘은 이름은 비슷하지만 전혀 다른 역할을 가지고 있어요.
이번 글에서는 이 둘의 차이와 사용법을 예제를 통해 쉽게 알아보겠습니다.
this란?
현재 객체 자신을 가리키는 키워드입니다.
객체가 생성되면 자바는 그 객체가 자기 자신을 가리킬 수 있도록 this라는 키워드를 자동으로 제공합니다.
즉, 클래스 내부에서 this를 사용하면 "내 자신", 즉 현재 만들어진 그 객체를 의미합니다.
this의 필요성
객체 안에서는 멤버 변수(필드)와 매개변수(입력값)가 같은 이름일 때가 많습니다.
이 경우, 자바는 어떤 게 멤버 변수인지, 어떤 게 매개변수인지 헷갈릴 수 있습니다.
예를 들어 아래 코드를 볼까요?
public class Student {
String name; // Student 클래스의 멤버변수
// 생성자
public Student(String name) {
name = name; // 매개변수 멤버변수 둘 다 name? → 멤버변수 초기화 안 됨
}
}
이 경우 name = name은 매개변수 name이 자기 자신에게 값을 준 것이기 때문에
멤버 변수인 name은 전혀 영향을 받지 않습니다.
그래서! 이런 상황에서 정확하게 "멤버 변수에 값을 넣고 싶다!" 라고 알려주는 것이 바로 this입니다.
public Student(String name) {
this.name = name; // 명확하게 "멤버 변수 = 매개변수"
}
실습 예제
public class Student {
String name;
// 생성자
public Student(String name) {
this.name = name; // 멤버변수 = 매개변수
}
public void introduce() {
System.out.println("제 이름은 " + this.name + "입니다.");
}
public static void main(String[] args) {
Student s = new Student("우징");
s.introduce();
}
}
- 출력 결과-
제 이름은 우징입니다.
📌 핵심 포인트
- this.name 👉 멤버 변수
- name 👉 매개변수
- 이름이 같을 때, this를 써야 정확하게 멤버 변수임을 지정할 수 있습니다!
this 사용시 주의사항
this는 객체 자신을 가리키는 키워드이기 때문에, 객체가 존재하지 않는 상황에서는 사용할 수 없습니다.
특히 ❗❗ static 메서드 안에서는 this를 사용할 수 없습니다 ❗❗
static은 클래스 자체가 실행될 때 메모리에 올라가는 메서드이기 때문에
객체가 만들어지기 전에 실행될 수 있습니다.
이 말은 곧, 객체 없이도 실행되므로 "현재 객체(this)"라는 개념 자체가 없습니다.
따라서 static 메서드 안에서 this를 쓰면 컴파일 에러가 발생합니다.
예시
public class Test {
String name = "우징";
public static void test() {
// System.out.println(this.name); // ❌ 오류 발생!
}
}
이 코드는 에러가 발생합니다!
test()는 static 메서드라서 객체가 없는데도 this로 뭔가를 가리키려고 하기 때문입니다.
요약 정리
정의 ?
✅ 현재 객체 자신을 가리키는 키워드
주요 용도 ?
✅ 멤버 변수와 매개변수 구분 / 객체 자기 참조
사용 위치 ?
✅ 생성자, 인스턴스 메서드 내부
사용 불가 ?
✅ static 메서드 내부
this는 자바에서 현재 객체 자신을 가리키는 키워드로,
변수 충돌을 방지하고, 코드의 명확성과 안정성을 높이는 데 중요한 역할을 합니다!
this() 란?
this()는 같은 클래스 안에 정의된 다른 생성자를 호출할 때 사용하는 키워드입니다.
즉, 하나의 생성자 안에서 다른 생성자를 재사용하고 싶을 때 this()를 사용하면 됩니다.
this()의 필요성
생성자를 여러 개 만들다 보면, 비슷한 초기화 코드를 여러 번 반복하게 되는 경우가 많습니다.
이럴 때 this()를 쓰면 중복되는 코드를 한 곳으로 모아서, 생성자끼리 서로 호출하면서 코드 재사용을 할 수 있습니다.
실습 예제
- this()를 쓰지 않았을 때 (중복 발생) -
public class Person {
String name;
int age;
public Person() {
name = "이름없음";
age = 0;
}
public Person(String name) {
this.name = name;
age = 0;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
이 예제에서는 age = 0;이 두 번 반복되고 있습니다.
👉 이 중복을 줄일 수 있는 방법이 바로 this()입니다!
- this() 사용 (중복 발생X) -
public class Person {
String name;
int age;
// 모든 생성자가 이 생성자를 재사용
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 기본 생성자
public Person() {
this("이름없음", 0); // 아래 생성자 호출
}
// 이름만 받는 생성자
public Person(String name) {
this(name, 0); // 아래 생성자 호출
}
public void introduce() {
System.out.println("이름: " + name + ", 나이: " + age);
}
public static void main(String[] args) {
new Person().introduce(); // 이름없음, 0
new Person("지민").introduce(); // 지민, 0
new Person("영수", 25).introduce(); // 영수, 25
}
}
코드 흐름 설명
- this("지민", 0) 👉 Person(String name, int age) 생성자 호출
- this("이름없음", 0) 👉 동일하게 아래 생성자 호출
즉, 모든 생성자가 하나의 생성자만 호출하게 만들어서 초기화 로직을 한 곳에서 통일시킬 수 있습니다.
this() 사용시 주의사항
this()는 반드시 생성자의 첫 줄에 위치해야 합니다.
👉 중간에 쓰면 컴파일 에러 발생
- ❌ 잘못된 예제 -
public class Person {
String name;
int age;
public Person(String name) {
age = 0; // ← 다른 코드 먼저 실행
this(name, age); // ❌ 오류 발생: this()는 첫 줄에 있어야 함!
}
}
- ⭕ 올바른 예제 -
public Person(String name) {
this(name, 0); // ✅ 생성자 첫 줄에 위치
}
📌 this()는 생성자 호출 키워드이기 때문에 다른 문장보다 먼저 실행되어야 합니다.
같은 클래스 안에서만 사용 가능합니다.
👉 다른 클래스의 생성자는 호출 불가
- ❌ 잘못된 예제 -
public class Parent {
public Parent(String name) { }
}
public class Child extends Parent {
public Child(String name) {
// this(name); ❌ 다른 클래스(Parent)의 생성자는 this()로 호출 불가!
}
}
- ⭕ 올바른 예제 -
public class Child extends Parent {
public Child(String name) {
super(name); // ✅ 부모 클래스 생성자 호출은 super()로!
}
}
📌 this()는 같은 클래스 내의 다른 생성자를 호출하는 키워드입니다. 다른 클래스 생성자를 호출하려면 반드시 super()를 사용해야 해요!
super()란?
부모 클래스의 생성자를 호출하는 키워드입니다. 즉, 자식 클래스가 생성될 때, 먼저 부모 클래스의 생성자를 호출해서 부모부터 초기화하도록 도와주는 역할을 합니다.
간단히 말하자면 자식 클래스가 부모 클래스를 먼저 준비시키는 문장입니다.
자세한 내용은 super() 시간에 알아보도록 하겠습니다!
일반 메서드에서는 사용할 수 없습니다.
👉 생성자 전용 키워드
- ❌ 잘못된 예제 -
public class Person {
String name;
int age;
public void init(String name, int age) {
this(name, age); // ❌ 오류! 일반 메서드에서는 this() 사용 불가
}
}
- ⭕ 올바른 예제 -
public void init(String name, int age) {
this.name = name; // ✅ this는 변수 구분 용도로 사용 가능
this.age = age;
}
📌 this()는 생성자끼리 서로 호출할 때만 사용하는 키워드입니다. 일반 메서드에서는 this() 자체가 문법적으로 허용되지 않습니다.
요약 정리
정의 ?
✅ 같은 클래스의 다른 생성자를 호출하는 키워드
주요 용도 ?
✅ 생성자 간 코드 재사용, 중복 제거
사용 위치 ?
✅ 생성자 내부 첫 줄에만 사용 가능, 반드시 같은 클래스 내 생성자여야 함
사용 불가 ?
✅ 일반 메서드, static 메서드, 생성자 첫 줄 외
this()는 같은 클래스의 생성자를 호출해서 중복을 줄이는 키워드이며,
생성자 첫 줄에서만 사용할 수 있는 생성자 전용 키워드입니다!
this vs this() 비교 정리
| 항목 | this | this() |
| 정의 | 현재 객체 자신을 가리키는 키워드 | 같은 클래스의 다른 생성자를 호출하는 키워드 |
| 사용 위치 | 인스턴스 메서드, 생성자 내부 | 생성자 내부 첫 줄에서만 사용 가능 |
| 주 용도 | 멤버 변수와 매개변수 이름이 겹칠 때 구분 | 생성자 간 중복 코드를 줄이기 위한 호출 |
| 호출 대상 | 현재 객체의 변수나 메서드 | 같은 클래스의 다른 생성자 |
| 반환 | 객체 자기 자신 (this) | 반환 없음 (호출만 함) |
| 사용 예시 | this.name = name; | this("지민", 20); |
| 사용 불가 위치 | static 메서드 내부 | 일반 메서드, static 메서드, 생성자 첫 줄 외 위치 |
읽어주셔서 감사합니다 😊
'프로그래밍 언어 > Java' 카테고리의 다른 글
| [Java] 19. 오버라이딩 (2) | 2025.04.09 |
|---|---|
| [Java] 18. 상속이란? (1) | 2025.04.09 |
| [Java] 16. 생성자와 오버로딩 (0) | 2025.04.08 |
| [Java] 15. 오버로딩 (0) | 2025.04.07 |
| [Java] 14. 재귀호출 (0) | 2025.04.07 |
