써먹는 웹개발

[Java] 15강 인터페이스 본문

Study/Java & Python

[Java] 15강 인터페이스

kmhan 2021. 2. 26. 15:57


728x90
반응형

15강 인터페이스(interface)

 - 한 객체가 다양한 역할을 수행하려면?

  ex) 홍팍이는 개발자이자 강사이며, 친구이다.

 

1. 인터페이스란

 - 정의 : 역할을 부여하는 것

 - 특징 : 추상 메소드로 구현한다.

   추상 메소드란? 중괄호 내부가 없는 껍데기 메소드

  ex) 스마트폰은 알람, 전화기, 메신저의 역할을 한다.

 

2. 인터페이스의 정의 및 구현

 - 형식

interface NAME {

  // 프로토타입 메소드들..

}

 

 - 예 : Alarm 인터페이스를 만들어보자

   기능 : 비프음 내기와 음악 재생

   주의사항 : 인터페이스 내의 메소드에 중괄호 없음

interface Alarm {

  public void beep(); // 추상메소드

  public void playMusic(); // 추상메소드

}

 

 - 인터페이스 구현을 선언

    위에서 만든 인터페이스를 클래스에 구현하자 이를 위해 implements 키워드를 사용한다.

// SmartPhone 클래스가 Alarm 역할을 수행하기로 함!

class SmartPhone implements Alarm {

   // 내부 구현 생략..

}

 

 - 추상 메소드 오버라이딩

이제 Alarm 인터페이스의 모든 추상 메소드를 재정의(오버라이딩) 해야 한다. 중괄호 내부가 없기 때문이다.

class SmartPhone implements Alarm {

  // 프로토타입 메소드를 재정의!

  public void beep() {

    System.out.println("삐~ 삐삑, 삐비비빅!");

  } 

  

  // 프로토타입 메소드를 재정의!

  public void playMusic() {

    System.out.println("아침 해가 빛나는~ 끝이 없는 바닷가!");

  }

}

 

3. 인터페이스의 장점

프로그램 설계의 명확성 : 인터페이스를 사용하면 프로그램 설계가 보다 명확해진다.

관계성 부여 : 서로 다른 객체들이 같은 인터페이스를 구현한다면, 인터페이스를 타입으로 하여 업캐스팅 할 수 있다.


     

 

 

 

 

 

 

 

 

 

 

 

다형성 : 여러 인터페이스를 구현하게 함으로써, 한 객체를 여러 타입으로 해석할 수 있게 된다.

 

4. 요약

 

인터페이스란

 - 역할을 부여하는 것

 - 추상 메소드로 구성

 - 추상 메소드란, 중괄호 내부가 없는 껍데기 메소드

 

인터페이스 정의 및 구현

 - 인터페이스 구현 시, implements 키워드를 사용한다.

 - 해당 인터페이스(역할)를 구현하는(부여받은) 클래스를 구현해 클래스라 한다.

 - 구현체 클래스는 모든 추상 메소드를 오버라이딩(재정의)해야 한다.

 

인터페이스의 장점

 - 프로그램 설계의 명확성

 - 서로 다른 객체에게 관계성 부여 (업캐스팅 가능)

 - 한 객체를 다양한 인터페이스로 해석 가능(다형성)

 

 

5. 개념실습

 

1. 인터페이스 정의 및 구현

public class SmartPhoneTest {
  public static void main(String[] args) {
    // 객체 생성
    SmartPhone sp = new SmartPhone("아이폰", "010-0000-0000");

    // 전화 걸기
    sp.call("010-1234-5678");
    
    // 전화벨이 울림
    sp.ring();
  }
}

interface Phone {
  // targetNumber로 전화를 걸거야! 어떻게? 그건 아직 몰라!
  public void call(String targetNumber);
  
  // 전화벨이 울릴거야! 어떻게? 그건 아직 몰라!
  public void ring();
}

class SmartPhone implements Phone {
  protected String name;
  protected String phoneNumber;
  
  public SmartPhone(String name, String phoneNumber) {
    this.name = name;
    this.phoneNumber = phoneNumber;
  }
  
  /* Phone 인터페이스의 모든 프로토타입 메소드를 구현하시오. */  
  public void call(String targetNumber){
    System.out.printf("%s로 전화를 겁니다!\n",targetNumber);
  }
  
  public void ring(){
    System.out.print("전화벨이 울립니다~");
  }
}


2. 인터페이스 정의 및 구현-2

public class SmartPhoneTest2 {
  public static void main(String[] args) {
    // 객체 생성
    SmartPhone sp = new SmartPhone("갤럭시 S10");
    // 비프음 내기
    sp.beep();
    // 음악 재생하기
    sp.playMusic("상어송");
  }
}

interface Alarm {
  public void beep();                  // 비프음
  public void playMusic(String title); // 음악 재생
}

class SmartPhone implements Alarm {
  private String name; // 모델명

  public SmartPhone(String name) {
    this.name = name;
  }
  /* Alarm 인터페이스의 추상 메소드를 재정의하시오. */
  public void beep(){
    System.out.println("삐빕! 삐비비빕~!");
  }
  public void playMusic(String title){
    System.out.printf("[%s]을 재생합니다..!", title);
  }
}


3. 인터페이스와 다형성

public class Polymorphism {
  public static void main(String[] args) {
    // 성기사 객체 생성
    HolyKnight uther = new HolyKnight("우서", 180);
    
    // 탱커로서의 역할 수행
    Tanker t = uther;
    t.increaseHp();
    
    // 힐러로서의 역할 수행
    Healer h = uther;
    h.heal();
  }
}

interface Tanker {
  public void increaseHp();
}

interface Healer {
  public void heal();
}

