본문 바로가기
Language/JAVA

[JAVA]인터페이스(interface) 구현과 형변환

by 바까 2020. 6. 29.
반응형

구현 코드가 없는 인터페이스(interface)

인터페이스는 클래스 혹은 프로그램이 제공하는 기능을 명시적으로 선언하는 역할을 한다.

인터페이스는 추상 메서드상수로만 이루어져 있다.

구현된 코드가 없기 때문에 당연히 인터페이스로 인스턴스를 생성할 수도 없다.


인터페이스의 요소

상수: 모든 변수는 상수로 변환

추상 메서드: 모든 메서드는 추상 메서드로 변환

디폴트 메서드: 기본 구현을 가지는 메서드, 구현 클래스에서 재정의 할 수 있음

정적 메서드: 인스턴스 생성과 상관없이 인터페이스 타입으로 사용할 수 있는 메서드

private 메서드: 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없다. 인터페이스 내부에서만 기능을 제공하기 위해 구현하는 메서드


실습

[메모리 구조]

[Calc 클래스]

package interfaceTest;

//인터페이스 정의
public interface Calc {

	//필드 정의
	//인터페이스에서 선언한 변수는 컴파일 과정에서 상수로 변환 -> final 예약어를 사용할 필요없음
	double PI = 3.14;
	int ERROR = -99999;
	
	//메서드 선언 (선언 - > 구현체가 없음)
	//인터페이스에서 선언한 메서드는 컴파일 과정에서 추상메서드로 변환된다. public abstract 를 작성할 필요없음
	int add(int num1, int num2);
	int substract(int num1, int num2);
	int times(int num1, int num2);//multiply
	int divide(int num1, int num2);
    
   //디폴트 메서드
	default void description() {
		System.out.println("정수 계산기를 구현합니다.");
	}
	//정적 메서드
	static int total(int[] arr) {
		int total = 0;
		
		for(int i:arr) {
			total += i;
		}
		return total;
	}
	
	//private 메서드
	private void myMethod() {
		System.out.println("private메소드 입니다.");
	}
	//private static 메서드
	private static void myStaticMethod() {
		System.out.println("private static 메서드 입니다.");
	}
}

[Calculator  클래스]

package interfaceTest;


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;
	}
	
}

//인터페이스의 모든 추상메서드를 구현하지 않았기 때문에 추상클래스(abstract)

[CompleteCalc  클래스]

package interfaceTest;

//구현체 클래스
public class CompleteCalc extends Calculator{
	
	@Override
	public int times(int num1, int num2) {
		// TODO Auto-generated method stub
		return num1 * num2;
	}
	@Override
	public int divide(int num1, int num2) {
		// TODO Auto-generated method stub
		if(num2 != 0)
			return num1/num2;
		else
			return Calc.ERROR; //num2가 0, 즉 나누는 수가 0인 경우에 대해 오류를 반환
	}
	
	//CompleteCalc에서 추가로 구현한 메서드를 정의
	public void showInfo() {
		System.out.println("Calc 인터페이스를 구현합니다.");
	}
}

 [메인 클래스]

package interfaceTest;

//구동 클래스
public class CalculatorTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int num1 = 10;
		int num2 = 5;
		
		//객체 생성
		CompleteCalc calc = new CompleteCalc();
		//더하기 메서드를 호출한 후 결과값을 출력
		System.out.println(calc.add(num1, num2));
		//빼기 메서드를 호출한 후 결과값을 출력
		System.out.println(calc.substract(num1, num2));
		//곱하기 메서드를 호출한 후 결과값을 출력
		System.out.println(calc.times(num1, num2));
		//나누기 메서드를 호출한 후 결과값을 출력
		System.out.println(calc.divide(num1, num2));
		//showInfo() 메서드 호출
		calc.showInfo();
		
		//형변환(업캐스팅)
		Calc calcTest = new CompleteCalc();
		calcTest.add(num1, num2);
		calcTest.substract(num1, num2);
		calcTest.times(num1, num2);
		calcTest.divide(num1, num2);
		//단, calcTest.showInfo();는 접근할 수 없다. 
	}

}

+ 인터페이스를 구현한 클래스는 인터페이스 형으로 선언한 변수로 형 변환 할 수 있다. 

상속에서의 형 변환과 동일한 의미.

단, 클래스 상속과 달리 구현 코드가 없기 때문에 여러 인터페이스를 구현할 수 있다. 

형 변환 시 사용할 수 있는 메서드는 인터페이스에 선언된 메서드만 사용할 수 있다.

 

[예시]

Calc calc = new CompleteCalc();

//형변환(업캐스팅)
		Calc calcTest = new CompleteCalc();
		calcTest.add(num1, num2);
		calcTest.substract(num1, num2);
		calcTest.times(num1, num2);
		calcTest.divide(num1, num2);
		//단, calcTest.showInfo();는 접근할 수 없다. 


 

반응형

댓글