슬라이드 1

Similar documents
JAVA PROGRAMMING 실습 08.다형성

슬라이드 1

gnu-lee-oop-kor-lec06-3-chap7

슬라이드 1

쉽게 풀어쓴 C 프로그래밍

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Microsoft PowerPoint - 2강

제11장 프로세스와 쓰레드

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

Design Issues

PowerPoint Presentation

PowerPoint Presentation

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

PowerPoint Presentation

PowerPoint Presentation

JAVA PROGRAMMING 실습 05. 객체의 활용

PowerPoint 프레젠테이션

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå

PowerPoint Presentation

PowerPoint Presentation

슬라이드 1

PowerPoint Presentation

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

슬라이드 1

PowerPoint 프레젠테이션

09-interface.key

(Microsoft PowerPoint - java2-lecture3.ppt [\310\243\310\257 \270\360\265\345])

유니티 변수-함수.key

Microsoft PowerPoint - Lect04.pptx

JUNIT 실습및발표

No Slide Title

슬라이드 1

PowerPoint Presentation

Network Programming

PowerPoint 프레젠테이션

슬라이드 1

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

5장.key

JAVA PROGRAMMING 실습 07. 상속

슬라이드 1

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Microsoft PowerPoint - 04-UDP Programming.ppt

Microsoft PowerPoint - chap11

오버라이딩 (Overriding)

Microsoft PowerPoint - java2 [호환 모드]

PowerPoint Presentation

Microsoft PowerPoint - 13_UMLCoding(2010).pptx

슬라이드 1

PowerPoint Presentation

PowerPoint Presentation

Cluster management software

비긴쿡-자바 00앞부속

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

PowerPoint Presentation

