* 인터페이스(interface)?
1. 완벽한 추상화를 제공한다.
==> - 일종의 추상클래스. 하지만 추상클래스보다 추상화 정도가 더 높다.
- 실제 구현된 것이 전혀 없는 기본 설계도(알멩이 없는 껍데기).
- 추상메서드와 상수만을 멤버로 갖는다.
- 인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용이 됨.
- 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는데 사용됨 ==> 명세서
2. 클래스와 클래스 사이의 중계적 역할을 하는 서비스를 제공함.
==> 객체와 객체 중간에 놓이는 통신 채널.
3. 모든 메서드가 추상화(추상메서드)이다.
4. 프로젝트 진행 시 표준 규약에 따른다.
==> 추상클래스보다 더 많이 사용이 됨.
5. 인터페이스는 상수와 추상메서드로만 구성됨.
6. 모든 변수는 상수가 된다.
예) public static final로 인식을 함.
7. 모든 메서드는 추상메서드가 된다.
예) public abstract로 인식을 함.
8. 인터페이스는 객체 생성이 불가능함.
9. 자식클래스로 상속을 하여 자식클래스로 객체 생성.
==> 인터페이스의 추상메서드는 반드시 재정의(강제성이 부여됨)
10. 인터페이스는 다중 상속을 제공함.
11. class -> interface 키워드 사용.
extends -> implements 키워드 사용.
* API(Application Programming Interface)
- 자바 시스템을 제어하기 위해서 자바에서 제공하는 명령어들의 집합을 말함.
- JDK를 설치를 하면 자바 시스템을 제어하기 위한 API들을 제공해 주고 있음.
- 자바 개발자들은 자바에서 제공한 API를 이용해서 자바 어플리케이션을 만들게 됨.
- API 문서들을 모아 놓은 곳 : http://docs.oracle.com/javase/8/docs/api/
Java Platform SE 8
docs.oracle.com
기본예제)
public interface Inter { // 인터페이스
// 6. 모든 변수는 상수가 된다.
int num = 100; // 인스턴스 멤버변수
// 7. 모든 메서드는 추상메서드이다.
void output1(); // 추상메서드
void output2(); // 추상메서드
}
public class Sub implements Inter {
@Override
public void output1() {
System.out.println("인터페이스 output1() 메서드 재정의");
}
@Override
public void output2() {
System.out.println("인터페이스 output2() 메서드 재정의");
}
}
public class Ex01_Inter {
public static void main(String[] args) {
// 인터페이스는 객체 생성 불가능.
// Inter inter = new Inter();
Sub sub = new Sub();
// static final 상수로 인식
// 상수에 값을 변경하는 것은 불가능.
// sub.num = 250;
sub.output1();
sub.output2();
}
}
예제1) 계산기
package interfaces;
public interface Calculator {
int add(int su1, int su2);
int sub(int s1, int s2);
int mul(int a1, int a2);
int divide(int aa1, int aa2);
}
public class GoodCalc implements Calculator {
@Override
public int add(int su1, int su2) {
return su1 + su2;
}
@Override
public int sub(int s1, int s2) {
return s1 - s2;
}
@Override
public int mul(int a1, int a2) {
return a1 * a2;
}
@Override
public int divide(int aa1, int aa2) {
return aa1 / aa2;
}
}
import java.util.Scanner;
public class Ex02_Calculator {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
GoodCalc calc = new GoodCalc();
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.sub(num1, num2));
break;
case "*" :
System.out.println("곱셈 >>> " + calc.mul(num1, num2));
break;
case "/" :
System.out.println("나눗셈 >>> " + calc.divide(num1, num2));
break;
}
sc.close();
}
}
예제2) 인터페이스끼리의 상속
interface Inter1 {
void aa();
}
interface Inter2 {
void bb();
}
// 인터페이스들끼리 상속을 받을 때는 extends 키워드를 사용함.
// 일반 클래스에서 상속은 단일 상속만 가능함.
// 인터페이스에서는 다중 상속이 가능함.
interface Inter3 extends Inter1, Inter2 {
void cc();
}
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() 메서드 재정의");
}
}
public class Ex03_Main {
public static void main(String[] args) {
Total total = new Total();
total.aa(); total.bb(); total.cc();
}
}
예제3)
public interface RemoteControl {
// 상수로 변경
int max_volume = 10;
int min_volume = 1;
void turnOn();
void turnOff();
void setVolume(int volume);
}
public class Audio implements RemoteControl {
int volume;
@Override
public void turnOn() {
System.out.println("Audio 전원을 켭니다.");
}
@Override
public void turnOff() {
System.out.println("Audio 전원을 끕니다.");
}
@Override
public void setVolume(int volume) {
if(volume > RemoteControl.max_volume) {
this.volume = RemoteControl.max_volume;
}else if(volume < RemoteControl.min_volume) {
this.volume = RemoteControl.min_volume;
}else {
this.volume = volume;
}
System.out.println("현재 Audio 볼륨 >>> " + this.volume);
}
}
public class Computer implements RemoteControl {
int volume;
@Override
public void turnOn() {
System.out.println("Computer 전원을 켭니다.");
}
@Override
public void turnOff() {
System.out.println("Computer 전원을 끕니다.");
}
@Override
public void setVolume(int volume) {
if(volume > RemoteControl.max_volume) {
this.volume = RemoteControl.max_volume;
}else if(volume < RemoteControl.min_volume) {
this.volume = RemoteControl.min_volume;
}else {
this.volume = volume;
}
System.out.println("현재 Computer 볼륨 >>> " + this.volume);
}
}
public class TV implements RemoteControl {
int volume;
@Override
public void turnOn() {
System.out.println("TV 전원을 켭니다.");
}
@Override
public void turnOff() {
System.out.println("TV 전원을 끕니다.");
}
@Override
public void setVolume(int volume) {
if(volume > RemoteControl.max_volume) {
this.volume = RemoteControl.max_volume;
}else if(volume < RemoteControl.min_volume) {
this.volume = RemoteControl.min_volume;
}else {
this.volume = volume;
}
System.out.println("현재 TV 볼륨 >>> " + this.volume);
}
}
public class Ex05_Remote_Main {
public static void main(String[] args) {
Audio audio = new Audio();
Computer computer = new Computer();
TV tv = new TV();
// Audio
audio.turnOn();
audio.setVolume(7);
audio.turnOff();
System.out.println();
// Computer
computer.turnOn();
computer.setVolume(13);
computer.turnOff();
System.out.println();
// TV
tv.turnOn();
tv.setVolume(0);
tv.turnOff();
}
}
'Back > JAVA' 카테고리의 다른 글
자바 빈(Java Bean)과 패키지(package) (0) | 2021.03.12 |
---|---|
상속 - 다형성(polymorphism) (0) | 2021.03.12 |
상속 - 추상클래스(abstract class) (0) | 2021.03.12 |
[문제] 상속을 사용하여 정규직과 계약직의 급여 관리 프로그램을 만드시오. (0) | 2021.03.10 |
메서드 재정의(method overriding) (0) | 2021.03.10 |