Download presentation
Presentation is loading. Please wait.
1
어서와 Java는 처음이지! 제9장 인터페이스, 람다식, 패키지
2
인터페이스 인터페이스(interafce)는 서로 다른 장치들이 연결되어서 상호 데이터를 주고받는 규격을 의미한다
3
자바 인터페이스 클래스와 클래스 사이의 상호 작용의 규격을 나타낸 것이 인터페이스이다
4
인터페이스의 예 스마트 홈 시스템(Smart Home System)
5
인터페이스의 정의 public interface RemoteControl { // 추상 메소드 정의
public void turnOn(); // 가전 제품을 켠다. public void turnOff(); // 가전 제품을 끈다. }
6
인터페이스 구현 public class 클래스_이름 implements 인터페이스_이름 { 반환형 추상메소드1(...) {
반환형 추상메소드1(...) { ..... } 반환형 추상메소드2(...) {
7
홈네트워킹 예제 public interface RemoteControl {
public void turnOn(); // 가전 제품을 켠다. public void turnOff(); // 가전 제품을 끈다. } 인터페이스를 구현 public class Television implements RemoteControl { public void turnOn() { // 실제로 TV의 전원을 켜기 위한 코드가 들어 간다. } public void turnOff() // 실제로 TV의 전원을 끄기 위한 코드가 들어 간다.
8
홈네트워킹 예제 Television t = new Television(); t.turnOn(); t.turnOff(); t
9
Lab: 자율 주행 자동차 추상 메소드를 가지는 인터페이스와 이 인터페이스를 구현하는 클래스를 작성하여 테스트해보자.
10
SOLUTION public interface OperateCar { void start(); void stop();
void setSpeed(int speed); void turn(int degree); }
11
SOLUTION 자동차 제조회사 public class AutoCar implements OperateCar {
public void start() { System.out.println("자동차가 출발합니다."); } public void stop() { System.out.println("자동차가 정지합니다."); public void setSpeed(int speed) { System.out.println("자동차가 속도를 " + speed + "km/h로 바꿉니다."); public void turn(int degree) { System.out.println("자동차가 방향을 " + degree + "도 만큼 바꿉니다.");
12
SOLUTION 자율 주행 시스템 public class AutoCarTest {
public static void main(String[] args) { OperateCar obj = new AutoCar(); obj.start(); obj.setSpeed(30); obj.turn(15); obj.stop(); }
13
Lab: 객체 비교하기 Comparable인터페이스를 실습하여 본다.
import java.util.*; Comparable인터페이스를 실습하여 본다. 이 인터페이스는 우리가 정의하는 것이 아니고 표준 자바 라이브러리에 다음과 같이 정의되어 있다. 이 인터페이스는 객체와 객체의 크기를 비교할 때사용된다.
14
SOLUTION import java.util.*;
public class Rectangle implements Comparable { public int width = 0; public int height = 0; @Override public String toString() { return "Rectangle [width=" + width + ", height=" + height + "]"; } public Rectangle(int w, int h) { width = w; height = h; System.out.println(this); public int getArea() { return width * height;
15
SOLUTION @Override public int compareTo(Object other) {
Rectangle otherRect = (Rectangle) other; if (this.getArea() < otherRect.getArea()) return -1; else if (this.getArea() > otherRect.getArea()) return 1; else return 0; }
16
SOLUTION public class RectangleTest {
public static void main(String[] args) { Rectangle r1 = new Rectangle(100, 30); Rectangle r2 = new Rectangle(200, 10); int result = r1.compareTo(r2); if (result == 1) System.out.println(r1 + "가 더 큽니다."); else if (result == 0) System.out.println("같습니다"); else System.out.println(r2 + "가 더 큽니다."); }
17
객체배열 정렬하기 java.util.Arrays 클래스의 sort() 함수를 사용하면 배열 안의 원소 크기 값을 오름 차순 정렬할 수 있다. 하지만 이 때 원소들이 객체가 아닌 기본자료이어야 한다. 배열의 원소가 객체라면 추가해 주어야 할 부분이 있다. 바로 comparable 인터페이스를 구현해야 하는 것이다. 실제로 자주 쓰는 String 과 Date 클래스를 포함한 많은 클래스들이 comparable 인터페이스를 구현하고 있다.
18
import java.util.*; Man.java public class Man implements Comparable<Man> { private String name; private int age; public Man(String name, int age){ this.name = name; this.age= age; } public String toString(){ return name+" (age : "+age+")"; public int compareTo(Man man) { // 나이순 올림차순 if (this.age < man.age) { return -1; } else if (this.age == man.age) { return 0; } else { return 1; }
19
SortTest.java public class SortTest {
public static void main(String[] args) { Man[] mans = { new Man("Sunny", 20), new Man("Tom", 8), new Man("Joy", 12), new Man("Jack", 40), new Man("Love", 10) }; System.out.println("###Before Sort###");// 정렬 전 print(mans); Arrays.sort(mans);// 정렬 System.out.println("###After Sort###");// 정렬 후 } public static void print(Man[] mans) { for (int i = 0; i < mans.length; i++) { System.out.println(mans[i]);
20
정렬 실행결과 ###Before Sort### Sunny (age : 20) Tom (age : 8)
Joy (age : 12) Jack (age : 40) Love (age : 10) ###After Sort### Try!!! 나이역순, 이름 가나다순
21
인터페이스와 타입 인터페이스는 하나의 타입으로 간주된다. RemoteControl obj = new Television();
obj.turnOn(); obj.turnOff(); 인터페이스로 참조 변수를 만들 수 있다.
22
예제 public interface Comparable {
// 이 객체가 다른 객체보다 크면 1, 같으면 0, 작으면 -1을 반환한다. int compareTo(Object other); } public Object findLargest(Object object1, Object object2) { Comparable obj1 = (Comparable)object1; Comparable obj2 = (Comparable)object2; if ((obj1).compareTo(obj2) > 0) return object1; else return object2; }
23
LAB 예를 들어서 버튼을 눌렀을 때 발생하는 이벤트를 처리하려면 어떤 공통적인 규격이있어야 한다.
ActionListener 인터페이스가 버튼 이벤트를 처리할 때 규격을 정의한다.
24
LAB public interface ActionListener { void actionPerformed(ActionEvent event); } ActionListener는 Timer 이벤트를 처리할 때도 사용된다. 자바에서 기본 제공되는 Timer 클래스는 주어진 시간이 되면 이벤트를 발생시키면서 actionPerformed() 메소드를 호출한다. 이점을 이용하여서 1초에 한 번씩 "beep"를 출력하는 프로그램을 작성하여 보자. beep ...
25
SOLUTION class MyClass implements ActionListener {
public void actionPerformed(ActionEvent event) { System.out.println("beep"); } public class CallbackTest { public static void main(String[] args) { ActionListener listener = new MyClass(); Timer t = new Timer(1000, listener); t.start(); for (int i = 0; i < 1000; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) {
26
인터페이스 상속하기 인터페이스가 인터페이스를 상속받는 것도 가능하다.
public interface AdvancedRemoteControl extends RemoteControl { public void volumeUp(); // 가전제품의 볼륨을 높인다. public void volumeDown();// 가전제품의 볼륨을 낮춘다. }
27
다중 상속 다중 상속(Multiple inheritance)은 하나의 클래스가 여러 개의 부모 클래스를 가지는 것이다. 예를 들어서 하늘을 나는 자동차는 자동차의 특성도 가지고 있지만 비행기의 특징도 가지고 있다.
28
다중 상속 다중 상속이란 여러 개의 수퍼 클래스로부터 상속하는 것 자바에서는 다중 상속을 지원하지 않는다.
다중 상속에는 어려운 문제가 발생한다. class SuperA { int x; } class SuperB { int x; } class Sub extends SuperA, SuperB // 만약에 다중 상속이 허용된다면 { ... } Sub obj = new Sub(); obj.x = 10; // obj.x는 어떤 수퍼 클래스의 x를 참조하는가?
29
다중 상속 인터페이스를 이용하면 다중 상속의 효과를 낼 수 있다. class Shape { protected int x, y;
} interface Drawable { void draw(); }; public class Rectangle extends Shape implements Drawable { int width, height; public void draw() { System.out.println("Rectangle Draw");
30
자바에서의 다중상속 인터페이스를 이용하여 가능하다. interface Drivable { void drive(); }
interface Flyable { void fly();
31
SOLUTION public class FlyingCar1 implements Drivable, Flyable {
public void drive() { System.out.println("I’m driving"); } public void fly() { System.out.println("I’m flying"); public static void main(String args[]) { FlyingCar1 obj = new FlyingCar1(); obj.drive(); obj.fly(); I’m driving I’m flying
32
상수 정의 인터페이스에는 상수를 정의할 수 있다. public interface MyConstants {
int NORTH = 1; int EAST = 2; int SOUTH = 3; int WEST = 4; }
33
상수를 공유하려면 인터페이스를 구현하면 된다.
상수 공유 interface Days { public static final int SUNDAY = 1, MONDAY = 2, TUESDAY = 3, WEDNESDAY = 4, THURSDAY = 5, FRIDAY = 6, SATURDAY = 7; } public class DayTest implements Days { public static void main(String[] args) System.out.println("일요일: “ + SUNDAY); } 상수를 공유하려면 인터페이스를 구현하면 된다.
34
디폴트 메소드 디폴트 메소드(default method)는 인터페이스 개발자가 메소드의 디폴트 구현을 제공할 수 있는 기능이다. 필요성 : 인터페이스에 추가할 메소드가 있을 시 default로 선언하면 기존 인터페이스를 사용하던 프로그램을 수정할 필요가 없다. (default가 아니면 기존 프로그램에서 재정의하지 않으면 오류가 발생한다)
35
디폴트 메소드 interface MyInterface { public void myMethod1();
default void myMethod2() { System.out.println("myMethod2()"); } public class DefaultMethodTest implements MyInterface { public void myMethod1() { System.out.println("myMethod1()"); public static void main(String[] args) { DefaultMethodTest obj = new DefaultMethodTest(); obj.myMethod1(); obj.myMethod2();
36
myMethod1() myMethod2()
37
정적 메소드 인터페이스는 전통적으로 추상적인 규격이기 때문에 정적 메소드(static method)가 들어간다는 것은 처음에는 생각할 수도 없었다. 하지만 시대가 변했다. 최근에 인터페이스에서도 정적 메소드가 있는 것이 좋다고 간주되고 있다. interface MyInterface { static void print(String msg) { System.out.println(msg + ": 인터페이스의 정적 메소드 호출"); } public class StaticMethodTest { public static void main(String[] args) { MyInterface.print("Java 8");
38
무명 클래스 무명 클래스(anonymous class:익명 클래스)는 클래스 몸체는 정의되지만 이름이 없는 클래스이다.
무명 클래스는 클래스를 정의하면서 동시에 객체를 생성하게 된다. 이름이 없기 때문에 한번만 사용이 가능하다.
39
예제 interface RemoteControl { void turnOn(); void turnOff(); }
public class AnonymousClassTest { public static void main(String args[]) { RemoteControl ac = new RemoteControl() { // 무명 클래스 정의 public void turnOn() { System.out.println("TV turnOn()"); public void turnOff() { System.out.println("TV turnOff()"); }; ac.turnOn(); ac.turnOff();
40
실행 결과 TV turnOn() TV turnOff()
41
람다식 람다식(lambda expression)은 나중에 실행될 목적으로 다른 곳에 전달될 수 있는 코드 블록이다.
람다식을 이용하면 메소드가 필요한 곳에 간단히 메소드를 보낼 수 있다.
42
람다식의 구문 람다식은 (argument) -> (body) 구문을 사용하여 작성
43
람다식의 예 () -> System.out.println("Hello World");
(String s) -> { System.out.println(s); } () -> 69 () -> { return ; };
44
람다식은 왜 필요한가? 람다식을 사용하여 버튼의 클릭 이벤트를 처리할 수 있다. // 람다식을 이용한 방법
button.addActionListener( (e) -> { System.out.println("버튼이 클릭되었음!"); });
45
LAB: 타이머 이벤트 처리 앞에서 Timer 클래스를 사용하여서 1초에 한 번씩 “beep”를 출력하는 프로그램을 작성한 바 있다. 람다식을 이용하면 얼마나 간결해지는 지를 확인하자. beep ...
46
SOLUTION ActionListener listener = new MyClass();
class MyClass implements ActionListener { public void actionPerformed(ActionEvent event) { System.out.println("beep"); } } … ActionListener listener = new MyClass(); Timer t = new Timer(1000, listener); t.start(); import javax.swing.Timer; public class CallbackTest { public static void main(String[] args) { Timer t = new Timer(1000, event -> System.out.println("beep")); t.start(); for (int i = 0; i < 1000; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { } beep ...
47
함수 인터페이스와 람다식 함수 인터페이스는 하나의 추상 메서드만 선언된 인터페이스
(예) java.lang.Runnable ActionListener 람다식은 함수 인터페이스에 대입할 수 있다. (예) Runnable r = () -> System.out.println("스레드가 실행되고 있습니다.");
48
예제 @FunctionalInterface interface MyInterface { void sayHello(); }
public class LambdaTest1 { public static void main(String[] args) { MyInterface hello = () -> System.out.println("Hello Lambda!"); hello.sayHello(); Hello Lambda!
49
패키지 패키지(package)는 서로 관련 있는 클래스나 인터페이스들을 하나로 묶은 것이다.
50
JDK 표준 자바 패키지 구조 : rt.jar java applet awt beans io lang math net nio
rmi security sql text util beancontext spi color datatransfer dnd event font geom im image print renderable channels charset annotation instrument management ref reflect acl interfaces cert spec activation dgc registry server concurrent jar logging prefs regex zip atomic locks
51
자바가 제공하는 라이브러리도 기능별로 패키지로 묶여서 제공되고 있다.
52
패키지를 사용하는 이유 패키지를 이용하면 서로 관련된 클래스들을 하나의 단위로 모을 수 있다.
패키지를 이용하여서 더욱 세밀한 접근 제어를 구현할 수 있다. 패키지를 사용하는 가장 중요한 이유는 바로 “이름공간(name space)” 때문이다.
53
패키지의 정의
54
패키지 정의
55
예제 package kr.co.company.mylibrary; public class PackageTest {
public static void main(String[] args) { System.out.println("패키지 테스트입니다."); } D:\tmp1> javac –d . PackageTest.java
56
실행 결과
57
LAB: 패키지 생성하기 예를 들어서 어떤 회사에서 게임을 개발하려면 library 팀과 game 팀의 소스를 합쳐야 한다고 가정해보자.
58
프로젝트 Package2를 생성한다. library 패키지를 생성한다. library 패키지에 Rectangle 클래스, Circle 클래스를 추가한다. game 패키지를 생성한다. game 패키지에 Rectangle 클래스와 Sprite 클래스를 추가한다.
59
SOLUTION
60
패키지의 사용 경로까지 포함하는 완전한 이름으로 참조한다.
(예) library.Rectangle myRect = new library.Rectangle(); 원하는 패키지 멤버만을 import한다. (예) import library.Rectangle; (예) Rectangle myRect = new Rectangle(); 패키지 전체를 import한다. (예) import library.*;
61
LAB
62
이클립스에서 쉽게 패키지 만들기 예제로 사용할 샘플 소스 lib 패키지 app 패키지
62 예제로 사용할 샘플 소스 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.subtract(2,3)); System.out.println(c.average(new int [] {2,3,4 })); lib 패키지 app 패키지 Calculator 클래스는 lib 패키지에 GoodCalc 클래스는 app 패키지에 나누어 저장하는 응용프로그램을 이클립스를 이용하여 만들기
63
프로젝트 작성(프로젝트 이름 : PackageEx)
63
64
File->New->Package
패키지 lib 작성 File->New->Package 64
65
File->New->Package
패키지 app 작성 65 File->New->Package
66
패키지 작성이 완료된 결과 66 패키지 탐색 창에 app 패키지와 lib 패키지가 보인다.
67
File->New->Class
클래스 Calculator 만들기 67 File->New->Class Calculator 클래스를 public abstract 속성으로 생성한다.
68
Calculator 소스 수정 68 다른 패키지, 즉 app 패키지의 클래스에서 접근할 수 있도록 하기 위해 클래스의 접근 지정자 public을 반드시 삽입.
69
GoodCalc.java 작성 후 소스 수정 69 import 문 삽입. Calculator 클래스를
사용하기 위해서는 패키지를 포함하는 정확한 경로명을 컴파일러에게 알려줘야 함.
70
실행을 위한 Run Configurations 작성
푸시다운 버튼을 누르면 아래 메뉴가 보인다. 실행을 위한 Run Configurations 작성 70
71
프로젝트 PackageEx 실행 71 실습 : 프로그램(계산기)을 이용하여 프로젝트, package lib와 app 작성한 다음 해당 class 작성하고 실행하여 보자!!!!!
72
정적 import 문장 클래스 안에 정의된 정적 상수나 정적 메소드를 사용하는 경우에 정적 import 문장을 사용하면 클래스 이름을 생략하여도 된다. (예) import static java.lang.Math.*; (예) double r = cos(PI * theta);
73
소스 파일과 클래스 파일 관리(이클립스) 자바에서 각종 소스 파일과 클래스 파일을 어떤 원칙으로 관리하는 것일까?
패키지의 계층 구조를 반영한 디렉토리 구조에 소스와 클래스 파일들을 저장한다.
74
자바 가상 머신은 어떻게 클래스 파일을 찾을까? 가상 머신이 클래스 파일을 찾는 디렉토리들을 클래스 경로(class path)라고 한다.
75
클래스 경로를 지정하는 3가지의 방법 자바 가상 머신은 항상 현재 작업 디렉토리부터 찾는다.
환경 변수인 CLASSPATH에 설정된 디렉토리에서 찾는다. 자바 가상 머신을 실행할 때 옵션 -classpath를 사용할 수 있다. D:\tmp1> javac –d . PackageTest.java C:\> java -classpath C:\classes;C:\lib;. library.Rectangle
76
JAR 압축 파일 JAR 파일은 여러 개의 클래스 파일을 디렉토리 계층 구조를 유지한 채로 압축하여서 가지고 있을 수 있다.
77
JAR 파일을 생성하는 방법 c> jar cvf Game.jar *.class icon.png
78
자바에서 지원하는 패키지
79
JDK의 주요 패키지 java.lang 자바 language 패키지
79 java.lang 자바 language 패키지 스트링, 수학 함수, 입출력 등 자바 프로그래밍에 필요한 기본적인 클래스와 인터페이스 자동으로 import 됨 - import 문이 필요없음 java.util 자바 유틸리티 패키지 날짜, 시간, 벡터, 해쉬 테이블 등과 같은 다양한 유틸리티 클래스와 인터페이스 제공 java.io 키보드, 모니터, 프린터, 디스크 등에 입출력을 할 수 있는 클래스와 인터페이스 제공 java.awt 자바 GUI 프로그래밍을 위한 클래스와 인터페이스 제공 javax.swing 자바 GUI 프로그래밍을 위한 스윙 패키지
80
자바 API 참조 문서 온라인 자바 API 참조 http://docs.oracle.com/javase/8/docs/api/
80 온라인 자바 API 참조 java.lang
81
java.lang 패키지 Import 문을 사용할 필요가 없이 기본적으로 포함된다.
Object 클래스: 기초적인 메소드를 제공하는 모든 클래스의 조상 클래스 Math 클래스: 각종 수학 함수들을 포함하는 클래스 Wrapper 클래스: Integer와 같이 기초 자료형을 감싸서 제공하는 랩퍼 클래스들(Double, Character, Boolean …) String 클래스, StringBuffer 클래스: 문자열을 다루는 클래스 System 클래스: 시스템 정보를 제공하거나 입출력을 제공하는 클래스 Thread 클래스: 스레드 기능을 제공하는 클래스 Class 클래스: 클래스에 대한 정보를 얻기 위한 클래스
82
Object 클래스 특징 주요 메소드 java.lang 패키지에 포함 자바 클래스 계층 구조의 최상위에 위치
82 특징 java.lang 패키지에 포함 자바 클래스 계층 구조의 최상위에 위치 모든 클래스의 수퍼 클래스 주요 메소드 클래스 상속 메소드 설명 protected Object clone() 현 객체와 똑같은 객체를 만들어 반환. 오버라이딩 필요 boolean equals(Object obj) obj가 가리키는 객체와 현재 객체가 비교하여 같으면 true 반환 Class getClass() 현 객체의 런타임 클래스를 반환 int hashCode() 현 객체에 대한 해쉬 코드 값 반환 String toString() 현 객체에 대한 스트링 표현을 반환 void notify() 현 객체에 대해 대기하고 있는 하나의 쓰레드를 깨운다. void notifyAll() 현 객체에 대해 대기하고 있는 모든 쓰레드를 깨운다. void wait() 현 객체의 다른 쓰레드가 notify() 또는 notifyAll() 메소드를 호출할 때까지 현 쓰레드를 대기하게 한다.
83
Wrapper 클래스 자바 기본 데이터 타입을 클래스화한 8개 클래스 용도 기초 자료형을 객체로 포장시켜주는 클래스
Java.lang 패키지 83 자바 기본 데이터 타입을 클래스화한 8개 클래스 용도 기본 데이터 타입을 사용할 수 없고 객체만 사용하는 컬렉션에 기본 데이터 타입을 Wrapper 클래스로 만들어 사용 기초 자료형을 객체로 포장시켜주는 클래스 (예) Integer obj = new Integer(10); 기본 데이터 타입 byte short int long char float double boolean Wrapper 클래스 Byte Short Integer Long Character Float Double Boolean
84
java.util 패키지 여러 가지 유틸리티 클래스 들을 제공한다.
자바에서 정수 10과 Integer(10)은 어떻게 다른가? 2. StringBuffer와 String은 어떻게 다른가? 84
85
Math 클래스 java.lang.Math 기본적인 산술 연산을 수행하는 메소드 제공
85 Java.lang 패키지 java.lang.Math 기본적인 산술 연산을 수행하는 메소드 제공 모든 멤버 메소드는 static으로 정의됨 객체를 만들어서 사용할 필요 없음
86
주요 메소드 double 타입에 대한 주요 메소드 메소드 설명 static double abs(double a) 절대값 반환
86 double 타입에 대한 주요 메소드 메소드 설명 static double abs(double a) 절대값 반환 static double cos(double a) cosine 값 반환 static double sin(double a) sine 값 반환 static double tan(double a) tangent 값 반환 static double exp(double a) 값 반환 static double ceil(double a) 지정된 실수보다 크거나 같은 수 중에서 가장 작은 정수를 실수 타입으로 반환 static double floor(double a) 지정된 실수보다 작거나 같은 수 중에서 가장 큰 정수를 실수 타입으로 반환 static double max(double a, double b) 두 수 중에서 큰 수 반환 static double min(double a, double b) 두 수 중에서 작은 수 반환 static double random() 0.0보다 크거나 같고 1.0보다 작은 임의의 수 반환 static double rint(double a) 지정된 실수와 가장 근접한 정수를 실수 타입으로 반환 static double round(double a) 지정된 실수를 소수 첫째 자리에서 반올림한 정수를 실수 타입으로 반환 static double sqrt(double a) 제곱근을 반환
87
System 클래스 Java.lang 패키지 System 클래스는 실행 시스템과 관련된 속성과 메소드를 제공
88
Q & A
Similar presentations