• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

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

23.07.23 19:25 작성 조회수 163

0

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

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

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

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

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

 

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

감사합니다.