티스토리 뷰

개인공부/백기선 선장 JAVA Study

class - 8 (인터페이스)

날따라해봐요요롷게 2021. 5. 11. 12:26
  • 인터페이스 정의하는 방법
  • 인터페이스 구현하는 방법
  • 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
  • 인터페이스 상속
  • 인터페이스의 기본 메소드 (Default Method), 자바 8
  • 인터페이스의 static 메소드, 자바 8
  • 인터페이스의 private 메소드, 자바 9

 

인터페이스(interface)

 

 : 인터페이스는 어떤 메소드를 제공하는지 미리 알려주어 해당 기능을 명시적으로 알려주는 역할을 한다.

 

 

(public, default) interface 인터페이스명 {
	(public)(abstract) 메소드();
    (public)(static)(final) 타입 상수명 : value;
}

인터페이스 구현 (간단하게 뒤에 더욱 자세하게 설명)

- 인터페이스를 구현하기 위해서는 class에 implements 키워드로 구현한다.

- 인터페이스는 다중 구현이 가능하다.

- 인터페이스를 추상클래스의 하나의 미완성된 집합으로 봤을 때, 완성을 시키는 과정을 구현으로 볼 수 있다.

class 클래스명 implements 인터페이스1, 인터페이스2 ... {
	인터페이스 메소드 재정의
}

인터페이스의 특징

- 인터페이스는 추상화로 이루어져 만들어진다. -> 추상메소드, 상수로 이루어진다. (Java 8 이전)

(Java 8 이후로는 default method, static method 가 추가되었다. ==> 추가된 이유를 차차 알아가보자!)

public interface 인터페이스명 {

	타입 상수명 = value;	 //상수 (절대적)
    //구현하는 클래스에서 값을 바꿀 수 없고, 반드시 해당 상수의 value를 사용하라.
    
    타입 메소드명(매개변수) {}; 	//추상 메소드(강제적)
    //재정의하여 사용하라.
    
    default 타입 메소드명(매개변수) {};	 // 디폴트 메소드 (선택적)
    //인터페이스에서 제공하지만, 기능이 원치 않는다면 재정의하여 사용하라.
    
    static 타입 메소드명(매개변수) {}; 	// 정적 메소드 (절대적)
    //인터페이스에서 제공하는 것을 반드시 사용하라!
}

- 인터페이스의 멤버는 public 으로 이루어져 있으며, public, static, final, abstract 는 생략이 가능하다.

(생략시, JVM이 컴파일 과정에서 생성하여 준다.)

public interface Ex {
	int number1 = 1; // public static final 접근제어자 생략
	public static final int number2 = 2;
	
	void Method1(); //abstract, public 예약어 생략가능
	public void Method2();
	static void Method3() {} 	// 구현부 있어야함
	default void Method4() {} 	// 구현부 있어야함
}

 

- 인터페이스는 인스턴스 생성이 안된다.

 : 추상클래스와 같이 인터페이스또한 인스턴스를 생성할 수 없다. 상속과 구현을 통해서 인스턴스를 생성하여 해당 인터페이스의 상수, 추상메소드를 호출하여 사용할 수 있다.

 

public class ExTest implements Ex{

	public static void main(String[] args) {
    	Ex ex = new Ex(); // 에러! 인스턴스화 할 수 없음!!
		ExTest ex1 = new ExTest();
		Ex ex2 = new ExTest(); // 업캐스팅하여 사용 가능.
        
		ex1.run();
		ex1.pass();
		ex1.shoot();
	}

	@Override
	public void run() {
		System.out.println("뜀");
	}

	@Override
	public void pass() {
		System.out.println("패스");		
	}

	@Override
	public void shoot() {	
		System.out.println("슛");
	}
}

 

 

인터페이스 vs 추상클래스

 

(참조. www.notion.so/Java-Study-1-d86030c0fbb946e3ad9764ab1bf15330)

인터페이스가 추상메소드와 상수로 이루어져 있다고 했다.(java 8 이후로는 default, static 이 있지만)

그렇다면 추상메소드를 갖는 추상클래스를 사용하지 왜? 인터페이스를 사용할까? 둘의 차이점을 알아보자.

 

#의미 : 

추상클래스는 "is-a : ~는 ~이다" 의 개념이다.

인터페이스는 "has-a : ~는 ~를 할 수 있다." 의 개념이다.

ex. SSON은 사람 Person 이면서 코딩(Developable)을 할 수 있다.

  -class SSON extends Person implements Developable

 

#특징

- 추상클래스는 추상메소드와 일반메소드 모두를 갖지만, 인터페이스는 상수와 추상메소드만을 갖는다.

(인터페이스는 메소드 기능을 구현할 수 없다.)

- 인터페이스의 상수는 "public static final"로 선언되고 메소드는 "public abstract" 로 선언된다. (둘 다 생략이 가능)

 

#결론

- 그렇다면 인터페이스를 사용하는 이유는 무엇일까?

  • 개발 기간을 단축 시킬 수 있다.
  • 클래스간 결합도를 낮출 수 있다.
  • 표준화가 가능하다.인터페이스 레퍼런스를 통해 구현체를 사용하는 방법

인터페이스 레퍼런스를 통해 구현체를 사용하는 방법

#인터페이스의 상속

 

- 서브 인터페이스는 슈퍼인터페이스의 메소드를 모두 구현해야 한다.

- 인터페이스 레퍼런스는 인터페이스를 구현한 클래스의 인스턴스를 가리킨다. 

( 인터페이스에 선언된 메소드와 클래스의 메소드만 호출하여 사용할 수 있다.)

- 인터페이스는 다중 상속이 가능하다고 하였다. 하지만 안되는 경우를 살펴보자.

 

public interface Ex1 {
	public void xxx();
}
public interface Ex2 {
	public void xxx();
	void yyy();
}
public interface Ex3 {
	public int xxx(); // 리턴값이 다른 메소드
	void yyy();
}
public interface Test1 extends Ex1, Ex2{
	void zzz();
}
public interface Test2 extends Ex1, Ex3{ //  ==> 에러!!
	void zzz();
}

인터페이스 다중 상속시 상속하는 각각의 인터페이스에 리턴값만 다른 메소드가 있다면 상속받은 인터페이스에서 어떤 메소드를 사용받냐에 따라 달라지기에 해당의 경우 다중 상속을 받을 수 없다.

 

#두 인터페이스의 추상 메소드가 같은 경우.

- 중복되는 인터페이스의 추상메소드를 재정의 하여 사용한다.

public interface Join1 {
	default void join() {
		System.out.println("Join1");
	};
}
public interface Join2 {
	default void join() {
		System.out.println("Join2");
	};
}
public class Group implements Join1, Join2{
	@Override
	public void join() { //===> 두 인터페이스의 join 메소드를 재정의 하여야 한다.
		Join1.super.join();
		Join2.super.join();
	}
}

위의 인터페이스의 메소드들이 default 메소드 이므로 super. 키워드로 접근하여 재정의 해야한다.

 

# static 메소드의 override?? ==> static 메소드는 재정의가 안된다.

public interface Static1 {
	static void join() {
		System.out.println("static 메소드");
	}
}
public interface Static2 extends Static1 {
	
	default void join() {
		System.out.println("default 메소드 ==> 재정의 되지 않음");
	}
	
	default void exit() {
		System.out.println("default exit 메소드");
	}
}

 

 

 

 

 

 

 

 

'개인공부 > 백기선 선장 JAVA Study' 카테고리의 다른 글

class - 6 (상속)  (0) 2021.05.03
class - 5 (클래스)  (0) 2021.04.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함