This란?
자바에서 this는 키워드로, 주로 객체 내에서 현재 객체 자체를 참조하는 데 사용된다. this를 사용하여 현재 객체의 인스턴스 변수나 메소드에 접근하거나 다른 생성자를 호출할 수 있다.
this 키워드를 사용하여 현재 객체의 인스턴스 변수에 접근할 수 있다. 이것은 메소드 내에서 로컬변수와 인스턴스 변수의 이름이 충돌할 때 특히 유용하다. this를 사용하면 인스턴스 변수와 로컬 변수를 구분할 수 있다.
public class MyClass {
private int myVar;
public void setMyVar(int myVar) {
this.myVar = myVar; // this를 사용하여 인스턴스 변수에 접근
}
}
클래스 내에서 여러 생성자를 정의한 경우, 한 생성자에서 다른 생성자를 호출할 수 있다. 이때 this를 사용하여 다른 생성자를 찾아 호출할 수 있다. 이를 생성자 중복(overloading) 또는 생성자 위임(constructor chaining)이라고 한다.
public class MyClass {
private int myVar;
public MyClass() {
this(0); // 다른 생성자 호출
}
public MyClass(int myVar) {
this.myVar = myVar;
}
}
메소드 내에서 this를 사용하여 현재 객체를 반환할 수 있다. 이것은 메소드 체이닝(메소드 호출을 연결하여 연속적인 작업을 수행하는 패턴)을 구현할 때 유용하다.
public class MyClass {
private int myVar;
public MyClass setMyVar(int myVar) {
this.myVar = myVar;
return this; // 현재 객체를 반환
}
}
객체를 다른 객체의 메소드에 전달하거나 인터페이스를 구현하는 경우 this를 사용하여 현재 객체를 전달할 수 있다.
public class MyClass {
public void process() {
AnotherClass.doSomething(this);
}
}
내부 클래스(Inner Class)에서 외부 클래스의 인스턴스에 접근하려면 this를 사용할 수 있다.
public class OuterClass {
private int value;
public class InnerClass {
public void printValue() {
System.out.println(OuterClass.this.value); // 외부 클래스의 인스턴스 변수에 접근
}
}
}
This 추가 설명
this는 현재 메서드가 속한 객체를 가리킨다. 따라서 객체 내에서 사용할 때 의미가 있으며, 클래스 내부에서는 어디서에든 사용할 수 있다. 하지만 static 메소드(클래스 메소드) 내에서는 this를 사용할 수 없다. static 메소드는 특정 인스턴스에 묶이지 않고 클래스 수준에서 실행되기 때문이다.
public class MyClass {
private int myVar;
public void instanceMethod() {
int localVar = 42;
this.myVar = localVar; // this는 현재 객체를 가리키므로 사용 가능
}
public static void staticMethod() {
this.myVar = 10; // 에러: static 메서드에서 this 사용 불가
}
}
생성자 위임을 사용할 때 this 키워드를 사용하여 다른 생성자를 호출하는 경우, 반드시 해당생성자 내에서 첫 번째 명령문으로 사용해야 한다. 그렇지 않으면 컴파일 오류가 발생한다.
public class MyClass {
private int myVar;
public MyClass() {
this(0); // 올바른 사용: 다른 생성자를 첫 번째 명령문으로 호출
}
public MyClass(int myVar) {
this.myVar = myVar;
}
}
this는 객체 자체를 가리키는 데 사용된다. 따라서 객체를 다른 객체에 전달하거나 반환하는 경우에도 this를 사용할 수 있다. 이것은 객체 지향 설계에서 객체 간의 협력과 메시지 전달을 구현하는 데 중요하다.
public class MyClass {
public void process() {
AnotherClass.doSomething(this); // 현재 객체를 다른 메서드에 전달
}
}
This는 어디에 쓰일까?
다양한 생성자를 정의하고 다른 생성자를 호출하는 경우, this를 사용하여 코드 중복을 피하고 재사용성을 높인다. 이것은 다양한 초기화 방법을 제공하고 객체 생성을 단순화한다. 현업에서는 종종 다양한 생성자를 통해 여러 옵션을 설정하는 클래스를 만들 때 사용된다.
public class Product {
private String name;
private double price;
public Product() {
this("Unknown", 0.0);
}
public Product(String name) {
this(name, 0.0);
}
public Product(String name, double price) {
this.name = name;
this.price = price;
}
}
현업에서 객체 모델링과 데이터베이스와의 상호 작용에 this가 사용된다. 객체의 상태를 나타내기 위해 인스턴스 변수를 사용하고 this를 통해 현재 객체의 인스턴스 변수에 접근한다. 이것은 주문 처리, 고객 관리, 재고 추적 및 기타 비즈니스 로직에 사용된다.
public class Order {
private int orderId;
private String customerName;
public void createOrder(int orderId, String customerName) {
this.orderId = orderId;
this.customerName = customerName;
// 주문 데이터베이스에 저장 등의 작업
}
}
객체 지향 디자인에서, 메소드 체이닝을 사용하여 여러 메소드 호출을 연결하는 경우 this를 반환값으로 사용한다. 이렇게 하면 메소드 호출을 연돼적으로 수행할 수 있으며 코드를 간결하게 만들 수 있다.
public class ShoppingCart {
private List<Item> items = new ArrayList<>();
public ShoppingCart addItem(Item item) {
items.add(item);
return this; // this를 반환하여 메서드 체이닝 가능
}
public ShoppingCart removeItem(Item item) {
items.remove(item);
return this;
}
}
// 사용 예시
ShoppingCart cart = new ShoppingCart();
cart.addItem(item1).addItem(item2).removeItem(item3);
GUI 응용 프로그램 및 이벤트 기반 시스템에서는 이벤트 핸들러나 리스너를 작성할 때 this를 사용하여 현재 객체를 참조하는 것이 일반적이다. 이것은 이벤트 처리 로직에서 현재 객체의 상태와 동작을 조작하는 데 사용된다.
public class ButtonClickListener implements ActionListener {
private MyClass myInstance;
public ButtonClickListener(MyClass myInstance) {
this.myInstance = myInstance;
}
@Override
public void actionPerformed(ActionEvent e) {
// 현재 객체(this)를 사용하여 동작 수행
myInstance.doSomething();
}
}
내부 클래스에서 외부 클래스의 인스턴스에 액세스할 때 this를 사용할 수 있다. 내부 클래스는 외부 클래스의 인스턴스에 대한 참조를 유지하기 위해 this를 사용한다.
public class OuterClass {
private int value;
public class InnerClass {
public void printValue() {
System.out.println(OuterClass.this.value); // 외부 클래스의 인스턴스 변수에 접근
}
}
}