2 단계 : 추상화 class 오리 { class 청둥오리 extends 오리 { class 물오리 extends 오리 { 청둥오리 mallardduck = new 청둥오리 (); 물오리 redheadduck = new 물오리 (); mallardduck.swim();

JAVA PROGRAMMING 실습 02. 표준 입출력

ilist.add(new Integer(1))과 같이 사용하지 않고 ilist.add(1)과 같이 사용한 것은 자바 5.0에 추가된 기본 자료형과 해당 객체 자료 형과의 오토박싱/언박싱 기능을 사용한 것으로 오토박싱이란 자바 컴파일러가 객체를 요구하는 곳에 기본 자료형

A Tour of Java IV

PowerPoint Template

Microsoft PowerPoint - lec08_1311.ppt [호환 모드]

PowerPoint Presentation

JAVA PROGRAMMING 실습 02. 표준 입출력

PowerPoint Presentation

Microsoft Word - java19-1-midterm-answer.doc

Microsoft PowerPoint - Java7.pptx

JAVA PROGRAMMING 실습 09. 예외처리

C++ Programming

1

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

Microsoft PowerPoint 장강의노트.ppt

rmi_박준용_final.PDF

쉽게 풀어쓴 C 프로그래밍

슬라이드 1

PowerPoint Presentation

자바 프로그래밍

교육자료

Microsoft PowerPoint - CSharp-10-예외처리

쉽게 풀어쓴 C 프로그래밍

Microsoft Word - java18-1-final-answer.doc

소프트웨어공학개론 강의 5: 객체지향개념 최은만동국대학교컴퓨터공학과

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

No Slide Title

JAVA PROGRAMMING 실습 05. 객체의 활용

- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname=

Microsoft PowerPoint - additional08.ppt [호환 모드]

금오공대 컴퓨터공학전공 강의자료

PowerPoint Presentation

슬라이드 1

Microsoft PowerPoint - lec7_package [호환 모드]

05-class.key

PowerPoint 프레젠테이션

PowerPoint Presentation

슬라이드 1

* Factory class for query and DML clause creation * tiwe * */ public class JPAQueryFactory implements JPQLQueryFactory private f

JVM 메모리구조

Transcription:

8 장. 심각한다형성 학습목표 추상 과 구상 의차이점에대해알아봅니다. Object 클래스에대해알아봅니다. 다형성에대해알아봅니다. 캐스팅에대해알아봅니다. 인터페이스에대해알아봅니다.

인터페이스와추상클래스

Animal picture RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line food hunger boundaries location makenoise() eat() sleep() roam Feline roam() Hippo Canine Lion roam() Cat Dog Wolf Tiger

Wolf 객체에대한 Wolf 레퍼런스 Wolf awolf = new Wolf(); Wolf 객체 awolf Wolf

Hippo 객체에대한 Animal 레퍼런스 Animal ahippo = new Hippo(); Hippo 객체 ahippo Animal

Animal 객체에대한 Animal 레퍼런스? Animal anim = new Animal();? Animal 객체 anim Animal

객체는어떻게생겼을까? Animal 객체는어떻게생겼을까요?

추상클래스 추상클래스 (abstract class) 란? 인스턴스를만들수없는클래스 반드시확장해야함 추상유형을레퍼런스로사용할수는있음 다형적인인자, 리턴유형, 배열등에활용 abstract class Canine extends Animal { } public void roam() { }

추상클래스 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(); } } % javac MakeCanine.java MakeCanine.java:5: Canine is abstract; Cannot be instantiated c = new Canine(); ^ 1 error

추상 vs. 구상 추상 Animal Component 구상 추상 Feline 구상 추상 Canine JButton JLabel JComboBox JList JScrollPane Lion 구상 Hippo Cat Tiger 구상 구상 Dog Wolf 구상

추상메소드 추상메소드 (abstract method) 몸통이없는메소드 반드시오버라이드해야합니다. public abstract void eat(); 추상메소드를만들때는클래스도반드시추상클래스로만들어야합니다. 추상클래스가아닌클래스에는추상메소드를집어넣을수없습니다.

바보같은질문은없습니다. 추상클래스는하위클래스에서상속해서쓸공통적인코드를집어넣기위해있는거라고볼수있지만추상메소드는왜있는거죠? 추상클래스에서하위클래스에서활용할수있는일반적인메소드코드를만들수없는경우에추상메소드를만듭니다. 하위클래스에반드시있어야하는일련의메소드를정의하기위해추상메소드가필요합니다.

바보같은질문은없습니다. 그러면어떤장점이있나요? 다형성이가장중요한장점입니다. 추상메소드는다형성을활용하기위해 이유형에속하는모든하위클래스유형에는이메소드가있어야한다 는것을지정하기위해서반드시필요합니다.

추상메소드는모두구현해야합니다. 추상메소드구현 == 메소드오버라이드 상속트리에서처음으로등장하는구상클래스에서모든추상메소드를구현해야만합니다. 추상메소드에는추상메소드와구상메소드가모두들어갈수있지만구상메소드에는추상메소드가들어갈수없습니다. 메소드서명과리턴형이똑같은추상메소드가아닌메소드를만들기만하면됩니다. ( 자바에서는메소드의코드가어떻게되는지는신경쓰지않습니다.)

다형성활용 ArrayList 비슷한클래스를직접만듭시다. 배열의길이는 5 로제한 (Dog 배열로시작 ) add() 메소드를호출하면새로받아온 Dog 객체를추가하고인덱스 (nextindex) 를증가시킴 public class MyDogList { private Dog[] dogs = new Dog[5]; private int nextindex = 0; } public void add(dog d) { if (nextindex < dogs.length) { dogs[nextindex] = d; System.out.println( Dog added at + nextindex); nextindex++; } }

Cat 객체도집어넣으려면? 1. Cat 객체를저장하기위해 MyCatList 라는클래스를따로만듭니다. 2. 서로다른두배열과서로다른두메소드 (addcat(cat c), adddog(dog d)) 가들어있는 DogAndCatList 라는클래스를만듭니다. 3. 모든 Animal 하위클래스를받아들일수있는 AnimalList 클래스를만듭니다.

MyAnimalList 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++; } }

AnimalTestDrive 클래스 public class AnimalTestDrive { } public static void main(string[] args) { } AnimalList list = new AnimalList(); Dog a = new Dog(); Cat c = new Cat(); list.add(a); list.add(c); % java AnimalTestDrive Animal added at 0 Animal added at 1

