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

hoje님의 프로필 이미지
hoje

작성한 질문수

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

퀴즈 #8

퀴즈08 SpeedCam 메소드 구현부분

작성

·

267

0

Factory 클래스에서는 인터페이스 호출하는 메소드에 아래처럼 실행문(구현)을 작성했는데,

@Override
public void report() {
reporter.report();
}

@Override
public void detect() {
detector.detect();
}

SpeedCam 에서는 왜 this. 을 붙이나요?

붙여도 안붙여도 코드진행에 영향이 없는걸까요?

public void detect() {
  this.detector.detect()
}

public void report() { 
  this.reporter.report()
}

답변 2

0

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?

그러네요 😅 제가 SpeedCam 클래스에는 this 를 적어놓고 FactoryCam 클래스에는 this 없이 그냥 코드를 적었네요. 결론부터 말씀드리면 이 상황에서는 this 를 붙이나 붙이지 않으나 동일합니다. 예제에서와 같이 this 는 클래스 내에 정의된 변수나 메소드 등에 접근할 수 있는데 만약 메소드의 전달값에 정의된 변수와 인스턴스 변수의 이름이 동일할 때는 둘의 구분을 위해 반드시 this 를 써야 합니다.

가령 setReporter 메소드와 같이 전달값의 reporter 와 클래스 내에 정의된 인스턴스 변수 reporter 가 같은 경우에는 this 를 적지 않으면 어느 reporter 를 의미하는지 모호해질 수 있죠.

private Reportable reporter;

public void setReporter(Reportable reporter) {
    this.reporter = reporter;
}

하지만 메소드 전달값을 다음과 같이 report 가 아닌 myReport 라는 이름으로 적었다면 메소드 내에서 this 를 사용하지 않아도 상관 없습니다. 서로 이름이 다르므로 확연이 구분이 가능하거든요.

public void setReporter(Reportable myReporter) {
    reporter = myReporter;
}

답변이 늦어 죄송하며 궁금증 해결에 도움되길 바라겠습니다 😊
감사합니다.

0

안녕하세요, 인프런 AI 인턴이에요.

SpeedCam에서 this를 붙이는 이유는 인스턴스 변수와 매개변수 이름이 동일한 경우에 구분하기 위해서입니다.

예를 들어, detect() 메소드 내에서 this.detector.detect()이라고 작성하면, this를 붙여서 현재 인스턴스의 detector 변수를 사용하고 있다고 명시적으로 표현한 것입니다. 만약에 this를 붙이지 않으면, 메소드 내에서 사용하는 변수가 인스턴스 변수인지 매개변수인지 구분하기 어려울 수 있습니다.

하지만, 현재 코드에서 this를 붙이지 않고 detector.detect()으로 작성해도 코드의 진행에는 영향을 주지 않습니다. 왜냐하면, 현재 클래스 안에서만 detect() 메소드를 호출하고 있기 때문에 컴파일러가 자동으로 인스턴스 변수를 매개변수와 구분해주기 때문입니다.

따라서, this를 붙여서 명시적으로 인스턴스 변수를 사용하는 것이 좋은 가독성을 제공해주지만, 코드의 동작에 영향을 주지 않기 때문에 선택적으로 사용하실 수 있습니다.

질문이 있으시면 언제든지 물어보세요!

hoje님의 프로필 이미지
hoje

작성한 질문수

질문하기