인터페이스(Interfaces) 강원대학교.

Slides:



Advertisements
Similar presentations
5 장 조건과 반복 ②. Contents Counting and Looping [while 문 사용 ] Powers of 2 [while 문 사용 ] More Guessing [do 문 사용 ] Election Day [do 문 사용 ] Finding Maximum &
Advertisements

제 5 장 상속과 다형성.
3. C++와 객체지향 C++ 코딩 방법 객체 단위로 2 개의 파일 인터페이스 파일 구현파일
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
10. 예외 처리.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
객체지향 프로그래밍.
Chap05 상속 5.1 상속의 개요 5.2 멤버 변수의 상속 5.3 메소드의 상속과 오버라이딩(Overriding)
7장 배열 ②.
Java Presentation 중간 시험2 풀이
자바란 무엇인가? JDK의 다운로드 및 설치 방법 Hello, Java 프로그램의 작성 자바 프로그램의 작동 원리
C++ Exspresso 제5장 클래스의 기초.
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
8. 객체와 클래스 (기본).
제7장 제어구조 I – 식과 문장.
[ 단원 08 ] 예외처리와 스레드.
명품 JAVA Programming.
명품 JAVA Programming 제 4 장 클래스와 객체.
Power Java 제4장 자바 프로그래밍 기초.
[INA470] Java Programming Youn-Hee Han
10장 객체-지향 프로그래밍 II ©창병모.
Power Java 제10장 배열.
객체지향 언어와 클래스, 객체 ㅎㅎ 개요 클래스의 선언, 객체의 생성 및 속성 참조 방식 멤버 변수 메소드 한빛미디어(주)
자바 5.0 프로그래밍.
Power Java 제15장 예외 처리 (Exception Handling).
프로그래밍 언어론 제 9 장 객체 지향 개념 객체 지향 방법론 객체 모델링 객체 지향 언어 C++ 객체 지향 언어 CLOS
명품 JAVA Essential.
이쁜 코드 작성하기 마이에트 레이더즈팀 중원.
명품 Java Programming.
최용술 장 Thread 최용술
10장 다중 스레드 10.1 스레드 개요 10.2 Thread 클래스 10.3 스레드 생성
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
윤 홍 란 4 장 클래스 작성 윤 홍 란
2010학년도 2학기 객체지향의 이해.
김 정 석 Web Programming 김 정 석
컴퓨터 프로그래밍 실습 #6 제 4 장 클래스 작성.
제 4주 – 클래스 설계 제 4주 목표 클래스를 구현하는 법을 배운다. 변수 선언 메소드 구현 구성자 객체지향프로그래밍
제 6주 인터페이스 (Interfaces) 제 6주 목표 인터페이스 개념 이해 다형성 개념 이해 자바프로그래밍 강원대학교.
6장 객체-지향 설계 ①.
제 4주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
제1장 서론.
2009학년도 1학기 상지대학교 컴퓨터정보공학부 고 광 만
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
5장 조건과 반복 ②.
6장 객체-지향 설계 ①.
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
가상함수와 추상 클래스.
메소드와 클래스 정의 및 문제 풀이 Method and Class Define and Problem Solve
Web programming Chap 04 상속 김 정 석
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
[INA470] Java Programming Youn-Hee Han
컴퓨터공학실습(I) 3주 인공지능연구실.
Java IT응용시스템공학과 김형진 교수 5장. 객체지향 개념 public class SumTest {
Chap02 객체 지향 개념 2.1 객체지향(object-oriented)과 절차지향(procedural-oriented)
JA A V W. 04.
자바 5.0 프로그래밍.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
[ 단원 06 ] 상속과 다형성.
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
자바 5.0 프로그래밍.
C# 10장. 참조형.
6장 클래스(상속).
Chapter 4 클래스 작성.
Java 5장. 객체지향 개념 public class SumTest {
C# 09장. 클래스와 객체.
Java의 정석 제 7 장 객체지향개념 II-3 Java 정석 남궁성 강의
1. 객체-지향 프로그래밍.
Chapter8 : 인터페이스와 패키지 8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용
Presentation transcript:

인터페이스(Interfaces) 강원대학교

“인터페이스” 두 가지 의미 클래스 사용법 (API) 서비스 이용자와 서비스 공급자간의 약속 자바 구성 요소 자바 표준 라이브러리에는 클래스와 인터페이스가 있다. 이탤릭체 이름이 인터페이스 강원대학교

인터페이스 정의 (interface definition) public interface Drivable { void drive(double speed); void turn(double angle); void stop(); int MAX_SPEED = 10; } 구현되지 않은 메소드들만을 갖는다. 중괄호(몸체) 없음. 구성자가 없다. 모든 메소드는 public으로 적어 주지 않아도 public이다. 필드는 public constant static 필드만 가능하다. public static final 키워드를 생략해도 이들이 붙은 것과 같다. 강원대학교

인터페이스를 갖춘 클래스 구현 class Bike implements Drivable { public void drive(double speed) { if (speed <= Drivable.MAX_SPEED) 페달을 돌린다, 열라~, speed될 때까지; } public void turn(double angle) { angle 만큼 핸들을 돌린다; public void stop() { 발로 질질 끈다; public void jump() { ... } 그 밖의 여러 메소드들... 인터페이스에 맞춰 메소드 구현 인터페이스에 있는 모든 메소드를 구현 강원대학교

인터페이스를 갖춘 클래스 구현 class Car implements Drivable { public void drive(double speed) { 엔진에 연료 분사, speed될 때까지; } public void turn(double angle) { angle 만큼 조향장치 구동; public void stop() { 브레이크 디스크 밀착; public void lockDoor() { ... } 그 밖의 여러 메소드들... 인터페이스에 맞춰 메소드 구현 인터페이스에 있는 모든 메소드를 구현 강원대학교

인터페이스는 타입으로 사용된다. c b Car Bike Drivable 인터페이스를 구현한 클래스 객체들 c는 Car 타입 객체이다. c는 Car이다. b는 Bike 타입 객체이다. b는 Bike이다. b와 c는 Drivable 타입 객체이다. b와 c는 Drivable 이다. 강원대학교

모든 Drivable에게는 세 가지 메소드를 호출할 수 있다. Drivable vehicle = new Car(); vehicle.drive(50.0); vehicle.turn(45.0); vehicle.stop(); vehicle = new Bike(); vehicle.drive(10.0); vehicle.turn(-30.0); 강원대학교

레퍼러스 타입(static type)에 따라 메소드 호출이 제한된다. Drivable vehicle = new Car(); vehicle.drive(50.0); vehicle.stop(); vehicle.lockDoor(); // No! vehicle = new Bike(); vehicle.turn(-30.0); vehicle.jump(); // No! Drivable 인터페이스에서 정의된 메소드만 호출 가능! vehicle이 Drivable 타입이므로... 강원대학교

Drivable은 Car가 아닐 수 있다. Drivable vehicle = new Car(); vehicle.drive(50.0); vehicle.stop(); Car myCar = vehicle; // No! 모든 Car는 Drivable이지만 모든 Drivable이 Car는 아니므로 ... 강원대학교

Drivable이 Car인 경우 Drivable vehicle = new Car(); vehicle.drive(50.0); vehicle.stop(); Car myCar = (Car)vehicle; // Yes! myCar.lockDoor(); // Yes! 현재 vehicle이 Car 타입 객체이므로 Car 타입으로 casting 가능! Car 타입 레퍼런스 myCar에는 Car의 메소드 lockDoor 호출 가능! 강원대학교

인터페이스의 다른 예 public interface Measurable { double getMeasure(); // 측정값을 반환 } 강원대학교

Measurable을 구현하는 클래스 class Square implements Measurable { public double getMeasure(){ return edgeLength * edgeLength; } private double edgeLength; 인터페이스 메소드 구현 면적을 반환 혹은 변의 길이를 반환 혹은 대각선 길이를 반환 (필요에 따라, 구현은 자유) 강원대학교

여러 인터페이스를 구현할 수 있다. class Boat implements Drivable, Measurable { void drive(double speed) { 스크루 돌림, speed될 때까지; } void turn(double angle) { angle 만큼 돌 때까지 키 작동; void stop() { 스크루 거꾸로 돌림; double getMeasure(){ return weight; private double weight; Boat 인스턴스는 Drivable 객체이기도하고 Measurable 객체이기도 하다. 강원대학교

레퍼런스 타입에 따라 메소드 호출이 제한된다. class RobotDriver { 레퍼런스 타입에 따라 메소드 호출이 제한된다. class RobotDriver { public static void main(String[] args) { Drivable vehicle1 = new Boat(); vehicle1.drive(20.0); vehicle1.getMeasure(); // 컴파일 에러 // vehicle1은 Drivable 타입인데 Drivable들은 getMeasure()를 // 지원하지 않음 Measurable vehicle2 = new Boat(); vehicle2.drive(20.0); // 컴파일 에러 vehicle2.getMeasure(); Boat vehicle3 = new Boat(); // vehicle3에는 Boat의 모든 메소드를 호출할 수 있다. } 강원대학교

다형성 (Polymorphism) class RobotDriver { public static void main(String[] args) { // Drivable들을 배열에 저장 Drivable[] vehicles = {new Car(), new Bike(), new Boat()}; // Drivable들에 drive 메소드를 호출하면 각각 다르게 작동 for (int i=0; i<vehicles.length; i++) vehicles[i].drive(50.0); // 여러가지 drive 메소드가 실행됨 } 강원대학교

다형성 Drivable 객체에게 drive 메소드를 호출하면, 그 Drivable 객체가 실제로 어떤 클래스에 속하는지에 따라 행동이 달라짐 vehicle이 Car이면 Car의 drive 메소드가, vehicle이 Bike이면 Bike의 drive 메소드가 실행됨 Polymorphism (many shapes): Drivable 객체가 이렇게 작동하기도 하고 저렇게 작동하기도 하는 것 (객체가 어떤 클래스 객체인가에 따라 따라) late binding: 실행 시 결정됨  early binding (컴파일 시 결정됨): overloading 강원대학교

인공지능의 시대, 프로그램이 운전한다. 인터페이스는 여러가지 클래스들을 하나의 그룹으로 취급할 수 있게 해 준다. 운전자가 자동차를 운전할 줄 알듯이 운전프로그램은 Drivable 인터페이스를 사용할 줄 안다. 운전프로그램은 Bike도 Car도 운전 가능 RobotDriver: Drivable 인터페이스를 쓸 줄 아는 로봇 RobotDriver는 Car, Bike에 대해 세부적인 것을 잘 몰라도 인터페이스에 맞춰 이들을 사용할 수 있다. 강원대학교

public class RobotDriverTest { public class RobotDriver { public void go(Drivable v){ // 지도를 보면서 // 요리 조리 운전!! // Drivable이라면 // 뭐든 오케이! v.drive(50.0); v.turn(60.0); ... v.stop(); } public class RobotDriverTest { public static void main(String[] args) { RobotDriver driver = new RobotDriver(); Car car = new Car(); // 로봇에게 자동차를 주면서 운전을 시킴 driver.go(car); Bike bike = new Bike(); // 로봇에게 자전거를 주면서 운전을 시킴 driver.go(bike); // 로봇에게 어떤 Drivable이든지 운전시킬 // 수 있음 } 강원대학교

인터페이스를 이용하여 애플리케이션을 구현한다. --> 낮은 결합성 애플리케이션에서의 변수 타입을 Drivable로 선언한다. 객체를 구성하는 곳에서만 특정 클래스 구성자를 이용한 다. 애플리케이션을 실행할 때 Car를 주면서 구동할 수도 있 고 Bike를 주면서 구동할 수도 있다. 나중에 Boat 클래스를 추가하는 경우 Boat가 Drivable 인터페이스를 구현하도록 하기만 하면 Boat를 주면서 애 플리케이션을 구동할 수도 있다. <-- 확장성! 강원대학교

public class RobotDriverTest { public class RobotDriver { public void go(Drivable v){ // 지도를 보면서 // 요리 조리 운전!! // Drivable이라면 // 뭐든 오케이! v.drive(50.0); v.turn(60.0); ... v.stop(); } public class RobotDriverTest { public static void main(String[] args) { RobotDriver driver = new RobotDriver(); Car car = new Car(); // 로봇에게 자동차를 주면서 운전을 시킴 driver.go(car); Bike bike = new Bike(); // 로봇에게 자전거를 주면서 운전을 시킴 driver.go(bike); Boat boat = new Boat(); // 로봇에게 배를 주면서 운전을 시킴 driver.go(boat); } 강원대학교

인터페이스는 하나의 도구가 여러 클래스 객체들을 처리할 수 있게 해 준다. public class RobotDriver { public void go(Drivable v){ // 지도를 보면서 // 요리 조리 운전!! // Drivable이라면 // 뭐든 오케이! v.drive(50.0); v.turn(60.0); ... v.stop(); } public class RobotDriverTest { public static void main(String[] args) { RobotDriver driver = new RobotDriver(); Car car = new Car(); // 로봇에게 자동차를 주면서 운전을 시킴 driver.go(car); Bike bike = new Bike(); // 로봇에게 자전거를 주면서 운전을 시킴 driver.go(bike); Boat boat = new Boat(); // 로봇에게 배를 주면서 운전을 시킴 driver.go(boat); } 강원대학교

인터페이스는 하나의 도구가 여러 클래스 객체들을 처리할 수 있게 해 준다. class Relator { // Measurable 객체를 다룰 줄 아는 클래스 public static int compare(Measurable a, Measurable b){ if (a.getMeasure() < b.getMeasure()) return -1; else if (a.getMeasure() > b.getMeasure()) return 1; else return 0; } Boat b1 = new Boat(); Boat b2 = new Boat(); if(Relator.compare(b1, b2) > 0) ... Square s1 = new Square(); Square s2 = new Square(); if(Relator.compare(s1, s2) > 0) ... 여러 클래스들을 하나의 그룹으로 다룰 수 있게 해 준다. Boat와 Square가 Measurable 인터페이스를 구현한 클래스라고 가정함 강원대학교

인터페이스 개념이 없다면... class Relator { public static int compare(Boat a, Boat b){ if (a.getWeight() < b.getWeight()) return -1; else if (a.getWeight() > b.getWeight()) return 1; else return 0; } public static int compare(Rectangle a, Rectangle b){ if (a.getArea() < b.getArea()) return -1; else if (a.getArea() > b.getArea()) return 1; 다루고 싶은 클래스 타입마다 메소드를 만들어야 한다. (overloading) 강원대학교

서브인터페이스 슈퍼인터페이스 FlyAndDrivable void drive(double speed); public interface FlyAndDrivable extends Drivable { void fly(); } FlyAndDrivable void drive(double speed); void turn(double angle); void stop(); void fly(); 강원대학교

클래스: 하나의 슈퍼클래스만 확장 가능 강원대학교

인터페이스: 여러 인터페이스 확장 가능 public interface GroupedInterface extends Interface1, Interface2, Interface3 { double E = 2.718282; void doSomething (int i, double x); int doSomethingElse(String s); } 강원대학교

또 하나의 예 public interface Measurable { double getMeasure(); // 측정값을 반환 } public class BankAccount implements Measurable { public BankAccount() { 구성자 } public void deposit(double amount){ ... } public double getBalance(){ ... } public String toString(){ ... } public double getMeasure() { return balance; } private String owner; private double balance; 강원대학교

public interface Measurable { double getMeasure(); // 측정값을 반환 } public class Coin implements Measurable { public Coin(double aValue, String aName) { ... } public double getValue() { ... } public String getName() { ... } public double getMeasure() { return value; } private double value; private String name; 강원대학교

DataSet: Measurable Objects 중 측정값이 최대인 놈을 골라내는 클래스 public class DataSet { public void add(Measurable x) { sum = sum + x.getMeasure(); if (count == 0 || maximum.getMeasure() < x.getMeasure()) maximum = x; count++; } public Measurable getMaximum() { return maximum; } private double sum; private Measurable maximum; private int count; } 강원대학교

UML Diagram of Dataset and Related Classes 구현 사용 강원대학교

File DataSetTester.java 04: public class DataSetTester 05: { 06: public static void main(String[] args) 07: { 08: DataSet bankData = new DataSet(); 09: 10: bankData.add(new BankAccount(0.0)); 11: bankData.add(new BankAccount(10000.0)); 12: bankData.add(new BankAccount(2000.0)); 13: 14: System.out.println("Average balance = " 15: + bankData.getAverage()); 16: Measurable max = bankData.getMaximum(); 17: System.out.println("Highest balance = " 18: + max.getMeasure()); 강원대학교

File DataSetTester.java 19: 20: DataSet coinData = new DataSet(); 21: 22: coinData.add(new Coin(10.0, "다보탑")); 23: coinData.add(new Coin(50.0, "벼이삭")); 24: coinData.add(new Coin(100.0, "이순신")); 25: 26: System.out.println("Average coin value = " 27: + coinData.getAverage()); 28: max = coinData.getMaximum(); 29: System.out.println("Highest coin value = " 30: + max.getMeasure()); 31: } 32: } 강원대학교

http://blog.daum.net/song9662/13753510 강원대학교

File DataSetTester.java 04: public class DataSetTester 05: { 06: public static void main(String[] args) 07: { 08: DataSet bankData = new DataSet(); 09: 10: bankData.add(new BankAccount(0.0)); 11: bankData.add(new BankAccount(10000.0)); 12: bankData.add(new BankAccount(2000.0)); 13: 14: System.out.println("Average balance = " 15: + bankData.getAverage()); 16: Measurable max = bankData.getMaximum(); 17: System.out.println("Highest balance = " 18: + max.getMeasure()); // double balance = max.getBalance(); // error! double balance = (BankAccount)max.getBalance(); // OK! 강원대학교

File DataSetTester.java 19: 20: DataSet coinData = new DataSet(); 21: 22: coinData.add(new Coin(10, "다보탑")); 23: coinData.add(new Coin(50, "벼이삭")); 24: coinData.add(new Coin(100, "세종대왕")); 25: 26: System.out.println("Average coin value = " 27: + coinData.getAverage()); 28: max = coinData.getMaximum(); 29: System.out.println("Highest coin value = " 30: + max.getMeasure()); // double value = max.getValue(); // error! double value = (Coin)max.getValue(); // OK! 31: } 32: } 강원대학교

File DataSetTester.java Output: Average balance = 4000.0 Highest balance = 10000.0 Average coin value = 53.3333333333333333 Highest coin value = 100. 강원대학교

강원대학교

정리 강원대학교

인터페이스 정의 (interface definition) public interface InterfaceName { constants method signatures } interface 앞에 public이 없으면 같은 패키지 내에서만 유효 메소드 이름 앞에 public이 없어도 public으로 간주됨 (public interface의 경우) 상수 앞에는 final, static이 있는 것으로 간주됨 메소드 본체(body, 중괄호 부분)는 없음 public interface Drivable { int MAX_SPEED = 100; void drive(double speed); void turn(double angle); void stop(); } 메소드 signature = 메소드 이름과 파라미터 강원대학교

인터페이스를 이용하는 프로그램 작성 강원대학교

인터페이스를 정의한다. public interface Drivable { void drive(double speed); void turn(double angle); void stop(); } 강원대학교

인터페이스를 구현한 클래스들 정의한다. class Car implements Drivable { void drive(double speed) { 엔진에 연료 분사, speed될 때까지; } ... class Bike implements Drivable if (speed <= Drivable.MAX_SPEED) 페달을 돌린다, 열라~, speed될 때까지; 강원대학교

인터페이스를 갖춘 클래스들을 인터페이스를 통해 사용한다. 인터페이스를 갖춘 클래스들을 인터페이스를 통해 사용한다. public class RobotDriverTest { public static void main(String[] args) { RobotDriver driver = new RobotDriver(); Car car = new Car(); // 로봇에게 자동차를 주면서 운전을 시킴 driver.go(car); Bike bike = new Bike(); // 로봇에게 자전거를 주면서 운전을 시킴 driver.go(bike); // 로봇에게 어떤 Drivable이든지 운전시킬 // 수 있음 } public class RobotDriver { public void go(Drivable v){ // 지도를 보면서 요리 조리 운전!! // Drivable이라면 뭐든 오케이! v.drive(50.0); v.turn(60.0); ... v.stop(); } 강원대학교

끝. 강원대학교