이번시간에는 클래스들의 다형성에 대해 알아보자.
먼저 아래의 예제를 살펴보면,
- package org.java.project;
- class Shop{
- public String map;
- public int count;
- public Customer(String map, int count){
- this.map = map;
- this.count = count;
- }
- }
- class GsShop extends Shop{
- public GsShop(String map, int count){
- super(map, count);
- }
- public void getMap(){
- String info = "GS편의점 " + this.count + "호 위치 : " + this.map;
- System.out.println(info);
- }
- }
- public class project{
- public static void main(String[] args){
- GsShop s1 = new GsShop("Daejeon Daeduk", 87);
- Shop s2 = new GsShop("Daejeon WestRegion", 41);
- s1.getMap(); //-- 정상출력 "GS편의점 87호 위치 : Daejeon Daeduk"
- s2.getMap(); //-- 실행오류! 이유 : The method getMap() is undefined for the type Shop
- }
- }
22번줄을 보면, 지금까지와는 다른 형태의 객체생성(인스턴스)을 보여주고 있다.
위 코드를 보고 2가지의 의문점이있다.
"다른 클래스를 데이터 타입으로 넣고있다. 이것은 실수일까? "=> 아니다, 바로 객체지향의 다형성을 이용한 정상적인 구현방식이다.
"하지만, 24번줄을 보면 에러가 발생한다. " => 당연하다, 객체의 클래스 타입이 Shop이므로 Shop에서 종속되게된다. 그러므로 Shop에는 존재하지않는 getMap에 접근하니까
The method getMap() is undefined for the type Shop 라는 Shop의 "클래스에는 getMap메소드가 정의되지 않았습니다." 에러가 발생한것이다.
위 코드는 GsShop()의 객체를 생성하는데, 부모클래스인 Shop의 클래스 타입을 갖는 s2라는 객체가 생성되었다. 이 객체는 s1과 다른점이 무엇일까?
1) GsShop s1 = new GsShop(); // 클래스 GsShop으로 GsShop에 접근가능한 GsShop의 객체 생성
2) Shop s2 = new GsShop(); // 클래스 GsShop으로 GsShop에 접근할 수 없는(Shop에 접근가능한) GsShop객체 생성.
s2는 Shop클래스에 종속시킨 GsShop객체이다. 즉 GsShop의 클래스에는 접근 할 수 없게 생성한것이다.
하지만 GsShop클래스에 접근을 완전히 못하는것은 아니다! 바로 GsShop클래스에 오버라이딩된 메소드가 존재한다면 접근할 수 있다.
즉, Shop클래스에 종속되긴 하지만, GsShop속성을 갖는 객체라고 할 수 있다.
다음예제를 통해 살펴보자
클래스의 다형성2 - 오버라이딩 된 자식클래스에 접근하기.
- package org.java.project1.subproject3;
- class Shop{
- public int no;
- public String map;
- public Shop(int no, String map) {
- this.no = no;
- this.map = map;
- }
- public void getMap() {
- }
- }
- class GsShop extends Shop{
- public GsShop(int no, String map) {
- super(no, map);
- }
- public void getMap() { // 메소드 오버라이딩
- String info = "GS편의점 "+this.no+"호 위치 : " + this.map;
- System.out.println(info);
- }
- }
- public class Calculator{
- public static void main(String[] args) {
- GsShop g1 = new GsShop(3, "Seoul");
- Shop g2 = new GsShop(5, "Busan");
- g1.getMap();
- g2.getMap();
- }
- }
▶ 실행결과
GS편의점 3호 위치 : Seoul
GS편의점 5호 위치 : Busan
다음시간에 이어서 Java 클래스의 다형성-2인 효율적인 사용법에 대해서 살펴보겠다.
댓글 없음:
댓글 쓰기