추상클래스
2022. 12. 3. 23:55ㆍ자바멘토링
추상클래스
-미완성 설계도: 미완성 메소드를 갖고 있는 메소드
package main200;
abstract class Player{//추상클래스 (미완성 클래스,미완성 설계도)
abstract void play(int pos);//추상 메소드 (미완성 메소드)
abstract void stop();//추상 메소드(선언부만 있고 구현부{}가 없는 메소드
}
-다른 클래스 작성에 도움을 주기위한 것으로 , 인스턴스 생성 불가
Player p = new Player(); //에러발생
미완성설계도 => 제품 생산 불가
-상속을 통해 추상메소드를 완성해야 인스턴스 생성 가능하다.
//추상클래스는 상속을 통해 완성해야 객체 생성 가능
class AudioPlayer extends Player{
void play (int pos) {
System.out.println(pos+"위치부터 paly합니다.");
}
void stop() {
System.out.println("재생을 멈춥니다.");
}
//두개다 구현을 해야 한다, 안할시는 abstract를 구현해줘야 한다.
}
//한개 메소드만 구현시 abstract를 붙혀 줘야 한다
abstract Class Abstractpayer extends player{
void play(int Pos)
}
Audioplayer ap = new Audioplayer(); //인스턴스 생성 가능(완성된 설계도)
Player pr = new Audioplayer(); // 조상 참조변수로도 생성가능 , 조상은 버튼(리모콘) 만 제공
pr.play(100);// 리모콘이 타입과 상관없이 실제 호출 되는 것은 구현 클래스 AudioPlayer가 호출된다.
pr.stop();
//다형성 예시
<추상메소드>
-추상 메소드 호출가능 (호출할때는 선언부만 필요)->인스턴스 (상속을 통해 객체 구현후 호출 가능)
abstract는 강제적인 것이 있다 . 꼭 자식 클래스에서 구현을 해야 한다.
추상메소드 사용하는 이유?
꼭 필요하지만 자손마다 다르게 구현 될 것으로 예상되는 경우
package main200;
public class EX7_10 {//추상 클래스
public static void main(String []args) {
/* Unit[] group = { new Marine(), new Tank(), new Dropship()}, */
Unit[] group = new Unit[3];//object로는 타입을 할수 없다 거기에는 move메소드가 없다.
group[0]= new Marine();
group[1]= new Tank();
group[2]= new Dropship();
//다형성 Unit[]타입에다가 ,group[0],group[1],group[2]의 타입은 Unit
group[0].move(100, 200);//각자 구현 된 것들이 실행된다.
group[1].move(100, 200);
group[2].move(100, 200);
}
}
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) {
System.out.println("Marine[x=" +x + ",y="+y+"]");
}
void stimPack() {
/*스팀팩을 사용한다,*/
}
}
class Tank extends Unit{
void move(int x, int y) {
System.out.println("Tank[x=" +x + ",y="+y+"]");
}
void changeMode() {
}
}
class Dropship extends Unit{
void move(int x, int y) {
System.out.println("Dropship[x=" +x + ",y="+y+"]");
}
void changeMode() {
}
}
추상화 <->구체화
추상화된 코드는 구체화된 코드 보다 유연하다.변경에 유리
GregorianCalendar cal = new GregorianCalendar();
//어떤 클래스의 객체를 만들어서 그 해당 클래스 타입에 참조변수를 다루다보니 명확하고 분명하다.
Calendar cal = Calendar.getInstance();
//Calendar객체를 반환한다, 그것을 참조 변수를 cal로 받는다.
//Calendar은 추상 클래스 이다. Calendar자손 객체를 반환한다. 어떤것을 반환할 지 모른다.
//추상적으로 써놓으면 유연하다.
private static Calendar createCalendar(TimeZone zone, Locale aLocale){
if(caltype != null{//캘린더 타입에 따라서 객체 생성 및 반환
switch (caltype){
case "buddhist":
cal = new BuddhistCalendar(zone,aLocale);
break;
case "japanese":
cal = new JapaneseImperialCalendar(zone,aLocale);
break;
case "gregory";
cal = new GregorianCalender(zone,aLocale);
break;
}
}
}
정리
- 상속과 다르게 꼭 자손 클래스에서 오버라이딩 해서 구현을 해야 한다.
-구현이 안된 추상클래스를 포함하고있다.
'자바멘토링' 카테고리의 다른 글
파일디스크립터 (0) | 2022.12.18 |
---|---|
리플렉션 (0) | 2022.12.15 |
Try - With - Resource (0) | 2022.12.04 |
Weak Reference & Soft reference (0) | 2022.12.03 |
Static 이란? (0) | 2022.11.27 |