A Tour of Java IV

Similar documents
A Tour of Java V

JAVA PROGRAMMING 실습 08.다형성

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

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

Microsoft PowerPoint - 2강

쉽게 풀어쓴 C 프로그래밍

No Slide Title

A Tour of Java III

Design Issues

PowerPoint 프레젠테이션

예제 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

PowerPoint Presentation

PowerPoint Presentation

PowerPoint Presentation

5장.key

09-interface.key

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - chap11

PowerPoint 프레젠테이션

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Microsoft PowerPoint - java2 [호환 모드]

07 자바의 다양한 클래스.key

1

제11장 프로세스와 쓰레드

PowerPoint Presentation

rmi_박준용_final.PDF

PowerPoint Presentation

비긴쿡-자바 00앞부속

PowerPoint 프레젠테이션

PowerPoint Presentation

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

슬라이드 1

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µå

Microsoft PowerPoint - 04-UDP Programming.ppt

PowerPoint Presentation

PowerPoint 프레젠테이션

Microsoft PowerPoint - CSharp-10-예외처리

Network Programming

C# Programming Guide - Types

PowerPoint Presentation

02 C h a p t e r Java

01-OOPConcepts(2).PDF

PowerPoint 프레젠테이션

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

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

Microsoft PowerPoint - Lect04.pptx

PowerPoint Presentation

JUNIT 실습및발표

PowerPoint Presentation

PowerPoint Presentation

PowerPoint 프레젠테이션

교육자료

gnu-lee-oop-kor-lec11-1-chap15

슬라이드 1

12-file.key

쉽게 풀어쓴 C 프로그래밍

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

ThisJava ..

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

자바 프로그래밍

신림프로그래머_클린코드.key

Cluster management software

11 템플릿적용 - Java Program Performance Tuning (김명호기술이사)

JAVA PROGRAMMING 실습 09. 예외처리

JAVA PROGRAMMING 실습 07. 상속

05-class.key

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

PowerPoint Presentation

JAVA PROGRAMMING 실습 05. 객체의 활용

제8장 자바 GUI 프로그래밍 II

오버라이딩 (Overriding)

PowerPoint Presentation

fundamentalOfCommandPattern_calmglow_pattern_jstorm_1.0_f…

Microsoft PowerPoint - RMI.ppt

PowerPoint 프레젠테이션

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

Spring Data JPA Many To Many 양방향 관계 예제

PowerPoint 프레젠테이션

Java ~ Java program: main() class class» public static void main(string args[])» First.java (main class ) /* The first simple program */ public class

PowerPoint Presentation

OOP 소개

Microsoft PowerPoint - 13_UMLCoding(2010).pptx

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

untitled

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

JAVA PROGRAMMING 실습 02. 표준 입출력

PowerPoint 프레젠테이션

PowerPoint Presentation

Microsoft PowerPoint - Java7.pptx

쉽게 풀어쓴 C 프로그래밍

목차 INDEX JSON? - JSON 개요 - JSONObject - JSONArray 서울시공공데이터 API 살펴보기 - 요청인자살펴보기 - Result Code - 출력값 HttpClient - HttpHelper 클래스작성 - JSONParser 클래스작성 공공

목차 JEUS EJB Session Bean가이드 stateful session bean stateful sample 가이드 sample source 결과확인 http session에

쉽게 풀어쓴 C 프로그래밍

C++ Programming

슬라이드 1

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - lec12 [호환 모드]

Interstage5 SOAP서비스 설정 가이드

C++ Programming

Transcription:

A Tour of Java IV Sungjoo Ha March 25th, 2016 Sungjoo Ha 1 / 35

Review First principle 문제가생기면침착하게영어로구글에서찾아본다. 타입은가능한값의집합과연산의집합을정의한다. 기본형이아니라면이름표가메모리에달라붙는다. 클래스로사용자정의타입을만든다. 프로그래밍은복잡도관리가중요하다. OOP 는객체가서로메시지를주고받는방식으로프로그램을구성해서복잡도관리를꾀한다. 각각의객체는기본형을사용하는것과비슷한느낌으로사용할수있어야한다. 인스턴스는개별적인상태를갖는다. Sungjoo Ha 2 / 35

