[Programming]/[Language]

[Java] Ch8. 추상 클래스 / K-Digital Credit Java / 객체 지향 프로그래밍 기초 / Summary

김파고띠 2022. 3. 19. 14:08

/// 17. 추상 클래스란?

 

| 추상 클래스

추상 메서드를 포함한 클래스

추상 메서드

  • 구현 코드가 없이 선언부만 있는 메서드

abstract 예약어 사용

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

 

cf) concrete class : 추상 메서드가 아닌 지금까지 코딩했던 클래스들

 

  • 선언부의 요소 : 반환값, 메서드 이름, 매개변수

 

| 설명

상위 클래스에서 선언을 하고 구현의 책임을 하위 클래스에서 위임

> 상속 받은 클래스가 구현을 해야한다

 

하나의 추상 메서드라도 포함하면

( 1개 이상의 추상 메서드가 있는데 일부분만 구현 시 )

추상 클래스

 

| 추상 클래스 구현

메서드와 클래스에 abstract 키워드 사용

추상 메서드가 포함된 클래스는 추상 클래스로 선언

 

모든 메서드가 구현되었다고 해도 클래스에 abstract 키워드를 사용하면 추상 클래스

 

/// Computer.java ///

 

package abstractex;

 

public abstract class Computer{

 

public abstract void display();

public abstract void typing();

// + 바디가 비어있는 것과 추상 메서드는 다름

 

public void turnon(){

System.out.println(“전원을 켭니다”);

}

 

public void turnoff(){

System.out.println(“전원을 끕니다”);

}

 

}

 

/// Desktop.java ///

 

package abstractex;

 

public class  DeskTop extends Computer(){

 

@override

public abstract void display(){

System.out.println(“DeskTop display”);

}

 

@override

public abstract void typing(){

System.out.println(“DeskTop typing”)

}

 

}

 

/// NoteBook.java ///

 

package abstractex;

 

public abstract class NoteBook extends Computer(){

 

@override

public void typing(){

System.out.println(“NoteBook typing”);

}

 

/// 하위 클래스에서 상위 클래스 메서드를 오버라이드 하는 경우

@override

public void turnoff(){

System.out.println(“Turn off the NoteBook”);

}

 

}

 

/// MyNoteBook.java ///

 

package abstractex;

 

public class MyNoteBook extends NoteBook(){

 

public void display(){

System.out.println(“NoteBook display”);

}

}

 

/// ComputerTest.java ///

 

package abstractex;

 

public static void main(String[] args){

 

Computer computer = new DeskTop();

computer.display();

computer.turnoff();

 

Note  MyNote = new MyNoteBook();

 

}

 

| 추상 클래스 사용하기 ( 정리 )

 

추상 클래스는 주로 상속의 상위 클래스로 사용됨

추상 메서드 : 하위 클래스가 구현해야 하는 메서드

Form) public abstract void display();

구현된 메서드 :

하위 클래스가 공통으로 사용하는 기능의 메서드

하위 클래스에 따라 재정의 할 수 있음 ( = 오버라이딩 )

 

—------------—------------—------------—------------—------------—------------—------------—---------------—------------—------------—------------—------------—------------—------------—------------—---------------

 

/// 18. 추상 클래스 응용 - 템플릿 메서드

 

| 템플릿 메서드

 

템플릿 : 틀이나 견본을 의미

 

템플릿 메서드 :

추상 메서드나 구현된 메서드를 활용하여

전체의 흐름(시나리오)를 정의 해 놓은 메서드

final로 선언하여 재정의 할 수 없게 함

 

템플릿 메서드 패턴:

디자인 패턴의 일종

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

추상 클래스로 선언된 상위 클래스에서 추상 메서드를 이용하여

전체 구현의 흐름을 정의하고 구체적인

각 메서드 구현은 하위 클래스에 위임함

하위 클래스가 다른 구현을 했다고 해도

템플릿 메서드에 정의된 시나리오 대로 수행됨

 

| 템플릿 메서드 구현하기 예제

 

<논리>

Car
startCar()
drive()
stop()
turnOff()
run()
AICar ManualCar

 

+ Bold체는 이미 구현된 클래스

 

/// Car.java ///

 

package template;

 

public abstract class Car()

