반응형

 

자바 - 인터페이스(interface)의 이해 및 사용하는 이유

 

자바-인터페이스

 

 

자바의 추상클래스에 이어 이번에는 상수와 추상메소드만으로 이루어진 인터페이스에 대해서 알아보도록 하겠습니다. 

 

 

   목차

  1. 인터페이스란?
    • 인터페이스 특징
    • 인터페이스 장점 및 사용이유
    • default메소드 및 static메소드
  2. 인터페이스 사용예시

 

 

1. 인터페이스(interface)란?

 

인터페이스란? 클래스에서 특정 기능(메소드)을 구현하도록 강제 할 수 있는 기능으로 다음과 같은 특징을 가지고 있습니다. 

 

1) 인터페이스 특징

  1. 인터페이스는 interface 키워드를 사용하여 정의합니다. 
  2. 인터페이스는 상수와 추상메소드로 구성되어 있습니다. (자바8부터 default 메소드와  static 메소드 사용가능)
  3. 인터페이스 안의 모든 상수는 public static final 타입입니다. (생략가능)
  4. 인터페이스 안의 모든 추상메소드는 abstract public 타입니다. (생략가능)
  5. 추상클래스와 마찬가지로 인스턴스를 생성할 수 없습니다. 
  6. 인터페이스는 레퍼런스 변수의 인터페이스 타입으로 사용될 수 있습니다. 
  7. 인터페이스는 다른 인터페이스를 extends 키워드로 상속 받을 수 있으며, 다중 상속이 가능합니다.
  8. 클래스에서 인터페이스의 구현은 implements 키워드를 사용하여 구현할 인터페이스를 지정후, 추상메소드를 모두 오버라이드 하여 내용을 완성 하여야 합니다. 

 

2) 인터페이스 장점 및 사용이유

  1. 인터페이스를 구현한 클래스들을 하나의 인터페이스 타입으로 다룰 수 있습니다. (인터페이스 멤버만 사용 가능)
  2. 기능(메소드)의 구현을 강제함으로써, 클래스의 설계 또는 표준화를 유도 할 수 있습니다. 

 

3) default 메소드 및 static 메소드

  • 자바8부터 인터페이스에 default 메소드와 static 메소드를 추가할 수 있습니다.
  • 인터페이스가 여러곳에서 사용되고 있는 상황에서 새로운 추상메소드를 추가할 경우, 모든 곳에서 오버라이드를 해주어야 하는 번거로움있습니다. 이에 대한 대응책으로 인터페이스에서도 구현부를 가질 수 있는 default 메소드를 활용할 수 있습니다. 
  • interface는 다중상속이 가능하기 때문에, default 메소드 이름이 충돌할수 있습니다. 이때는 해당 이름의 메소드를 오버라이드하여 재정의후 사용하시면 됩니다. 
  • interface 안에 default 메소드는 아래와 같이 { } 안에 실행문을 사용할 수 있습니다.

     interface Attakable {

          default void basicAttack( ) {

               System.out.println("공격");

          }

     }

 

 

 

2. 인터페이스 사용예시

 

1) 클래스 정의

public class Human {		// Human 클래스 정의
	String name;
    
	public void speak() {
		System.out.println(name + ": 안녕하세요");
	}
}


interface Attackable {	// Attackable 인터페이스 정의
	abstract public void attack();
}


class Archer extends Human implements Attackable {	// Archer 클래스정의 (Human상속, Attackable구현) 
	@Override
	public void attack() {
		System.out.println(name + ": 공격합니다."); 
	}
}

 

2) 객체 생성 및 사용

public class HelloWorld {
	public static void main(String[] args) {

		Archer a1 = new Archer();	// Archer 클래스 타입
		a1.name = "궁수1";
		a1.speak();
		a1.attack();
		
		Attackable a2 = new Archer();	// Attackable 인터페이스 타입
		// a2.name = "궁수2";		// 사용불가
		// a2.speak();			// 사용불가
		a2.attack();
	}
}

 

3) 실행결과

궁수1: 안녕하세요
궁수1: 공격합니다.
null: 공격합니다.

 

반응형

+ Recent posts