[JAVA] 객체지향(5) - 상속

ho's·2022년 4월 9일
0
post-custom-banner

위 글은 김성박선생님의 자바 강의를 바탕으로 쓰여졌습니다.
더 자세한 내용은 아래 링크를 통해 알아보실 수 있습니다.

부부개발단 유투브


부모 타입으로 자손 타입을 참조할 수 있다.

  • 버스는 자동차다.
Car car = new Bus();

Bus의 인스턴스를 만드는 코드

Bus의 인스턴스를 Car로 참조한다는 얘기이다.

버스를 가리키면서 이 버스는 자동차야! 라고 말하는것과 비슷하다.

위와 같은 포함 관계를 갖는다.

좀 더 자세히 알아보자!
아래와 같은 Car를 상속받는 Bus클래스가 있다고 하자.

Bus b1 = new Bus();
b1.달리다();
b1.안내방송();

버스객체를 버스를 참조해서 만든다면, Car의 메소드와 Bus의 메소드 모두를 사용할 수 있다.
하지만, Bus객체를 Car를 참조해서 만든다면, Car에 있는 메소드만 사용 할 수있다.

요약하자면, 참조타입(왼쪽)의 메소드만 이용할 수 있다는 것이다.

다형성 - 메소드 오버라이딩(Overrding)

  • over + ride = 올라타다
  • 상위 클래스의 메서드를 하위 클래스가 재정의 하는 것
  • 메서드의 이름은 물론 파라메터의 갯수나 타입도 동일해야 하며, 주로 상위 클래스의 동작을 상속 받는 하위 클래스에서 변경하기 위해 사용된다.

코드로 보기



Car c1 = new Bus();
버스 객체를 Car를 참조해서 만들었기 때문에, Bus클래스의 메소드인 안내방송(); 은 c1객체를 통해 사용 할 수 없게 되어 오류가 발생한다.

CarExam01 클래스를 실행시키면 출력이 어떻게 될까

b1은 Bus를 참조해 만들어진 인스턴스이고,
b2는 Car를 참조해 만들어진 인스턴스이다.

b1.run();
b2.run();
의 결과는 어떻게 나올까! 잠시 생각하고 돌려보면

위와 같이 모두 후륜구동으로 달린다 가 출력된다.

여기서 알 수 있는 사실은, 메소드오버라이딩을 하면, 자식의 메소드가 실행된다는 것이다

메소드가 오버라이딩 되면 무조건 자식의 메소드가 실행된다.

  • Car도 public void run()메소드를 가지고 있고, Bus도 public void run() 메소드를 가지고 있다면?
Car car = new Bus();
car.run();
  • Bus의 run()메소드가 실행 된다.

필드는 Type을 따라가고, 메소드는 오버라이딩된 자식의 메소드가 실행된다.

다음 클래스들을 보도록하자.


Child 클래스는 Parent클래스를 상속받았다.
Exam01 클래스에서 p1,c1,p2 객체를 만들었다.
Parent를 참조해서 만든 p2의 p2.i와 p2.printI();는 어떤 결과값을 같게 될까?

위와 같이 필드는 Type을 따라가고, 메소드는 오버라이딩된 자식의 메소드가 실행 된다는 것을 알 수 있다.

메소드 오버라이딩만 기억한다.

  • 정보 은닉(information hiding)은 객체지향의 중요한 기법이다. 중요한 필드는 은닉하고, 필드는 메소드를 통해서만 접근해서 사용하도록 한다.

위의 그림처럼 객체지향에서 필드에 직접 접근하는 것은 좋지 않은 태도이다

그렇다면 어떻게 할 것인가?

Setter, getter의 등장

위의 그림과 같이 price의 접근제한자를 priavte로 바꾸어 준다음,
get과 set 메소드를 만들어 메소드를 통해 값을 수정할 수 있게 만들어 준다!

Object가 오버라이딩하라고 제공하는 메소드

  • toString()
  • equals() & hashCode()

Object가 제공하는 메소드를 어떻게 사용하면 좋을지 생각해보자

profile
그래야만 한다
post-custom-banner

0개의 댓글