[JAVA] 인터페이스 (Interface)

:-)·2022년 4월 16일
1

☕ JAVA

목록 보기
7/15
post-thumbnail

추상 클래스의 한계

  • 자바 클래스간의 상속에서는 하나의 부모만 존재할 수 있기 때문에,
    다중 상속의 구현은 불가능하다.
  • 하지만, 인터페이스는 다중 상속이 가능하다.

📝 인터페이스 (Interface)

  • 일종의 추상클래스이다.
  • 오직 추상메서드와 상수만을 구성 멤버로 가진다.
  • 다중 상속이 가능하기 때문에 용도별로 세분화 하여 필요한 요소만 상속할 수 있다.

인터페이스의 장점

  • 개발시간을 단축시킬 수 있다.
  • 표준화가 가능하다.
  • 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
  • 독립적인 프로그래밍이 가능하다.

인터페이스 정의

  • 클래스를 작성하는 것과 같다.
    ❗❗ 다만, class 키워드 대신 interface를 사용해야 한다.

  • 인터페이스 내의 모든 메서드는 추상 메서드이기 때문에 'abstract' 키워드를 명시할 필요가 없다.

public interface 인터페이스명 {

	public 리턴타입 메서드명(파라미터,...);

}

인터페이스 상속

  • 인터페이스의 상속은 implements 키워드를 사용한다.

  • 인터페이스도 추상화를 구현하고 있기 때문에, 인터페이스를 상속받는 클래스는
    인터페이스내의 모든 메서드들을 반드시 재정의 해야 한다.

  • 인터페이스는 클래스와 달리 Object클래스와 같은 최상위 클래스가 없다.

  • 다중 상속이 가능하다.

    • 인터페이스는 콤마( , )로 연결하여 여러개를 동시에 상속받을 수 있다.
    • 필요한 경우 다른 클래스와 동시에 상속받을 수 있다.
  // 콤마(,)로 연결하여 동시에 상속한 경우
  public class Monster implements Fight, Move {
  	...
  }   

  // 다른 클래스와 동시에 상속한 경우
  public class Monster extends User implements Fight, Move{
	  ...
  }



인터페이스 예시


public abstract class Unit{
		public abstract void attack();		// 공격
		public abstract void shield();		// 방어
		public abstract void walk();		// 걷다
		public abstract void run();			// 뛰다	
		public abstract void jump();		// 점프
		public abstract void pickup();		// 아이템 줍기
	}

추상클래스인 Unit 클래스가 있다.

주인공과 몬스터 클래스가 Unit을 상속받을 경우

주인공 클래스는 Unit의 모든 기능을 사용하지만,
몬스터 클래스는 사용하지 않는 기능도 재정의해야하는 문제가 발생한다.


그래서 추상 클래스인 Unit의 기능을 용도별로 분할하여 나누어 놓고,
주인공과 몬스터가 각각의 기능 중에서 자신에게 필요한 것들만 상속받도록 해야한다.

클래스 다이어그램으로 표현하면 다음과 같다.


✍ 코드 예시

// Action 인터페이스
public interface Action {
	
	public void pickup();		// 줍다
	
}

// Fight 인터페이스
public interface Fight {

	public void attack();		// 공격
	public void shield();		// 방어
	
}

// Move 인터페이스
public interface Move {

	public void walk();		// 걷기
	public void run();		// 뛰기
	public void jump();		// 점프
	
}
// Monster 클래스 
public class Monster implements Fight, Move{
	private String name;				// 몬스터 이름

	public Monster(String name) {		// 생성자
		super();
		this.name = name;
	}
	
    // 다음과 같이 메서드 재정의가 이루어지면 필요한 기능을 구현한다.
	@Override
	public void walk() {
		System.out.println(this.name + " >> 걷다");
	}

	@Override
	public void run() {
		System.out.println(this.name + " >> 뛰다");
	}

	@Override
	public void jump() {
		System.out.println(this.name + " >> 점프");
	}

	@Override
	public void attack() {
		System.out.println(this.name + " >> 공격");
	}

	@Override
	public void shield() {
		System.out.println(this.name + " >> 방어");
	}
	
}
// Character 클래스
public class Character implements Action, Fight, Move{
	private String name;				// 캐릭터 이름

	public Character(String name) {		// 생성자
		super();
		this.name = name;
	}

	@Override
	public void attack() {
		System.out.println(this.name + " >> 공격");
	}

	@Override
	public void shield() {
		System.out.println(this.name + " >> 방어");
	}

	@Override
	public void pickup() {
		System.out.println(this.name + " >> 아이템을 줍다");
	}

	@Override
	public void walk() {
		System.out.println(this.name + " >> 걷다");
	}

	@Override
	public void run() {
		System.out.println(this.name + " >> 뛰다");
	}

	@Override
	public void jump() {
		System.out.println(this.name + " >> 점프");
	}
	
}

// Main 클래스
public class Main {

	public static void main(String[] args) {
		Character c = new Character("주인공");
		
		c.walk();
		c.run();
		c.attack();
		c.shield();
		c.pickup();
		c.jump();
		
		System.out.println("------------------------------------");
		
		Monster m = new Monster("몬스터");
		
		m.attack();
		m.shield();
		m.walk();
		m.run();
		m.jump();
		
	}

}

👉 실행 결과

주인공 >> 걷다
주인공 >> 뛰다
주인공 >> 공격
주인공 >> 방어
주인공 >> 아이템을 줍다
주인공 >> 점프
------------------------------------
몬스터 >> 공격
몬스터 >> 방어
몬스터 >> 걷다
몬스터 >> 뛰다
몬스터 >> 점프



📙 정리

일반 클래스추상 클래스인터페이스
생성자, 멤버변수가능가능불가능
(상수만 가능)
일반 메서드가능가능불가능
추상 메서드불가능가능가능

0개의 댓글