Animal 말고다른객체는요? 가장포괄적인클래스는? Object 클래스!!! Object 클래스는모든클래스의어머니, 즉모든클래스의상위클래스입니다. 별도로어떤클래스를확장한것이라고지정해주지않으면자동으로 Object 클래스의하위클래스가됩니다.

Object 클래스에는무엇이있나요? equals(object o) Dog a = new Dog(); Cat c = new Cat(); Object boolean equals() Class getclass() int hashcode() String tostring() if (a.equals(c)) { System.out.println( true ); } else { System.out.println( false ); } YourClassHere % java TestObject false

Object 클래스의메소드 getclass() Cat c = new Cat(); System.out.println(c.getClass()); % java TestObject class Cat

Object 클래스의메소드 hashcode() Cat c = new Cat(); System.out.println(c.hashCode()); % java TestObject 8202111

Object 클래스의메소드 tostring() Cat c = new Cat(); System.out.println(c.toString()); % java TestObject Cat@7d277f

바보같은질문은없습니다. Object 클래스는추상클래스인가요? 아닙니다. 모든클래스에서무조건오버라이드할필요없이그대로사용할수있는메소드를구현해놓은코드가들어있기때문에추상클래스가아닙니다.

바보같은질문은없습니다. 그러면 Object 에들어있는메소드를오버라이드할수는있나요? 할수있는것도있지만 final 로지정되어있어서오버라이드할수없는것도있습니다. 될수있으면 hashcode(), equals(), tostring() 메소드는오버라이드하는것이좋습니다. getclass 같은메소드는반드시특정한방식으로작동을해야하기때문에 final 로지정되어있습니다. 그리고고유코드 (native code) 로만들어진메소드도있습니다.

바보같은질문은없습니다. ArrayList 는범용으로쓸수있다고했는데왜 ArrayList<DotCom> 같은식으로써서제한을가하나요? 예전에는무조건 ArrayList<Object> 같은식이었습니다. 하지만자바 5.0 에서 < 유형 > 같은매개변수화된유형기능이추가되어이제특정유형의객체만들어갈수있도록제한할수있습니다. 이렇게되면나중에 ArrayList 에서객체를꺼낼때훨씬편하게쓸수있습니다.

바보같은질문은없습니다. Object 클래스도 Animal 클래스처럼 객체 를만들기가이상하지않나요? 주로포괄적인개념의 객체 가필요한경우에 Object 객체를사용합니다. 특히스레드동기화를할때많이사용합니다. Object 객체를실제로만들수는있지만그렇게하는경우가그리흔하지않다는정도로만알아두고넘어가도됩니다.

바보같은질문은없습니다. Object 유형은주로다형적인인자 / 리턴형으로쓰인다고할수있는건가요? ArrayList 에서처럼말이죠? 임의클래스에대해어떤작업을하는메소드를만들때다형적유형으로쓰이는경우 실행중자바에들어있는모든객체에서필요한진짜메소드를제공하는경우 스레드와관련된메소드도매우중요하게쓰입니다.

바보같은질문은없습니다. 왜모든메소드의인자와리턴유형을 Object 로하지않나요? 유형안전성 (type-safety) 문제 레퍼런스유형에서정의되어있는메소드만호출할수있습니다. Object o = new Ferrari(); o.gofast(); Object 유형의레퍼런스로참조한객체에대해서는 Object 클래스에정의되어있는것만주문할수있습니다.

다형적레퍼런스 어떤객체를 ArrayList<Dog> 에집어넣으면그객체는 Dog 로저장되고, 꺼낼때도무조건 Dog 객체가됩니다. ArrayList<Object> 에저장하면그객체는원래자기가무슨객체인지기억하질못합니다. ArrayList<Object> Object Object Object Object

기억상실증에걸린듯한객체 public void go() { Dog adog = new Dog(); Dog samedog = getobject(adog); } public Object getobject(object o) { Object return o o; = al.get(index); } DogPolyTest.java:10: incompatible types found : java.lang.object required : Dog Dog samedog = getobject(adog); ^ 1 error

