Download presentation
Presentation is loading. Please wait.
Published byΔαυίδ Γούσιος Modified 5년 전
1
제 6주 인터페이스 (Interfaces) 제 6주 목표 인터페이스 개념 이해 다형성 개념 이해 자바프로그래밍 강원대학교
2
Interface 약속 (서비스 이용자와 제공자 사이의) 서비스 사용법 자동차 사용자는 어떤 자동차이든 운전 가능
자동차 회사들이 표준 인터페이스를 지키므로 표준 인터페이스: 핸들, 브레이크, 엑셀, 기어 등 자동차: 인터페이스 트럭, 승용차, 유조차, 승합차 등: 자동차 인터페이스를 구현한 클래스들 자바프로그래밍 강원대학교
3
인터페이스 정의 (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(); } 자바프로그래밍 강원대학교
4
인터페이스를 갖춘 클래스 구현 class Bike implements Drivable {
void drive(double speed) { if (speed <= Drivable.MAX_SPEED) 페달을 돌린다, 열라~, speed될 때까지; } void turn(double angle) { angle 만큼 핸들을 돌린다; void stop() { 발로 질질 끈다; void jump() { ... } 그 밖의 여러 메소드들... 약속에 맞춰 메소드 구현 약속에 맞춤: 메소드 signature를 준수함 구체적인 구현은 자유 자바프로그래밍 강원대학교
5
인터페이스를 갖춘 클래스 구현 class Car implements Drivable {
void drive(double speed) { 엔진에 연료 분사, speed될 때까지; } void turn(double angle) { angle 만큼 조향장치 구동; void stop() { 브레이크 디스크 밀착; void lockDoor() { ... } 그 밖의 여러 메소드들... 약속에 맞춰 메소드 구현 약속에 맞춤: 메소드 signature를 준수함 구체적인 구현은 자유 자바프로그래밍 강원대학교
6
인터페이스는 타입으로 사용된다. Drivable vehicle = new Car(); vehicle.drive(50);
vehicle.stop(); vehicle = new Bike(); vehicle.turn(-30); RobotDriver: Drivable 인터페이스를 쓸 줄 아는 로봇 RobotDriver는 Car, Bike에 대해 세부적인 것을 잘 몰라도 인터페이스에 맞춰 이들을 사용할 수 있다. 자바프로그래밍 강원대학교
7
인터페이스는 타입으로 사용된다. Drivable vehicle = new Car(); vehicle.drive(50);
vehicle.stop(); vehicle.lockDoor(); // No! vehicle = new Bike(); vehicle.turn(-30); vehicle.jump(); // No! Drivable 인터페이스에서 정의된 메소드만 호출 가능! vehicle이 Drivable 타입이므로... 자바프로그래밍 강원대학교
8
인터페이스는 타입으로 사용된다. Drivable vehicle = new Car(); vehicle.drive(50);
vehicle.stop(); Car myCar = vehicle; // No! 모든 Car는 Drivable이지만 모든 Drivable이 Car는 아니므로 ... 자바프로그래밍 강원대학교
9
인터페이스는 타입으로 사용된다. Drivable vehicle = new Car(); vehicle.drive(50);
vehicle.stop(); Car myCar = (Car)vehicle; // Yes! myCar.lockDoor(); // Yes! 현재 vehicle이 Car 타입 객체이므로 Car 타입으로 casting 가능! Car 타입 레퍼런스 myCar에는 Car의 메소드 lockDoor 호출 가능! 자바프로그래밍 강원대학교
10
인공지능의 시대, 프로그램이 운전한다. 운전자가 자동차를 운전할 줄 알듯이
운전프로그램은 Drivable 인터페이스를 사용할 줄 안다. 운전프로그램은 Bike도 Car도 운전 가능 자바프로그래밍 강원대학교
11
public class RobotDriver { public void go(Drivable v){ // 지도를 보면서 요리 조리 운전!! // Drivable이라면 뭐든 오케이! v.drive(50); v.turn(60); ... v.stop(); } 자바프로그래밍 강원대학교
12
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); } 자바프로그래밍 강원대학교
13
또 하나의 인터페이스 public interface Measurable { double getMeasure(); // 측정값을 반환 } 자바프로그래밍 강원대학교
14
Measurable을 구현하는 클래스 class Square implements Measurable {
double getMeasure(){ return edgeLength * edgeLength; } private double edgeLength; 약속된 메소드 구현 사각형의 경우 그 면적을 계산 자바프로그래밍 강원대학교
15
여러 인터페이스를 구현할 수 있다. 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 객체이기도 하다. 배의 무게를 반환 자바프로그래밍 강원대학교
16
RobotDriver는 배도 운전할 수 있다.
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); Boar boat = new Boat(); driver.go(boat); } 자바프로그래밍 강원대학교
17
타입에 따라 메소드 호출이 제한된다. class RobotDriver {
public static void main(String[] args) { Drivable vehicle = new Car(); vehicle.drive(50); vehicle.stop(); vehicle = new Bike(); vehicle.turn(-30); vehicle = new Boat(); vehicle.drive(20); vehicle.getMeasure(); // 컴파일 에러 } // vehicle은 Drivable 타입인데 Drivable들은 getMeasure()를 // 지원하지 않음 자바프로그래밍 강원대학교
18
Casting class RobotDriver { public static void main(String[] args) {
Drivable vehicle = new Car(); vehicle.drive(50); vehicle.stop(); vehicle = new Bike(); vehicle.turn(-30); vehicle = new Boat(); vehicle.drive(20); Boat b = (Boat) vehicle; // vehicle이 실제로는 Boat 인스턴스이므로 // Boat 타입으로 캐스팅 가능 b.getMeasure(); // OK! } 자바프로그래밍 강원대학교
19
다형성 (Polymorphism) class RobotDriver {
public static void main(String[] args) { Drivable vehicle = new Car(); vehicle.drive(50); // Car의 drive 메소드가 실행됨 vehicle.stop(); vehicle = new Bike(); vehicle.drive(50); // Bike의 drive 메소드가 실행됨 vehicle.turn(-30); vehicle = new Boat(); vehicle.drive(20); Boat b = (Boat) vehicle; // vehicle이 실제로는 Boat 인스턴스이므로 // Boat 타입으로 캐스팅 가능 b.getMeasure(); // OK! } 자바프로그래밍 강원대학교
20
Polymorphism Drivable인 vehicle 에게 drive를 호출하면, vehicle이 실제로 어떤 객체인지에 따라 행동이 달라짐 vehicle이 Car라면 Car의 drive 메소드가, vehicle이 Bike라면 Bike의 drive 메소드가 실행됨 Polymorphism (many shapes): vehicle이 이렇게 작동하기도 하고 저렇게 작동하기도 하는 것 (실제 객체 타입이 무엇인가에 따라) late binding: 실행 시 결정됨 early binding (컴파일 시 결정됨): overloading 자바프로그래밍 강원대학교
21
Measurable 객체를 다룰 줄 아는 클래스
class Relator { 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) ... Square가 Measurable 인터페이스를 구현한 클래스라고 가정함 자바프로그래밍 강원대학교
22
인터페이스는 코드를 재사용할 수 있게 해 준다. Boat들을 서로 비교하기 위해 Relator라는 코드를 한 번 만들어 놓으면, Square들을 서로 비교하기 위해 또 다른 코드를 개발할 필요 없이 Relator를 재사용할 수 있다. Relator는 Measurable 인터페이스를 구현한 어떤 객체에게도 적용할 수 있다. (코드 재사용!) 자바프로그래밍 강원대학교
23
서브인터페이스 슈퍼인터페이스 FlyAndDrivable int MAX_SPEED = 100;
public interface FlyAndDrivable extends Drivable { void fly(); } FlyAndDrivable int MAX_SPEED = 100; void drive(double speed); void turn(double angle); void stop(); void fly(); 자바프로그래밍 강원대학교
24
클래스: 하나의 슈퍼클래스만 확장 가능 자바프로그래밍 강원대학교
25
인터페이스: 여러 인터페이스 확장 가능 public interface GroupedInterface extends Interface1, Interface2, Interface3 { double E = ; void doSomething (int i, double x); int doSomethingElse(String s); } 자바프로그래밍 강원대학교
26
또 하나의 예 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; 자바프로그래밍 강원대학교
27
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; 자바프로그래밍 강원대학교
28
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; } 자바프로그래밍 강원대학교
29
UML Diagram of Dataset and Related Classes
구현 사용 자바프로그래밍 강원대학교
30
File DataSetTester.java
01: /** 02: This program tests the DataSet class. 03: */ 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)); 11: bankData.add(new BankAccount(10000)); 12: bankData.add(new BankAccount(2000)); 13: 14: System.out.println("Average balance = " 15: bankData.getAverage()); 16: Measurable max = bankData.getMaximum(); 17: System.out.println("Highest balance = " 18: max.getMeasure()); 자바프로그래밍 강원대학교
31
File DataSetTester.java
19: 20: DataSet coinData = new DataSet(); 21: 22: coinData.add(new Coin(0.25, "quarter")); 23: coinData.add(new Coin(0.1, "dime")); 24: coinData.add(new Coin(0.05, "nickel")); 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: } 자바프로그래밍 강원대학교
32
File DataSetTester.java
Output: Average balance = Highest balance = Average coin value = Highest coin value = 0.25 자바프로그래밍 강원대학교
Similar presentations