{

 

public abstract void drive();

public abstract void stop();

 

public void startCar()

{

System.out.println(“시동을 켭니다");

}

 

public void turnoff()

{

System.out.println(“시동을 끕니다");

}

 

// 훅 메서드

public void washCar()

{

}

 

/// 템플릿 메서드 ( final 이용 )

final public void run()

{

startCar();

drive();

stop();

turnoff();

washCar();

}

}

 

/// AICar.java ///

 

package template;

 

public class AICar extends Car()

{

public void drive()

{

System.out.println(“자율 주행합니다”);

System.out.println(“자동차가 스스로 방향을 바꿉니다”);

}

 

public void stop()

{

System.out.println(“스스로 멈춥니다”);

}

 

public void washCar()

{

System.out.println(“자동 세차합니다”);

}

 

}

 

/// ManualCar.java ///

 

package template;

 

public class ManualCar extends Car()

{

public void drive()

{

System.out.println(“사람이 운전합니다”);

System.out.println(“사람이 핸들을 조작합니다”);

}

 

public void stop()

{

System.out.println(“브레이크를 밟아서 정지합니다”);

}

 

}

 

/// CarTest.java ///

 

package template;

 

public static void main(String[] args)

{

Car aiCar = new AICar();

aiCar.run();

 

Car manualCar = new ManualCar();

manualCar.run();

 

}

 

| final 예약어

 

final 변수는 값이 변경될 수 없는 상수임

public static final double PI = 3.14;

오직 한 번만 값을 할당할 수 있음

 

final 메서드는 하위 클래스에서 재정의 (overriding) 할 수 없음

 

final 클래스는 더 이상 상속되지 않음

Ex) java의 String 클래스

 

| public static final 상수 값 정의하여 사용하기

 

프로젝트 구현 시 여러 파일에서 공유해야 하는 상수 값은

하나의 파일에 선언하여 사용하면 편리함

 

/// Define.java ///

 

package literal;

 

public class Define

{

public static final int MIN = 1;

public static final int MAX = 99;

public static final String GOOD_MORNING = “Good Morning”;

}

 

/// UsingDefine.java ///

 

package literal;

 

public class UsingDefine

{

System.out.println(Define.MIN);

System.out.println(Define.MAX);

System.out.println(Define.GOOD_MORNING);

}



—------------—------------—------------—------------—------------—------------—------------—---------------—------------—------------—------------—------------—------------—------------—------------—---------------

 

// 19. 템플릿 메서드 활용하기

 

| 템플릿 메서드 활용 예제

 

Player가 존재하고, 게임을 합니다

게임에서 Player가 가지는 레벨아 따라

run(), jump(), turn() 세 가지 기능을 할 수 있습니다.

각 레벨에 따라 기능가능 여부가 다음과 같습니다.

 

초보자 레벨 : 천천히 달립니다 ( run() 가능 )

중급자 레벨 : 빠르게 달리고 ( run() 가능 ) 점프 ( jump() 가능 ) 할 수 있습니다.

고급자 레벨 : 매우 빠르게 달리고 ( run() 가능 ) 점프 ( jump() 가능 ) 하고

한 바퀴 돌 수 있습니다.( turn() 가능 )

 

플레이어는 go() 명령어를 받으면 이 세 가지 기능을 수행합니다.

이중 할 수 없는 것은 할 수 없다는 메세지를 보냅니다.

 

| 템플릿 메서드 활용 예제

 

Playerlevel
getLevel()
upgradeLevel(PlayerLevel)
play()

 

 

PlayerLevel
run()
jump()
turn()
showLevelMessage()
go(int)
BeginnerLevel AdvancedLevel SuperLevel
run()
jump()
turn()
showLevelMessage()
run()
jump()
turn()
showLevelMessage()

run()
jump()
turn()
showLevelMessage()

—------------—------------—------------—------------—------------—------------—------------—---------------—------------—------------—------------—------------—------------—------------—------------—---------------

 

/// 20. 코딩해보세요

 

| 자동차 주행 과정 구현하기

 

Car 추상 클래스를 상속 받는 Sonata, Avante, Grandeur, Genesis 클래스가 있다.

각 차는 주행하기 위해 다음 메서드의 순서로 움직인다.



run()
{
start();
drive();
stop();
turnoff();
}



| CarTest 클래스와 실행 결과

package chapter9;

import java.util.ArrayList;

 

public class CarTest

{

 

public static void main(String[] args)

{

 

ArrayList<Car> carList = new ArrayList<Car>;

carList.add(new Sonata());

 

carList.add(new Grandeur());

carList.add(new Avante());

carList.add(new Genesis());

for(Car car : carList)

{

car.run();

System.out.println(“=============”);

}

 

}

 

}

 

—-----------—-----------—-----------—-----------—-----------—-----------—-----------—-----------

—-----------—-----------—-----------—-----------—-----------—-----------—-----------—-----------

 

이 정리 내용은 패스트 캠퍼스, K-Digital Credit Java 강의를 참고했습니다