인터페이스 ( Interface )
- 인터페이스가 생긴 이유
▶ 클래스는 다중 상속을 지원하지 않는다.
▶ 아래 그림처럼 부모클래스 아래 여러 자식클래스들 중 하나의 클래스를 다른 부모클래스로 추가하고 싶은 경우
기존 클래스와 동일한 클래스를 포유류의 자식클래스로 만들어야함으로, 재활용성이 떨어지게 된다.
- 위와 같이 부모클래스를 추상클래스로 정의하고, 포유류를 Interface 구조로 정의를 하면
추상메서드를 이용해 해당 기능만 정의가 가능하다. - 인터페이스로 정의하고, 포유류의 기능을 구현(상속)하는 형태로 사용이 가능하다.
- 클래스에서 인터페이스를 구현 할 때는 클래스 이름 뒤에 implements 키워드를 사용해야한다.
1번 interface
public interface Inter1 {
//인터페이스는 상수, 추상메서드 +a(static, default)
int A = 1; //자동으로 상수로 선언됩니다.
void method01(); //자동으로 추상메서드가 됩니다.
//static메서드도 선언이 됩니다.
public static void method03() {
System.out.println("static메서드 선언 가능");
}
//인터페이스에서 몸체를 가진 메서드 default
public default void method04() {
System.out.println("default메서드 선언 가능");
}
}
2번 interface
public interface Inter2 {
double PI = 3.14;
void method02();
}
interface를 상속받는 클래스
public class Basic implements Inter1, Inter2 {
//클래스가 인터페이스를 상속받을 때는 implements 키워드를 씁니다.
//클래스가 인터페이스를 구현한다(상속) 이라고 부릅니다.
//인터페이스에 선언된 추상메서드는 자식에서 반드시 오버라이딩 되야합니다.
@Override
public void method01() {
System.out.println("오버라이드 된 메서드 1번");
}
public void method03() {
System.out.println("basic의 메서드 3번");
}
@Override
public void method02() {
System.out.println("오버라이드 된 메서드 2번");
}
}
부모타입
public class MainClass {
public static void main(String[] args) {
//인터페이스는 객체 생성을 할 수 없습니다.
//Inter1 i1 = new Inter1();
Basic b = new Basic();
b.method01(); //
//인터페이스는 부모 타입이 될 수 있습니다.
Inter1 i1 = b;
i1.method01(); //
System.out.println("------------------------------");
/*
* 인터페이스 타입으로 변환되면, 자식의 기능을 사용할 수 없습니다.
*
* 다시 자식의 기능을 사용하고 싶다면, 형변환이 가능합니다.
*/
Basic bb = (Basic)i1;
bb.method01();
bb.method03();
//default메서드
bb.method04();
Inter1.method03();
}
}
인터페이스의 기능
- 인터페이스 기능 1 : 다중 상속 지원
▶ 여러 인터페이스를 동시 구현 가능
- 인터페이스 기능 2 : 메서드 명세서
: 자바의 인터페이스는 객체의 사용방법을 정의한 타입으로 객체의 교환성을 높여준다.
다형성을 구현하는 매우 중요한 역할을 한다.
- 인터페이스 기능 3 : 사용방법이 동일한 클래스를 만드는 기술
부모클래스 1
public abstract class Animal {
public abstract void eat();
}
자식클래스 1-1
public class Dog extends Animal implements IPet{
@Override
public void eat() {
System.out.println("강아지는 사료를 먹어요");
}
@Override
public void play() {
System.out.println("강아쥐는 밖에서 놀아요");
}
}
자식클래스 1-2
public class Cat extends Animal implements IPet {
@Override
public void eat() {
System.out.println("고양이는 생선을 먹어요");
}
@Override
public void play() {
System.out.println("고양이는 방에서 놀아요");
}
}
자식클래스 1-3
public class Tiger extends Animal {
@Override
public void eat() {
System.out.println("호랑이는 고기를 먹어요");
}
}
부모클래스 2
public abstract class Fish {
public abstract void swim();
}
자식클래스 2-1
public class Shark extends Fish{
@Override
public void swim() {
System.out.println("상어는 바다에서 놀아요");
}
}
자식클래스 2-2
public class GoldFish extends Fish implements IPet{
@Override
public void swim() {
System.out.println("금붕어는 어항에서 헤엄쳐요");
}
@Override
public void play() {
System.out.println("금붕어는 어항에서 놀아요");
}
}
인터페이스
public interface IPet {
void play();
}
메인클래스
public class MainClass {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
Animal tiger = new Tiger();
Fish gold = new GoldFish();
Fish shark = new Shark();
//dog, cat, goldfish는 IPet타입이 될 수 있습니다.
//ex) 강아지는 Animal이지만, 하위클래스가 상호연관이 있다면, 형변환이 됩니다
IPet p1 = (IPet)dog;
IPet p2 = (IPet)cat;
IPet p3 = (IPet)gold;
IPet[] arr = {p1, p2, p3 };
for(IPet p : arr ) {
p.play();
}
System.out.println("--------------------------");
Animal a = (Animal)p1;
Animal a2 = (Animal)p2;
//Animal a3 = (Animal)p3; //err
}
}
위 메인클래스에서 처럼 여러 형변환을 이용해 해당 기능을 사용할 수 있다.
728x90
'Programming > Java' 카테고리의 다른 글
[JAVA] API ( java.lang package ) (0) | 2023.12.04 |
---|---|
[JAVA] 예외 처리 (0) | 2023.12.01 |
[JAVA] Final 과 Abstract(추상화) (0) | 2023.11.30 |
[JAVA] SingleTon Design Pattern (0) | 2023.11.30 |
[JAVA] 정적 제한자 Static (0) | 2023.11.30 |