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메서드를 사용하는 것이 가능