h-i-s-t-o-r-y

[Java] 추상화 / 인터페이스(Interface) / 익명 클래스(anonomous class) 본문

Java

[Java] 추상화 / 인터페이스(Interface) / 익명 클래스(anonomous class)

H' 2021. 7. 17. 23:29

> 추상화

클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업

    예) abstract Employee 사원이라면 공통적으로 가지고 있어야할 멤버 선언한 클래스

    Employee - Regular - SalesMan - Temp

추상클래스는 완성되지 않은 설계도. 자식클래스들의 공통점을 가지고 있다.

선언부만 있어서 상속받는 자식클래스가 몸체를 구현해야 한다.

 

* 추상화 사용 이유?

코딩이 간결. 공통적으로 가진 내용을 모든 클래스들에서 선언해야 하는 복잡함 사라짐


package days19;

public class Ex07 {

	public static void main(String[] args) {
    
		// 1. 추상클래스도 클래스의 한 종류이다.
		// 2. 추상클래스에 업캐스팅 가능하다.
		//VideoPlayer p = new VideoPlayer();	//모두 사용가능
		//AudioPlayer p = new VideoPlayer();	//모두 사용가능
		Player p = new VideoPlayer();		//pause()빼고 사용가능
		//p.pause();
		p.stop();		//> VideoPlayer.stop()...
		p.play(10);		//> AudioPlayer.play()...
		
		
	}//main

}//class


//추상클래스 - 객체 생성하고 사용하지 말라는 의도
abstract class Player{
	abstract void play(int pos);
	abstract void stop();
}//class

abstract class AudioPlayer extends Player{
	void pause() {	//잠시멈춤()
		//코딩
	}
	
	//추상클래스에서 상속된 추상메서드도 오버라이딩(재정의)한다.
	@Override
	void play(int pos) {
		System.out.println("> AudioPlayer.play()...");
	}
}//class

class VideoPlayer extends AudioPlayer{
	
	@Override
	void stop() {
		System.out.println("> VideoPlayer.stop()...");
	}
}

> 인터페이스

추상클래스보다 추상화 정도가 더 높은 참조 타입의 자료형 일종의 추상클래스

자료형) 참조형 - 배열, 클래스, [인터페이스]

 

> 인터페이스 선언 형식

[public or default] interface 인터페이스명 [extends 부모인터페이스] {
        public static final 상수
        public abstract 추상메서드

        JDK 1.8
        >> 디폴트 메서드
        >> static 메서드
}

 

> 인터페이스를 이용한 다중상속

    인터페이스는 여러 인터페이스들로부터 상속받는 다중상속이 가능하다.

    interface 인터페이스 extends 인터페이스, 인터페이스, ...

 

> 인터페이스를 이용한 다형성

    인터페이스 타입의 참조변수로 그 인터페이스를 구현한 클래스의 멤버들에 접근할 수 있다.

 

> 인터페이스 장점
    ㄱ. 한쪽에서는 인터페이스를 선언하고, 다른한쪽에선 인터페이스를 구현하는 작업이

        동시에 이루어지기 때문에 개발시간이 단축된다.

    ㄴ. 선언부와 구현부가 따로 작성되어 독립적이다.

    ㄷ. 관계없는 클래스들이 공통의 인터페이스를 구현함으로써 클래스들간의 관계가 형성될 수 있다.

    ㄹ. 인터페이스는 기본 설계도이기 떄문에 이를 구현하는 프로그램들은 일관성이 있다.


package days19;

public class Ex08 {

	public static void main(String[] args) {
		
		System.out.println(PlayingCard.SPACE);
		System.out.println(PlayingCard.DIAMOND);
		
	}//main

}//class


interface PlayingCard{
	public static final int SPACE = 4;
	//public static final (기본생략)
	int DIAMOND = 3;		//public static final
	static int HEART = 2;	//public static final
	final int CLOVER = 1;	//public static final
	
	public abstract String getCardNumber();	//추상메서드
	//public abstract (기본생략)
	String getCardKind();	//abstract 키워드 없는데도 구현부(몸체){}없어도 에러X
}
package days19;

public class Ex11 {

	public static void main(String[] args) {
    
		// H사에서
		// 신형차
		//	+ 신형엔진(인터페이스) -> S, H, K 공체업체
		
		S_Engine sengine = new S_Engine();
		K_Engine kengine = new K_Engine();
		H_Engine hengine = new H_Engine();
		
		NewCar myCar = new NewCar(sengine);
//		NewCar myCar = new NewCar(kengine);
//		NewCar myCar = new NewCar(hengine);
		
		myCar.speedUp(10);
		
		// 10년 뒤에 sengine이 고장
		myCar.setEngine(kengine);
		myCar.speedUp(20);
		
		myCar.setEngine( new K_Engine_Two() );
		myCar.speedDown(20);
		
		System.out.println("END");
	}

}

> 익명 클래스 (anonymous class)

이름이 없는 클래스로 클래스를 선언하는 동시에 생성한다.

 

> 익명클래스 선언 형식

    ㄱ. new 부모클래스명() { 필드X메서드X 부모클래스의 메서드만을 재정의해서 사용할 뿐 }

    ㄴ. new 구현인터페이스명() { 인터페이스의 추상메서드를 재정의해서 사용할 뿐 }

 

 


 

Comments