인터페이스

Java

목록 보기
11/26
post-thumbnail

1. 인터페이스

결론 : <추상메서드의 집합 . 구현된 것이 하나도 없는 껍데기>
<다 public>
상수 추상메서드 default 메서드 정적 메서드가 있으나
추상메서드만 알면 된다! 이게 본질이다.

  • 접근제한자 : public / default

1-1) 구성멤버

  • 상수 추상메서드 디폴트 메소드 정적 메소드
  • 모든 멤버가 public입니다!!!
  • 변수 (X 안 됨) / 상수만 됨.
  • 인터페이스의 모든 구성멤버는 static final 성질을 갖고 있다. (굳이 앞에 붙이지 않아도 그 성질을 갖고 있다)
public interface PlayingCard {
		public static final int SPADE = 4;	//public static final 생략
		final int DIAMOND = 3;				//public static final 생략
		static int HEART = 2;				//public static final 생략
		int CLOVER = 1;						//public static final 생략
		
		public abstract String getCardNumber();		//public abstract 생략
		String getCardKind();						//public abstract 생략
}			

그렇지만 이것▲들이 다 핵심은 아니다. 다 부수적인 것. 추상메서드만 이해하면 된다! by.자버지

1-2) 추상클래스 vs 인터페이스 차이?

<<추상 클래스: 일반 클래스인데 추상 클래스를 갖고 있다.
인터페이스 : 구현된게 아무것도 없는 것>>

1-3) 인터페이스의 상속

  • 모든 클래스의 조상은 object지만, 인터페이스의 조상은 인터페이스만 가능
  • 다중 상속 가능(추상메서드는 충돌해도 문제 없음. 왜? 구현된게 없으니까 충돌할 게 없음)

1-4) 인터페이스의 구현

  • 인터페이스에 정의된 추상 메서드를 완성하는 것
    = 인터페이스의 추상메서드 몸통{...}만들기
  • 인터페이스를 구현하면(추상메서드를 구현하면) 추상클래스다.
    그런데 이 인터페이스의 일부 추상메서드만 구현하는 경우, 클래스 앞에 abstract를 붙여야 함
interface Fightable {
void move(int x, int y)
coid attack(Unit u);
}
abstract class Fighter implements Fightable
	public void move(int x, int y) {...}
}						>>추상 메서드 두개 중 하나만 구현한거니까 abstract 붙이기

2. 인터페이스의 다형성

  • 인터페이스도 구현클래스의 부모가 된다(상속 시)
class Fignter extends Unit implemnts Fightable{
	public void move(int x, int y) {   };
    public void attack(Fightable f) {   };
    }
Unit u = new Fighter();
Fightable f = new Fighter();

▲클래스 상속과 마찬가지로, Fightable 인터페이스를 구현한 클래스의 인스턴스만 가능

  • 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
    : Fightable 인터페이스를 구현한 클래스의 인스턴스를 반환
Fightable method() {
Fightaer f = new Fighter();
return f;			//인터페이스를 구현한 객체를 반환
}

Fightable f = new Fighter(); = Fightable f = method();
자식메소드니까.

abstract class Unit {
	int x, y;
	abstract void move(int x, int y);
	void stop() {
		System.out.println("멈춥니다");
	}
}

interface Fightable {
	void move(int x, int y);
	void attack(Fightable f);
}

class Fighter extends Unit implements Fightable {
	public void move(int x, int y) {					//오버라이딩 규칙 : 조상(public)보다 접근제어자가 좁으면 안된다.
	System.out.println("[" + x + "," + y + "]로이동");
	}
	public void attack(Fightable f) {
		System.out.println(f + "를 공격");
	}
}

public class FighterTest {

	public static void main(String[] args) {
		Fighter f = new Fighter();
        f2.attack;Unit에는 attack이 없어서 호출 불가
		f.move(100,200);
		f.attack(new Fighter());
        또는
        Fighter f = new Fighter();
		Fightable f2 = f.getFightable(); 		>>우회해서 interface 객체 만드네
	}
}

2-1. 인터페이스의 장점

  • 두 대상(객체)간의 '연결, 대화, 소통'을 돕는 '중간역할'을 한다.
  • 선언(설계)와 구현을 분리할 수 있다.
    (인터페이스 만들고, 알맹이(추상메서드의 동작 내용)는 클래스에서 구현)
  • B가 C로 바뀌어도 A는 바꼈는지도 몰라요(우리 자판기 내부가 어떻게 바뀌는지는 모르잖아요)
  • A클래스는 변경 안해도 됨. (변경에 유리해짐 == 유연한 코드 == 느슨한 결합)
    A클래스와 B클래스가 있고 Interface가 있다.
    A는 B클래스의 B 메서드를 사용하는데, 만약 B클래스에서 말고 인터페이스에 B메서드를 정의하면, A클래스는 i.methodB를 사용하면 된다.
    그럼 나중에 method가 C메소드로 바뀔 경우 아무것도 안 바꿔도 되니까 편리함.
    그런데 그 전에 B클래스의 B메소드를 구현했다면, C객체를 만들어서 C메소드를 참조하는걸로 다 바꿔야 한다.
class A {
	public void method(B b) {
		b.method();
	}
}

class B {
	public void method() {
		System.out.println("B클래스의 메서드");
	}
}
public class InterfaceTest {
	public static void main (String[] args) {
		A a= new A();
		a.method(new B());		//A가 B를 사용(의존)
	}
}
class A {
	public void methodd(I i) {                     >>인터페이스 I를 구현한 넘들만 들어와라
		i.method();
	}
}

2-2. 인터페이스의 디폴트 메서드, static메서드

(부가적인거니까 그렇구나 하고 알고 계시면 돼요 by.자버지)

  • 이미 만들어져서 다 상속까지 하고 구현했는데,
    인터페이스에 새로운 추상메서드를 만들면 (상속받은) 모든 클래스들이 다 그 메서드를 구현해야 함. 불편하니까.

3. 다형성

  • 다형성을 구현하는 기술 (상속 또는 인터페이스의 자동 타입 변환)

3-1. 익명 구현 객체

  • 구현 클래스를 만들어 사용하는 것이 일반적이고, 클래스를 재사용할 수 있기 때문에 편리하지만, 일회성의 구현 객체를 만들기 위해 소스파일을 만들고 클래스를 선언하는 것은 비효율적이다. ```java
    Interface interface = new Interface(){
    //인터페이스에 선언된 추상 메소드의 실체 메소드 선언}

0개의 댓글