JAVA

221014 인터페이스 2

주영재 2022. 10. 14. 15:38

부모

package day09.inter.basic3;

public abstract class Animal {

	public abstract void eat();
	
}

 

클래스와 인터페이스를 상속받은 자식

package day09.inter.basic3;

public class Dog extends Animal implements IPet{

	public void eat() {
		System.out.println("갱얼쥐는 사료를 먹어요");
		
	}
	
	public void play() {
		System.out.println("갱얼쥐는 방에서 놀아요");
	}
}

 

 

 

package day09.inter.basic3;

public class Cat extends Animal implements IPet{

	public void eat() {
		System.out.println("냐옹이는 생선을 먹어요");
	}

	@Override
	public void play() {
		System.out.println("냐옹이는 방에서 놀아요");
	}
}

 

클래스 상속받은 자식

package day09.inter.basic3;

public class Tiger extends Animal{

	public void eat() {
		System.out.println("호돌이는 고기를 먹어요");
	}

}

 

부모

package day09.inter.basic3;

public abstract class Fish {
	
	public abstract void swim();

}

 

 

클래스와 인터페이스를 상속받은 자식

package day09.inter.basic3;

public class GoldFish extends Fish implements IPet {

	@Override
	public void swim() {
		System.out.println("금붕어는 강에서 놀아요");
	}
	
	public void play() {
		System.out.println("금붕어는 어항에서 놀아요");
	}

}

 

클래스만 상속받은 자식 

package day09.inter.basic3;

public class Shark extends Fish {

	@Override
	public void swim() {
		System.out.println("상어는 바다에서 놀아요");
	}

}

 

인터페이스

package day09.inter.basic3;

public interface IPet {
	void play();//....

}

 

사용자클래스-static메서드 사용하기

package day09.inter.basic3;

public class PetHouse {
	
	//1.IPet타입을 받아서 기능을 출력하는 static메서드
	
	public static void pet(IPet i) {
		i.play();
	}
	
	
	//2.IPet[] 타입을 매개변수로 받아서 배열 내부 Pet들의 play기능을 전부 출력하는 메서드
	public static void house(IPet[] ip) {
		for(IPet i : ip) {
			i.play();
		}
	}
	

}

 

main

package day09.inter.basic3;

public class MainClass {
	public static void main(String[] args) {
		
		//Dog d = new Dog(); //eat, play
		//Animal d = new Dog();//eat
		//IPet d = new Dog();//play
		
		Animal baduk = new Dog(); 
		Animal nabi = new Cat();
		Animal hodol = new Tiger();
		
		//1.Animal 배열에 저장
		Animal[] arr = {baduk, nabi, hodol};
		for(Animal a :arr) {
			a.eat();
		}
		
		//2. 바둑이는 현재 Animal이지만 생성된 클래스가 인터페이스 상속을 받고 있다면, 상호형변환이 됩니다.
		IPet i1 =(IPet)arr[0];
		IPet i2 =(IPet)nabi;
		IPet i3 = new GoldFish();
		
		IPet[] arr2 = {i1, i2, i3};
		for(IPet i : arr2) {
			i.play();
		}
		System.out.println("====================");
		PetHouse.pet(i1);
		PetHouse.house(arr2);
		
		
		
	}

}
갱얼쥐는 사료를 먹어요
냐옹이는 생선을 먹어요
호돌이는 고기를 먹어요
갱얼쥐는 방에서 놀아요
냐옹이는 방에서 놀아요
금붕어는 어항에서 놀아요
====================
갱얼쥐는 방에서 놀아요
갱얼쥐는 방에서 놀아요
냐옹이는 방에서 놀아요
금붕어는 어항에서 놀아요

뭘 상속받았는지에 따라 호출가능한 메서드가 다르다.

자신 객체가 아닌 부모나 인터페이스 객체로 받는 것은 배열에 넣어 처리하기 편하기 때문!

애당초 다형성과 상속은 뗄 수 없는 관계. 

 

바둑이는 Animal이지만, Dog클래스가 인터페이스도 상속받고 있기 때문에 형변환이 가능하다.

 

 

 

인터페이스에서 static과 default메서드도 가능
많이 쓸 일은 없다

 

인터페이스

package day09.inter.default_;

public interface MyInter {
	//상수, 추상, default, static
	
	double PI = 3.14;
	void some1();
	
	//default메서드 - 인터페이스에도 몸체를 가지는 메서드 선언이 가능합니다
	default void some2() {
		System.out.println("default메서드 실행");
	}
	
	static void some3() {
		System.out.println("static메서드 실행");
	}
	
	
}

상속

package day09.inter.default_;

public class MyClass implements MyInter{

	@Override
	public void some1() {
		System.out.println("some1 오버라이딩");
	}
}

 

main

package day09.inter.default_;

public class MainClass {
	public static void main(String[] args) {
		MyInter i =new MyClass();
		i.some1();//오버라이딩된 메서드 
		i.some2();//default 메서드
		MyInter.some3(); //static메서드
		System.out.println(MyInter.PI);//상수
	}

}
some1 오버라이딩
default메서드 실행
static메서드 실행
3.14

인터페이스로 받았으니, 안에 있는 default메서드와 static메서드를 사용하는 것이 가능