JAVA 웹 개발 패키지 - 패스트캠퍼스/Chapter3

추상 클래스(abstract class) 와 템플릿 메서드 패턴

giggs 2022. 1. 4. 11:27

 

추상 클래스란?

 

 

- 구현 코드 없이 메서드의 선언만 있는 추상 메서드(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 

 

body 를 구성하던지 / abstract로 추상메서드로 만들어라

 

abstract로 추상클래스로 만들어라

 

 

 

 


 

 

모두 구현된 클래스 Desktop 

 

추상클래스 Computer 상속받았다. 구현하지 않은 추상메서드 모두 구현하던지 // 너도 추상클래스가 되어라

 

 

추상 클래스 내의 추상 메서드 -> 하위 클래스가 구현해야 하는 메서드

추상 클래스 내의 구현된 메서드 -> 하위 클래스가 공통으로 사용하는 메서드 ( 필요에 따라 하위 클래스에서 재정의 )

 

 


 

 

추상 클래스 NoteBook  +

모두 구현된 클래스 MyNoteBook 

 

 

 

 

 


 

 

 

 

추상 클래스는 new 할 수 없음 ( 인스턴스화 할 수 없음 )

   예) Computer를 new 하고 display 호출하면 구현 코드가 없음. 실행될 부분이 없어서 안됨.

 

 

 


 

 

 

추상 클래스의 응용 - 템플릿 메서드 패턴

 

 

템플릿 메서드

 

추상 메서드나 구현된 메서드를 활용하여 코드의 흐름(시나리오)을 정의하는 메서드

 

final로 선언하여 하위 클래스에서 재정의 할 수 없게 함 -

final 변수 - 상수 // final 메서드 - 재정의 금지 // final class - 상속 금지

 

프레임워크에서 많이 사용되는 설계 패턴

 

추상 클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용하여 전체적인 흐름을 정의하고 하위 클래스에서

다르게 구현되어야 하는 부분은 추상 메서드로 선언하여 하위 클래스에서 구현하도록 함

  

 

 


 


 

Car 

 


 

AICar 

 


 

ManualCar

 


 

CarTest

 

시나리오 대로 출력 확인 GOOD :)

메서드는 타입형이 아닌 인스턴스형으로 적용 개념!

 


 

+ 기능을 추가 하려고 할 때

 

{ } 가 있냐 없냐 차이로 구현이 됐다 / 안됐다 결정 -&gt; 추상메서드로 포함되냐 안되냐 판단

 

추상메서드로 넘어온 부분은 상속 받은 모든 클래스에서 반드시 각각 구현 // 안하려면 추상클래스로 선언

 

추가 기능을 넣어준 AICar 시나리오 에서만 세차 기능 출력 확인

 

 


 

여러 자바 파일에서 사용하는 상수 값 정의

 

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
다른 상황에서는 사용하겠지만 적어도 이번 예제에서는ㅎㅎ

상위 클래스의 기본 기능을 쓰면서 추가되는 기능은 추가해주거나 재정의하여 사용하거나 하면 되었다.
새로운 개념 확립!  후후 개발자가 되기 위해 한 발 한 발 나아가는 중임을 느낀다!