본문 바로가기
JAVA

[JAVA(자바)] 인터페이스 (feat. 인터페이스와 추상클래스 비교)

by 초이사 2023. 1. 22.

인터페이스의 정의는 사물과 사물 등 두 장치를 연결해주는 매개체를 말한다. 자바에서는 이 사물을 객체라고 생각하고 보면 된다.

 

 

인터페이스

  • 객체들을 연결해주는 역할 (객체a와 객체b가 있을 때, a가 인터페이스 메소드 호출을 통해 b메소드 호출의 결과를 받아올 수 있다.)
  • interface 키워드를 사용한다.
  • 객체를 생성할 수 없고, 따라서 생성자도 가질 수 없다. (추상 메소드를 가지고 있어 미완성인 코드가 존재할 수 있기 때문
  • 클래스처럼 접근 제한자로 public , defalut만 사용할 수 있다.
  • 클래스와 달리 상수필드와 추상메소드, defalut 메소드, private메소드 , public 메소드만 가질 수 있다.
  • 다중 상속이 가능하다. (껍데기만 존재하는 것과 같아 클래스와 달리 다중상속으로 인한 문제가 없음)
  • 인터페이스의 부모는 인터페이스만 가능하다.
interface 인터페이스명 { 
	... 
}

 

구현 클래스 (인터페이스를 상속받은 클래스)

class 클래스명 implements 인터페이스명 { 
	... 
}

 

변수의 타입(참조타입)으로는 사용 가능하다. 인터페이스에서 객체 생성은 불가능하기 때문에 인터페이스를 구현한 객체의 번지(구현 객체)를 대입한다. 

인터페이스명 변수명 = new 구현클래스명();

 

 

 

인터페이스 사용 이유

  • 객체a와 객체b가 있을 때, a가 인터페이스 메소드 호출을 통해 b메소드 호출의 결과를 받아올 수 있다.
    • -> 객체 b가 객체 c로 바뀌어도 객체 a는 수정할 필요 없다. 
    •  같은 인터페이스 메소드로 다른 결과를 가져옴 -> 다형성 실현

 

 

 

인터페이스가 가질 수 있는 멤버

 

  • 상수 필드 - 인터페이스는 모든 필드가 public static final라서 생략 가능
    • 객체 생성과 관계없는 필드로 구현 객체 생성 없이 바로 접근할 수 있다.
public interface 인터페이스명{
	public static final double PI = 3.14;
	int price = 10000; //public static final생략해도 컴파일 과정에서 붙음
}

 

 

  • 추상 메소드 - 선언은 되었지만 코드가 미완성인 메소드로 public abstract 생략 가능
    • 반드시 자식 클래스에서 재정의 해야 한다.
public interface 인터페이스명{
	public abstract void run(); //추상 메소드
	void print(); //public abstract 생략 가능
}

 

 

  • default 메소드 - dafalut 키워드를 반드시 붙여야 하고 중괄호 부분이 있어야 한다.
    • 상속받은 자식 클래스에서 재정의할 수 있다. 이때, default를 생략하고 public 접근 제한자를 붙여야 한다. (인터페이스의 디폴트 메소드 접근 제한은 public으로 지정되어 있음)
public interface 인터페이스명{
	default void print() {
		System.out.println("디폴트 메소드");
	} 
}

 

 

  • private 메소드 - private 키워드를 붙여야 하고, 중괄호 부분이 있어야 한다.
    • 인터페이스내에서만 호출 가능, 인터페이스내에 중복 코드를 줄이기 위해 사용
public interface 인터페이스명{
	private void print() { 
		System.out.println("private 메소드");
	}
	private static void run() {  //객체 생성 없이 바로 접근 가능
		System.out.println("private 정적 메소드");
	}
}

 

 

  • static 메소드 - static 키워드를 붙여야 하고, 중괄호 부분이 있어야 한다.
    • 상수 필드와 마찬가지로 구현 객체 생성 없이 바로 접근할 수 있다.
    • 접근 제한자가 생략되면 public으로 컴파일과정에서 붙는다. private으로 지정할 수도 있다.
public interface 인터페이스명{
	static void run() {
		System.out.println("정적 메소드");
	}
}

 

 

 

인터페이스 사용 예시

interface ComputerInterface {
	int price = 10000; //상수필드 - public static final 생략
	
	void run(); //추상 메소드 - public abstract 생략
	default void off() { //default 메소드
		System.out.println("전원을 끕니다.");
	}
	
	default void defaultOn() { //default 메소드 - private 메소드 호출
		on();
	}
	private void on() { //private 메소드
		System.out.println("전원을 켭니다.");
	}
	
	static void print() { //static 메소드 
		System.out.println("출력합니다.");
	}
}
class Computer implements ComputerInterface{
	@Override
	public void run() { //추상 메소드 오버라이딩
		System.out.println("실행합니다.");
	}
	@Override
	public void off() { //default 메소드 오버라이딩 - public으로 작성
		System.out.println("(재정의)전원을 끕니다.");
	}
}


public class Solution {
	public static void main(String[] args) {
		ComputerInterface ci; //인터페이스 변수 선언
		
		//상수 필드 객체생성없이 바로 호출
		System.out.println("컴퓨터 가격: "+ComputerInterface.price);
		//정적 메소드 객체생성없이 바로 호출
		ComputerInterface.print();
		
		ci = new Computer(); // 구현 객체 생성
		
		//Computer객체 run() 호출
		ci.run();
		//Computer객체 off() 호출
		ci.off();
		//defaultOn()을 통해 private 메소드인 on() 호출
		ci.defaultOn();
		
	}
}

//결과
//컴퓨터 가격: 10000
//출력합니다.
//실행합니다.
//(재정의)전원을 끕니다.
//전원을 켭니다.

 

 

 

 

인터페이스의 다중 구현

  • 인터페이스는 추상클래스와 달리 다중 상속이 가능하다. (-> 구현 클래스가 여러개의 인터페이스를 상속받을 수 있다.)
  • implements 키워드 뒤에 인터페이스명을 나열한다.
  • 구현 클래스는 implements한 인터페이스의 모든 메소드를 재정의해야 한다.
class 클래스명 implements 인터페이스명, 인터페이스명 { ... }

 

 

 

인터페이스간의 상속

  • 인터페이스도 다른 인터페이스를 상속할 수 있고, 다중 상속도 가능하다.
  • extends 키워드 뒤에 인터페이스명을 나열한다.
  • 자식 인터페이스는 부모 인터페이스의 모든 추상 메소드를 재정의해야 한다.
interface 부모인터페이스명 extends 자식인터페이스명, 자식인터페이스명 { ... }

 

 

 

 

봉인된 인터페이스(sealed interface)

  • Java 15부터 사용 가능
  • 인터페이스 상속을 제한하기 위해 등장 (무분별한 사용 막기 위해)
  • sealed 키워드로 선언된 인터페이스는 permits 키워드 다음에 오는 인터페이스에만 상속이 가능하다.
  • 봉인된 클래스를 상속받은 자식클래스는 sealed나 non-sealed, final 키워드를 사용해서 선언해야 한다.
    • non-sealed :  자식 인터페이스에게 상속이 가능하다.
    • sealed : 봉인 인터페이스 선언
public sealed interface 부모인터페이스몉 permits 자식인터페이스명 { ... }

 

 

 

 

인터페이스와 추상 클래스

  • 공통점
    • 객체를 생성할 수 없고(new 연산자 사용 불가능), 다형성 실현이 목적이다.
    • 추상 메소드를 가질 수 있다. (구현 내용이 없는 메소드)
    • 추상 메소드는 반드시 자식 클래스에서 재정의되어야 한다. (메소드 오버라이딩)
차이점 인터페이스 추상 메소드
키워드 interface abstract
생성자 가질 수 없음 가질 수 있음 
필드 상수 필드만 포함 가능 일반 필드도 포함 가능
메소드 추상메소드, default 메소드,private메소드, static 메소드만 가능 일반 메소드도 포함 가능
다중 상속 O X
목적 설계, 구현 복제, 확장

 

  •  목적 (인터페이스)
    • 인터페이스에 작성된 메소드를 구현 클래스에서 목적에 따라 구현 내용을 작성함 (다형성 실현)
  • 목적 (추상클래스) 
    • 자식 클래스가 공통으로 가져야 하는 기능은 작성하되, 자식클래스에서만 구현해야 하는 기능을 추상 메소드를 선언 -> 자식 클래스에 같은 메소드의 구현 내용이 달라짐 (다형성 실현)
    • 추상클래스 구현 내용을 자식 클래스가 복제하고, 원하는 기능 구현 -> 확장

 

 

 

 

댓글