Java
★ 인터페이스(interface) ★
햄발자
2024. 4. 25. 16:33
인터페이스 (interface)
- 모든 메서드가 추상 메서드 로 선언됨 public abstract
- 모든 변수는 상수 로 선언됨 public static final
예시
package basic.ch22;
interface Animal {
// 추상 메서드만 선언 가능
// public abstract void eat();
// public abstract void move();
// 축약 가능
void eat();
void move();
}
// implements - 구현하다
class Dog implements Animal {
@Override
public void eat() {
System.out.println("먹이를 먹다");
}
@Override
public void move() {
System.out.println("총총 다닌다");
}
}
class Bird implements Animal {
@Override
public void eat() {
System.out.println("모이를 먹다");
}
@Override
public void move() {
System.out.println("날아 다니다");
}
}
package basic.ch22;
interface Animal {
// 추상 메서드만 선언 가능
// public abstract void eat();
// public abstract void move();
// 축약 가능
void eat();
void move();
}
// implements - 구현하다
class Dog implements Animal {
@Override
public void eat() {
System.out.println("먹이를 먹다");
}
@Override
public void move() {
System.out.println("총총 다닌다");
}
}
class Bird implements Animal {
@Override
public void eat() {
System.out.println("모이를 먹다");
}
@Override
public void move() {
System.out.println("날아 다니다");
}
}
인터페이스의 특징
추상 메서드
인터페이스는 추상 메서드(구현부가 없는 메서드)만을 가질 수 있습니다. 자바 8부터는 default 메서드와 staitc 메서드를 가질 수 있게 되었습니다.
다중 상속
클래스는 여러 인터페이스를 구현할 수 있으므로, 다중 상속의 효과를 낼 수 있습니다.
구현
클래스가 인터페이스를 구현할 때는 implements 키워드를 사용합니다.
package basic.ch22;
public abstract class HomeAppliances {
int width;
int height;
String color;
}
package basic.ch22;
public interface RemoteController {
// 모든 변수는 --> public static final
// 모든 메서드 --> 추상 메서드 public abstract
public abstract void turnOn();
void turnOff(); // 축약 가능
}
package basic.ch22;
public interface SoundEffect {
// public abstract void soundOn();
void soundOn();
}
package basic.ch22;
public class Refrigerator extends HomeAppliances
implements RemoteController, SoundEffect {
@Override
public void turnOn() {
System.out.println("냉장고를 켭니다.");
}
@Override
public void turnOff() {
System.out.println("냉장고를 끕니다.");
}
@Override
public void soundOn() {
System.out.println("띠리링 ~~~ ");
}
}
package basic.ch22;
public class Televsion extends HomeAppliances implements RemoteController {
@Override
public void turnOn() {
System.out.println("TV를 켭니다");
}
@Override
public void turnOff() {
System.out.println("TV를 끕니다");
}
}
package basic.ch22;
public class ToyRobot implements RemoteController, SoundEffect {
int width;
int height;
String color;
@Override
public void turnOn() {
System.out.println("장남감 로봇을 켭니다.");
}
@Override
public void turnOff() {
System.out.println("장남감 로봇을 끕니다.");
}
@Override
public void soundOn() {
System.out.println("도도동~");
}
}
인터페이스 와 추상클래스 응용
package basic.ch22;
public interface Calc {
public abstract int add(int n1, int n2);
public abstract int substract(int n1, int n2);
public abstract int times(int n1, int n2);
public abstract double divide(int n1, int n2);
}
package basic.ch22;
public abstract class Calculator implements Calc {
// 예상 테스트 값 n1 - 10 , n2 - 0
@Override
public double divide(int n1, int n2) {
if(n1 == 0 || n2 == 0) {
System.out.println("어떤 수를 0으로 나눌 수 없습니다");
return 0.0;
}
return n1 / n2;
}
}
package basic.ch22;
public class CompleteCalc extends Calculator {
@Override
public int add(int n1, int n2) {
return n1 + n2;
}
@Override
public int substract(int n1, int n2) {
return n1 - n2;
}
@Override
public int times(int n1, int n2) {
return n1 * n2;
}
public void showInfo() {
System.out.println("계산 완료");
}
// 코드 테스트 메인 함수
public static void main(String[] args) {
Calc calc = new CompleteCalc(); // 업캐스팅된 상태
System.out.println(calc.add(10, 10));
System.out.println(calc.divide(10, 0));
System.out.println("--------------------");
((CompleteCalc)calc).showInfo();
// 반복문, 제어문 활용한다면 instanceof 연산자를 기억하자
if( calc instanceof CompleteCalc ) {
((CompleteCalc) calc).showInfo();
}
}
}
인터페이스를 통한 동물 경주 게임 설계
문제1
여기에 거북이, 토끼 클래스가 존재합니다. 어느 날 둘이 경주 게임에 참가하자고 합의를 하였습니다. 단, 참가를 하기 위해서는 본인에 이름과 경주 속도를 알려주는 장치를 달아야 중개가(일종에 스펙) 가능하다고 합니다. 이 상황을 코드로 작성해 봅시다.
package basic.ch22;
public interface RaceParticipant {
String getName();
int getSpeed();
}
package basic.ch22;
public class Turtle implements RaceParticipant {
private final int speed = 2;
@Override
public String getName() {
return "깡총깡총거북이";
}
@Override
public int getSpeed() {
return speed;
}
}
연극 , 로미오라는 역할, 배우1과 배우2
문제2
더블 캐스팅(Double Casting) : 주연 역할을 두 명의 배우가 번갈아 가며 연기하여, 공연의 부담을 분담하거나 다양한 해석을 관객에게 제공할 수 있는 장점이 있습니다.
package basic.ch22;
public interface Romeo {
void performAsRomeo();
}
package basic.ch22;
public class Actor implements Romeo {
String name;
public Actor(String name) {
this.name = name;
}
@Override
public void performAsRomeo() {
System.out.println(name + " 가 줄리엣 연극합니다");
}
}
package basic.ch22;
public class Student implements Romeo {
String name;
public Student(String name) {
this.name = name;
}
@Override
public void performAsRomeo() {
System.out.println("학교 축제에서 " + name + " 이 연극을 합니다");
}
}