java programming 실습 08.다형성 - apache2 ubuntu ...class.gnu.ac.kr/~ejsja/java/08.pdf ·...

21
2015학년도 2학기

Upload: hanhi

Post on 21-Jun-2018

229 views

Category:

Documents


0 download

TRANSCRIPT

2015학년도 2학기

1. 추상 메소드

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

abstract 키워드 사용

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

2. 추상 클래스

abstract 키워드로 선언한 클래스

종류

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

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

public abstract String getName();

public abstract void setName(String s);

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

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(); } }

결과는 ?

추상 클래스의 필요성

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

설계와 구현 분리

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

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

추상 클래스의 상속

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

추상 클래스화

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

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

지 않음

해결 1.

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”); } }

추상 클래스로 수정

다음 추상 클래스 Calculator를 상속받은 GoodCalc 클래스를 구현하라.

결과값은

import java.util.Scanner;

abstract class Calculator {

public abstract int add(int a, int b); // 두 정수의 합을 구하여 리턴

public abstract int subtract(int a, int b); // 두 정수의 차를 구하여 리턴

public abstract double average(int[] a); // 배열에 저장된 정수의 평균을 구해 실수로 반환

}

class GoodCalc extends Calculator {

public int add(int a, int b) {

return a+b;

}

public int subtract(int a, int b) {

return a - b;

}

public double average(int[] a) {

double sum = 0;

for (int i = 0; i < a.length; i++)

sum += a[i];

return sum/a.length;

}

public static void main(String [] args) {

Calculator c = new GoodCalc();

System.out.println(c.add(2,3));

System.out.println(c.add(2,-3));

System.out.println(c.average(new int [] {2,3,4 }));

}

}

인터페이스(interface)

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

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

인터페이스 선언

interface 키워드로 선언된 클래스

인터페이스의 특징

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

인터페이스의 속성

▪ public, static, final으로 가정(생략 가능) – but 정의해 주는 게 좋다.

객체 생성 불가

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

ex) public interface SerialDriver{…}

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

클래스는 다중 상속 불가

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

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

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

사용자 인터페이스

구현2

구현1

인터페이스 간 상속 가능

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

다중 상속 허용

인터페이스 구현

implements 키워드 사용

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

상속과 구현이 동시에 가능

interface USBMouseInterface { void mouseMove(); void mouseClick(); } public class MouseDriver implements USBMouseInterface { // 인터페이스 구현 void mouseMove() { .... } void mouseClick() { ... } // 추가적으로 다른 메소드를 작성할 수 있다. int getStatus() { ... } int getButton() { ... } }

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() { ... } }

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

성하여라

비교 내용

추상 클래스

일반 메소드 포함 가능

상수, 변수 포함 가능

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

인터페이스

모든 메소드가 추상 메소드

상수만 포함 가능

다중 상속 지원

인터페이스 타입의 객체 참조 변수에 인터페이스를 포함하는 클래스

의 객체를 할당(!) 가능

단, 인터페이스 타입의 객체 참조 변수를 통해서는 인터페이스에 선언된 속

성만 접근 가능.

결과는 ?

다형적 참조(polymorphic reference)

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

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

수 있음

상속을 통한 다형성

참조 변수는 한 객체를 가리킬 수 있고, 다른 경우에는 상속에 의해 관련이

있는 다른 객체를 참조 할 수 있음

인터페이스를 통한 다형성

• 인터페이스의 이름이

한 참조 변수의 데이터

형으로 사용 가능

• 인터페이스를 참조하

는 변수는 그 인터페이

스를 구현하는 어떤 클

래스의 어느 객체를 참

조하기 위해 사용 가능