인터페이스(interface)
1. 완벽한 추상화를 제공한다.
==> 일종의 추상클래스. 하지만 추상클래스보다 추상화 정도가 더 높다.
- 실제 구현된 것이 전혀 없는 기본 설계도(알멩이 없는 껍데기).
- 추상메서드와 상수만을 멤버로 갖는다.
- 인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용이 됨.
- 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는데 사용됨 ==> 명세서
2. 클래스와 클래스 사이의 중계적 역할을 하는 서비스를 제공함.
==> 객체와 객체 중간에 놓이는 통신 채널.
3. 모든 메서드가 추상화(추상메서드)이다.
4. 프로젝트 진행 시 표준 규약에 따른다.
==> 추상클래스보다 더 많이 사용이 됨.
5. 인터페이스는 상수와 추상메서드로만 구성됨.
6. 모든 변수는 상수가 된다.
예) public static final로 인식을 함.
7. 모든 메서드는 추상메서드가 된다.
예) public abstract로 인식을 함.
8. 인터페이스는 객체 생성이 불가능함.
9. 자식클래스로 상속을 하여 자식클래스에서 객체 생성.
==> 인터페이스의 추상메서드는 반드시 재정의(강제성이 부여됨)
10. 인터페이스는 다중 상속을 제공함.
How to define a interace
<Alarm>
- beep();
- playMusic();
'알람'이라는 기능은 비프음을 내거나(beep) 음악을 재생할 수 있을 것(playMusic)
이를 통해 Alarm이라는 인터페이스를 작성해보자
1. 인터페이스 선언 + 인터페이스 이름 작성
- class 키워드가 아닌 interface 키워드를 사용하여 선언함.
interface Alarm {
2. 내부에 프로토타입 메서드 작성
- 프로토타입 메서드란 내용이 없는 껍데기 메서드. 즉, 추상메서드
public void beep();
public void playMusic();
3. 이 프로토타입 메서드를 묶어, 하나의 역할. 즉 인터페이스를 만들 수 있음
interface Alarm {
public void beep();
public void playMusic();
}
4. 그럼 이제 해당 역할을 새로운 클래스에게 부여해보자.
implements 라는 키워드를 통해 인터페이스명을 명시한다.
=> smartPhone클래스는 알람 인터페이스를 구현받기로 약속됨.
class smartPhone implements Alarm {
5. 프로토타입 메서드를 새롭게 재정의해야만 함.
구체적으로 beep음을 어떻게 낼건지 등의 내용을 작성
class smartPhone implements Alarm {
public void beep() {
System.out.println("삐-삐삑!");
}
public void playMusic() {
System.out.println("동해물과 백두산이~");
}
}
예제01)
인터페이스 기능을 활용하여 계산기 기능을 구현해보자.
package interfaces;
import java.util.Scanner;
public class Ex02_Calculator {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Calc calc = new Calc();
System.out.print("첫번째 숫자 입력 : ");
int num1 = sc.nextInt();
System.out.print("두번째 숫자 입력 : ");
int num2 = sc.nextInt();
System.out.print("연산자 입력 : ");
String op = sc.next();
switch(op) {
case "+" :
System.out.println("덧셈 >>> " + calc.add(num1, num2));
break;
case "-" :
System.out.println("뺄셈 >>> " + calc.minus(num1, num2));
break;
case "*" :
System.out.println("곱셈 >>> " + calc.mul(num1, num2));
break;
case "/" :
System.out.println("나눗셈 >>> " + calc.divide(num1, num2));
break;
}
sc.close();
}
}
// 인터페이스
interface Calculator {
int add(int su1, int su2);
int minus(int su1, int su2);
int mul(int su1, int su2);
int divide(int su1, int su2);
}
// 구현체 클래스
class Calc implements Calculator {
// Calculator 인터페이스의 모든 프로토타입 메서드를 구현
@Override
public int add(int su1, int su2) {
return su1 + su2;
}
@Override
public int minus(int su1, int su2) {
return su1 - su2;
}
@Override
public int mul(int su1, int su2) {
return su1 * su2;
}
@Override
public int divide(int su1, int su2) {
return su1 / su2;
}
}
결과
첫번째 숫자 입력 : 20
두번째 숫자 입력 : 2
연산자 입력 : +
덧셈 >>> 22
예제02)
인터페이스끼리 상속받고자 하는건 가능할까?
인터페이스간 다중상속이 가능할까?
package interfaces;
public class Ex03_Main {
public static void main(String[] args) {
Total total = new Total();
total.aa(); total.bb(); total.cc();
}
}
// 인터페이스
interface Inter1 {
void aa();
}
// 인터페이스
interface Inter2 {
void bb();
}
//인터페이스들끼리 상속을 받을 때에는 extends 키워드를 사용함
//일반적으로 클래스에서 상속은 단일 상속만 가능하지만 인터페이스는 다중 상속이 가능함
interface Inter3 extends Inter1, Inter2 {
//void aa(); // 상속이 된 추상메소드
//void bb(); // 상속이 된 추상메소드
void cc();
}
// 구현체 클래스_결과적으로 Inter1,2,3을 구현하고 있음
class Total implements Inter3 {
@Override
public void aa() {
System.out.println("aa() 메서드 재정의");
}
@Override
public void bb() {
System.out.println("bb() 메서드 재정의");
}
@Override
public void cc() {
System.out.println("cc() 메서드 재정의");
}
}
결과
aa() 메서드 재정의
bb() 메서드 재정의
cc() 메서드 재정의
예제03)
하나의 클래스가 여러 인터페이스를 구현하고 싶을때는?
핸드폰과 그 기능들을 예시로 구현해보자.
package interfaces;
// 인터페이스_핸드폰의 기능들을 인터페이스로 정의
interface Camera {
// 사진을 찍는 기능
void photo();
}
interface DMB {
// TV를 보는 기능
void viewTv();
}
interface MP3 {
// 음악을 듣는 기능
void playMP3();
}
// 구현체 클래스
class MyPhone implements Camera, DMB, MP3{
//인터페이스의 모든 프로토타입 메서드를 구현
@Override
public void playMP3() {
System.out.println("핸드폰으로 음악을 들어요");
}
@Override
public void viewTv() {
System.out.println("핸드폰으로 TV를 봐요");
}
@Override
public void photo() {
System.out.println("핸드폰으로 사진을 찍어요");
}
}
public class Ex04_Main {
public static void main(String[] args) {
// 핸드폰 객체 생성
MyPhone phone = new MyPhone();
// 핸드폰의 각 역할 수행
phone.photo(); phone.viewTv(); phone.playMP3();
}
}
결과
핸드폰으로 사진을 찍어요
핸드폰으로 TV를 봐요
핸드폰으로 음악을 들어요
'Back-End > Java' 카테고리의 다른 글
[Java] 자바 빈(Java Bean), API, 패키지(package) (0) | 2021.08.18 |
---|---|
[Java] 다형성(polymorphism) (0) | 2021.08.18 |
[Java] 상속_추상클래스(abstracts class) (0) | 2021.08.17 |
[Java] 상속_메소드 재정의(method overriding) (0) | 2021.08.17 |
[Java] 상속(inheritance) (0) | 2021.08.17 |
댓글