개발군싹

[Java] 인터페이스(Interface) 본문

Java

[Java] 인터페이스(Interface)

개발자군싹 2023. 9. 23. 09:32

Java

인터페이스(Interface)란?

인터페이스란 상수형(final) 필드와 추상메소드(abstract)만으로 구성되어있다.

추상클래스와 비슷하지만 인터페이스는 위 두가지만 인터페이스 구현분에 작성할 수 있다.

인터페이스를 상속받은 자식 클래스는 인터페이스에 정의된 모든 추상메소드를 구현해야한다. 

[접근제한자] interface 인터페이스명 {

	//인터페이스 내부에는 static final로 선언한 필드만 가질 수 있다.
	public static final 자료형 변수명 = 초기값;
    
    
    //추상메소드만 선언가능하다
    //public abstract가 생략하여 작성할 수 있다.
    //인터페이스를 implements 시 오버로딩하는 클래스는 해당 메소드에 public을 표기해야 한다.
    [public abstract] 반환자료형 메소드명 ([자료형 매개변수]);
    
    
}

상속 방법 -> implements 인터페이스명1, 인터페이스명 2, ...

public class 클래스명 [extends 클래스명 ] implements 인터페이스명1, 인터페이스명2, 인터페이스명3 ... { 클래스 구현 }

특징

  1. 모든 인터페이스의 메소드는 public 이고 abstract이다. 이는 생략 가능하다.
  2. 변수는 public static final로 static 영역 final변수로만 선언 가능하며 인터페이스에 선언된 필드의 값을 변경 시도하면 컴파일 에러가 발생한다.
  3. 인터페이스는 추상클래스와 같이 객체 생성은 불가능하나 참조변수로 사용가능하다. (다형성 적용가능)
  4. 공통적인 기능구현을 해야하는 경우 인터페이스를 구현하여 상속한다. 이는 개발자가 클래스마다 인터페이스에 정의된 공통 기능을 구현해야하는데 있어서 구현하지 않을 시 컴파일 에러가 발생하기 때문에 서비스 제공 시 기능의 부재를 막아 줄 수  있다.
  5. 인터페이스를 통해 클래스간 연결이 더욱 유연해질 수 있다. 
  6. 상속과 다르게 implements를 이용한 인터페이스 상속은 다중 상속이 가능하다.

인터페이스를 이용한 간단한 예제

프린터 기능을 가진 메소드를 구현하고 각 제조사별 프린터를 연결 시킬 수 있는 가벼운 예제를 작성해보자.

 

1. 프린트의 기본기능인 print(), scan(), copy()를 인터페이스 메소드로 작성하였다. 접근제한자와 예약어가 생략되어 있고 인터페이스 내부에 작성된 메소드이기 때문에 'public abstract'가 생략되어 있다.

public interface PrinterDriver {
	void print(); //프린트기능
	void scan(); //스캔기능
	void copy(); //복사기능
}

이제 각 제조사별 프린터 클래스를 작성하고, 'PrintDriver' 인터페이스를 상속받아 이를 토대로 제조사별 다른 메소드 기능들을 오버라이딩하여 사용할 수 있다.

SamsungPrinter 클래스 구현

import com.inter.common.PrinterDriver;

public class SamsungPrinter implements PrinterDriver{
	
	public SamsungPrinter() {
	}
	
	public void samPrint() {
		System.out.println("삼성프린트 인쇄중...");
	}
	
	public void samScan() {
		System.out.println("삼성프린트 스캔중...");
	}
	
	public void samCopy() {
		System.out.println("삼성프린트 복사중...");
	}

	@Override
	public void print() {
		samPrint();
	}

	@Override
	public void scan() {
		samScan();
	}

	@Override
	public void copy() {
		samCopy();
	}
	
}

LgPrinter 클래스 구현

import com.inter.common.PrinterDriver;

public class LgPrinter implements PrinterDriver{

	public LgPrinter() {
	}
	
	public void printLg() {
		System.out.println("인쇄중...LGLG");	
	}
	
	public void scanLg() {
		System.out.println("스캔중...LGLG");
	}
	
	public void copyLg() {
		System.out.println("복사중...LGLG");
	}

	@Override
	public void scan() {
		scanLg();
	}

	@Override
	public void copy() {
		copyLg();
	}

	@Override
	public void print() {
		printLg();
	}
	
	
}

Main

public class PrintMain {
	public static void main(String[] args) {
		PrinterController pc = new PrinterController(new SamsungPrinter());
		Scanner sc = new Scanner(System.in);
		
		System.out.println("====== 프린트이용 ======");
		System.out.println("1. 인쇄하기");
		System.out.println("2. 스캔하기");
		System.out.println("3. 복사하기");
		System.out.print("입력 > ");
		int cho = sc.nextInt();
		switch(cho) {
		case 1:	pc.print(); break;
		case 2:	pc.scan(); break;
		case 3:	pc.copy(); break;
		}
	}
}

PrinterController

public class PrinterController {
//	private SamsungPrinter printer =  new SamsungPrinter();
//	private LgPrinter printer = new LgPrinter();
	
	private PrinterDriver printer; //인터페이스는 참조변수로 선언 가능, 객체 생성 X
	
	public PrinterController() {
	}
    
    //매개변수를 인터페이스 자료형으로 선언하여 PrinterDriver를 implements하고 있는 클래스 모두를 받을 수 있다.
    //다형성을 이용하여 PrinterDriver를 상속 받은 클래스는 모두 Printer 기능을 이용할 수 있게 만든다.
	public PrinterController(PrinterDriver driver) {
		this.printer = driver;
	}
	
	public void print() {
		printer.print();
	}
	
	public void scan() {
		printer.scan();
	}
	
	public void copy() {
		printer.copy();
	}
}

출력결과

 

'Java' 카테고리의 다른 글

[Java] 다형성(Polymorphism)  (0) 2023.09.21
[Java] 상속(Inherit)  (0) 2023.09.17
[Java] 객체 배열(Object Array)  (0) 2023.09.17
[Java]객체(2) - 생성자(Contructor)와 this  (0) 2023.09.15
[Java] 객체란(1)?  (0) 2023.09.15