Vector class Vector { // construct a Vector public Vector(int s) { elem = new double[s]; sz = s; // elem access public double elementat(int i) { return elem[i]; public void set(int i, double e) { elem[i] = e; public int size() { return sz; private int sz; // number of elements private double[] elem; // array of elements Sungjoo Ha 3 / 35

Abstract Type Vector와같은타입을 concrete type이라부른다. 외부세계와의계약 (interface) 과내부적구현 (implementation) 을모두포함하고있다. Abstract type은내부구현에대해전혀공개하지않는타입을말한다. 이를위해인터페이스와구현을완전히분리한다. Sungjoo Ha 4 / 35

Interface interface Container { double elementat(int i); void set(int i, double e); int size(); 타입은가능한값의집합과연산의집합을정의한다. interface 는 abstract type 을정의한다. 내부구현에대한정보는전혀없다. { 부분이없고곧바로 ; 로선언을마치고있다. interface 는상수, 메소드시그너처등만가질수있다. http://docs.oracle.com/javase/tutorial/java/iandi/ createinterface.html interface 에정의된모든메소드는 public abstract 메소드이다. interface 는인스턴스를바로만들수없다. Container c = new Container(); // Wrong Sungjoo Ha 5 / 35

Container static void use(container c) { final int sz = c.size(); for (int i = 0; i < sz; ++i) { System.out.println(c.elementAt(i)); Container 가어떤방식으로구현될지는전혀모르지만앞서 interface 를통해약속한연산을지원해야한다. 우리는 Container 타입이약속한방법대로사용할수있다. 특정조건을만족하는입력을넣어주고메소드를호출하면특정타입의결과를얻는다. Sungjoo Ha 6 / 35

VectorContainer class VectorContainer implements Container { private Vector v; public VectorContainer(int s) { v = new Vector(s); public double elementat(int i) { return v.elementat(i); public void set(int i, double e) { v.set(i, e); public int size() { return v.size(); public static void main(string[] args) { Container c = new VectorContainer(10); use(c); implements 키워드를통해 VectorContainer 클래스가 Container 인터페이스를따름을명시한다. Container 타입이지원하기로한연산을모두구현해야한다. Sungjoo Ha 7 / 35

ArrayListContainer import java.util.arraylist; class ArrayListContainer implements Container { private ArrayList<Double> list; public ArrayListContainer(int s) { list = new ArrayList<>(s); for (int i = 0; i < s; ++i) { list.add(0.0); public double elementat(int i) { return list.get(i); public void set(int i, double e) { list.add(i, e); public int size() { return list.size(); Sungjoo Ha Container 타입을따르는다른클래스 ArrayListContainer를만들었다. VectorContainer와 ArrayListContainer는내부구현이다르지만같은인터페이스를갖는다. 8 / 35

Container Comparison public static void main(string[] args) { Container c = new VectorContainer(10); use(c); public static void main(string[] args) { Container d = new ArrayListContainer(10); use(d); use 메소드는어떤종류의 Container 가입력으로들어오는지신경쓰지않는다. Container 에의해정의된약속만지켜주면된다. Sungjoo Ha 9 / 35

Comparable Interface class Genre implements Comparable<Genre> 과제뼈대코드의일부의변형이다. Genre 는 Comparable <Genre > 인터페이스에서정해진연산을정의하기로하였다. Comparable<T > 타입은 int compareto(t) 연산을정의하면된다. http://docs.oracle.com/javase/7/docs/api/java/ lang/comparable.html Sungjoo Ha 10 / 35

compareto @Override public int compareto(genre other) { // TODO implement this throw new UnsupportedOperationException(); @Override 는 annotation 으로여기에서는컴파일러를도와주는역할을한다. 해당메소드가상위클래스나인터페이스에정의된메소드를 override 하였음을알려준다. 이를바탕으로컴파일러가우리가의도한대로잘 override 되었는지를검사한다. Sungjoo Ha 11 / 35

Comparable Example class SmallInt implements Comparable<SmallInt> { public int d; public SmallInt(int a) { d = a; @Override public int compareto(smallint that) { if (this.d < that.d) { return -1; else if (this.d > that.d) { return 1; else { return 0; SmallInt 는 Comparable 인터페이스의연산자를지원하기로약속했다. 이를위해 compareto() 메소드를구현하였다. Sungjoo Ha 12 / 35

Comparable Example import java.util.arrays; public class ComparableExample { public static void main(string[] args) { SmallInt a = new SmallInt(10); SmallInt b = new SmallInt(5); SmallInt c = new SmallInt(50); SmallInt[] list = new SmallInt[3]; list[0] = a; list[1] = b; list[2] = c; for (int i = 0; i < 3; ++i) { System.out.println(list[i].d); Arrays.sort(list); for (int i = 0; i < 3; ++i) { System.out.println(list[i].d); Comparable 은객체사이에 total ordering 을부여하는역할을한다. 즉, 객체를서로비교할수있다는의미를갖는인터페이스이다. 비교가능한객체라면정렬을하거나정렬된상태를유지하는자료구조에담을수있다. Sungjoo Ha 13 / 35

Iterable Interface public interface ListInterface<T> extends Iterable<T> { 과제 2 뼈대코드의일부이다. ListInterface 는 Iterable<T > 인터페이스에서정해진연산을정의하기로하였다. Iterable<T > 타입은 Iterator<T >iterator() 연산을정의하면된다. http://docs.oracle.com/javase/7/docs/api/java/ lang/iterable.html Sungjoo Ha 14 / 35

Iterator @Override public Iterator<T> iterator() { // This code does not have to be modified. // Implement MyLinkedListIterator instead. return new MyLinkedListIterator<T>(this); Iterator<T > 는다음의세메소드를정의하면된다. boolean hasnext() T next() void remove() http://docs.oracle.com/javase/7/docs/api/java/ util/iterator.html Sungjoo Ha 15 / 35

Iterator MyLinkedList<MovieDBItem> result = db.items(); for (MovieDBItem item : result) { System.out.printf("(%s, %s)\n", item.getgenre(), item.gettitle()); Iterator 는컨테이너를순회할수있게해주는객체이다. 컨테이너의사용자가직접어디까지살펴봤는지기억하는것이아니라컨테이너의 iterator 가이를기억하고관리한다. 직접적인인덱스접근에비해몇가지장점이있다. 임의의위치에한번에도달하는것이불가능한자료구조를사용할때 임의의컨테이너를순회하는통일된방법을제공 Iterable 는 foreach 문을사용할수있게해준다. Sungjoo Ha 16 / 35

Iterator Example import java.util.iterator; public class ArrayIterator implements Iterator<Object> { private Object[] array; private int cur; public ArrayIterator(Object[] a) { array = a; cur = 0; public boolean hasnext() { return cur < array.length; public Object next() { return array[cur++]; public void remove() { throw new UnsupportedOperationException(); public static void main(string[] args) { Object[] a = new Object[] { "A", "B", "C" ; ArrayIterator it = new ArrayIterator(a); while (it.hasnext()) System.out.println(it.next().toString()); Iterator 의구현예이다. 자바의모든클래스는 Object 클래스를암묵적으로상속받는다. 그러므로 Object 는임의의타입을담을수있다. Iterator 인터페이스가요구하는세메소드를구현하고있다. 내부적으로커서를두고이를옮겨가며현재위치를기억한다. Sungjoo Ha 17 / 35

Interface Usage import java.util.*; public class InterfaceSample { public static void main(string[] args) { List<String> s = Arrays.asList("C", "B", "A"); List<Iterable<String>> cs = new ArrayList<Iterable<String>>(); cs.add(new ArrayList<String>(s)); cs.add(new LinkedList<String>(s)); cs.add(new TreeSet<String>(s)); cs.add(new HashSet<String>(s)); for (Iterable<String> c: cs) { System.out.println(c.getClass().getName()); for (String item: c) System.out.println(item); Iterable 인터페이스의사용예이다. 다양한구현체를다루지만같은방식으로사용할수있도록약속하였기에사용하는입장에서큰고민없이사용할수있다. Sungjoo Ha 18 / 35

Multiple Interfaces class MultipleInterfaces implements InterfaceOne, InterfaceTwo interface 를통해약속을정한다. interface 를구현하는클래스는약속을지키기로한다. 한클래스는여러 interface 의약속을전부지키기로할수있다. Sungjoo Ha 19 / 35

Class Hierarchy 계층적구조를가진개념을표현하는방법으로상속 (inheritance) 이있다. 상속을통해기존클래스가가진코드를재사용하는새클래스를만들수있다. 자식클래스 (subclass, derived class, child class) 는부모의모든멤버를물려받는다. 생성자는물려받지않지만명시적으로자식클래스에서부모클래스의생성자를호출할수있다. Sungjoo Ha 20 / 35

Starcraft class Marine { public void move() { public void attackwithgun() { public void draw() { public void stimpack() { class Zergling { public void move() { public void attackwithclaw() { public void draw() { public void burrow() { Marine 은움직일수있고, 화면에그려질수있어야한다. 그외에총도쏘고스팀팩도맞을수있다. Zergling 은움직일수있고, 화면에그려질수있어야한다. 그외에발톱공격도하고땅속으로숨을수도있다. Sungjoo Ha 21 / 35

Starcraft public class Starcraft { public static void main(string[] args) { Marine marine = new Marine(); Zergling zergling = new Zergling(); marine.move(); Sungjoo Ha 22 / 35

Inheritance class Unit { public void move() { public void draw() { class Marine extends Unit { public void attackwithgun() { @Override public void draw() { public void stimpack() { class Zergling extends Unit { public void attackwithclaw() { @Override public void draw() { public void burrow() { Sungjoo Ha 23 / 35

Inheritance public class Starcraft2 { public static void main(string[] args) { Marine marine = new Marine(); Zergling zergling = new Zergling(); marine.move(); Marine 이나 Zergling 이나움직이는것은 (move) 똑같다. Marine 이나 Zergling 이나화면에그려져야한다는것은같으나각자다른그림을그리게 (draw) 될것이다. 보다상위개념의클래스로부터기능을빌려오거나 (move) 더구체적인기능을제공하기위해 (draw) 상속을한다. extends 키워드를통해이를표시한다. 즉, 자식클래스는부모클래스를확장하는것이다. 더구체적인기능을제공하는것을 overriding 이라고한다. Overriding - 부모가제공하는것을재정의하는것 Overloading - 이름은같지만시그너쳐가다른메소드를정의하는것 자바는클래스다중상속을지원하지않는다. Sungjoo Ha 24 / 35

Polymorphism vs if-else public class Starcraft { public static void main(string[] args) { List<Object> group = new ArrayList<Object>(); group.add(new Marine()); group.add(new Zergling()); for (Object unit: group) { if (unit instanceof Marine) ((Marine) unit).move(); else if (unit instanceof Zergling) ((Zergling) unit).move() public class Starcraft2 { public static void main(string[] args) { List<Unit> group = new ArrayList<Unit>(); group.add(new Marine()); group.add(new Zergling()); for (Unit unit: group) unit.move(); // OK if else 문에비해더예쁜코드를만들수있다. Beautiful is better than ugly. Sungjoo Ha 25 / 35

Object public boolean equals(object obj) { if (this == obj) return true; if (obj == null) return false; if (getclass()!= obj.getclass()) return false; Something other = (Something) obj; if (h == null) { if (other.h!= null) return false; else if (!h.equals(other.h)) { return false; if (member!= other.member) return false; return true; 자바의모든클래스는 Object 클래스를암묵적으로상속받는다. equals hashcode tostring... http://docs.oracle.com/javase/tutorial/java/ IandI/objectclass.html Sungjoo Ha 26 / 35

Inheritance Example public class CommandNotFoundException extends Exception { private String command; public CommandNotFoundException(String command) { super(string.format("input command: %s", command)); this.command = command; private static final long serialversionuid = 1L; public String getcommand() { return command; 과제 2 뼈대코드의일부이다. super 를사용해서부모클래스의생성자를호출한다. http://docs.oracle.com/javase/7/docs/api/java/ lang/exception.html Sungjoo Ha 27 / 35

Inheritance Example if (command == null) throw new CommandNotFoundException(cmd); catch (CommandNotFoundException e) { System.err.printf("command not found: %s\n", e.getcommand()); e.printstacktrace(system.err); 새로정의된 CommandNotFoundException 은 Exception 처럼동작하고추가적인기능을갖게된다 ( 확장 ). Sungjoo Ha 28 / 35

Abstract Class public interface ConsoleCommand { void parse(string input) throws CommandParseException; public abstract class AbstractConsoleCommand implements ConsoleCommand { @Override public void parse(string input) throws CommandParseException { String[] args = input.split(" *% *%? *"); if (input.isempty()) args = new String[0]; parsearguments(args); Sungjoo Ha 29 / 35

Abstract Class 과제 2 뼈대코드의일부이다. AbstractConsoleCommand는추상 (abstract) 클래스이다. abstract 키워드로이를표시하고있다. 추상클래스는인스턴스를만들수없다. AbstractConsoleCommand a = new AbstractConsoleCommand(); // Wrong 추상클래스는추상메소드 (abstract method) 를가질수있다. 추상메소드는구현이없는메소드이다. 이는자식클래스에서구현해야한다. Sungjoo Ha 30 / 35

Abstract Class Inheritance class InsertCmd extends AbstractConsoleCommand { @Override protected void parsearguments(string[] args) throws CommandParseException { if (args.length!= 3) throw new CommandParseException( "INSERT", Arrays.toString(args), "insufficient argument"); this.genre = args[1]; this.movie = args[2]; InsertCmd 클래스는 AbstractConsoleCommand 클래스를상속한다. 추상메소드인 parsearguments() 를구현하고있다. Sungjoo Ha 31 / 35

Polymorphism ConsoleCommand command = null; command.parse(input); ConsoleCommand 타입은 parse() 기능을제공하기로하였다. 런타임에 command 가실제로어떤타입인지 JVM 이살펴보고적합한메소드를호출해준다. 다양한타입을다룰수있는하나의인터페이스를제공하는것을폴리모피즘 (polymorphism) 이라한다. Sungjoo Ha 32 / 35

Abstract Class vs Interface 추상클래스 (abstract class) 와인터페이스 (interface) 는약간의차이가있으나유사하다. 추상클래스는 static 이나 final 이아닌멤버를선언할수있고구현을채워넣은메소드를만들수도있다. 인터페이스는여러개를받을수있다.... 추상클래스는이럴때사용한다. 서로관련깊은클래스들이코드를공유하고싶을때 자식클래스가부모클래스의 public 아닌멤버에접근하고싶을때 인터페이스는이럴때사용한다. 서로관계가깊지않은클래스가모두구현해야하는약속을정의할때 가령 Comparable http://docs.oracle.com/javase/tutorial/java/ IandI/abstract.html Sungjoo Ha 33 / 35

Interface and Inheritance 인터페이스와상속은방대한주제이다. 자세한내용은스스로공부하기바란다. http://docs.oracle.com/javase/tutorial/java/ IandI/index.html Sungjoo Ha 34 / 35

Advice 객체를사용하는약속과구현을분리하기위해 interface 를사용한다. 특정타입이보장하는약속을사용해서다양한타입이같은인터페이스를사용하는폴리모피즘을구현할수있다. 계층적구조를지닌개념을표현하기위해상속을사용한다. @Override 를사용해서메소드를 override 함을명확하게표현한다. 가능하면 interface 를상속에비해선호하도록한다. 하지만스스로잘판단하고필요하다면상속을사용하는것에두려움을느끼지않아도된다. 수업시간에배우는자료구조는타입에불과하다. 겁먹지말자. Sungjoo Ha 35 / 35