인터페이스 배효철 th1g@nate.com 1
목차 인터페이스의역할 인터페이스선언 인터페이스구현 인터페이스사용 타입변환과다형성 인터페이스상속 디폴트메소드와인터페이스확장 2
인터페이스의역할 인터페이스란? 개발코드와객체가서로통신하는접점 개발코드는인터페이스의메소드만알고있으면 OK 인터페이스의역할 개발코드가객체에종속되지않게 -> 객체교체할수있도록하는역할 개발코드변경없이리턴값또는실행내용이다양해질수있음 ( 다형성 ) 3
인터페이스의역할 4
인터페이스선언 인터페이스선언 인터페이스이름 - 자바식별자작성규칙에따라작성 소스파일생성 인터페이스이름과대소문자가동일한소스파일생성 인터페이스선언 5
인터페이스선언 인터페이스선언 인터페이스의구성멤버 6
인터페이스선언 상수필드선언 인터페이스는상수필드만선언가능 데이터저장하지않음 인터페이스에선언된필드는모두 public static final 자동적으로컴파일과정에서붙음 상수명은대문자로작성 서로다른단어로구성되어있을경우에는언더바 (_) 로연결 선언과동시에초기값지정 static { 블록작성불가 - static { 으로초기화불가 7
인터페이스선언 추상메소드선언 인터페이스통해호출된메소드는최종적으로객체에서실행 인터페이스의메소드는기본적으로실행블록이없는추상메소드로선언 public abstract 를생략하더라도자동적으로컴파일과정에서붙게됨 추상메소드 ( 메소드선언부 ) ( 호출방법만기술 ) 재정의된메소드 ( 실제실행메소드 ) 8
인터페이스선언 디폴트메소드선언 자바 8 에서추가된인터페이스의새로운멤버 실행블록을가지고있는메소드 default 키워드를반드시붙여야 기본적으로 public 접근제한 생략하더라도컴파일과정에서자동붙음 9
인터페이스선언 정적메소드선언 자바 8 에서추가된인터페이스의새로운멤버 10
인터페이스구현 구현객체와구현클래스 인터페이스의추상메소드대한실체메소드를가진객체 = 구현객체 구현객체 구현객체를생성하는클래스 = 구현클래스 11
인터페이스구현 구현클래스선언 자신의객체가인터페이스타입으로사용할수있음 implements 키워드로명시 추상메소드의실체메소드를작성하는방법 메소드의선언부가정확히일치해야 인터페이스의모든추상메소드를재정의하는실체메소드작성해야 일부만재정의할경우, 추상클래스로선언 + abstract 키워드붙임 12
인터페이스구현 익명구현객체 명시적인구현클래스작성생략하고바로구현객체를얻는방법 이름없는구현클래스선언과동시에객체생성 인터페이스의추상메소드들을모두재정의하는실체메소드가있어야 추가적으로필드와메소드선언가능하나익명객체안에서만사용 인터페이스변수로접근불가 13
인터페이스구현 다중인터페이스구현클래스 14
인터페이스구현 15
인터페이스사용 인터페이스에구현객체를대입하는방법 16
인터페이스사용 추상메소드사용 17
인터페이스구현 interface OpenCloseIf { public void open(); public void close(); interface PaintIf { public void Red(); public void Blue(); class Door implements OpenCloseIf, PaintIf { @Overridepublic void open() { System.out.println("Door Open"); @Override public void close() { System.out.println("Door Close"); @Override public void Red() { System.out.println("Paint the door red"); @Override public void Blue() { System.out.println("Paint the door blue"); 18
class Bottle implements OpenCloseIf { @Override public void open() { System.out.println("Bottle Open"); @Override public void close() { System.out.println("Bottle Close"); public class test { public static void main(string[] args) { Door door = new Door(); door.open(); door.close(); door.red(); door.blue(); Bottle bottle = new Bottle(); bottle.open(); bottle.close(); 19
인터페이스사용 디폴트메소드사용 인터페이스만으로는사용불가 구현객체가인터페이스에대입되어야호출할수있는인스턴스메소드 모든구현객체가가지고있는기본메소드로사용 필요에따라구현클래스가디폴트메소드재정의해사용 정적메소드사용 인터페이스로바로호출가능 20
인터페이스사용 interface Parent{ public abstract void run(); public default void setstate(boolean state){ if(state){ System.out.println(" 현재상태는정상입니다 "); else { System.out.println(" 현재상태는비정상입니다 "); public class Child implements Parent { public void run() { public void setstate(boolean state) { 21
인터페이스사용 interface Parent{ public abstract void run(); public default void setstate(boolean state){ if(state){ System.out.println(" 현재상태는정상입니다 "); else { System.out.println(" 현재상태는비정상입니다 "); public static void change() { System.out.println( 상태를변경합니다. ); 22
타입변환과다형성 다형성 하나의타입에여러가지객체대입해다양한실행결과를얻는것 다형성을구현하는기술 상속또는인터페이스의자동타입변환 (Promotion) 오버라이딩 (Overriding) 다형성의효과 다양한실행결과를얻을수있음 객체를부품화시킬수있어유지보수용이 ( 메소드의매개변수로사용 ) 23
타입변환과다형성 자동타입변환 (Promotion) 24
타입변환과다형성 필드의다형성 25
타입변환과다형성 인터페이스배열로구현한객체관리 26
타입변환과다형성 매개변수의다형성 매개변수의타입이인터페이스인경우 어떠한구현객체도매개값으로사용가능 구현객체에따라메소드실행결과달라짐 강제타입변환 (Casting) 인터페이스타입으로자동타입변환후, 구현클래스타입으로변환 필요성 : 구현클래스타입에선언된다른멤버사용하기위해 객체타입확인 (instanceof 연산자 ) 강제타입변환전구현클래스타입조사 27
인터페이스상속 인터페이스간상속가능 하위인터페이스구현클래스는아래추상메소드를모두재정의해야 하위인터페이스의추상메소드 상위인터페이스1의추상메소드 상위인터페이스2의추상메소드 인터페이스자동타입변환 해당타입의인터페이스에선언된메소드만호출가능 28
디폴트메소드와인터페이스확장 디폴트메소드와확장메소드사용하기 29
디폴트메소드와인터페이스확장 디폴트메소드가있는인터페이스상속 부모인터페이스의디폴트메소드를자식인터페이스에서활용방법 디폴트메소드를단순히상속만받음 디폴트메소드를재정의 (Override) 해서실행내용을변경 디폴트메소드를추상메소드로재선언 30
클래스비교 31