프로그래밍/자바(java) 융합개발자 2차

[취성패] 자바 배우기 - 선수학습(인터페이스)

aSpring 2020. 12. 13. 17:49
728x90
728x90

[인터페이스 정의]

1. 인터페이스 개요

ex) 음향기기의 볼륨조절 장치 -> 인터페이스로 구현 -> 여러가지 음향기기 클래스에 쉽게 적용 가능

 

- 클래스와는 다른 개념

- 명칭과 매개변수가 동일한 메서드로 객체에 접근 가능하도록 하기 위한 기법

- 인터페이스의 모든 메서드는 추상 메서드이며 "abstract" 키워드를 붙이지 않아도 됨

- 인터페이스에 정의된 메서드는 인터페이스를 사용하는 클래스에서 반드시 구현해야 함

- 인터페이스의 모든 메서드는 public으로 선언해야 함

- 인터페이스는 값을 저장하는 일반 변수를 가질 수 없으나 상수는 사용 가능함

- 인터페이스의 메서드는 내부적으로 "public abstract"로 인식함

- 클래스에서 인터페이스를 적용할 때 "구현한다."라는 표현을 쓰며 "implements" 키워드를 사용함

- 인터페이스를 적용하는 클래스에서 인터페이스의 메서드 내용을 구체적으로 구현해야 함

 

- 자바의 클래스는 다중 상속이 불가능하나! 인터페이스를 이용할 경우 다중 상속이 가능

  (클래스는 단 한개만 상속받을 수 있음)

- 문법

interface Volume {  -> class 대신 interface 사용

 void volumeUp();

}

- 인터페이스를 클래스에서 구현하는 문법

class Audio implements Volume {

 public void volumeUp() { 문장 }

}

 

2. 인터페이스 활용

- 인터페이스 정의

interface Volume {

 void volumeUp();

 void volumeDown(); -> 추상메서드와 유사-메서드 명칭만 작성. 내용은 작성X(구현/적용하는 클래스에서 작성)

}

- 인터페이스 구현

class Audio implements Volume {    -> volumeUp, Down의 실제 내용을 여기서 작성

 public void volumeUp() {

   System.out.println("오디오 볼륨을 높인다.");

 }

 public void volumeDown() {

   System.out.println("오디로 볼륨을 낮춘다.");  

 }

}

 

[다중 상속]

1. 다중 상속 개요

- 자바의 클래스는 다중 상속 불가능 -> 인터페이스를 이용하여 다중 상속 가능

- 다중 상속의 부작용 : 승용차와 트럭 모두를 상속받게 될 경우 중복적인 상속을 받을 우려가 있음

- 자동차 클래스를 승용차와 트럭 클래스가 상속을 받음(승용차, 트럭에는 공통된 내용이 있을 것)

  -> 승용차와 트럭 두 가지 클래스를 상속 받을 경우(다중 상속) -> 중복된 내용 발생 -> 자바에서 다중 상속 허용X

- 문법

interface Volume{ 문장 }

interface Tuner{ 문장 }

class Audio implements Volume, Tuner{  } -> 두 개를 동시에 상속 받아서 Audio 클래스를 구현함

 

2. 다중 상속 활용

- 인터페이스 정의

interface Volume {  -> 인터페이스 1

 void printVolume();

}

 

interface Tuner {  -> 인터페이스 2

 void printTuner(); -> 메서드 명칭만 부여 : 실제 내용은 인터페이스를 구현하는 곳에서 작성!

}

 

- 클래스에서 2개의 인터페이스 구현(다중 상속 효과)

class Audio V implements Volume, Tuner {   -> 두가지 이상의 인터페이스 구현 -> 각 메서드를 모두 구현 해주어야 함

 public void printVolume() {

   System.out.println("볼륨 조절기");

 {

 public void printTuner() {

   System.out.println("채널 선택기");

 }

}

 

V -> 이 부분에 'extends B'라고 추가 해서 B 클래스 하나를 상속받을 수도 있음.

 

class Audio extends B implements Volume, Tuner {   -> B 클래스 상속 받고 Volume, Tuner 인터페이스를 모두 구현 

 public void printVolume() {

   System.out.println("볼륨 조절기");

 {

 public void printTuner() {

   System.out.println("채널 선택기");

 }

}

 

+예제 :

- 다중 상속을 활용한 인터페이스 정의 예제

interface Volume { -> Volume이라는 인터페이스 정의

 void printVolume(); -> 메서드 이름만 : 내용은 작성하지 않음

}

 

interface Tuner {

 void printTuner();

}

 

interface Controller extends Volume, Tuner {  -> 인터페이스 2개(Volume, Tuner) 상속받아 Controller 정의

 void printController();  -> printController라는 메서드 이름만 정의

}

 

class Audio implements Controller {  -> 반드시 Controller의 메서드 구현되도록 작성

 public void printVolume() {                 그런데 Controller는 두가지 인터페이스를 상속 받음

  System.out.println("볼륨 조절기");        즉 3가지 메서드 모두 구현해주어야 함(Controller, Volume, Tuner의 메서드)

 }

 public void printTuner() {

  System.out.println("채널 선택기");

 }

 public void printController() {

  System.out.println("볼륨, 채널 통합 조정");

 }

}

 

class TestAudio {

 public static void main(String args[]) {

  Audio a = new Audio();

  a.printVolume();   -> 볼륨 조절기

  a.printTuner();     -> 채널 선택기

  a.printController();  -> 볼륨, 채널 통합 조정

 }

}

 

[실습]

interface VolumeSystem {

   void volumeUp();

   void volumeDown();

}

public class Exam15_1 implements VolumeSystem {

   public void volumeUp() {

      System.out.println("볼륨을 높인다.");

   }

   public void volumeDown() {

      System.out.println("볼륨을 낮춘다.");

   }

   public static void main(String[] args) {   -> 객체 생성 

      Exam15_1 audio = new Exam15_1();

      audio.volumeUp();

      audio.volumeDown();

   }

}

 

실행결과

볼륨을 높인다.

볼륨을 낮춘다.

 

728x90
728x90