🖍️ Java 의 this 와 super 개념 트레이닝
this
인스턴스 변수와 로컬 변수 구분
public class Car {
private String model;
private int year;
public Car(String model, int year) {
this.model = model;
this.year = year;
}
}
다른 생성자 호출
생성자 체이닝
같은 클래스 내에서 다른 생성자를 호출할 때 사용
public class Car {
private String model;
private int year;
public Car(String model) {
this(model, 0); // 다른 생성자 호출
}
public Car(String model, int year) {
this.model = model;
this.year = year;
}
}
현재 객체의 참조 반환
메서드 체이닝 패턴을 구현할 때 this를 반환
메서드를 연속해서 호출 가능
public class Car {
private String model;
public Car setModel(String model) {
this.model = model;
return this;
}
}
super
부모 클래스의 생성자 호출
자식 클래스의 생성자에서 부모 클래스의 생성자를
명시적으로 호출할 때 사용
부모 클래스의 초기화를 보장
public class Vehicle {
private String model;
public Vehicle(String model) {
this.model = model;
}
}
public class Car extends Vehicle {
private int year;
public Car(String model, int year) {
super(model);
this.year = year;
}
}
부모 클래스의 메서드 호출
자식 클래스에서 부모 클래스의 메서드를 오버라이드한 경우
부모 클래스의 메서드를 명시적으로 호출할 때 사용
public class Vehicle {
public void display() {
System.out.println("This is a vehicle.");
}
}
public class Car extends Vehicle {
@Override
public void display() {
super.display(); // 부모 클래스의 메서드 호출
System.out.println("This is a car.");
}
}
부모 클래스의 변수 참조
자식 클래스에서 부모 클래스의 변수를 참조할 때 사용
public class Vehicle {
private String model;
public Vehicle(String model) {
this.model = model;
}
}
public class Car extends Vehicle {
private int year;
public Car(String model, int year) {
super(model);
this.year = year;
}
public void display() {
System.out.println("Model: " + super.model);
System.out.println("Year: " + year);
}
}
Spring Boot에서의 this와 super 사용
의존성 주입(DI)에서의 this 사용
@Autowired를 사용하여 의존성을 주입할 때
현재 객체의 메서드나 변수를 가리키기 위해 this를 사용
@Service
public class CarService {
private final CarRepository carRepository;
@Autowired
public CarService(CarRepository carRepository) {
this.carRepository = carRepository;
}
}
부모 클래스의 메서드 오버라이딩에서 super 사용
@Service
public class CustomUserDetailsService extends DefaultUserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserDetails userDetails = super.loadUserByUsername(username);
// 추가 로직 구현
return userDetails;
}
}
기타 유용한 개념
스태틱(static)
클래스 수준에서 공유되는 변수나 메서드를 정의할 때 사용
객체 인스턴스 없이 클래스 이름으로 접근 가능
public class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
int sum = MathUtils.add(5, 10);
싱글톤(Singleton)
애플리케이션 전체에서 하나의 인스턴스만 존재하도록
보장하는 디자인 패턴
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
요약
"this"
- 현재 객체의 참조
- 인스턴스 변수와 로컬 변수를 구분
- 다른 생성자를 호출할 때 사용
"super"
- 부모 클래스의 멤버(변수, 메서드, 생성자)를 참조할 때 사용
Spring Boot 에서는 this와 super를 DI와
메서드 오버라이딩 상황에서 자주 사용기타 유용한 개념으로는 스태틱 변수 및 메서드, 싱글톤 패턴 등이 존재