
Java에서 생성자를 만들 때, 아래 두 개의 코드가 헷갈렸다.
public Store(String product) {
product = this.productType; // ❌ 이렇게 하면 왜 안 될까?
}
public Store(String product) {
this.productType = product; // ✅ 이렇게 해야 제대로 작동!
}
처음에는 두 개가 같은 의미라고 생각했는데, 사실은 전혀 다르게 동작한다!
어떤 차이가 있는지 하나씩 살펴보자.
프로그래밍에서 =은 "같다"가 아니라 "대입(할당)"을 의미한다.
즉, 오른쪽에 있는 값을 왼쪽 변수에 저장하는 것!
this.productType = product;
👉 "product 값을 productType에 넣어라" 라는 뜻!
product = this.productType;
👉 "product 값을 productType의 값으로 바꿔라" 라는 뜻! (그런데 productType은 아직 값이 없음!)
public Store(String product) {
this.productType = product;
}
✅ 이 코드가 실행되는 순서:
1. product는 생성자를 호출할 때 넘겨주는 값이다. (예: "pencil")
2. this.productType = product; 실행!
productType은 Store 클래스의 인스턴스 변수(필드).product는 생성자에서 받은 매개변수.productType이 "pencil"이 된다. ✔️ 이제 Store 객체를 만들면 올바르게 productType 값이 설정된다!
Store myStore = new Store("pencil");
System.out.println(myStore.productType); // 출력: pencil
public Store(String product) {
product = this.productType;
}
❌ 이 코드의 실행 과정:
1. productType은 아직 값이 없음! (기본적으로 null)
2. product = this.productType; 실행
product = null;이 되어버림.productType에는 아무 값도 저장되지 않는다! 🚨 즉, 객체를 만들었지만 productType이 설정되지 않음!
Store myStore = new Store("pencil");
System.out.println(myStore.productType); // 출력: null ❌
→ 생성자에서 값을 설정하지 못했기 때문에 productType이 null이 됨!
이 개념을 쉽게 이해하려면 택배 박스와 상품으로 비유할 수 있다. 🎁
productType → 📦 택배 박스 (Store 클래스가 가지고 있는 변수) product → 🎁 상품 (생성자로 전달받는 값) product = this.productType;
📦 "택배 박스(productType)가 비었는데, 상품(product)이 그걸 복사하려고 함."
→ 결과적으로 아무것도 할 수 없음!
this.productType = product;
📦 "택배 박스(productType)에 상품(product)을 넣어줌."
→ 이제 올바르게 productType이 설정됨!
🔹 프로그래밍에서 =은 "같다"가 아니라 "대입(할당)"을 의미한다!
🔹 왼쪽(this.productType)이 바뀌는 대상이고, 오른쪽(product)이 그 값을 제공한다.
🔹 객체의 필드 값을 설정하려면 this.productType = product;을 사용해야 한다!
이제 생성자에서 변수를 설정할 때 this.productType = product;이 왜 맞는지 확실히 이해했다!
혹시 같은 문제로 헷갈리는 사람이 있다면, 이 글이 도움이 되길 바란다. (아마 그건 미래의 나....)
📝 추가 학습
this 키워드의 역할