inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

상속 (전반전)

상속(전반전) 질문입니다.

245

Rene02

작성한 질문수 11

0

 처음 public class Camera에 대한 생성자를 만들 때

public Camera() {
this.name = "카메라";
}

그리고 public class SpeedCam에 대한 생성자를 만들 때

public SpeedCam() {
this.name = "과속단속 카메라";
}

이렇게 둘 다 this가 자동으로 들어가는데 이유가 무엇인지 궁금합니다.

 

java 객체지향

답변 1

0

나도코딩

안녕하세요?

this. 는 해당 클래스 내에 정의된 인스턴스 변수나 메소드 등에 접근하기 위해 사용합니다. 상속이라는 것은 부모 클래스의 기능을 그대로 사용하고 거기에 더하여 기능을 확장하는 개념이므로 동일하게 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 를 활용할 수 있습니다. 단, 필수는 아닙니다 😊

감사합니다.

자바를 처음 배울 때 이런 고민이 드는 게 정상일까요?

1

146

2

static이 뭐였는지 기억이 안나요 ㅜㅜ

0

119

2

Iterator (알 수 없음) 데이터 삭제 후 초기화 관련 문의

0

70

1

사고력 키우는 법이 어떤게 있나요?

0

93

2

getter setter

0

103

2

섹션9. 66 메소드 오버로딩 시 질문이 있습니다.

0

80

1

안녕하세요 갑자기 프로그램 에러가 떠서 안되네요

0

76

2

변수 이름짓는법

0

114

2

intelli J 실행오류

0

115

2

혹시 이건 수학적 사고가 부족한 걸까요?

0

152

2

영상이 재생이 안됩니다.

0

167

3

이중 반복문 (후반전) 오른쪽으로 치우친 별 쌓기에 질문이 있습니다.

0

117

2

응용이 어렵습니다.

0

206

2

IntelliJ가 보이지 않습니다.

0

186

3

JDK 버전 문의

0

129

2

BlackBox 파일 내에서 메소드 정의

0

136

1

동기화

0

121

2

Iterator 문의

0

105

1

코드 순서 문의

0

142

1

클래스 메소드

0

149

2

Quiz_05 관련 질문드립니다 !

0

118

2

다운로드가 안됩니다

0

165

2

다형성

0

120

2

HashMap

0

80

2