일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 자바접근지정자
- 자바자료형
- 자바함수
- 자바별찍기
- 자바기타제어자
- 자바수우미양가
- 연산자우선순위
- 겟셋함수
- read()함수
- 클래스배열
- 자바형식
- 변수의 초기화
- 기타제어자
- 자바상수
- 자바실행방법
- 중첩for문
- 팩토리얼재귀
- 프로그래머스
- 자바클래스
- 오버로딩
- 변수명명규칙
- 오라클
- 자바if문
- 자바switch문
- 누승재귀
- 반복문라벨
- 효율적인연산
- SQL
- 자바제어문
- 자바연산자
- Today
- Total
h-i-s-t-o-r-y
[Java] 추상화 / 인터페이스(Interface) / 익명 클래스(anonomous class) 본문
> 추상화
클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업
예) 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 구현인터페이스명() { 인터페이스의 추상메서드를 재정의해서 사용할 뿐 }
'Java' 카테고리의 다른 글
[Java] String 클래스 - 문자열 관련 메서드들 정리 (0) | 2021.07.17 |
---|---|
[Java] 예외 처리 (Exception Handling) (0) | 2021.07.17 |
[Java] 클래스의 특징 - 다형성 / UpCasting, DownCasting (0) | 2021.07.17 |
[Java] 기타제어자 - final / abstract (0) | 2021.07.17 |
[Java] 오버라이딩(Overriding) / 패키지(package)와 import (0) | 2021.07.17 |