[Java 개념노트 23] this 키워드 이해하기
안녕하세요. Java 개념노트 시리즈 스물세 번째 글입니다.
지난 글에서는 객체를 만들 때 자동으로 실행되는 생성자에 대해 정리했습니다. 이번 글에서는 생성자와 메서드에서 자주 등장하는 this 키워드에 대해 알아보겠습니다.
this는 처음 보면 조금 헷갈릴 수 있습니다. 하지만 의미는 단순합니다. this는 현재 객체 자기 자신을 가리키는 키워드입니다.
1. this란?
this는 현재 객체를 가리키는 키워드입니다.
객체가 여러 개 만들어졌을 때, 각 객체는 자기만의 필드 값을 가지고 있습니다. 이때 객체 내부에서 “내 필드”, “내 메서드”, “나 자신”을 가리킬 때 this를 사용할 수 있습니다.
쉽게 말하면this는 객체 안에서 자기 자신을 가리키는 말입니다. 즉, “현재 이 객체”를 의미합니다.
2. this가 필요한 이유
this가 가장 자주 필요한 상황은 필드 이름과 매개변수 이름이 같을 때입니다.
예를 들어 학생 클래스에 name 필드가 있고, 생성자에서도 name이라는 매개변수를 받는다고 생각해보겠습니다.
class Student {
String name;
Student(String name) {
name = name;
}
}
위 코드는 겉으로 보면 필드에 값을 저장하는 것처럼 보입니다. 하지만 실제로는 매개변수 name에 자기 자신을 다시 넣는 코드가 됩니다. 객체의 필드 name에는 값이 제대로 저장되지 않습니다.
3. this로 필드와 매개변수 구분하기
필드와 매개변수 이름이 같을 때는 this를 사용해서 객체의 필드를 명확히 가리킬 수 있습니다.
class Student {
String name;
Student(String name) {
this.name = name;
}
}
여기서 this.name은 현재 객체의 name 필드를 의미합니다. 오른쪽의 name은 생성자로 전달받은 매개변수입니다.
| 코드 | 의미 |
this.name |
현재 객체의 name 필드 |
name |
생성자로 전달받은 매개변수 |
this.name = name; |
매개변수 name 값을 현재 객체의 name 필드에 저장 |
핵심 포인트this.필드명은 현재 객체의 필드를 의미합니다. 필드와 매개변수 이름이 같을 때 특히 중요합니다.
4. this를 사용한 생성자 예제
생성자에서 this를 사용하는 전체 예제를 보겠습니다.
public class Main {
public static void main(String[] args) {
Student student = new Student("건", 20, 90);
student.printInfo();
}
}
class Student {
String name;
int age;
int score;
Student(String name, int age, int score) {
this.name = name;
this.age = age;
this.score = score;
}
void printInfo() {
System.out.println("이름: " + name);
System.out.println("나이: " + age);
System.out.println("점수: " + score);
}
}
실행 결과는 다음과 같습니다.
이름: 건
나이: 20
점수: 90
new Student("건", 20, 90)로 전달한 값들이 생성자의 매개변수로 들어가고, this.name, this.age, this.score를 통해 객체의 필드에 저장됩니다.
5. this 없이 작성할 수 있는 경우
필드 이름과 매개변수 이름이 다르면 this를 생략할 수도 있습니다.
class Student {
String name;
int age;
Student(String studentName, int studentAge) {
name = studentName;
age = studentAge;
}
}
위 코드에서는 필드 이름이 name, age이고 매개변수 이름은 studentName, studentAge입니다. 이름이 다르기 때문에 자바가 구분할 수 있습니다.
하지만 실제 코드에서는 필드 이름과 매개변수 이름을 같게 두고 this로 구분하는 방식을 많이 사용합니다.
Student(String name, int age) {
this.name = name;
this.age = age;
}
6. this는 현재 객체를 의미한다
this는 단순히 필드 구분용으로만 쓰는 것이 아닙니다. 더 정확히 말하면 this는 현재 객체 자기 자신을 의미합니다.
class Student {
String name;
void printThis() {
System.out.println(this);
}
}
객체 안에서 this를 출력하면 현재 객체를 가리키는 정보가 출력됩니다. 출력 형태는 실행 환경에 따라 다르게 보일 수 있습니다.
7. 객체마다 this는 다르다
같은 클래스로 만든 객체라도 각각의 객체 안에서 this는 자기 자신을 가리킵니다.
public class Main {
public static void main(String[] args) {
Student student1 = new Student("건");
Student student2 = new Student("자바");
student1.printName();
student2.printName();
}
}
class Student {
String name;
Student(String name) {
this.name = name;
}
void printName() {
System.out.println(this.name);
}
}
실행 결과는 다음과 같습니다.
건
자바
student1.printName()이 실행될 때 this는 student1 객체를 가리킵니다. student2.printName()이 실행될 때 this는 student2 객체를 가리킵니다.
8. this로 메서드 호출하기
this를 사용해서 현재 객체의 다른 메서드를 호출할 수도 있습니다.
public class Main {
public static void main(String[] args) {
Student student = new Student("건", 90);
student.printResult();
}
}
class Student {
String name;
int score;
Student(String name, int score) {
this.name = name;
this.score = score;
}
void printResult() {
this.printInfo();
this.printGrade();
}
void printInfo() {
System.out.println("이름: " + this.name);
System.out.println("점수: " + this.score);
}
void printGrade() {
if (this.score >= 90) {
System.out.println("등급: A");
} else {
System.out.println("등급: B");
}
}
}
실행 결과는 다음과 같습니다.
이름: 건
점수: 90
등급: A
this.printInfo()와 this.printGrade()는 현재 객체의 메서드를 호출합니다. 다만 같은 클래스 안에서는 this를 생략하고 printInfo()처럼 작성해도 됩니다.
9. this 생략 가능 여부
같은 클래스 안에서 필드나 메서드에 접근할 때는 this를 생략할 수 있는 경우가 많습니다.
class Student {
String name;
void printName() {
System.out.println(name);
System.out.println(this.name);
}
}
위 코드에서 name과 this.name은 같은 필드를 가리킵니다.
하지만 필드와 지역변수 또는 매개변수 이름이 같다면 this를 사용해야 정확하게 구분할 수 있습니다.
10. this와 지역변수
메서드 안에서 선언한 변수를 지역변수라고 합니다. 지역변수와 필드 이름이 같으면 지역변수가 우선 사용됩니다.
class Student {
String name = "필드 이름";
void printName() {
String name = "지역변수 이름";
System.out.println(name);
System.out.println(this.name);
}
}
실행하면 name은 지역변수를 의미하고, this.name은 필드를 의미합니다.
지역변수 이름
필드 이름
핵심 포인트
이름이 겹치면 가까운 범위의 변수가 먼저 사용됩니다. 이때 필드를 명확히 가리키려면 this.필드명을 사용합니다.
11. this()란?
this와 비슷하게 생긴 문법으로 this()가 있습니다. this()는 현재 클래스의 다른 생성자를 호출할 때 사용합니다.
class Student {
String name;
int age;
Student() {
this("이름 없음", 0);
}
Student(String name, int age) {
this.name = name;
this.age = age;
}
}
위 코드에서 기본 생성자 Student()는 this("이름 없음", 0)을 사용해서 다른 생성자를 호출합니다.
12. this()를 사용하는 이유
생성자가 여러 개 있을 때 같은 초기화 코드가 반복될 수 있습니다. this()를 사용하면 한 생성자에서 다른 생성자를 호출해서 중복을 줄일 수 있습니다.
중복이 있는 코드
class Student {
String name;
int age;
int score;
Student() {
this.name = "이름 없음";
this.age = 0;
this.score = 0;
}
Student(String name) {
this.name = name;
this.age = 0;
this.score = 0;
}
Student(String name, int age, int score) {
this.name = name;
this.age = age;
this.score = score;
}
}
this()로 중복을 줄인 코드
class Student {
String name;
int age;
int score;
Student() {
this("이름 없음", 0, 0);
}
Student(String name) {
this(name, 0, 0);
}
Student(String name, int age, int score) {
this.name = name;
this.age = age;
this.score = score;
}
}
기본 생성자와 이름만 받는 생성자가 결국 마지막 생성자를 호출하도록 만들었습니다. 이렇게 하면 초기화 로직을 한 곳에 모을 수 있습니다.
13. this() 사용 규칙
this()를 사용할 때는 중요한 규칙이 있습니다. this()는 생성자 안에서 첫 번째 줄에 작성해야 합니다.
올바른 예
Student() {
this("이름 없음", 0);
}
잘못된 예
Student() {
System.out.println("생성자 호출");
this("이름 없음", 0);
}
위 코드는 오류가 발생합니다. this()는 생성자의 첫 번째 줄에 있어야 하기 때문입니다.
주의this()는 현재 클래스의 다른 생성자를 호출하는 문법이며, 반드시 생성자의 첫 번째 줄에 작성해야 합니다.
14. this와 this()의 차이
this와 this()는 모양이 비슷하지만 역할이 다릅니다.
| 구분 | 의미 | 사용 예 |
this |
현재 객체 자기 자신 | this.name = name; |
this() |
현재 클래스의 다른 생성자 호출 | this("건", 20); |
15. this는 static 메서드에서 사용할 수 없다
this는 현재 객체를 가리키는 키워드입니다. 따라서 객체와 관련 없는 static 메서드에서는 사용할 수 없습니다.
class Student {
String name;
static void printName() {
System.out.println(this.name);
}
}
위 코드는 오류가 발생합니다. static 메서드는 특정 객체에 속한 메서드가 아니기 때문에 this를 사용할 수 없습니다.
static은 다음 글에서 더 자세히 다룰 예정입니다. 이번 글에서는 this는 객체가 있어야 사용할 수 있다는 점만 기억하면 됩니다.
16. this를 반환하기
메서드에서 this를 반환할 수도 있습니다. 이 방식은 현재 객체 자신을 반환하는 것입니다. 입문 단계에서는 자주 사용하지 않지만, 나중에 메서드 체이닝을 이해할 때 도움이 됩니다.
class Student {
String name;
Student setName(String name) {
this.name = name;
return this;
}
void printInfo() {
System.out.println("이름: " + this.name);
}
}
위 코드에서 return this;는 현재 객체 자신을 반환합니다. 이 개념은 나중에 더 깊은 객체지향 문법을 배울 때 다시 만날 수 있습니다.
17. this 사용 전체 예제
이번에는 this와 this()를 함께 사용하는 예제를 보겠습니다.
public class Main {
public static void main(String[] args) {
Book book1 = new Book();
Book book2 = new Book("자바 개념노트");
Book book3 = new Book("스프링 입문", 20000);
book1.printInfo();
book2.printInfo();
book3.printInfo();
}
}
class Book {
String title;
int price;
Book() {
this("제목 없음", 0);
}
Book(String title) {
this(title, 0);
}
Book(String title, int price) {
this.title = title;
this.price = price;
}
void printInfo() {
System.out.println("제목: " + this.title + ", 가격: " + this.price);
}
}
실행 결과는 다음과 같습니다.
제목: 제목 없음, 가격: 0
제목: 자바 개념노트, 가격: 0
제목: 스프링 입문, 가격: 20000
기본 생성자와 제목만 받는 생성자는 this()를 사용해 다른 생성자를 호출합니다. 마지막 생성자에서는 this.title과 this.price를 사용해 현재 객체의 필드에 값을 저장합니다.
18. this 사용 시 자주 하는 실수
this를 처음 배울 때는 아래와 같은 실수를 자주 합니다.
| 실수 | 문제점 | 해결 방법 |
필드와 매개변수 이름이 같은데 this 누락 |
필드에 값이 저장되지 않을 수 있음 | this.name = name; 형태로 작성 |
this()를 첫 줄이 아닌 곳에 작성 |
컴파일 오류 발생 | this()는 생성자 첫 줄에 작성 |
this와 this()를 혼동 |
현재 객체와 생성자 호출을 헷갈림 | this는 현재 객체, this()는 생성자 호출 |
static 메서드에서 this 사용 |
static은 객체 자기 자신이 없음 | 객체 메서드에서만 this 사용 |
this를 무조건 붙임 |
코드가 불필요하게 길어질 수 있음 | 필요한 경우에 명확히 사용 |
19. 직접 연습해보기
아래 코드를 직접 작성하고 실행해보세요.
public class Main {
public static void main(String[] args) {
Product product1 = new Product();
Product product2 = new Product("노트북");
Product product3 = new Product("마우스", 30000);
product1.printInfo();
product2.printInfo();
product3.printInfo();
product3.discount(5000);
product3.printInfo();
}
}
class Product {
String name;
int price;
Product() {
this("상품명 없음", 0);
}
Product(String name) {
this(name, 0);
}
Product(String name, int price) {
this.name = name;
this.price = price;
}
void discount(int price) {
this.price -= price;
}
void printInfo() {
System.out.println("상품명: " + this.name + ", 가격: " + this.price);
}
}
실행 결과는 다음과 같습니다.
상품명: 상품명 없음, 가격: 0
상품명: 노트북, 가격: 0
상품명: 마우스, 가격: 30000
상품명: 마우스, 가격: 25000
Product()와 Product(String name) 생성자는 this()로 다른 생성자를 호출합니다. discount 메서드에서는 매개변수 price와 필드 price를 구분하기 위해 this.price를 사용했습니다.
20. 이번 글 정리
이번 글에서는 현재 객체를 가리키는 this 키워드에 대해 정리했습니다. 핵심 내용은 다음과 같습니다.
this는 현재 객체 자기 자신을 가리키는 키워드이다.this.필드명은 현재 객체의 필드를 의미한다.- 필드와 매개변수 이름이 같을 때
this를 사용해 구분한다. - 같은 클래스 안에서는
this를 생략할 수 있는 경우도 많다. - 객체마다
this는 각각 자기 자신을 가리킨다. this()는 현재 클래스의 다른 생성자를 호출할 때 사용한다.this()는 생성자의 첫 번째 줄에 작성해야 한다.this와this()는 서로 다른 문법이다.this는 객체를 가리키므로 static 메서드에서는 사용할 수 없다.
한 줄 요약this는 현재 객체 자신을 가리키고, this()는 같은 클래스의 다른 생성자를 호출하는 문법입니다.
다음 글 예고
다음 글에서는 [Java 개념노트 24] static 키워드 이해하기라는 주제로 객체마다 따로 가지는 값과 클래스가 함께 공유하는 값의 차이를 정리해보겠습니다.
GWDEVELBlog Java 개념노트 시리즈

'Computer Science > Java' 카테고리의 다른 글
| [Java] 개념노트 25 final 키워드 이해하기 (0) | 2026.06.10 |
|---|---|
| [Java] 개념노트 24 static 키워드 이해하기 (0) | 2026.06.10 |
| [Java ] 개념노트 22 생성자란 무엇인가? 객체를 만들 때 필드 값 초기화하기 (0) | 2026.06.09 |
| [JAVA] 개념노트 21 클래스와 객체란 무엇인가? (0) | 2026.03.15 |
| [Java] 개념노트 20 메서드 오버로딩 이해하기 (0) | 2026.03.14 |