추상 클래스란?
- 구현 코드 없이 메서드의 선언만 있는 추상 메서드(abstract method)를 포함한 클래스
- 메서드 선언(declaration) : 반환 타입, 메서드 이름, 매개변수로 구성
- 메서드 정의(definition) : 메서드 구현(implementation)과 동일한 의미 구현부(body)를 가짐 ({ })
예) int add(int x, int y); // 선언, 구현부 없음, 추상 메서드 O
int add(int x, int y){ } // 구현부가 있음, 추상 메서드 아님
- abstract 예약어를 사용 - ( abstract <-> concrete 구체적인)
- 추상 클래스는 new 할 수 없음 ( 인스턴스화 할 수 없음 )
예) Computer를 new 하고 display 호출하면 구현 코드가 없음. 실행될 부분이 없어서 안됨.
추상 클래스 구현하기
메서드에 구현 코드가 없으면 abstract로 선언
abstract로 선언된 메서드를 가진 클래스는 abstract로 선언
모든 메서드가 구현 된 클래스라도 abstract로 선언되면 추상 클래스로 인스턴스화 할 수 없음
다 구현했더라도 추상클래스로 사용할 수 있다. - why? 상속만을 목적으로 사용하기 위해서 - new 사용 불가능
추상 클래스의 추상 메서드는 하위 클래스가 상속하여 구현
추상 클래스 내의 추상 메서드 -> 하위 클래스가 구현해야 하는 메서드
추상 클래스 내의 구현 된 메서드 -> 하위 클래스가 공통으로 사용하는 메서드 ( 필요에 따라 하위 클래스에서 재정의 )
예제 구현하기
기울임꼴 애들은 추상 클래스와 추상 메서드 나타냄
추상 클래스 Computer
모두 구현된 클래스 Desktop
추상 클래스 내의 추상 메서드 -> 하위 클래스가 구현해야 하는 메서드
추상 클래스 내의 구현된 메서드 -> 하위 클래스가 공통으로 사용하는 메서드 ( 필요에 따라 하위 클래스에서 재정의 )
추상 클래스 NoteBook +
모두 구현된 클래스 MyNoteBook
추상 클래스는 new 할 수 없음 ( 인스턴스화 할 수 없음 )
예) Computer를 new 하고 display 호출하면 구현 코드가 없음. 실행될 부분이 없어서 안됨.
추상 클래스의 응용 - 템플릿 메서드 패턴
템플릿 메서드
추상 메서드나 구현된 메서드를 활용하여 코드의 흐름(시나리오)을 정의하는 메서드
final로 선언하여 하위 클래스에서 재정의 할 수 없게 함 -
final 변수 - 상수 // final 메서드 - 재정의 금지 // final class - 상속 금지
프레임워크에서 많이 사용되는 설계 패턴
추상 클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용하여 전체적인 흐름을 정의하고 하위 클래스에서
다르게 구현되어야 하는 부분은 추상 메서드로 선언하여 하위 클래스에서 구현하도록 함
Car
AICar
ManualCar
CarTest
시나리오 대로 출력 확인 GOOD :)
메서드는 타입형이 아닌 인스턴스형으로 적용 개념!
+ 기능을 추가 하려고 할 때
여러 자바 파일에서 사용하는 상수 값 정의
Define.java
public class Define {
public static final int MIN = 1;
public static final int MAX = 999999;
public static final double PI = 3.14;
public static final String GREETING = "Good Morning!";
public static final int MATH_CODE = 1001;
public static final int CHEMISTRY_CODE = 1002;
}
static final 로 지정 후 모아 놓으면 나중에 사용자가 사용할 때
( Define . ~ )해서 사용 가능 - new 해서 사용할 필요가 없어짐
UsingDefine.java
public class UsingDefine {
public static void main(String[] args) {
System.out.println(Define.GREETING);
System.out.println(Define.MIN);
System.out.println(Define.MAX);
System.out.println(Define.MATH_CODE);
System.out.println(Define.CHEMISTRY_CODE);
System.out.println("원주률은" + Define.PI + "입니다.");
}
}
review
추상 클래스(abstract class)와 템플릿 메서드 패턴
실습 예제를 따라 하면서 개념 이해가 잘 되었다.
추상 클래스는 구현부 { } 가 없는 선언만 있는 메서드 포함한다.
추상 클래스에 추상 메서드 이것을 구현해야 하는 하위 클래스들
시나리오대로 흘러가게 하는 템플릿 메서드 패턴
반복문과 조건문을 잘 쓰면 프로그램을 잘 짜는 것이라 생각했던
내가.. 어리석었다.
여러 조건과 상황이 있으면 if-elseif, while 문에
추가해주고 변경해주면 되겠지 생각했었다.
하지만 이번에 상속과 추상 클래스를 배우면서 여러 조건과 상황, 메서드들이 있었지만
if, while 단 한 번도 쓰지 않았다. wow
다른 상황에서는 사용하겠지만 적어도 이번 예제에서는ㅎㅎ
상위 클래스의 기본 기능을 쓰면서 추가되는 기능은 추가해주거나 재정의하여 사용하거나 하면 되었다.
새로운 개념 확립! 후후 개발자가 되기 위해 한 발 한 발 나아가는 중임을 느낀다!
'JAVA 웹 개발 패키지 - 패스트캠퍼스 > Chapter3' 카테고리의 다른 글
인터페이스 - 메서드, 구현, 상속 (0) | 2022.01.04 |
---|---|
인터페이스(interface) (0) | 2022.01.04 |
다운 캐스팅과 instanceof (0) | 2022.01.04 |
다형성과 다형성을 사용하는 이유 (0) | 2022.01.03 |
메서드 재정의 하기 (overring) (0) | 2022.01.03 |