Java 프로그래밍 언어에서 `this`와 `this()`는 중요한 역할을 합니다. 이 두 키워드는 클래스와 객체 지향 프로그래밍에서 객체 참조와 생성자 호출을 관리하는 데 사용됩니다. 아래에서는 `this`와 `this()`에 대해 자세히 설명하겠습니다.
### `this` 키워드
`this`는 Java에서 객체 자신을 참조하는 데 사용되는 키워드입니다. 이를 통해 객체 자신의 멤버 변수나 메서드에 접근할 수 있습니다. `this`는 다음과 같은 상황에서 주로 사용됩니다:
1. **인스턴스 변수와 로컬 변수의 구별:**
클래스의 인스턴스 변수가 로컬 변수와 이름이 동일할 때, `this`를 사용하여 인스턴스 변수를 참조할 수 있습니다.
```java
public class MyClass {
private int value;
public MyClass(int value) {
this.value = value; // 인스턴스 변수 value에 로컬 변수 value를 할당
}
}
```
여기서 `this.value`는 인스턴스 변수를 참조하고, `value`는 생성자의 매개변수입니다.
2. **메서드 체이닝:**
`this`를 반환값으로 사용하여 메서드 체이닝을 구현할 수 있습니다. 이는 객체의 메서드를 연속적으로 호출할 수 있도록 합니다.
```java
public class MyClass {
private int value;
public MyClass setValue(int value) {
this.value = value;
return this;
}
public MyClass incrementValue() {
this.value++;
return this;
}
}
public class Main {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.setValue(5).incrementValue();
}
}
```
위의 코드에서 `setValue`와 `incrementValue` 메서드는 `this`를 반환하므로, 메서드를 연속적으로 호출할 수 있습니다.
3. **현재 객체의 참조 전달:**
메서드에 현재 객체를 전달할 때 `this`를 사용할 수 있습니다.
```java
public class MyClass {
private int value;
public void printValue(MyClass obj) {
System.out.println("Value: " + obj.value);
}
public void display() {
printValue(this); // 현재 객체를 전달
}
}
```
4. **중첩 클래스에서의 사용:**
중첩 클래스(내부 클래스)에서 바깥 클래스의 인스턴스를 참조할 때 `OuterClass.this` 형식을 사용할 수 있습니다.
```java
public class OuterClass {
private int outerValue = 10;
class InnerClass {
private int innerValue = 20;
public void display() {
System.out.println("Outer value: " + OuterClass.this.outerValue);
System.out.println("Inner value: " + this.innerValue);
}
}
}
```
### `this()` 생성자 호출
`this()`는 현재 클래스의 다른 생성자를 호출하는 데 사용됩니다. 이를 통해 코드의 중복을 줄이고, 생성자 간의 초기화 로직을 공유할 수 있습니다. `this()`는 생성자의 첫 번째 줄에서만 호출할 수 있습니다.
1. **생성자 간 호출:**
여러 생성자에서 공통적으로 수행해야 하는 초기화 작업이 있을 때, `this()`를 사용하여 코드 중복을 피할 수 있습니다.
```java
public class MyClass {
private int value;
private String name;
public MyClass() {
this(0, "Default");
}
public MyClass(int value) {
this(value, "Default");
}
public MyClass(int value, String name) {
this.value = value;
this.name = name;
}
}
```
위의 예제에서 기본 생성자와 단일 매개변수 생성자는 `this()`를 통해 가장 파라미터가 많은 생성자를 호출하여 초기화 작업을 공유합니다.
2. **초기화 블록의 공유:**
생성자들이 공통적인 초기화 블록을 공유해야 할 때 `this()`를 사용하면 유용합니다.
```java
public class MyClass {
private int value;
public MyClass() {
this(0);
// 추가적인 초기화 작업
}
public MyClass(int value) {
this.value = value;
// 공통적인 초기화 작업
}
}
```
여기서 기본 생성자는 다른 생성자를 호출한 후 추가적인 초기화 작업을 수행할 수 있습니다.
### 사용 예제
#### 예제 1: 인스턴스 변수와 로컬 변수 구분
```java
public class Employee {
private String name;
private int id;
public Employee(String name, int id) {
this.name = name;
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void display() {
System.out.println("Name: " + this.name + ", ID: " + this.id);
}
}
```
#### 예제 2: 메서드 체이닝
```java
public class Calculator {
private int value;
public Calculator add(int num) {
this.value += num;
return this;
}
public Calculator subtract(int num) {
this.value -= num;
return this;
}
public void display() {
System.out.println("Value: " + this.value);
}
public static void main(String[] args) {
Calculator calc = new Calculator();
calc.add(5).subtract(3).display();
}
}
```
#### 예제 3: 생성자 간 호출
```java
public class Book {
private String title;
private String author;
private double price;
public Book() {
this("Unknown Title", "Unknown Author", 0.0);
}
public Book(String title) {
this(title, "Unknown Author", 0.0);
}
public Book(String title, String author) {
this(title, author, 0.0);
}
public Book(String title, String author, double price) {
this.title = title;
this.author = author;
this.price = price;
}
public void display() {
System.out.println("Title: " + this.title + ", Author: " + this.author + ", Price: " + this.price);
}
public static void main(String[] args) {
Book book1 = new Book();
Book book2 = new Book("Effective Java");
Book book3 = new Book("Effective Java", "Joshua Bloch");
Book book4 = new Book("Effective Java", "Joshua Bloch", 45.0);
book1.display();
book2.display();
book3.display();
book4.display();
}
}
```
### 결론
Java에서 `this`와 `this()`는 객체 지향 프로그래밍의 핵심적인 역할을 합니다. `this` 키워드는 객체 자신의 참조를 제공하여 인스턴스 변수와 로컬 변수를 구분하고, 메서드 체이닝을 가능하게 하며, 중첩 클래스에서 바깥 클래스의 인스턴스를 참조할 수 있게 합니다. `this()` 생성자 호출은 생성자 간의 코드 중복을 줄이고, 공통적인 초기화 작업을 공유하는 데 유용합니다. 이를 통해 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.
'게으른 개발자의 끄적거림' 카테고리의 다른 글
JavaScript 날짜 완벽 정리(한달 전, 1년 전, 어제, 내일 등) (1) | 2024.06.11 |
---|---|
Http requestwrapper란? (0) | 2024.06.10 |
Java instanceof란? (0) | 2024.05.30 |
eval() vs new Function() 차이점 (0) | 2024.05.29 |
JavaScript .eval() 함수란? (feat. 쓰면 안되는 이유) (0) | 2024.05.29 |