본문 바로가기
Programming/Java

[JAVA] 인터페이스 (Interface)

by 공부합시다홍아 2023. 11. 30.
 

[JAVA] Final 과 Abstract(추상화)

[JAVA] SingleTon Design Pattern [JAVA] 정적 제한자 Static [JAVA] 다형성 [JAVA] 접근 제한자 [JAVA] 패키지와 상속 [JAVA] 객체와 클래스 [JAVA] 스택(Stack)과 큐(Queue) [JAVA] 매서드 [JAVA] 2차원 배열 [JAVA] 배열을 이용

hong-study.tistory.com


인터페이스 ( 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