서로 다른 시스템이나 장치 사이에서 정보를 주고 받는 접점·경계면
인터페이스로부터 클래스가 메소드를 물려받고 이를 구현하는 행위
키보드 : 게임 시 기능 / 문서작업 시 기능 등 프로그램은 다르지만 하나의 키보드로 조작 가능
리모콘 : 서로 다른 모델/제조사의 TV를 하나의 리모콘으로 조작 가능
키오스크 : 식당/편의점/병원 등 사용처는 다르지만 동일한 기계로 사용은 가능
서로 다른 장치 사이에, 동일한 목적을 달성하기 위해, 서로 다른 기능을 작동하게 하는 것 (호환성)
(1) 선언할 패키지 우클릭 > new > java class > Interface
(2) 첫글자를 대문자로 하여 Interface 파일 생성
※ 멤버변수, 생성자, 메소드 사용 불가능!!
(1) 상수
public static final 키워드가 필요하나 자동으로 포함되므로 생략 가능(2) 추상메소드
{}이 없는 메소드abstract 키워드가 필요하나 자동으로 포함되므로 생략 가능(3) 확인 방법
객체 instanceof 타입 >> boolean으로 결과 반환class 구현클래스 implements 인터페이스1, 인터페이스2{ }
1) "소리를 냅니다."라는 추상 메소드 makeSound()를 가진 Soundable 인터페이스를 정의하세요.
2) Soundable 인터페이스를 구현(implements)하는 Cat 클래스와 Dog 클래스를 만드세요.
3) 각 클래스에서 makeSound() 메소드를 오버라이딩하여, 각각 "야옹", "멍멍"을 출력하도록 구현하세요.
4) main 함수에서 Cat 객체와 Dog 객체를 생성하고, 각 객체의 makeSound() 메소드를 호출하여 결과를 확인하세요.
// 인터페이스 선언
interface Soundable {
void makeSound(); //실행문이 없는 추상메소드 makeSound()선언
}
// Soundable 인터페이스 구현을 위한 Cat class
class Cat implements Soundable {
public void makeSound() { //makeSound() 메소드 구현
System.out.println("야옹");
}
}
// Soundable 인터페이스 구현을 위한 Dog class
class Dog implements Soundable {
public void makeSound() { //makeSound() 메소드 overriding
System.out.println("멍멍");
}
}
public class Practice {
public static void main(String[] args) {
Cat cat = new Cat();
Dog dog = new Dog();
cat.makeSound(); // 출력 : 야옹
dog.makeSound(); // 출력 : 멍멍
}
}
1) RemoteControl 인터페이스를 만드세요.
2) 이 인터페이스 안에, public static final로 최대 볼륨 MAX_VOLUME = 10과 최소 볼륨 MIN_VOLUME = 0 상수를 정의하세요.
3) main 함수에서 객체를 생성하지 않고, RemoteControl.MAX_VOLUME과 같이 인터페이스 이름으로 직접 접근하여 두 상수를 출력하세요.
// RemoteControl 인터페이스 선언
interface RemoteControl {
// 멤버변수
// interface의 멤버변수는 `public static final`이 자동이므로 생략 가능
int MAX_VOLUME = 10;
int MIN_VOLUME = 0;
}
public class Practice {
public static void main(String[] args) {
System.out.println(RemoteControl.MAX_VOLUME); // 출력 : 10
System.out.println(RemoteControl.MIN_VOLUME); // 출력 : 0
// RemotoeControl은 [인터페이스이]므로
// `RemotoeControl 변수 = new RemotoeControl()`와 같이 인스턴스 불가!!
// `타입.메소드();`와 같이 바로 메소드 실행은 가능!!
}
}
1) "하늘을 납니다."를 출력하는 fly() 추상 메소드를 가진 Flyable 인터페이스를 만드세요.
2) "물에서 헤엄칩니다."를 출력하는 swimmable() 추상 메소드를 가진 Swimmable 인터페이스를 만드세요.
3) Duck 클래스가 Flyable과 Swimmable 두 인터페이스를 모두 구현하도록 작성하세요.
4) main 함수에서 Duck 객체를 생성하고, fly()와 swimmable() 메소드를 모두 호출하여 결과를 확인하세요.
// Flyable 인터페이스 선언
interface Flyable {
// fly() 추상 메소드 선언
void fly();
}
// Swimmalbe 인터페이스 선언
interface Swimmalbe {
void swimmable();
}
// 상기의 두 인터페이스를 구현하는 Duck class
class Duck implements Flyable, Swimmalbe {
// Flyable 인터페이스의 fly() 메소드를 overriding
public void fly() {
System.out.println("하늘을 납니다.");
}
// Swimmalbe 인터페이스의 swimmable() 메소드를 overriding
public void swimmable() {
System.out.println("물에서 헤엄칩니다.");
}
}
public class Practice {
public static void main(String[] args) {
Duck duck = new Duck();
duck.fly();
duck.swimmable();
}
}
1) "환영합니다."를 출력하는 welcome() 추상 메소드를 가진 Greeting 인터페이스를 만드세요.
2) main 함수에서, 별도의 클래스 파일을 만들지 않고, Greeting 인터페이스 타입의 변수를 선언하면서 익명 구현 객체를 생성하여 welcome() 메소드를 즉석에서 구현하고 호출하세요.
예] Greeting g = new Greeting() { ... };
interface Greeting{
void welcome();
}
public class Practice {
public static void main(String[] args) {
Greeting greeting = new Greeting() {
public void welcome() {
System.out.println("환영합니다.");
}
};
greeting.welcome();
}
}
| 상속 | VS | 구현(인터페이스) | |
|---|---|---|---|
| 키워드 | extends | Implements | |
| 객체생성 | O | X | |
| 상위 | 하나의 상위클래스 | 다수의 인터페이스 | |
| 메소드 | 선택적 오버라이딩 | 필수적 오버라이딩 | |
| 멤버 | 멤버변수, 생성자, 메소드 | 상수, 추상메소드 |