= 인터페이스(Interface)
인터페이스가 생긴 원인 부터 알아볼까요?고양이나 강아지, 늑대는 animal이라는 추상클래스를 가지고있습니다. + 고양이나, 강아지에 짓다. 라는 기능을 추가하고싶다면?그럴 때, 사용할 때 interface구조로 정의 후, 추상 메서드로 그 기능만 정의해놓는다면인터페이스를 구현(상속)하는 형태로 사용이 가능하다.
인터페이스 구현 방법 : 클래스 이름 뒤에 implements사용
ex) class Cat extends Animal implements bark
= 기본 interface 예제 =
public class Cat extends KindaCat implements Pet {
@Override
public void sit() {
System.out.println("무시합니다.");
}
}
--------------------------------------------------
public class Malamute extends KindaDog implements Pet{
@Override
public void sit() {
System.out.println("자리에 앉습니다.");
}
--------------------------------------------------
public interface Pet {
// 인터페이스의 메소드는 추상(abstract) 메소드, 그리고 public
// public abstract void sit();
// public void sit();
void sit();
}
--------------------------------------------------
< MainClass >
public class Example2 {
public static void main(String[] args) {
Pet p1 = new Cat();
Pet p2 = new Malamute();
p1.sit();
p2.sit();
}
}
< 출력값 >
무시합니다.
자리에 앉습니다.
class가 오는 자리에 interface가 위치했고, interface의 sit();은 오버라이딩이 무조건 필요해서,
Cat과 Dog클래스에서 오버라이딩 해서 진행했습니다.
= Interface기능 1 =
인터페이스는 다중 상속이 가능하고, 여러 인터페이스를 동시 구현이 가능하다
단, 인터페이스에 있는 모든 추상메서드는 오버라이딩되야한다!
public interface Inter1 {
public double PI = 3.14; //자동 상수
public void method1();//추상메서드
}
--------------------------------------------------
package personal_trainning.Interface;
public interface Inter2 {
int ABC = 1;
void method2();
}
--------------------------------------------------
package personal_trainning.Interface;
public class Basic implements Inter1,Inter2{ //동시상속
@Override
public void method1(){
System.out.println("오버라이딩 된 메서드1 실행");
}
@Override
public void method2() {
System.out.println("오버라이딩 된 메서드2 실행");
}
}
< MainClass >
public class MainClass {
public static void main(String[] args) {
Inter1 b1 = new Basic();
b1.method1(); //오버라이딩 된 메서드
// b.method2(); //불가능 why? 부모클래스가 인터1이라
Inter2 b2 = new Basic();
b2.method2(); //여기선 inter2에서 가져온 메서드라 가능
Basic bb = new Basic();
bb.method1();
bb.method2();
System.out.println("-------------------------");
Basic bbb = (Basic) b1; //내자신으로 돌아왔으니까! -> 클래스 casting가능
bbb.method1();
bbb.method2();
//상수
System.out.println(Inter1.PI);
System.out.println(Inter2.ABC);
}
}
< 출력값 >
오버라이딩 된 메서드1 실행
오버라이딩 된 메서드2 실행
오버라이딩 된 메서드1 실행
오버라이딩 된 메서드2 실행
-------------------------
오버라이딩 된 메서드1 실행
오버라이딩 된 메서드2 실행
3.14
1
상수명 작성할 때, 대문자로 작성하고, 다른 단어로 구성되면 _언더바로 연결한다.
+) 인터페이스 상수는 static{}블록 초기화 불가능하다.
따라서, 선언과 동시에 초기값 지정해야한다.
아직 익숙하게 외워지지 않는 부분!
interface내에 변수 사용 했을 때 : 상수화 (public static final이 변수 앞에 붙는다)
interface내에 메서드 사용 했을 때 : 추상화 (public abstract void 변수())
(자주사용하다보면 감이 익혀지겠지!)
= Interface기능 2 =
자바의 인터페이스는 객체의 사용 방법을 정의한 타입(메서드 명세서)으로 객체의 교환성을 높여주기 때문에,
다형성을 구현하는 매우 중요한 역할을 합니다.
인터페이스도 데이터 타입(부모타입) 가능하다.
public class Cat extends Animal implements IPet{
@Override
public void eat() {
System.out.println("고양이는 생선을 먹어요");
}
@Override
public void play() {
System.out.println("고양이는 방에서 놀아요");
}
}
-------------------------------------------------------
public class Dog extends Animal implements IPet{
@Override
public void eat() {
System.out.println("강아지는 사료를 먹어요");
}
@Override
public void play() {
System.out.println("강아지는 밖에서 놀아요");
}
}
-------------------------------------------------------
public class GoldFish extends Fish implements IPet{
@Override
public void swim() {
System.out.println("금붕어는 강에서 헤엄쳐요");
}
@Override
public void play() {
System.out.println("금붕어는 어항에서 놀아요");
}
}
public interface IPet {
public void play();
}
-------------------------------------------------------
public abstract class Animal {
public abstract void eat();
}
-------------------------------------------------------
< MainClass >
public class MainClass {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
Animal[] ani = {dog, cat};
for(Animal a:ani) {
a.eat();
System.out.println("-----------------------------");
IPet dog2 = new Dog();
IPet cat2 = new Cat();
IPet fish2 = new GoldFish();
IPet[] pets = {dog2, cat2, fish2};
for(IPet p : pets) {
p.play();
}
}
}
< 출력값 >
강아지는 사료를 먹어요
고양이는 생선을 먹어요
-----------------------------
강아지는 밖에서 놀아요
고양이는 방에서 놀아요
금붕어는 어항에서 놀아요
클래스는 바로 위 1개의 클래스만 상속받을 수 있지만, interface는 개념을 여러 클래스에서 상속과 같이 가져와서 사용 할 수 있으며,
관련이 없는 객체끼리도 사용이 가능해서 중요하게 공부해야하는 개념입니다!
= Default Interface =
public interface Pet {
void sit();
default void roll() { // 항상 public
System.out.println("구릅니다.");
}
---------------------------------------------------
public class Dog implements Pet {
@Override
public void sit() {
System.out.println("자리에 앉습니다.");
}
--------------------------------------------------
public class Cat implements Pet {
@Override
public void sit() {
System.out.println("무시합니다.");
}
@Override
public void roll() {
System.out.println("또 무시합니다.");
}
< MainClass >
public class MainClass {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.sit();
d1.roll();
Cat c1 = new Cat();
c1.sit();
c1.roll();
Pet p1 = c1;
p1.roll();
}
// 추상 클래스 vs 인터페이스
// 4가지접근지정자 사용가능 public 메소드만가능
// 인스턴스 필드 사용가능 스태틱 파이널 필드만 가능
// 하나만 상속 가능 여러 인터페이스 구현가능
}
< 출력값 >
자리에 앉습니다.
구릅니다.
무시합니다.
또 무시합니다.
또 무시합니다.
Dog에 roll() 메소드가 있지 않지만, Pet 인터페이스에 default roll()메소드가 있기때문에,
d1.roll()을 불러와도 interface의 roll()메소드를 불러온다는 것!
= Interface 총정리 =
1. 인터페이스는 상수와 추상 메서드만 구성으로 가진다.
2. 인터페이스는 다중 상속이 가능하다
3. 인텊이스도 데이터 타입(부모 타입)이 가능하다
4. 사용방법이 동일한 클래스를 만들 수 있다.
인터페이스는 추상클래스의 확장된 형태!
+) 일반클래스 -> 오버라이딩강제(추상클래스) -> 오버라이딩강제 + 다중 상속(인터페이스)
'수업 복습하기 > Java' 카테고리의 다른 글
Day 16 - 예외(Exception) (2) (0) | 2021.09.10 |
---|---|
Day 15 - 예외(Exception) (0) | 2021.09.10 |
Day 14 - 추상 (abstract) (0) | 2021.09.06 |
Day 13 - Final (변수, 클래스, 메소드) (7) | 2021.09.06 |
Day 13 - 정적 멤버 (Static) (0) | 2021.09.06 |