java programming 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · java...

19

Upload: others

Post on 23-Jun-2020

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33
Page 2: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

1. 추상 메소드

선언은 되어있으나 코드 구현되어있지 않은 메소드

abstract 키워드 사용

메소드 타입, 이름, 매개변수 리스트만 선언

2. 추상 클래스

abstract 키워드로 선언한 클래스

종류

▪ 추상 메소드를 포함하는 클래스 (반드시, abstract로 선언)

▪ 추상 메소드가 없지만 abstract로 선언한 클래스

public abstract String getName();

public abstract void setName(String s);

Page 3: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33
Page 4: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

추상 클래스는 객체를 생성할 수 없다

abstract class DObject {public DObject next;

public DObject(){ next = null;}abstract public void draw();

}

class AbstractErr{public static void main(String[] args){

DObject obj;obj = new DObject();obj.draw();

}}

결과는 ?

Page 5: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

추상 클래스의 필요성

계층적 상속 관계를 갖는 클래스 구조를 만들 때

설계와 구현 분리

슈퍼클래스에서는 개념적 특징 정의

서브 클래스에서 구체적 행위 구현

추상 클래스의 상속

추상 클래스를 상속받아, 추상 메소드를 구현하지 않으면 서브 클래스도

추상 클래스화

서브 클래스도 abstract로 선언해야함.

but, 서브 클래스에서 추상 메소드 구현 시 서브 클래스는 추상클래스화 되

지 않음

Page 6: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

해결 1.

Page 7: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

class Line extends DObject {public void draw() {

System.out.println(“Line”);}

}

class Rect extends DObject {public void draw() {

System.out.println(“Rect”);}

}

class Circle extends DObject {public void draw() {

System.out.println(“Circle”);}

}

abstract class DObject {public DObject next;

public DObject() { next = null;}abstract public void draw();

}

class DObject {public DObject next;

public DObject() { next = null;}public void draw() {

System.out.println(“DObject draw”);}

}

추상 클래스로 수정

Page 8: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

Shape 클래스 정의

추상클래스로 작성한다.(골격을 잡는다)

추상메소드 getArea, getPerimeter으로 구성된다

Rectangle 클래스정의

추상클래스인 Shape클래스로부터 상속받는다

이름, 가로, 세로 필드를 선언하고, 초기화하는 생성자를 만든다

서브클래스인 Rectangle클래스가 추상클래스가 되지 않기 위해서, Shape클래스

의 추상메소드를 오버라이딩한다

ShapeDriver 클래스정의

서브클래스인 Rectangle클래스 객체를 생성한다.

이름, 가로, 세로, 둘레, 면적을 각각 Rectangle의 필드 및 메소드로 접근하여 출

력한다.

Page 9: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

인터페이스(interface)

모든 메소드가 추상 메소드인 클래스

인터페이스는 상수와 메소드만 가짐(필드 X)

인터페이스의 특징

메소드 선언에 abstract키워드를 사용하지 않아도 됨

인터페이스의 속성

▪ 모든 메소드의 접근지정자는 public이며, 생략 가능하다.

▪ 상수는 public static final이며, 생략 가능) – but 정의해 주는 게 좋다.

객체 생성 불가

레퍼런스 변수 타입으로 사용 가능

인터페이스 선언

interface 키워드로 선언된 클래스

ex) public interface SerialDriver{…}

Page 10: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33
Page 11: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

인터페이스를 이용하여 다중 상속 구현

클래스는 다중 상속 불가

인터페이스는 명세서와 같음

구현은 블랙박스와 같아 인터페이스의 사용자는 구현에 대해 알 필요 없음

정의와 구현을 분리하여, 작업자가 다양한 구현을 할 수 있음

사용자인터페이스

구현2

구현1

Page 12: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

인터페이스 간 상속 가능

인터페이스가 인터페이스를 상속하여 확장된 인터페이스 작성 가능

다중 상속 허용

Page 13: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

인터페이스 구현

implements 키워드 사용

여러 개의 인터페이스 동시 구현 가능

상속과 구현이 동시에 가능

interface USBMouseInterface {void mouseMove();void mouseClick();

}

public class MouseDriver implements USBMouseInterface { // 인터페이스 구현void mouseMove() { .... }void mouseClick() { ... }

// 추가적으로 다른 메소드를 작성할 수 있다.int getStatus() { ... }int getButton() { ... }

}

Page 14: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

interface USBMouseInterface {void mouseMove();void mouseClick();

}

interface RollMouseInterface{void roll();

}

public class MouseDriver implements USBMouseInterface, RollMouseInterface { void mouseMove() { .... }void mouseClick() { ... }void roll(){…}

// 추가적으로 다른 메소드를 작성할 수 있다.int getStatus() { ... }int getButton() { ... }

}

Page 15: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

다음의 클래스를 상속받고 인터페이스를 구현하는 SmartPhone을 작

성하여라

Page 16: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

비교 내용

추상 클래스

일반 메소드 포함 가능

상수, 변수 포함 가능

모든 서브 클래스에 공통된 메소드가 있는 경우는 추상 클래스가 적합

인터페이스

모든 메소드가 추상 메소드

상수만 포함 가능

다중 상속 지원

Page 17: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

다형적 참조(polymorphic reference)

시점에 따라 다른 유형의 객체를 가리킬 수 있는 참조 변수

하나의 다형적 참조를 통해 호출되는 특정 메소드는 호출 때마다 바뀔

수 있음

다형적 참조 방법

상속을 통한 다형성

인터페이스를 통한 다형성

Page 18: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

cry() 메소드의 재정의를 통한 다형성

동물을 나타내는 Animal클래스의 하위 클래스들로 Cat, Bird, Dog클래스를 가진

다.

Animal클래스는 동물의 소리를 나타내는 cry 메소드를 가지고 있으며, 하위 클래

스들은 각각 다른 울음소리를 낼 수 있도록 cry 메소드를 재정의 한다.

Page 19: JAVA PROGRAMMING 실습 08.다형성 - gnu.ac.krclass.gnu.ac.kr/~smjeong/pdf/java/09.pdf · JAVA PROGRAMMING 실습 08.다형성 Author: jinyoung Created Date: 11/20/2017 5:56:33

인터페이스를 참조하는 변수를 통한 다형성

인터페이스를 참조하는 변수는 그 인터페이스를 구현하는 어떤 클래스의 어느

객체를 참조하기 위해 사용 가능하다.

b1.move() 호출을 통하여 다형성을 확인할 수 있다.