객체지향프로그래밍 인터페이스, 람다식, 패키지 손시운 ssw5176@kangwon.ac.kr
인터페이스 인터페이스 (interafce) 는서로다른장치들이연결되어서상호데이터를주 고받는규격을의미한다 2
자바인터페이스 클래스와클래스사이의상호작용의규격을나타낸것이인터페이스이다 3
인터페이스의예 스마트홈시스템 (Smart Home System) 4
인터페이스의정의 public interface RemoteControl { // 추상메소드정의 public void turnon(); // 가전제품을켠다. public void turnoff(); // 가전제품을끈다. 5
인터페이스구현 public class 클래스 _ 이름 implements 인터페이스 _ 이름 { 반환형추상메소드1 (...) {... 반환형추상메소드2 (...) {... 6
홈네트워킹예제 public interface RemoteControl { public void turnon(); // 가전제품을켠다. public void turnoff(); // 가전제품을끈다. 인터페이스를구현 public class Television implements RemoteControl { public void turnon() { // 실제로 TV의전원을켜기위한코드가들어간다. public void turnoff() { // 실제로 TV의전원을끄기위한코드가들어간다. 7
홈네트워킹예제 Television t = new Television(); t.turnon(); t.turnoff(); 8
Lab: 자율주행자동차 추상메소드를가지는인터페이스와이인터페이스를구현하는클래스를작 성하여테스트해보자. 9
SOLUTION public interface OperateCar { void start(); void stop(); void setspeed(int speed); void turn(int degree); 10
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 + " 도만큼바꿉니다."); 11
SOLUTION public class AutoCarTest { public static void main(string[] args) { OperateCar obj = new AutoCar(); obj.start(); obj.setspeed(30); obj.turn(15); obj.stop(); 12
Lab: 객체비교하기 Comparable인터페이스를실습하여본다. 이인터페이스는우리가정의하는것이아니고표준자바라이브러리에다음과같이정의되어있다. 이인터페이스는객체와객체의크기를비교할때사용된다. 13
SOLUTION 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; 14
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; 15
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 + " 가더큽니다."); 16
인터페이스와타입 인터페이스는하나의타입으로간주된다. RemoteControl obj = new Television(); obj.turnon(); obj.turnoff(); 인터페이스로참조변수를만들수있다. 17
예제 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; 18
LAB 예를들어서버튼을눌렀을때발생하는이벤트를처리하려면어떤공통적 인규격이있어야한다. ActionListener 인터페이스가버튼이벤트를처리할때규격을정의한다. 19
LAB ActionListener 는 Timer 이벤트를처리할때도사용된다. 자바에서기본제 공되는 Timer 클래스는주어진시간이되면이벤트를발생시키면서 actionperformed() 메소드를호출한다. 이점을이용하여서 1 초에한번씩 "beep" 를출력하는프로그램을작성하여보자. public interface ActionListener { void actionperformed(actionevent event); beep beep beep... 20
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) { 21
인터페이스상속하기 인터페이스가인터페이스를상속받는것도가능하다. public interface AdvancedRemoteControl extends RemoteControl { public void volumeup(); // 가전제품의볼륨을높인다. public void volumedown();// 가전제품의볼륨을낮춘다. 22
다중상속 다중상속 (Multiple inheritance) 은하나의클래스가여러개의부모클래스 를가지는것이다. 예를들어서하늘을나는자동차는자동차의특성도가지 고있지만비행기의특징도가지고있다. 23
다중상속 다중상속이란여러개의수퍼클래스로부터상속하는것 자바에서는다중상속을지원하지않는다. 다중상속에는어려운문제가발생한다. class SuperA { int x; class SuperB { int x; class Sub extends SuperA, SuperB // 만약에다중상속이허용된다면 {... Sub obj = new Sub(); obj.x = 10; // obj.x는어떤수퍼클래스의 x를참조하는가? 24
다중상속 인터페이스를이용하면다중상속의효과를낼수있다. 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"); ; 25
자바에서의다중상속 인터페이스를이용하여가능하다. interface Drivable { void drive(); interface Flyable { void fly(); 26
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 27
상수정의 인터페이스에는상수를정의할수있다. public interface MyConstants { int NORTH = 1; int EAST = 2; int SOUTH = 3; int WEST = 4; 28
상수공유 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); 상수를공유하려면인터페이스를구현하면된다. 29
디폴트메소드 디폴트메소드 (default method) 는인터페이스개발자가메소드의디폴트구 현을제공할수있는기능이다. 30
디폴트메소드 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(); mymethod1() mymethod2() 31
정적메소드 인터페이스는전통적으로추상적인규격이기때문에정적메소드 (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"); 32
무명클래스 무명클래스 (anonymous class) 는클래스몸체는정의되지만이름이없는클래스이다. 무명클래스는클래스를정의하면서동시에객체를생성하게된다. 이름이없기때문에한번만사용이가능하다. 33
예제 interface RemoteControl { void turnon(); void turnoff(); public class AnonymousClassTest { public static void main(string args[]) { RemoteControl ac = new RemoteControl() { ; public void turnon() { ac.turnon(); ac.turnoff(); System.out.println("TV turnon()"); public void turnoff() { System.out.println("TV turnoff()"); TV turnon() TV turnoff() // 무명클래스정의 34
람다식 람다식 (lambda expression) 은나중에실행될목적으로다른곳에전달될수 있는코드블록이다. 람다식을이용하면메소드가필요한곳에간단히메소드를보낼수있다. 35
람다식의구문 람다식은 (argument) -> (body) 구문을사용하여작성 36
람다식의예 () -> System.out.println("Hello World"); (String s) -> { System.out.println(s); () -> 69 () -> { return 3.141592; ; 37
람다식은왜필요한가? 람다식을사용하여버튼의클릭이벤트를처리할수있다. // 람다식을이용한방법 button.addactionlistener( (e) -> { System.out.println(" 버튼이클릭되었음!"); ); 38
LAB: 타이머이벤트처리 앞에서 Timer 클래스를사용하여서 1 초에한번씩 beep 를출력하는프로 그램을작성한바있다. 람다식을이용하면얼마나간결해지는지를확인하 자. (p. 21 참고 ) beep beep beep... 39
SOLUTION 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) { 40
함수인터페이스와람다식 함수인터페이스는하나의추상메서드만선언된인터페이스 ( 예 ) java.lang.runnable 람다식은함수인터페이스에대입할수있다. ( 예 ) Runnable r = () -> System.out.println(" 스레드가실행되고있습니다."); 41
예제 @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! 42
패키지 패키지 (package) 는서로관련있는클래스나인터페이스들을하나로묶은 것이다. 43
패키지 자바가제공하는라이브러리도기능별로패키지로묶여서제공되고있다. 44
패키지를사용하는이유 패키지를이용하면서로관련된클래스들을하나의단위로모을수있다. 패키지를이용하여서더욱세밀한접근제어를구현할수있다. 패키지를사용하는가장중요한이유는바로 이름공간 (name space) 때문 이다. 45
패키지의정의 46
패키지정의 47
예제 package kr.co.company.mylibrary; public class PackageTest { public static void main(string[] args) { System.out.println(" 패키지테스트입니다."); D:\tmp1> javac d. PackageTest.java 48
실행결과 49
LAB: 패키지생성하기 예를들어서어떤회사에서게임을개발하려면 library 팀과 game 팀의소스 를합쳐야한다고가정해보자. 50
LAB: 패키지생성하기 프로젝트 Package2를생성한다. library 패키지를생성한다. library 패키지에 Rectangle 클래스, Circle 클래스를추가한다. game 패키지를생성한다. game 패키지에 Rectangle 클래스와 Sprite 클래스를추가한다. 51
SOLUTION 52
패키지의사용 경로까지포함하는완전한이름으로참조한다. ( 예 ) library.rectangle myrect = new library.rectangle(); 원하는패키지멤버만을 import 한다. ( 예 ) import library.rectangle; ( 예 ) Rectangle myrect = new Rectangle(); 패키지전체를 import 한다. ( 예 ) import library.*; 53
정적 import 문장 클래스안에정의된정적상수나정적메소드를사용하는경우에정적 import 문장을사용하면클래스이름을생략하여도된다. ( 예 ) import static java.lang.math.*; ( 예 ) double r = cos(pi * theta); 54
소스파일과클래스파일관리 ( 이클립스 ) 자바에서각종소스파일과클래스파일을어떤원칙으로관리하는것일까? 패키지의계층구조를반영한디렉토리구조에소스와클래스파일들을저 장한다. 55
자바가상머신은어떻게클래스파일을찾을까? 가상머신이클래스파일을찾는디렉토리들을클래스경로 (class path) 라고 한다. 56
클래스경로를지정하는 3 가지의방법 자바가상머신은항상현재작업디렉토리부터찾는다. 환경변수인 CLASSPATH에설정된디렉토리에서찾는다. D:\tmp1> javac d. PackageTest.java 자바가상머신을실행할때옵션 -classpath 를사용할수있다. C:\> java -classpath C:\classes;C:\lib;. library.rectangle 57
JAR 압축파일 JAR 파일은여러개의클래스파일을디렉토리계층구조를유지한채로압 축하여서가지고있을수있다. 58
JAR 파일을생성하는방법 c> jar cvf Game.jar *.class icon.png 59
자바에서지원하는패키지 60