본문 바로가기
Challenge

8주자 과제: 인터페이스

by Daisy :) 2021. 1. 8.
반응형

인터페이스 정의하는 방법

인터페이스(interface)는 일종의 추상클래스입니다.

 

우선, 추상클래스(abstract class)에 대해 간략하게 살펴보겠습니다.

추상클래스(abstract class)?
→ 미완성 설계도
→ 인스턴스 생성불가
→ 미완성 메서드(추상메서드)를 포함하고 있는 클래스
→ 생성자가 있으며, 멤버변수와 메서드도 가질수 있음.
abstract class 클래스이름{
	....
}

추상클래스는 앞에 'abstract'를 붙이기만 하면, 이 클래스를 사용 할 때 abstract를 보고 이 클래스에는 추상메서드가 있으니 상속을 통해서 구현해주어야 한다는 것을 알 수 있습니다.

 

인터페이스는 클래스를 작성하는 것과 같지만,class 대신 interface를 사용하고, 접근제어자로 public 또는 default만 사용할 수 있습니다.

interface 인터페이스이름{
	public static final 타입 상수이름 = 값;
	public abstract 메서드이름(매개변수목록); // abstract 생략가능
}

또한 인스페이스 멤버들은 몇가지 제약 사항이 있습니다.

→ 모든 멤버변수는 public static final이어야 하며, 이를 생략 할 수 있습니다.
→ 모든 메서드는 public abstract 이어야 하며, 이를 생략 할 수 있습니다.
    (단, static메서드와 디폴트 메서드는 예외(JDK1.8부터)

인터페이스의 장점

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

인터페이스의 상속

인터페이스는 클래스와 달리 Object클래스와 같은 최고 조상이 없고, 인터페이스로부터만 상속 받을 수 있습니다.

또한 클래스와 달리 다중상속, 여러개의 인터페이스로부터 상속을 받는 것이 가능합니다.

자손 인터페이스는 조상 인터페이스에 정의된 멤버를 모두 상속받습니다.

 

인터페이스 구현하는 방법

인터페이스도 추상클래스처럼 그 자체로는 인스턴스를 생성할 수 없습니다.

 

추상클래스가 상속을 통해 추상메서드를 완성하는 것 처럼 인터페이스도 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야하는데, 그 방법은 추상클래스가 자신을 상속받는 클래스를 정의하는 것과 다르지 않습니다.

다만, 인터페이스는 extends 키워드가 아닌 implements 키워드를 사용합니다.

 

class 클래스이름 implements 인터페이스이름{
	// 인터페이스에 정의된 추상메서드를 모두 구현해야 합니다.
    // extends는 하나의 클래스만 상속받을 수 있지만, 
    // implements는 여러개의 interface를 상속받을 수 있습니다.
}

 

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

1. 인터페이스를 만들어줍니다.

public interface InterfaceTest {
	public void print();
}

2. 일회성 구현체

public class ImplementMain{
	
	public static void main(String[] args) {
		InterfaceTest it1 = new InterfaceTest() {
			
			@Override
			public void print() {
				System.out.println("Hello World_InnerType");
				
			}
		};
        
        it1.print();
    }
}

 

3. 재사용이 가능한 구현체 

public class ImplementMain{
	
	public static void main(String[] args) {
    
    	ImplementsClass2 it3 = new ImplementsClass2();
		
		it3.print();
    
    }
    
}

class ImplementsClass2 implements InterfaceTest {

	@Override
	public void print() {
		System.out.println("Hello World_ImplementsClass2");
	}
	
}

 

4. 인터페이스는 다중구현이 가능합니다. (다만, 인터페이스들 내부의 메서드들은 서로 공유하지 않습니다.)

public class ImplementMain{
	
	public static void main(String[] args) {
    
    	InterfaceTest it2 = new ImplementsClass1();
		
		it2.print();
		
		Runnable r1 = new ImplementsClass1();
		r1.run();
    
    }
    
}

class ImplementsClass1 implements InterfaceTest, Runnable {

	@Override
	public void print() {
		System.out.println("Hello World_ImplementsClass1");
	}

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

 

 

인터페이스의 기본 메소드 (Default Method), 자바 8

추상클래스는 정상기능이 있는 메서드에 추상메서드를 포함하는 것 처럼,

자바 8부터는 추상메서드만 있어야하는 interface에 정상기능을 수행하는 메서드를 추가할 수 있습니다.

(반환타입 앞에 default를 기재해주어야 합니다.)

 

인터페이스 구현시에 추상메서드는 오버라이딩이 필요하지만, 

Default Method는 오버라이딩을 하지 않아도 되고,  호출시 인터페이스에 정의된 기능을 수행합니다.

필요시, 오버라이딩해서 기능을 바꿀 수 도 있습니다.

 

사용법 

public interface InterfaceTest {
	public void print();
	
	public default void defaultPrint() {
		System.out.println("default!");
	}
}
public class ImplementMain{
	
	public static void main(String[] args) {
		InterfaceTest it1 = new InterfaceTest() {
			@Override
			public void defaultPrint() {
				System.out.println("Inner_default!");
			}
		};
		
		it1.defaultPrint();
        
    }
}

 

인터페이스의 static 메소드, 자바 8

dafault와 비슷하지만, static 메서드는 오버라이딩을 할 수 없습니다.

사용은 무조건 interface를 참조하여서 사용됩니다 (인터페이스이름.static메서드이름)

 

public interface InterfaceTest {

	public static void staticPrint() {
		System.out.println("static!");
	}
}
public class ImplementMain{
	
	public static void main(String[] args) {
		InterfaceTest.staticPrint();
    }  
}

인터페이스의 private 메소드, 자바 9

private 메서드는 자바 9에서부터 사용이 가능합니다.

 

메서드 body가 있고, abstract가 아니며, static이거나 non-static 일 수 있습니다.

구현클래스와 인터페이스가 상속되지않고, 인터페이스에서 다른 메소드를 호출 할 수 있습니다.

 

private는 private, abstract, default 또는 static 메서드를 호출 할 수 있습니다.

private static은 static 및 static private 메소드만 호출 할 수 있습니다.

 

public interface InterfaceTest {
	public void print();
	
	public default void defaultPrint() {
		System.out.println("default!");
		privatenonstaticPrint();
	}
	
	public static void staticPrint() {
		System.out.println("static!");
		privatestaticPrint();
	}
	
	private static void privatestaticPrint() {
		System.out.println("private_static_print");
	}
	
	private void privatenonstaticPrint() {
		System.out.println("private_non_static_print");
	}
}

 

 

 

 

 

 

 

 

 

<reference>

자바의 정석 저자 남궁 성

flyburi.com/605

반응형

'Challenge' 카테고리의 다른 글

10주차 과제: 멀티쓰레드 프로그래밍  (0) 2021.01.23
9주차 과제: 예외 처리  (0) 2021.01.15
7주차 과제: 패키지  (0) 2021.01.02
6주차 과제: 상속  (0) 2020.12.26
5주차 과제: 클래스  (0) 2020.12.19

댓글