-
Java | InterfaceJAVA/JAVA 2020. 2. 3. 22:27
Interface 인터페이스
클래스 혹은 프로그램이 제공하는 기능을 명시적으로 선언하는 역할
특징
- 추상클래스와 동일하게 설계 목적으로 사용
- 멤버변수: 상수만 가능, static final을 이용해서 정적 상수 선언
(static final)을 작성하지 않아도 자동으로 설정됨 - 추상메소드만 선언 가능, 일반메소드 사용 X ↔ 추상 클래스
추상메소드만 사용하기 때문에 abstract 예약어 사용 X(써도 되긴 함) - 인터페이스 간 상속 가능
- 인터페이스를 상속받은 자식 클래스는
반드시 인터페이스의 추상메소드를 오버라이딩해야 함
강제성, 통일성 부여 - 구현된 코드가 없기 때문에 객체를 생성할 수 없음
- 다형성을 지원하는 방법 중 하나
※ 전체 프로그램의 설계도 역할, 둘 이상의 클래스에 통일성을 부여함
추상 클래스와의 차이점
인터페이스 추상 클래스 다중 상속 가능
완전한 다중 상속 X
implements(구현) 필요단일 상속만 가능 추상메소드만 작성 일반메소드도 사용 가능 ※ implements : 인터페이스로부터 상속받은 추상 메소드를
클래스에서 일반 메소드로 오버라이딩해서 기능을 부여하는 것
형식
접근 제어자 interface 인터페이스명{ // 상수 접근 제어자 [static final] 자료형 변수명; // 추상 메소드, 구현부{} X public [abstract] 반환형 메소드명(); }
상속 형식
인터페이스 → 인터페이스
interface 자식 인터페이스명 extends 부모 인터페이스명 {}
클래스 → 인터페이스
// 단일 상속 class 클래스명 implements 인터페이스명 {} // 다중 상속 class 클래스명 implements 인터페이스명1, 인터페이스명2 {}
클래스 → 클래스 & 인터페이스
// 클래스 하나와 여러 개의 인터페이스 상속 class 클래스명 extends 클래스명 implements 인터페이스명1, 인터페이스명2 {}
※ 주요 기능은 부모 클래스에 작성해 두고 부족한 부분을 인터페이스를 상속해서 채움
사용례
여러 개의 음향 기기에서 공통적으로 필요한 음악 재생 프로그램 설계
Volume.java
Volume 인터페이스 작성
package j200203; // 전체 프로그램의 설계도, 모든 클래스에서 공통으로 필요로하는 메소드 선언 public interface Volume { // 1. 볼륨 증가, 수정 목적(매개변수 O, 반환값 X) public void volumeUp(int level); // 2. 볼륨 감소 public void volumeDown(int level); // 3, 4 turn on, turn off // => 자식 인터페이스에서 구현 }
AdvanceVolume.java
volume 인터페이스를 상속하는 AdvanceVolume 인터페이스 작성
package j200203; public interface AdvanceVolume extends Volume { // 프로그램 실행 public void turnOn(); // 프로그램 종료 public void turnOff(); }
※ 프로그램 규모가 커지면 하나의 인터페이스에 모든 기능을 작성할 수 없기 때문에
여러 개의 인터페이스로 분할해서 기능별로 관리함
TV.java
AdvanceVolume 인터페이스를 상속하는 TV 클래스 작성
package j200203; public class TV implements AdvanceVolume { // 멤버 변수 선언, 기본 볼륨 설정 private int volLevel; // 1. 볼륨 증가 메소드 오버라이딩 public void volumeUp(int level) { volLevel += level; System.out.println("볼륨이 " + level + "만큼 증가했습니다."); System.out.println("현재 볼륨: " + volLevel); } // 2. 볼륨 감소 메소드 오버라이딩 public void volumeDown(int level) { if (volLevel - level < 0) { System.out.println("볼륨의 크기는 0보다 작을 수 없습니다!"); System.out.println("현재 볼륨: " + volLevel); } else { volLevel -= level; System.out.println("볼륨이 " + level + "만큼 감소했습니다."); System.out.println("현재 볼륨: " + volLevel); } } // 3. 전원 켜기 메소드 오버라이딩 public void turnOn() { // 전원을 켰을 때 기본 볼륨을 10으로 설정 volLevel = 10; System.out.println("TV 전원이 켜졌습니다."); } // 4. 전원 끄기 메소드 오버라이딩 public void turnOff() { System.out.println("TV 전원이 꺼졌습니다."); } }
※ TV 클래스와 유사한 Radio, Mp3, Speaker,,,, 등의 여러 가지 클래스를
간단한 수정만을 통해서 유사하게 작성할 수 있음
VolTest.java
TV 클래스와 그와 유사한 Radio 클래스를 객체화해서 실행
package j200203; public class VolTest { public static void main(String[] args) { // TV 클래스 객체화 TV tv = new TV(); tv.turnOn(); tv.volumeUp(3); tv.volumeDown(5); tv.turnOff(); System.out.println("======================="); // Radio 클래스 객체화 Radio rd = new Radio(); rd.turnOn(); rd.volumeUp(5); rd.volumeDown(20); rd.turnOff(); // 객체는 다 다르지만 공통으로 사용하는 // 메소드의 형식 및 이름은 동일하며 세부적인 기능(구현부)만 다름 // => 다형성 } }
사용례_인터페이스 & 추상 클래스 활용
도형(원, 사각형, 삼각형,,,)에 따른 면적을 구하고, 그림을 그리는 프로그램 작성
Shape.java
추상 클래스
면적을 구하는 추상 메소드 명시
면적 멤버 변수, 면적을 출력하는 일반 메소드 작성package j200203; public abstract class Shape { // 면적을 저장할 멤버 변수, 모든 도형에 공통으로 적용 public double res = 0.0; // =========== 추상 메소드 =========== // 원 면적 구하기, 반지름을 매개변수로 받는 메소드를 자식 클래스에서 구현 public abstract double areaCircle(int r); // 직사각형 abstract public double areaSquare(int w, int h); // =========== 일반 메소드 =========== // 면적 출력 메소드 public void printArea() { System.out.println("도형의 면적은 " + res + "입니다."); } }
Drawable.java
도형을 그리는 메소드를 명시하는 인터페이스
package j200203; public interface Drawable { public void draw(); // abstract가 생략되어 있음 }
ShapeTest.java
추상 메소드 구현(오버라이딩) 및 프로그램 실행
package j200203; // Shape 클래스와 Drawable 인터페이스 상속 public class ShapeTest extends Shape implements Drawable { // 원의 면적을 구하는 메소드 오버라이딩 public double areaCircle(int r) { return r * r * Math.PI; } // 사각형의 면적을 구하는 메소드 오버라이딩 public double areaSquare(int w, int h) { res = w * h; return res; } // 그림을 그리는 메소드 오버라이딩 public void draw() { System.out.println("원, 직사각형 그림을 그립니다."); } public static void main(String[] args) { ShapeTest st = new ShapeTest(); double ac = st.areaCircle(3); System.out.println("원 면적: " + ac); double sc = st.areaSquare(2, 5); System.out.println("사각형 면적: " + sc); st.draw(); } /* 원 면적: 28.274333882308138 사각형 면적: 10.0 원, 직사각형 그림을 그립니다. */ }
프로그램을 전체적으로 설계할 때 사용하는 인터페이스에 대해 알아보았습니다.
추상클래스는 일반메소드도 작성할 수 있으면서 단일 상속만 가능하지만,
인터페이스는 상수와 추상메소드만 작성할 수 있고 다중 상속이 가능하다는 것이 가장 큰 차이점입니다.
인터페이스는 클래스의 부족한 부분을 채우기 위해서도 사용할 수 있고,
전체적인 설계를 위해서도 사용할 수 있기 때문에 상황에 맞게 적절하게 사용해야겠습니다.
'JAVA > JAVA' 카테고리의 다른 글
Java | Inner Class 내부 클래스 & Anonymous class 익명 클래스 (0) 2020.02.04 Java | String Method(2) & Character Method (0) 2020.02.03 Java | Call by Value & Call by Reference (0) 2020.01.31 Java | Abstract 추상 클래스 & 추상 메소드 (0) 2020.01.31 Java | Final (0) 2020.01.31