인터페이스 기본

zzangbae·2023년 5월 12일
0

Java-인터페이스

목록 보기
1/1
post-thumbnail

이 글은 개발 공부하는 "학생"의 글입니다. 참고용으로만 활용해주시길 바랍니다. 혹시 오류를 찾으셨다면 답글달아주시면 정말 감사드리겠습니다:)

공부 한 곳 : 자바 프로그래밍 입문(박은종 저)

인터페이스 -> 구현 코드X

정의 : 자바 프로그래밍 언어에서 클래스들이 구현해야 하는 동작을 지정하는데 사용되는 추상 자료형

  • 클래스 혹은 프로그램이 제공하는 기능을 명시적으로 선언하는 역할
  • 추상 메서드, 상수로만 이루어져 있음
    => 구현 코드 없음 -> 인터페이스로 인스턴스를 생성할 수 없음
package interfaceex;

public interface Calc {
	// 변수이지만 컴파일 과정에서 상수로 인식됨
    // public static final이 자동으로 붙게됨
    double PI = 3.14;
    int ERROR = -9999999;
    
    // 추상 메서드
    // public abstract가 자동으로 붙게됨
    int add(int num1, int num2);
    int substract(int num1, int num2);
    int times(int num1, int num2);
    int divide(int num1, int num2);
}

클래스를 통한 인터페이스 구현1-추상클래스

인터페이스를 클래스에서 사용하는 것
= 클래스에서 인터페이스를 구현(implements)하다.

인터페이스를 구현한 클래스는 2가지를 선택할 수 있다.

  • 인터페이스의 추상 메서드를 모두 구현하여, 구체적인 클래스로서 존재
    => 인스턴스 생성가능
  • 인터페이스의 추상 메서드 중 일부만 구현하여, 추상 클래스로서 존재
    => 인스턴스 생성 불가능
    => 구현체를 만드려면 추상 클래스를 상속한 구체적인 클래스를 만들어야함
package interfaceex;

public abstract class Calculator implements Calc {

	@Override	// 상속받아서 구현
	public int add(int num1, int num2) {
		return num1 + num2;
	}

	@Override
	public int substract(int num1, int num2) {
		return num1 - num2;
	}
}

  • 추상클래스이기 때문에 위와 같이 표현한다
  • 화살표 뜻 : Calculator가 Calc을 구현했다(점선-추상클래스)

클래스를 통한 인터페이스 구현2-클래스 완성

위에서 인터페이스를 구현하여 추상클래스를 만들었다.
이제, 추상클래스를 상속(extends)받아 구체적인 클래스를 만들어본다.

package interfaceex;

public class CompleteCalc extends Calculator{

	@Override
	public int times(int num1, int num2) {
		return num1 * num2;
	}

	@Override
	public int divide(int num1, int num2) {
		if(num2 != 0)
			return num1/num2;
		else
			return Calc.ERROR;
	}
	
	// CompleteCalc에서 추가로 구현한 메서드
	public void showInfo() {
		System.out.println("Calc 인터페이스를 구현하였습니다.");
	}
}	

이제, 위에서 구현해 놓은 CompleteCalc를 실행해보자

package interfaceex;

public class CalaulatorTest {

	public static void main(String[] args) {
		int num1 = 10;
		int num2 = 5;
		
		CompleteCalc calc = new CompleteCalc();
		System.out.println(calc.add(num1, num2));		// 15
		System.out.println(calc.substract(num1, num2));	// 5
		System.out.println(calc.times(num1, num2));		// 50
		System.out.println(calc.divide(num1, num2));	// 2
		calc.showInfo();	// Calc 인터페이스를 구현하였습니다.
	}
}

new CompleteCalc()를 보면 알 수 있듯이, 구체적인 클래스인 CompleteCalc 클래스만 인스턴스를 생성할 수 있음

  • 이제 위와 같이 구현된 것이다.
  • CompleteCalc는 Calc를 구현한 Calculator을 상속받은 '구체적인 클래스'로서, 인스턴스를 생성할 수 있다.

인터페이스 구현과 형 변환

  • 하위 클래스의 형 변환이 어떻게 이루어질까?
    Calc <----- Calculator <------ CompleteCalc
  • 상속 관계에서 하위 클래스는 상위 클래스 자료형으로 묵시적 형 변환할 수 있음
    => 인터페이스도 마찬가지다.
    => CompleteCalc는 Calculator형 이면서, Calc형이다.
    = 사람은 동물이면서 생명체이다.(사람 < 동물 < 생명체)
// 위의 코드에 이어서
// CompleteCalc calc = new CompleteCalc(); 위의 구현체
Calc newCalc = calc;


=> 인터페이스를 구현한 클래스가 있을 때, 그 클래스는 해당 인터페이스형으로 묵시적 형 변환이 이루어지며, 형 변환되었을 때 사용할 수 있는 메서드는 인터페이스에서 선언한 메서드 뿐이다!
=> Calc에는 showInfo()는 없음을 확인할 수 있다.


정리

  • 인터페이스는 클래스들이 구현해야할 기능을 명시적으로 선언해둔 추상 자료형이다.
    => 연극에서의 "대본"이다. 즉, 대본은 연기할 연기자(인스턴스)가 필요하다.
  • 인터페이스에는 추상 메서드와 상수만 존재한다.
    (public static final, public abstract를 안써도 자동으로)
  • 구현은 implements로 수행한다.
  • 인터페이스를 구현할 클래스가 있을 때, 그 클래스는 해당 인터페이스형으로 묵시적 형 변환이 이루어지며 형 변환이 되었을 때 사용할 수 있는 메서드는 인터페이스에서 선언한 메서드 뿐이다.
profile
배우는 게 너무 즐거운 개발자

0개의 댓글