/* 1. 탱커와 힐러 역할을 부여하세요. */
class HolyKnight implements Tanker, Healer {
  private String name;
  private int hp;

  public HolyKnight(String name, int hp) {
    this.name = name;
    this.hp = hp;
  }

  /* 2. Tanker의 메소드를 오버라이딩하세요. */
  public void increaseHp(){
    hp += 50;
    System.out.println("전체 체력 +50 증가시킵니다.");
  }
  
  /* 3. Healer의 메소드를 오버라이딩하세요. */
  public void heal(){
    hp += 30;
    System.out.println("체력을 +30 회복합니다.");
  }
}


4. 다형성 인생 - 인터페이스

public class VariousRoles {
  public static void main(String[] args) {
    // HongPark 객체 생성
    HongPark park = new HongPark();

    // 각 직업으로 변신
    Developer devPark = park;
    Instructor instPark = park;
    Masseur masPark = park;
    
    /* 3. 직업별 메소드를 호출하여 코드를 완성하세요. */
    devPark.programming("Java");
    instPark.teach("자료구조");
    masPark.massage();
  }
}

interface Developer {
  public void programming(String lang);
}

interface Instructor {
  public void teach(String subject);
}

interface Masseur {
  public void massage();
}

/* 1. 홍팍 클래스에 개발자, 강사, 마사지사 역할을 부여하세요. */
class HongPark implements Developer, Instructor, Masseur {
  private String name = "홍팍";

  /* 2. 구현하기로 한 인터페이스의 메소드를 오버라이딩 하세요.*/
  public void programming(String lang){
    System.out.printf("%s -> %s 프로그래밍 중!\n", name, lang);
  }
  
  public void teach(String subject){
    System.out.printf("%s -> %s 수업 중!\n", name, subject);
  }
  
  public void massage() {
    System.out.printf("%s -> 마사지 중!\n", name);
  }
}


5. 인터페이스와 업캐스팅

public class ObjectGrouping {
  public static void main(String[] args) {
    // 다양한 객체 생성
    Bird bird = new Bird();
    Helicopter copter = new Helicopter();
    Rocket rocket = new Rocket();
    
    // 인터페이스 타입으로 그룹화
    Flyable[] flyableThings = { bird, copter, rocket };
    
    // 모든 날것들을 날림
    for (int i = 0; i < flyableThings.length; i++) {
      Flyable temp = flyableThings[i];
      temp.fly();
    }
  }
}

interface Flyable {
  public void fly();
}

class Bird implements Flyable {
  /* 1. fly() 메소드를 오버라이딩 하세요. */
  public void fly(){
    System.out.printf("<새>가 날개를 퍼덕이며 날아갑니다!");
  }
}

class Helicopter implements Flyable {
  /* 2. fly() 메소드를 오버라이딩 하세요. */
  public void fly(){
    System.out.printf("<헬기>가 프로펠러를 힘차게 돌리며 날아갑니다!");
  }
}

class Rocket implements Flyable {
  /* 3. fly() 메소드를 오버라이딩 하세요. */
  public void fly(){
    System.out.printf("<로켓>이 제트 엔진을 분출하며 날아갑니다!");
  }
}

 


6. 인터페이스와 ArrayList

public class InterfaceType {
  public static void main(String[] args) {
    // 다양한 타입의 객체 생성
    Orderable jokbal = new Food("족발", 19800);
    Orderable airpod = new Electronics("에어팟", 199000);
    Orderable shirt = new Clothing("셔츠", 49900); 
    
    int sum = jokbal.discountedPrice()+airpod.discountedPrice()+shirt.discountedPrice();
    // 결과 출력
    System.out.printf("총합: %d원\n", sum);
  }
}

interface Orderable {
  public int discountedPrice();
}

class Food implements Orderable {
  private String name;
  private int price;
  
  public Food(String name, int price) {
    this.name = name;
    this.price = price;
  }
  /* 1. 오버라이딩을 통해, 음식 할인율을 적용하세요. */
  public int discountedPrice() {
    return (int) (price * 0.9);
  }
}

class Electronics implements Orderable {
  private String name;
  private int price;
  
  public Electronics(String name, int price) {
    this.name = name;
    this.price = price;
  }
  /* 2. 오버라이딩을 통해, 전자기기 할인율을 적용하세요. */
  public int discountedPrice() {
    return (int) (price * 0.8);
  }
}

class Clothing implements Orderable {
  private String name;
  private int price;
  
  public Clothing(String name, int price) {
    this.name = name;
    this.price = price;
  }
  /* 3. 오버라이딩을 통해, 의류 할인율을 적용하세요. */
  public int discountedPrice() {
    return (int) (price * 0.7);
  }
}

// 해당 화면에서 ArrayList 사용시 에러발생하여 ArrayList를 쓰지 않고 처리

 


7. 리뷰: 인터페이스

public class InterfaceReview {
  public static void main(String[] args) {
    // 객체 생성
    Sounding dog = new Dog();
    Sounding baby = new Baby();
    Sounding tiger = new Tiger();
    Sounding robot = new Robot();
    
    dog.sound();
    baby.sound();
    tiger.sound();
    robot.sound();
  }
}

/* 인터페이스 및 클래스를 작성하시오. */
interface Sounding{
  public void sound();
}

class Dog implements Sounding {
  public void sound(){
    System.out.println("Dog: 멍멍!");
  }
}

class Baby implements Sounding {
  public void sound(){
    System.out.println("Baby: 응애!");
  }
}

class Tiger implements Sounding {
  public void sound(){
    System.out.println("Tiger: 어흥!");
  }
}

class Robot implements Sounding {
  public void sound(){
    System.out.println("Robot: 삐빕!");
  }
}

 


강의 출처 : cloudstudying.kr/lectures/267

728x90
반응형


Comments