Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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 31
Archives
Today
Total
관리 메뉴

기록 저장소

[Java #14] abstract 본문

kitri 노트/java

[Java #14] abstract

resault 2019. 3. 25. 23:14


[ 추상클래스 (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