24
8. 인인인인인인 인인 인인인

8. 인터페이스와 추상 클래스

  • Upload
    konane

  • View
    115

  • Download
    1

Embed Size (px)

DESCRIPTION

8. 인터페이스와 추상 클래스. 추상클래스 (1/5). Animal. Feline. Dog. Canine. Hippo. Wolf. Lion. Cat. Tiger. picture food hunger boundaries location. makeNoise () eat(). makeNoise () eat(). makeNoise () eat(). makeNoise () eat(). makeNoise () eat(). makeNoise () eat(). - PowerPoint PPT Presentation

Citation preview

Page 1: 8.  인터페이스와 추상 클래스

8. 인터페이스와 추상 클래스

Page 2: 8.  인터페이스와 추상 클래스

Head First JAVA

추상클래스 (1/5)

2

Animal picture food hunger boundaries location makeNoise() eat() sleep() roam()

Feline

roam()

Canine

roam()

Hippo

makeNoise() eat()

Lion

makeNoise() eat()Tiger

makeNoise() eat()

Cat

makeNoise() eat()

Dog

makeNoise() eat()

Wolf

makeNoise() eat()

Page 3: 8.  인터페이스와 추상 클래스

Head First JAVA

추상클래스 (2/5)

3

aWolf

Animal aWolf = new Wolf;

Animal Wolf 객체

Animal anim = new Animal();

Animal Animal 객체

anim

이 둘도 같은 유형이지만 Animal 객체는 도대체 어떻게 생겼을까 ?

Wolf 객체에 대한Animal 레퍼런스

Animal 객체에 대한Animal 레퍼런스

Page 4: 8.  인터페이스와 추상 클래스

Head First JAVA

추상클래스 (3/5)

4

클래스 중에는 인스턴스 ( 속성 ) 를 만들면 안 되는 것도 있음

어떤 클래스의 인스턴스를 만들 수 없게 하는 방법즉 특정 유형에 대해 ‘ new’ 키워드를 쓸 수 없게 하는 방법

abstract class Canine extends Animal {

public void roam() { } }

Ex> Wolf 객체 , Hippo 객체 , Tiger 객체 등은 이해가 되지만 Animal 객체는 정확하게 어떤 것인지 알 수 없다 .

클래스를 추상 클래스로 만든다 클래스를 선언할 때 앞에 abstract 만 붙여줌

Page 5: 8.  인터페이스와 추상 클래스

Head First JAVA

추상 클래스 (4/5)

5

abstract public class Canine extends Animal {

public void roam() { } }

public class MakeCanine { public void go() {

Canine c; c = new Dog(); c = new Canine(); c.roam();

} }

추상 클래스 - 아무도 그 클래스의 새로운 인스턴스를 만들 수 없는 클래스

상위클래스가 추상 클래스인 경우에도하위클래스 객체를 상위클래스 레퍼런스에대입하는 것은 가능

Canine 클래스는 추상 클래스이기때문에 이런 선언은 불가능

Page 6: 8.  인터페이스와 추상 클래스

Head First JAVA

추상 클래스 (5/5)

6

Animal picture food hunger boundaries location makeNoise() eat() sleep() roam()

Feline

roam()

Canine

roam()

Hippo

makeNoise() eat()

Lion

makeNoise() eat()Tiger

makeNoise() eat()

Cat

makeNoise() eat()

Dog

makeNoise() eat()

Wolf

makeNoise() eat()

추상 추상

추상

구상구상구상

구상

구상

구상

Page 7: 8.  인터페이스와 추상 클래스

Head First JAVA

추상 메소드

7

추상 클래스는 반드시 확장해야 하는 클래스

→ 추상 메소드는 반드시 오버라이드 해야 하는 메소드

public abstract void eat();

적당한 코드를 생각할 수 없는 메소드를 추상메소드로 만들기

때문에 몸통이 없음

추상 메소드를 만들 때는 클래스도 반드시 추상 클래스로 만들어야 함

- But 추상 클래스 안에 추상 메소드와 추상 메소드가 아닌

메소드를 집어 넣는 것은 가능

Page 8: 8.  인터페이스와 추상 클래스

Head First JAVA

다형성 예제

8

public class MyAnimalList { private Animal [] animals = new Animal[5]; private int nextIndex = 0; public void add(Animal a) {

if (nextIndex < animals.length) { animals[nextIndex] = a; System.out.println(“Animal added at “ +

nextIndex); nextIndex++;

} }

} public class AnimalTestDrive {

public static void main (String [] args) { MyAnimalList list = new MyAnimalList(); Dog a = new Dog(); Cat c = new Cat(); list.add(a); list.add(c);

} }

MyAnimalListAnimal[] animalsInt nextindex add(Animal a)

Animal added at 0Animal added at 1

Page 9: 8.  인터페이스와 추상 클래스

Head First JAVA

Object (1/5)

9

자바에서 모든 클래스는 Object 라는 클래스를 확장한 것이다 .

