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

9kku2님의 프로필 이미지
9kku2

작성한 질문수

김영한의 실전 자바 - 기본편

문제와 풀이

상속 관계와 캡슐화 질문

해결된 질문

작성

·

377

·

수정됨

1

안녕하세요 영한님 강의 잘 보고 있습니다.

상속 관계와 캡슐화에 대해 궁금증이 있어 질문 남깁니다.

 

문제를 풀 때 부모와 자식은 각각 별도로 생성되지만, 하나의 묶음으로 생각되어 자식 클래스에서 부모 클래스의 필드에 직접 접근 가능하여야 한다 생각했습니다

그리하여 부모 클래스의 필드를 protected로 생성하여 풀었는데, 영한님 문제 풀이를 보니 private 으로 감추시는걸 보고 의문점이 생겼습니다

private으로 감춘다면 기존 부모 클래스 기능을 오버라이딩 하여 부모 필드에 접근이 필요 할 때는 getter/setter 같은 메소드를 만들어서 접근 해야 하는 걸까요?

아래는 Car Classmove 메소드를 GasCar Class가 재정의 하는 코드를 간략하게 작성해보았습니다

public class Car {
  private int speed;
	
  public void move(){
	speed++;
        System.out.println("speed : " + speed);
  }
  protected int getSpeed() {
	return speed;
  }
  protected void setSpeed(int speed) {
	this.speed = speed;
  }
}


public class GasCar extends Car{

  @Override
  public void move() {
	int speed = getSpeed() + 2;
	setSpeed(speed);
	System.out.println("speed : " + speed);
  }
}

따라서 상속 관계라도 일반 객체를 사용하는 입장과 동일하게 캡슐화를 해야 하고, 확장의 여지를 두고 부모 클래스의 필드에 접근하는 메소드를 만들어야 하는것인지 궁금합니다!

 

답변 1

4

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 9kku2님

캡슐화는 상속 관계에서도 마찬가지로 적용됩니다 :)

따라서 자식이 부모의 필드에 직접 접근하는 것 보다는 부모의 메서드를 통해서 접근하는 것이 더 나은 선택입니다.

단순한 예로 부모의 필드를 private으로 사용해서 자식에서 직접 접근하지 못하게 막으면, 자식 클래스가 10개 있다고 가정했을 때 부모의 필드 이름이 변경되어도 부모의 메서드 내부만 변경한다면 모든 자식 클래스의 코드는 변경하지 않아도 되겠지요?

도움이 되셨길 바래요.

9kku2님의 프로필 이미지
9kku2
질문자

감사합니다 ^^

9kku2님의 프로필 이미지
9kku2

작성한 질문수

질문하기