package ex0726;

public class Ex02_interface {
	public static void main(String[] args) {
		// Demo2 dm = new Demo2(); // 컴파일 오류. 인터페이스는 추상 클래스의 일종으로 객체 생성 불가

		// 인터페이스는 구현 클래스의 상위 클래스와 유사하다.
		Demo2 dm = new DemoImpl2(); // up casting
		dm.print();
		dm.disp();
		
		// dm.sub(); // 컴파일 오류. 
			// 구현 클래스에는 정의 되어 있지만 인터페이스에는 존재하지 않으므로
		((DemoImpl2)dm).sub(); // down casting
		
		System.out.println(Demo2.A);
		
		// Demo2.B = 50 ; // 컴오류. 인터페이스에 정의된 필드는 final 이므로
		
	}
}
// interface : 선언만 있고 정의가 없는 abstract 클래스의 일종
// 인터페이스 작성
interface Demo2 {
	// 인터페이스 필드는 static final만 가능
	public static final int A = 10;
	int B = 20; // public static final을 붙이지 않아도 public static final
	
	public void print(); // 메소드는 선언만 가능(abstract 메소드)
	public abstract void disp(); // abstract 는 생략 가능
	
	/*
	public void sub() { // 메소드를 정의 하면 컴파일 오류가 발생
		// 
	}
	*/
	
}

인터페이스 클래스에서는 메소드를 대괄호를 넣어서 정의를 하면 안되고, 따옴표를 찍어서 ; 선언만 가능!!

// 인터페이스 구현
// 인터페이스를 구현한 클래스가 추상 클래스가 아닌 경우 인터페이스의 모든 메소드를 재정의 해야 한다.
class DemoImpl2 implements Demo2 {
	@Override
	public void print() {
		System.out.println("print - 인터페이스 메소드 재정의...");		
	}

	@Override
	public void disp() {
		System.out.println("disp - 인터페이스 메소드 재정의...");
	}
	
	public void sub() {
		System.out.println("클래스에 정의된 메소드...");
	}
	
}

인터페이스에서 선안된 메소드를 인터페이스를 구현한 클래스가 꼭 Override를 해야함!

+ Recent posts