2018년 9월 6일 목요일

Java 클래스의 다형성

우리는 이전시간에 클래스의 접근제어자에 대해서 살펴보았다.

이번시간에는 클래스들의 다형성에 대해 알아보자.

먼저 아래의 예제를 살펴보면,

  1. package org.java.project;
  2. class Shop{
  3.     public String map;
  4.     public int count;
  5.     public Customer(String map, int count){
  6.         this.map = map;
  7.         this.count = count;
  8.     }
  9. }
  10. class GsShop extends Shop{
  11.     public GsShop(String map, int count){
  12.         super(map, count);
  13.     }
  14.     public void getMap(){
  15.         String info = "GS편의점 " + this.count + "호 위치 : " + this.map;
  16.         System.out.println(info);
  17.     }
  18. }
  19. public class project{
  20.     public static void main(String[] args){
  21.         GsShop s1 = new GsShop("Daejeon Daeduk"87);
  22.         Shop s2 = new GsShop("Daejeon WestRegion"41);
  23.         s1.getMap(); //-- 정상출력 "GS편의점 87호 위치 : Daejeon Daeduk"
  24.         s2.getMap(); //-- 실행오류!  이유 : The method getMap() is undefined for the type Shop
  25.     }
  26. }

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 - 오버라이딩 된 자식클래스에 접근하기.

  1. package org.java.project1.subproject3;
  2. class Shop{
  3.     public int no;
  4.     public String map;
  5.     public Shop(int no, String map) {
  6.         this.no = no;
  7.         this.map = map;
  8.     }
  9.     public void getMap() {
  10.        
  11.     }
  12. }
  13. class GsShop extends Shop{
  14.     public GsShop(int no, String map) {
  15.         super(no, map);
  16.     }
  17.     public void getMap() { // 메소드 오버라이딩
  18.         String info = "GS편의점 "+this.no+"호 위치 : " + this.map;
  19.         System.out.println(info);
  20.     }
  21. }
  22. public class Calculator{
  23.     public static void main(String[] args) {
  24.         GsShop g1 = new GsShop(3"Seoul");
  25.         Shop g2 = new GsShop(5"Busan");
  26.         g1.getMap();
  27.         g2.getMap();
  28.     }
  29. }

▶ 실행결과
GS편의점 3호 위치 : Seoul
GS편의점 5호 위치 : Busan

즉, 오버라이딩을 통해서 접근이 가능한걸 알았다.

다음시간에 이어서 Java 클래스의 다형성-2인 효율적인 사용법에 대해서 살펴보겠다.

댓글 없음:

댓글 쓰기

[Java] N-I/O(Non-Blocking) 파일 읽기 쓰기 - GatheringByteChannel, ScatteringByteChannel, ByteBuffer 사용.

우리는 지금까지 다음과 같이 살펴보았다. 1.  InputStream / OutputStream : 입, 출력 스트림을 바이트로 처리하여 읽기, 쓰기. 2.  FileInputStream / FileOutputStream : 입, 출력 스트림을 ...