인프런 커뮤니티 질문&답변

최은희님의 프로필 이미지
최은희

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

퀴즈 #8

this의 사용에 대해

작성

·

200

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 를 활용할 수 있습니다. 단, 필수는 아닙니다 😊

감사합니다.

최은희님의 프로필 이미지
최은희

작성한 질문수

질문하기