작성
·
205
0
안녕하세요. 나름대로 혼자 코드를 짜고 문제를 풀어보았습니다. 근데 SpeedCam의 코드에서 저의 코드는
package camera2;
import detector.*;
import reporter.*;
public class SpeedCam extends Camera {
private Detectable detect;
private Reportable report;
public void setDetect(Detectable detect) {
this.detect = detect;
}
public void setReport(Reportable report) {
this.report = report;
}
public void showMainFeature() {
System.out.println("속도 측정, 번호 인식");
}
public void detect() {
detect.detect();
}
public void report() {
report.report();
}
}
이러합니다. 정상적으로 목표 결과도 얻었습니다
근데 강사님의 코드는
public void detect() {
this.detect.detect();
}
public void report() {
this.report.report();
}
이렇게 다른 부분이 존재하는데
this는 왜 필요한걸까요?
답변 1
1
※ 본 답변은 유사한 질문에 대한 답변을 토대로 작성되었습니다.
👉 https://www.inflearn.com/questions/952530
안녕하세요?
this. 는 해당 클래스 내에 정의된 인스턴스 변수나 메소드 등에 접근하기 위해 사용합니다. 하지만 사실 this 를 꼭 쓰지 않아도 됩니다.
다음과 같이 클래스를 만들었을 때 setX 와 setY 를 보시면 한 쪽에는 this 를 쓰고, 다른 쪽에는 this 를 쓰지 않았습니다.
public class Point {
public int x;
public int y;
public void setX(int xValue) {
this.x = xValue;
}
public void setY(int yValue) {
y = yValue;
}
}
하지만 메인 메소드에서 두 메소드 모두 다음과 같이 아무런 문제 없이 사용할 수 있지요.
public class Sample {
public static void main(String [] args) {
Point point = new Point();
point.setX(1);
point.setY(2);
System.out.println("x : " + point.x); // 1
System.out.println("y : " + point.y); // 2
}
}
x 와 y 는 Point 클래스 내에서 인스턴스 변수로 정의된 것밖에 없기 때문에 문제가 없습니다.
그런데 만약 Point 클래스의 setter 메소드들이 이렇게 바뀌면 어떨까요?
매개변수의 이름이 xValue 에서 x 로, yValue 에서 y 로 바뀌었습니다.
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
y = y;
}
setX 의 경우 this 를 사용하였기 때문에 this.x 는 인스턴스 변수인 x 를, 그냥 x 는 전달값을 받은 매개변수 x 를 의미하므로 서로 혼란이 없어서 문제 없이 사용이 가능합니다. 하지만 setY 의 경우 인스턴스 변수 y 와 매개변수 y 와의 구분이 어렵습니다.
동일한 메인 메소드 코드를 실행시켜보면 y 값이 앞에서는 2였는데 이번에는 0으로 나오는 것을 알 수 있습니다. y = y; 라는 코드를 통해 매개변수 y 의 값을 매개변수 y 의 값으로 바꾸는 동작을 하게 되어서 인스턴스 변수 y 에는 값이 설정되지 않고, 다만 자바에서 기본적으로 int 형 변수의 초깃값으로 설정되는 0 이 그대로 출력되는 것이죠. this 를 사용하지 않으면 이렇게 의도하지 않은 결과를 만날 수 있게 됩니다.
public class Sample {
public static void main(String [] args) {
Point point = new Point();
point.setX(1);
point.setY(2);
System.out.println("x : " + point.x); // 1
System.out.println("y : " + point.y); // 0 (앞에서는 2)
}
}
정리하면, 인스턴스 변수와 매개변수의 이름이 같은 경우라면 둘을 구분하기 위해 반드시 this 를 사용해야 하며, 꼭 그런 경우가 아니라도 명시적으로 인스턴스 변수와 매개변수를 사용하는 목적으로 this 를 활용할 수 있습니다. 단, 필수는 아닙니다 😊
감사합니다.