객체의유형과레퍼런스의유형 Object o = al.get(index); int i = o.hashcode(); o.bark(); Dog 객체 메소드를호출할수있는지결정할때는객체가아닌레퍼런스의유형을기준으로합니다. o Object Object equals() getclass() hashcode() tostring()

객체안에들어있는알맹이 Object equals() getclass() hashcode() tostring() Snowboard equals() getclass() hashcode() tostring() turn() shred() getair() losecontrol() Object Snowboard Snowboard 객체

다형성 여러형태 Snowboard s = new Snowboard(); Object o = s; Object Snowboard Snowboard 객체

레퍼런스캐스팅 Object o = al.get(index); Dog d = (Dog) o; d.roam(); o Dog 객체 Object d if (o instanceof Dog) { Dog d = (Dog) o; 컴파일러에서는 Dog 레퍼런스가참조하는실제객체의클래스가아닌레퍼런스변수를선언할때지정한유형의클래스를확인합니다.

계약서 어떤객체에있는메소드를호출하려면그메소드가레퍼런스변수의클래스에들어있어야만합니다. 클래스에있는 public 메소드는계약서, 즉외부와의약속이라고생각하면됩니다. 컴파일러에서는레퍼런스가참조하는실제객체의클래스가아닌레퍼런스변수를선언할때지정한유형의클래스를확인합니다.

계약서를고쳐야한다면? Dog 클래스는동물시뮬레이션용으로는적합합니다. 하지만애완동물가게프로그램에서 Dog 클래스를사용하려는경우를생각해보면? 애완동물 (Pet 객체 ) 의행동인 befriendly(), play() 같은메소드가있어야합니다. 그냥 Dog 클래스에이런메소드를바로추가하면될까요?

Dog를 Pet으로 첫번째방법 애완동물의성질을나타내기위한메소드를 Animal 클래스에집어넣습니다. 장점 모든 Animal 객체에애완동물의행동이상속됩니다. 기존의하위클래스를전혀건드리지않아도되고새로만드는하위클래스에서도그런메소드를사용할수있습니다. 단점 하마, 사자, 늑대같은것은애완동물로잘키우지않죠? 애완동물이아닌동물에게애완동물의행동을부여하는것이적절치않습니다. 각애완동물마다행동이많이다르기때문에일일이수정해야합니다.

Dog를 Pet으로 두번째방법 메소드를추상메소드로만들어서오버라이드해야만쓸수있도록만듭니다. 장점 단점 엉뚱한클래스에서오버라이드하지않으면 Pet 용메소드가실행되지않도록할수있습니다 구상클래스에서는무조건코드를만들어야합니다. 일부유형에만적용할것을 Animal 클래스에집어넣는다는자체가잘못된접근법이라고할수있습니다.

Dog를 Pet으로 세번째방법 애완동물용메소드를사용할클래스에만집어넣습니다. 장점 단점 애완동물이아닌동물에애완동물용메소드가들어갈걱정을하지않아도됩니다. Dog 나 Cat 에서는그런메소드를구현할수있지만다른클래스에서는전혀그런메소드를쓸수가없도록할수있습니다. 제대로된계약서를갖춰야합니다. 다형성을적용할수가없습니다.

두개의상위클래스? 필요한것 애완동물의행동을 Pet 클래스에만집어넣는방법 모든애완동물클래스에똑같은메소드가정의되게하는방법 각애완동물마다다른인자, 리턴유형, 배열을사용하지않고도다형성을활용하여모든애완동물에대해애완동물용메소드를호출할수있도록하는방법 두개의상위클래스??

두개의상위클래스? Pet Animal Feline Canine Lion Hippo Cat Tiger Dog Wolf

다중상속 다중상속 (multiple inheritance) 의문제점 죽음의다이아몬드 DigitalRecorder int i burn() CDBurner DVDBurner burn() burn() 자바에서는다중상속을허용하지않습니다. ComboBurner

인터페이스 (interface) 인터페이스 모든메소드가추상메소드입니다. 하위클래스에서반드시구현해야만하므로상속받은것중에어떤것을호출해야할지결정할수없게되는문제가생기지않습니다. Pet 정의방법 public interface Pet { } abstract void befriendly(); abstract void play(); 구현방법 public class Dog extends Canine implements Pet { }

Pet 인터페이스정의및구현 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() { }

바보같은질문은없습니다. 인터페이스에서는전혀코드를구현할수없으니까진정한의미에서다중상속기능을제공한다고할수없지않나요? 모든메소드가추상메소드라면인터페이스를왜사용해야하나요? 다형성때문입니다!!! 인자나리턴유형으로구상클래스대신인터페이스를사용하면어떤객체든그자리에들어갈수있습니다. 객체의역할을기준으로해서처리할수있습니다. 인터페이스의특성상, 구상메소드를쓸수있더라도대부분오버라이드해서써야하는메소드를정의합니다.

인터페이스 Robot Pet Animal Agent RoboDog Feline Canine Lion Hippo Cat Tiger Dog Wolf

인터페이스 서로다른상속트리에서같은인터페이스를구현할수있습니다. 한클래스에서여러개의인터페이스를구현할수도있습니다. public class Dog extends Animal implements Pet, Saveable, Paintable { }

핵심정리 클래스를만들때인스턴스를만들수없게하고싶다면 abstract 키워드를사용하면됩니다. 추상클래스에는추상메소드와추상메소드가아닌메소드를모두집어넣을수있습니다. 클래스에추상메소드가하나라도있으면그클래스는추상클래스로지정해야합니다. 추상메소드에는본체가없으며선언부분은세미콜론으로끝납니다. 상속트리에서처음으로나오는구상클래스에서는반드시모든추상메소드를구현해야합니다. 자바에들어있는모든클래스는직접또는간접적으로 Object 의하위클래스입니다. ArrayList<Object> 에서꺼내는객체는모두 Object 유형입니다.

핵심정리 레퍼런스변수를캐스트해서객체의원래유형으로돌려놓을수있습니다. 어떤객체에있는메소드를호출하려면그메소드가레퍼런스변수의클래스에들어있어야합니다. 자바에서는다중상속을허용하지않습니다. 클래스는단하나밖에확장할수없습니다. 인터페이스는 100% 순수한추상클래스입니다. 인터페이스를구현할때는 implements 라는키워드를씁니다. 한클래스에서여러개의인터페이스를구현할수있습니다. 인터페이스의모든메소드는 public, abstract 메소드이므로인터페이스를구현하는클래스에서는모든메소드를구현해야만합니다.

하위클래스? 추상클래스? 인터페이스? 어떤클래스가다른어떤클래스에대해서도 A 는 B 다 테스트를통과할수없다면그냥클래스를만듭니다. 더구체적인클래스 를만들고싶다면하위클래스를만듭니다. 하위클래스에서사용할틀 (template) 을정의하고싶다면, 그리고구현코드가조금이라도있으면추상클래스를사용합니다. 상속트리에서의위치에상관없이어떤클래스의역할을정의하고싶다면인터페이스를사용하면됩니다.

super 키워드 오버라이드할때상위클래스버전의메소드의기능이필요하다면어떻게해야하나요? super 키워드를사용하여상위클래스버전의메소드를호출할수있습니다. 추상클래스에구상메소드에서필요한포괄적인작업을처리하기위한코드를미리만들어두고나중에구상메소드에서더구체적인부분만처리하도록할수있습니다.

super 키워드 abstract class Report { void runreport() { // 보고서설정 } void printreport() { // 포괄적인출력작업 } } Report BuzzwordReport class BuzzWordReport extends Report { void runreport() { super.runreport(); buzzwordcompliance(); printreport(); } void buzzwordcompliance() { } }

숙제 본문을다시한번꼼꼼히읽어봅시다. 본문중간에있는각종연습문제와 8 장끝에있는연습문제, 퍼즐을풀어봅시다.