기록 저장소
[Java #14] abstract 본문
[ 추상클래스 (Abstract Class) ]
1. 기본개념
1) 정의: 추상메소드를 하나이상 가진 클래스
2) abstract keyword 사용
형식)
접근제어자 abstract class ClassName {
(field)
접근제어자 DT varName;
(constructor)
접근제어자 ClassName([args]) {
}
(method)
접근제어자 RT methodName([args]) { //구현method : method의 선언과 method의 body로 구성되어 있음
}
접근제어자 abstract RT methodName([args]); //추상method : method의 선언만 있음
}
- return type 앞에는 modifier가 올 수 있음 (접근제어자는 access modifier!)
- abstract도 modifier의 일종임
3) 추상클래스는 하위클래스를 제어하기 위해 사용
- 상속한 후 추상메소드를 override하지 않으면 에러 발생함
4) 추상클래스는 자신의 생성자를 이용하여 객체 생성 불가능
>> 추상클래스를 하위클래스에 상속시킨 후
반드시 추상메소드를 override 후 사용
>> 하위클래스를 참조하여 상위(추상)클래스의 객체를 생성 → 다형성
5) 객체 생성 방법 (일반 클래스에서도 사용가능하나, 일반적으로 추상클래스에서 사용함)
a. 하위클래스 참조
b. 자신의 객체를 return하는 static method 이용
- static method는 객체를 생성하지 않고도 클래스 이름으로 method 사용 가능(ex. Math.random() 등)
c. 외부클래스를 이용
d. 자신의 생성자를 이용
2. 상세내용 & 예제
▷ 추상클래스를 상속하고 override 하지 않으면 에러 발생함
▷ 하위클래스의 생성자를 통해 추상클래스(상위클래스)의 객체를 생성하는 방법
Dohyung d1 = new Rect(); //Rect까지 메모리에 할당하되, 타입은 Dohyung클래스!
//System.out.println(d1.width + d1.height + ""); //Dohyung 클래스에는 해당 필드가 없기때문에 컴파일 에러 발생
System.out.println(d1.getArea + d1.getRound + ""); //override하면 method가 링크되어 결국 override 된 method가 호출됨
Rect r2 = (Rect) d1; //상위클래스를 하위클래스에 대입하는 것이므로 강제형변환 하지 않으면 컴파일 에러 발생
System.out.println(r2.width + r2.height + "");
//Circle c2 = (Circle) d1; //Circle은 메모리에 할당되지 않은 상태이므로 형변환 불가
----------------------------------------------------------------------------------------------------------------------
//Calendar cal = new Calendar(); //api확인해보면, Calendar는 추상클래스이므로 생성 불가
Calendar cal1 = new GregorianCalendar(); //Calendar의 하위클래스를 참조하여 객체 생성
▷ 자신의 객체를 return하는 static method 사용
Calendar cal2 = Calendar.getInstance();
▷ 외부클래스 참조
Runtime r = Runtime.getRuntime();//Runtime의 생성자는 private이라 new로 호출 불가하므로 static method 이용함
Process p = r.exec("calc");
▷ 자신의 생성자를 이용
- 추상클래스의 모든 method를 override하면 자신의 생성자를 이용하여 객체를 생성할 수 있음
- 의미상의 추상클래스는 method중 하나만 override해도 new 사용 가능함
public class AbstractTest3 extends Frame {
WindowListener wl = new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
addWindowListener(wl);
'kitri 노트 > java' 카테고리의 다른 글
[Java #16] constant, modifier (0) | 2019.03.25 |
---|---|
[Java #15] interface (0) | 2019.03.25 |
[Java #13] inheritance (0) | 2019.03.25 |
[Java #12] method (0) | 2019.03.22 |
[Java #11] field, constructor (0) | 2019.03.21 |