위 글은 김성박선생님의 자바 강의를 바탕으로 쓰여졌습니다.
더 자세한 내용은 아래 링크를 통해 알아보실 수 있습니다.
부모 타입으로 자손 타입을 참조할 수 있다.
Car car = new Bus();
Bus의 인스턴스를 만드는 코드
Bus의 인스턴스를 Car로 참조한다는 얘기이다.
버스를 가리키면서 이 버스는 자동차야! 라고 말하는것과 비슷하다.
위와 같은 포함 관계를 갖는다.
좀 더 자세히 알아보자!
아래와 같은 Car를 상속받는 Bus클래스가 있다고 하자.
Bus b1 = new Bus();
b1.달리다();
b1.안내방송();
버스객체를 버스를 참조해서 만든다면, Car의 메소드와 Bus의 메소드 모두를 사용할 수 있다.
하지만, Bus객체를 Car를 참조해서 만든다면, Car에 있는 메소드만 사용 할 수있다.
다형성 - 메소드 오버라이딩(Overrding)
Car c1 = new Bus();
버스 객체를 Car를 참조해서 만들었기 때문에, Bus클래스의 메소드인 안내방송(); 은 c1객체를 통해 사용 할 수 없게 되어 오류가 발생한다.
CarExam01 클래스를 실행시키면 출력이 어떻게 될까
b1은 Bus를 참조해 만들어진 인스턴스이고,
b2는 Car를 참조해 만들어진 인스턴스이다.
b1.run();
b2.run();
의 결과는 어떻게 나올까! 잠시 생각하고 돌려보면
위와 같이 모두 후륜구동으로 달린다 가 출력된다.
메소드가 오버라이딩 되면 무조건 자식의 메소드가 실행된다.
Car car = new Bus();
car.run();
필드는 Type을 따라가고, 메소드는 오버라이딩된 자식의 메소드가 실행된다.
다음 클래스들을 보도록하자.
Child 클래스는 Parent클래스를 상속받았다.
Exam01 클래스에서 p1,c1,p2 객체를 만들었다.
Parent를 참조해서 만든 p2의 p2.i와 p2.printI();는 어떤 결과값을 같게 될까?
메소드 오버라이딩만 기억한다.
- 정보 은닉(information hiding)은 객체지향의 중요한 기법이다. 중요한 필드는 은닉하고, 필드는 메소드를 통해서만 접근해서 사용하도록 한다.
위의 그림처럼 객체지향에서 필드에 직접 접근하는 것은 좋지 않은 태도이다
Setter, getter의 등장
위의 그림과 같이 price의 접근제한자를 priavte로 바꾸어 준다음,
get과 set 메소드를 만들어 메소드를 통해 값을 수정할 수 있게 만들어 준다!
Object가 오버라이딩하라고 제공하는 메소드
- toString()
- equals() & hashCode()