java - 추상화

imjingu·2023년 8월 26일
0

개발공부

목록 보기
416/481

추상 메소드(abstract method)란 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미
추상 메소드는 선언부만 정의하고 구체적인 내용은 비워놓은 메서드

예를 들면 모듈처럼 중복되는 부분이나 공통적인 부분은 미리 다 만들어진 것을 사용하고, 이를 받아 사용하는 쪽에서는 자신에게 필요한 부분만을 재정의하여 사용함으로써 생산성이 향상되고 배포 등이 쉬워지기 때문

이러한 추상 메소드는 선언부만이 존재하며, 구현부는 작성되어 있지 않습니다.

바로 이 작성되어 있지 않은 구현부를 자식 클래스에서 오버라이딩하여 사용하는 것입니다.

추상 클래스(abstract class)
자바에서는 하나 이상의 추상 메소드를 포함하는 클래스를 가리켜 추상 클래스(abstract class)라고 합니다.

이러한 추상 클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 해줍니다.

즉, 반드시 사용되어야 하는 메소드를 추상 클래스에 추상 메소드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서는 이 추상 메소드를 반드시 재정의해야 합니다.

package chapter20230825.test05;

public class CarTest {

	/*
	Car 추상 클래스를 상속받는 Sonata, Grandeur, Avante, Genesis 클래스가 있습니다.
	각차는 주행하기 위해 다음 순서로 움직입니다.

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

	CarTest 클래스를 보고 다음 출력 결과가 나오도록 Car, Sonata, Grandeur, Avante, Genesis 클래스를 구현하세요.

	출력 결과 :
	Sonata 시동을 켭니다.
	Sonata 달립니다.
	Sonata 멈춥니다.
	Sonata 시동을 끕니다.
	======================
	Grandeur 시동을 켭니다.
	Grandeur 달립니다.
	Grandeur 멈춥니다.
	Grandeur 시동을 끕니다.
	======================
	Avante 시동을 켭니다.
	Avante 달립니다.
	Avante 멈춥니다.
	Avante 시동을 끕니다.
	======================
	Genesis 시동을 켭니다.
	Genesis 달립니다.
	Genesis 멈춥니다.
	Genesis 시동을 끕니다.
	 */

	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());
		
		Car[] carList = new Car[4];
		carList[0] = new Sonata();
		carList[1] = new Grandeur();
		carList[2] = new Avante();
		carList[3] = new Genesis();

	        for(Car car : carList) {
	            car.run(); // car안에는 run()메서드가 있어야함
	            System.out.println("======================");
	        }
	    }
}

package chapter20230825.test05;

abstract class Car { // abstract 추상클래스가 만들어진다
	public void run() {
        start();
        drive();
        stop();
        turnOff();
        System.out.println("세차를 합니다."); // 위 4개는 각 class마다 내용이 바뀌는 거라 메서드로 하고, '세차를 합니다' 는 똑같은 내용으로 반복임
    }
	protected abstract void start(); // Car를 상속을 받으면 강제로 4개를 오버라이드 해야함
	protected abstract void drive();
	protected abstract void stop();
	protected abstract void turnOff();
}

package chapter20230825.test05;

public class Avante extends Car{
	@Override
	protected void start() {
		System.out.println("Avante 시동을 켭니다.");
		
	}

	@Override
	protected void drive() {
		System.out.println("Avante 달립니다.");
		
	}

	@Override
	protected void stop() {
		System.out.println("Avante 멈춥니다.");
		
	}

	@Override
	protected void turnOff() {
		System.out.println("Avante 시동을 끕니다.");
		
	}
}

package chapter20230825.test05;

public class Genesis extends Car{
	@Override
	protected void start() {
		System.out.println("Genesis 시동을 켭니다.");
		
	}

	@Override
	protected void drive() {
		System.out.println("Genesis 달립니다.");
		
	}

	@Override
	protected void stop() {
		System.out.println("Genesis 멈춥니다.");
		
	}

	@Override
	protected void turnOff() {
		System.out.println("Genesis 시동을 끕니다.");
		
	}
}

package chapter20230825.test05;

public class Grandeur extends Car{
	@Override
	protected void start() {
		System.out.println("Grandeur 시동을 켭니다.");
		
	}

	@Override
	protected void drive() {
		System.out.println("Grandeur 달립니다.");
		
	}

	@Override
	protected void stop() {
		System.out.println("Grandeur 멈춥니다.");
		
	}

	@Override
	protected void turnOff() {
		System.out.println("Grandeur 시동을 끕니다.");
		
	}
}

package chapter20230825.test05;

public class Sonata extends Car{

	@Override
	protected void start() {
		System.out.println("Sonata 시동을 켭니다.");
		
	}

	@Override
	protected void drive() {
		System.out.println("Sonata 달립니다.");
		
	}

	@Override
	protected void stop() {
		System.out.println("Sonata 멈춥니다.");
		
	}

	@Override
	protected void turnOff() {
		System.out.println("Sonata 시동을 끕니다.");
		
	}

}

0개의 댓글