Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "인터페이스(Interfaces) 강원대학교."— Presentation transcript:

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

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

3 인터페이스 정의 (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 키워드를 생략해도 이들이 붙은 것과 같다. 강원대학교

4 인터페이스를 갖춘 클래스 구현 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() { ... } 그 밖의 여러 메소드들... 인터페이스에 맞춰 메소드 구현 인터페이스에 있는 모든 메소드를 구현 강원대학교

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

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

7 모든 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); 강원대학교

8 레퍼러스 타입(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 타입이므로... 강원대학교

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

10 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 호출 가능! 강원대학교

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

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

13 여러 인터페이스를 구현할 수 있다. 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 객체이기도 하다. 강원대학교

14 레퍼런스 타입에 따라 메소드 호출이 제한된다. 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의 모든 메소드를 호출할 수 있다. } 강원대학교

15 다형성 (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 메소드가 실행됨 } 강원대학교

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

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

18 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이든지 운전시킬 // 수 있음 } 강원대학교

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

20 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); } 강원대학교

21 인터페이스는 하나의 도구가 여러 클래스 객체들을 처리할 수 있게 해 준다.
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); } 강원대학교

22 인터페이스는 하나의 도구가 여러 클래스 객체들을 처리할 수 있게 해 준다.
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 인터페이스를 구현한 클래스라고 가정함 강원대학교

23 인터페이스 개념이 없다면... 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) 강원대학교

24 서브인터페이스 슈퍼인터페이스 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(); 강원대학교

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

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

27 또 하나의 예 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; 강원대학교

28 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; 강원대학교

29 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; } 강원대학교

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

31 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( )); 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()); 강원대학교

32 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: } 강원대학교

33 강원대학교

34 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( )); 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! 강원대학교

35 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: } 강원대학교

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

37 강원대학교

38 정리 강원대학교

39 인터페이스 정의 (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 = 메소드 이름과 파라미터 강원대학교

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

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

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

43 인터페이스를 갖춘 클래스들을 인터페이스를 통해 사용한다.
인터페이스를 갖춘 클래스들을 인터페이스를 통해 사용한다. 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(); } 강원대학교

44 끝. 강원대학교


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

Similar presentations


Ads by Google