6. 추상클래스 abstract class
6.1 추상클래스란
-미완성 설계도. 미완성 메스드(추상 메서드)를 갖고 있는 클래스
-abstract를 붙이면 됨
abstract class 클래스이름 {
'''
}
abstract class Player { //추상클래스(미완성 클래스)
abstract void play(int pos); //추상메서드(몸통이 없는 미완성 메서드)
abstract void stop(); //추상메서드
}
-다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가
(미완성 설계도기 때문에 제품 생성 불가)
-상속을 통해 추상 메서드를 완성해야 인스턴스 생성가능
class AudioPlayer extends Player{ //완성된 설계도
void paly(int pos) { /* */ } //추상메서드를 구현함(추상메서드 몸통 만들기)
void stop() { /* */ } //추상메서드 구현
}
//더이상 추상메서드가 아니고 추상클래스가 아니니까 abstract안붙임
AudioPlayer ap = new AudioPlayer(); //인스턴스 생성가능
추상메서드를 포함하고 있다는 것을 제외하면 일반클래스와 다르지 않아서 생성자 있고 멤버변수 메서드 가질 수 있다.
6.2 추상메서드
-미완성 메서드. 구현부(몸통)가 없는 메서드
-꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우 사용
-구현부가 없으니 { }대신 문장의 끝인 ;를 붙인다
abstract 리턴타입 메서드이름();
abstract class Player { //추상클래스
abstract void play(int pos); //추상메서드
abstract void stop();
}
class AudioPlayer extends Player{ //완성된 설계도
void paly(int pos) { /* */ } //추상메서드를 구현함(추상메서드 몸통 만들기)
void stop() { /* */ } //추상메서드 구현
}
//더이상 추상메서드가 아니고 추상클래스가 아니니까 abstract안붙임
abstract class AbstractPlayer extends PlayerP{
void play(int pos) { /* */ }
} //하나만 구현부를 완성했으니 아직 추상클래스임
-추상 메서드 호출 가능(호출할 때는 선언부만 필요)
나중에 상속을 통해 자손이 완성할 수 있으니까
인스턴스 메서드는 객체생성 후 호출 가능함
상속을 통해 자손이 완성, 자손 객체 생성 후
6.3 추상클래스의 작성
-여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존 클래스의 공통 부분을 뽑아서 추상클래스를 만든다.
class Marine {
int x, y;
void move(int x, int y) {}
void stop() {}
void stimPack() {}
}
class Tank {
int x, y;
void move(int x, int y) {}
void stop() {}
void changeMode() {}
}
class Dropship {
int x, y;
void move(int x, int y) {}
void stop() {}
void load() {}
void unload() {}
}
//기존의 클래스에서 공통된 부분을 뽑아내어 추상클래스로 만들면 아래와 같음
abstract class Unit {
int x, y;
abstract void move(int x, int y);
void stop() {}
}
class Marine extends Unit {
void move(int x, int y) {}
void stimPack() {}
}
class Tank extends Unit {
void move(int x, int y) {}
void changeMode() {}
}
class Dropship extends Unit {
void move(int x, int y) {}
void load() {}
void unload() {}
}
추상화<->구체화
추상화된 코드는 구체화된 코드보다 유연하다(변경에 유리함)
7.인터페이스 interface
7.1 인터페이스란
-추상 메서드의 집합
-구현된 것이 전혀 없는 설계도. 껍데기 (모든 멤버가 public)
(public 접근 제한이 전혀 없는 접근 제어자)
추상클래스는 일반 클래스인데 추상 메서드를 가지고 있는것(생성자, iv가짐)
인터페이스는 추상 메서드외에 아무것도 가질 수 없음(멤버변수를 가질 수 없음)
interface 인터페이스이름{
public static final 타입 상수이름 = 값; //상수 (변수는 가질 수 없음)
public abstract 메서드이름(매개변수목록); //추상메서드
}
interface PlayingCard {
public static final int SPADE = 4;
final int DIAMOND = 3;
statuc int HEART = 2;
int CLOVER = 1;
//항상 public static final 이라서 생략가능
public abstract String getCardNumber();
String getCardKind(); //public abstract String getCardKind();
} //인터페이스는 추상메서드만 가지고 무조건public이라 생략가능
-모든 멤버변수는 public static final 이어야 하며, 생략 가능
-모든 메서드는 public abstract이어야 하고 생략가능
7.3 인터페이스의 상속
-인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상이 아님!)
-다중 상속 가능(추상메서드는 충돌해도 문제 없음)
interface Fightable Movable, Attackable { } //멤버2개됨
interface Movable {
void move(int x, int y);
}
interface Attackable {
void attack(Unit u);
}
7.4 인터페이스의 구현
-인터페이스에 정의된 추상 메서드를 완성하는 것(인터페이스 구현)
class 클래스이름 implements 인터페이스이름 {
//인터페이스에 정의도니 추상메서드를 모두 구현해야 한다.
}
-일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 함
Q.인터페이스란?
A.추상메서드의 집합
Q.인터페이스의 구현이란?
A.인터페이스의 추상메서드 몸통{ } 만들기 (미완성 설계도 완성하기)
Q.추상클래스와 인터페이스의 공통점은?
A.추상 메서드를 가지고 있다. (미완성 메서드)
Q.추상클래스와 인터페이스의 차이점은?
A.인터페이스는 iv를 가질 수 없다.
7.5 인터페이스를 이용한 다중상속
7.6 인터페이스를 이용한 다형성
다형성
Tv t = new SmartTv();
조상 참조변수로 자손 객체 가리키는 것
그렇다면 인터페이스도 구현 클래스의 부모로 치는건가? Yes
'JAVA' 카테고리의 다른 글
| JAVA | 예외처리 (0) | 2022.02.12 |
|---|---|
| JAVA | 인터페이스 장점, 내부 클래스 (0) | 2022.02.11 |
| JAVA | final 상수 (0) | 2022.02.06 |
| JAVA | 재귀호출, 변수의 초기화 (0) | 2022.02.05 |
| JAVA | instanceof연산자, 매개변수 다형성, 객체 배열로 다루기 (0) | 2022.02.03 |