ArrayList

boolean remove(Object elem) : 인자로 주어진 객체를 삭제 . Elem 객체가 목록에 있었다면 true 리턴

boolean contains(Object elem) : 인자로 주어진 객체하고 매치되는 것이 있으면 true 리턴

boolean isEmpty() : 목록에 아무 원소도 들어있지 않으면 true 리턴

int indexOf(Object elem) : 인자로 주어진 인덱스 위치에 있는 원소를 리턴

boolean add(Object elem) : 인자로 주어진 객체를 목록에 추가

// 기타 메소드 ..

Page 10: 8.  인터페이스와 추상 클래스

Head First JAVA

Object (2/5)

10

Objectbooleanequals()Class getClass()Int hashCode()String toString()

Dog a = new Dog(); Cat c = new Cat(); if (a.equals(c)) {

System.out.println(“true”); } else {

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

equals(Object to)

Cat c = new Cat(); System.out.println(c.getClass());

getClass()

falseclass Cat

Cat c = new Cat(); System.out.println(c.hashCode());

hashCode()

8202111

Cat c = new Cat(); System.out.println(c.toString());

toString()

Cat@7d277f

같은지…

그 객체의 클래스

객체에 해당하는 해시코드클래스명과

String 메시지

Page 11: 8.  인터페이스와 추상 클래스

Head First JAVA

Object (3/5)

11

ArrayList<Dog> myDogArrayLest = new ArrayList<Dog>(); Dog aDog = new Dog(); myDogArrayList.add(aDog); Dog d = myDogArrayList.get(0);

ArrayList<Object> myDogArrayLest = new ArrayList<Object>(); Dog aDog = new Dog(); myDogArrayList.add(aDog); Dog d = myDogArrayList.get(0);

목록에 있는 Dog 를 Dog 레퍼런스에 대입

Object 를 Dog 에 . ‘불가능’Object 의 하위클래스일 뿐

ArrayList<Object> 에서 나오는 객체는 레퍼런스 무조건 Object 유형의 레퍼런스로 나옴 .컴파일러에서는 그 객체가 Object 가 아닌 다른 클래스의 인스턴스라 가정할 수 없음 .

Page 12: 8.  인터페이스와 추상 클래스

Head First JAVA

Object (4/5)

12

O

Object Dog 객체

ArrayList 로부터 객체 레퍼런스를 받아오면 Dog 에 대한 Object 레퍼런스를 가짐

Object o = a1.get(index); int i = o.hashCode(); o.bark();

Object 클래스에도 hashCode() 메소드는 있기 때문에 어떤 자바 객체에서도 호출 가능

Object 클래스에서는 bark() 의 의미를 알 수 없음인덱스에 Dog 객체가 들어있다는 것을 컴파일러는 모름

컴파일러에서 어떤 메소드를 호출할 수 있는지 결정할 때는 실제 객체 유형이 아닌 레퍼런스 유형을 기준으로 따짐

Page 13: 8.  인터페이스와 추상 클래스

Head First JAVA

Object (5/5)

13

Snowboard 객체

Snowboard

ObjecttoString()

equals()

hashCode()

getClass()

shred() turn()

getAir() loseControl()

Snowboard s = new Snowboard();

Object o = s;

O

S

Page 14: 8.  인터페이스와 추상 클래스

Head First JAVA

객체 캐스트

14

Dog 객체

Object o = a1.get(index); Dog d = (Dog) o; d.roam();

O

S객체가 확실히 Dog 객체라면 레퍼런스를 복사한 다음 그 사본을 강제로 Dog 레퍼런스로

if (o instanceof Dog) {Dog d = (Dog) o;

Dog 인지 잘 모르겠다면 instanceof 연산자를 사용하여 확인 . 엉뚱한 클래스로 캐스트하면ClassCastException 으로 프로그램 정지

Page 15: 8.  인터페이스와 추상 클래스

Head First JAVA

클래스 트리 수정 (1/3)

15

PetShop 프로그램에서 기존 클래스를 재사용하기 위한 방법

애완동물의 성질을 나타내기 위한

메소드를 Animal 클래스에…

- 모든 Animal 객체가 바로

애완동물의 성질을 상속 가능 .- 애완동물이 아닌 동물에

애완동물 메소드를 부여 . 동물 별로 애완동물로써의 행동이

달라 따로 수정해야 함 .

Animal

Feline Canine

Lion

Cat

Tiger

Hippo

Wolf

Dog

Page 16: 8.  인터페이스와 추상 클래스

Head First JAVA

클래스 트리 수정 (2/3)

16

첫 번째 옵션과 같지만 메소드를

추상메소드로 만들어서 Animal 하위 클래스에서 오버라이드…

- 애완동물이 아닌 클래스에서

애완동물 메소드를 사용할 수

있다는 단점 극복

- 하위클래스 중 구상 클래스에서는

반드시 모든 애완동물 메소드를

구현해야 함

Animal

Feline Canine

Lion

Cat

Tiger

Hippo

Wolf

Dog

Page 17: 8.  인터페이스와 추상 클래스

Head First JAVA

클래스 트리 수정 (3/3)

17

애완동물 메소드는 그 메소드를

사용할 클래스에만…

- 메소드가 필요한 클래스에만

들어감 .- 애완동물용 메소드에 대해서

다형성을 적용할 수 없음 . 모든 애완동물에 있어야만 하는

정확한 메소드 ( 규약 ) 를 모든

프로그래머가 알고 있어야 함 .

Animal

Feline Canine

Lion

Cat

Tiger

Hippo

Wolf

Dog

Page 18: 8.  인터페이스와 추상 클래스

Head First JAVA

다중속성

18

Animal

Feline Canine

Cat

Lion

Tiger

Hippo

Wolf

Dog

Pet애완동물 메소드를 Pet 클래스에

- 모든 애완동물 클래스에 똑같은

메소드가 정의되게 함 .- 다형성을 활용하여 애완동물용

메소드를 호출할 수 있음 .

JAVA 에서는 다중속성을사용할 수 없음

죽음의 다이아몬드를 허용하지 않기 때문

Page 19: 8.  인터페이스와 추상 클래스

Head First JAVA

인터페이스

19

public interface Pet { public abstract void beFriendly(); public abstract void play();

}

public class Dog extends Canine implements Pet { public void beFriendly() { … } public void play() { … }

public void roam() { … } public void eat() { … }

}

Pet

abstract void beFriendly();Abstract void play();

자바 인터페이스는 추상 클래스와 비슷

- 모든 메소드가 추상 메소드

- 모든 애완동물 클래스는 Pet 의 메소드를

구현 ( 오버라이드 ) 해야 함

Page 20: 8.  인터페이스와 추상 클래스

Head First JAVA

인터페이스 다형성

20

Animal

Feline Canine

Cat

Lion

Tiger

Hippo

Wolf

Dog

PetRobot

RoboDogTiger

- 서로 다른 상속 트리에 속한

클래스에서도 같은

인터페이스를 구현할 수 있음

- 한 클래스에서 인터페이스 여러

개를 구현할 수 있음

Page 21: 8.  인터페이스와 추상 클래스

Head First JAVA

Super 키워드

21

abstract class Report { void runReport() {

// 보고서 설정 } void printReoprt() {

// 포괄적인 인쇄 작업 }

} class BuzzwordsReport extends Report {

void runReport() { super.runReport(); buzzWordCompliance(); printReport();

} void buzzwordCompliance()

{ … } }

상위클래스 메소드에서 하위클래스에서 사용할 수 있는 작업 처리

상위클래스 버전을 호출한 다음 하위클래스에서 해야 할 일을 처리

Page 22: 8.  인터페이스와 추상 클래스

Head First JAVA

핵심정리 (1/3)

22

클래스를 만들 때 인스턴스를 만들 수 없게 하고 싶다면

abstract 키워드를 사용하면 된다 .

추상 클래스에는 추상 메소드와 아닌 것을 모두 넣을 수 있다 .

클래스에 추상 메소드가 하나라도 있으면 추상 클래스이다 .

추상 메소드에는 본체가 없어 세미콜론으로 끝난다 .

상속 트리에서 처음으로 나오는 구상 클래스에서는 반드시 모든

추상 메소드를 구현해야 한다 .

자바에 들어 있는 모든 클래스는 Object 의 하위클래스이다 .

Page 23: 8.  인터페이스와 추상 클래스

Head First JAVA

핵심정리 (2/3)

23

메소드를 선언할 때 인자 , 리턴 유형을 Object 로 지정해도 된

다 .메소드를 호출하려면 레퍼런스가 참조하는 객체의 유형과는

무관하게 레퍼런스 변수유형의 클래스에 그 메소드가 있어야 한

다 .Object 유형의 레퍼런스 변수는 캐스팅을 하지 않고는 다른

유형의 레퍼런스에 대입할 수 없다 .

ArrayList<Object> 에서 나오는 것은 Object 유형으로

나온다 .자바에서는 다중 상속을 허용하지 않는다 .

인터페이스는 100% 순수한 추상 클래스이다 . 추상 메소드만

정의

Page 24: 8.  인터페이스와 추상 클래스

Head First JAVA

핵심정리 (3/3)

24

인터페이스를 만들 때는 class 대신 interface 키워드를

사용한다 .인터페이스를 구현할 때는 implements 라는 키워드를

사용한다 .클래스를 만들 때 인터페이스를 여러 개 구현할 수 있다 .

인터페이스를 구현하는 클래스에서는 인터페이스에 들어있는 모든

메소드를 구현해야 한다 .

하위클래스에서 어떤 메소드를 오버라이드 했는데 , 상위클래스

버전을 호출하고 싶다면 super 라는 키워드를 사용한다 .