추상 클래스란?
추상 클래스 (Abstract Class)는 하나 이상의 추상 메서드를 포함하는 클래스입니다.
추상 메서드는 선언만 있고 구현이 없는 메서드를 의미합니다.
추상 클래스는 직접적으로 객체를 생성할 수 없으며, 상속을 통해 하위 클래스에서 구체적인 구현을 제공해야 합니다.
- 추상 메서드를 통해 하위 클래스가 반드시 구현해야 할 동작을 정의합니다.
- 추상 메서드는 상속받은 클래스에서 반드시 구현되어야 합니다.
- 공통된 특성이나 동작을 가지는 클래스들의 공통 부분을 추상화하여 코드의 재사용성을 높입니다.
- 추상 클래스는 abstract 키워드를 사용하여 선언합니다.
- 추상 클래스 내에는 일반적인 멤버 변수, 메서드, 생성자 등이 포함될 수 있습니다.
- 추상 클래스는 객체를 직접 생성할 수 없기 때문에, 반드시 상속을 통해 하위 클래스에서 구체적인 구현을 제공해야 합니다.
- 추상 클래스를 상속받은 하위 클래스는 추상 메서드를 반드시 구현해야 합니다.
그렇지 않으면 하위 클래스도 추상 클래스가 되어야 합니다.
abstract class Animal {
abstract void cry();
abstract void eat();
public void awake() {
System.out.println("동물이 잠에서 꺠어 납니다..");
}
public void sleep() {
System.out.println("동물이 잠듭니다..");
}
}
class Dog extends Animal {
@Override
void cry() {
System.out.println("강아지가 멍멍 웁니다.");
}
@Override
void eat() {
System.out.println("강아지가 강아지 사료를 먹습니다.");
}
}
abstract class Cat extends Animal {
@Override
public void eat() {
System.out.println("고양이가 야옹 웁니다.");
}
}
class MyCat extends Cat {
@Override
void cry() {
System.out.println("나의 고양이가 미유미유 웁니다.");
}
}
public class AbstractTest {
public static void main(String[] args) {
Animal animal = new Dog();
Cat myCat = new MyCat();
animal.eat(); // 강아지가 강아지 사료를 먹습니다.
animal.cry(); // 강아지가 멍멍 웁니다.
animal.awake(); // 동물이 잠에서 꺠어 납니다..
myCat.eat(); // 고양이가 야옹 웁니다.
myCat.cry(); // 나의 고양이가 미유미유 웁니다.
myCat.awake(); // 동물이 잠에서 꺠어 납니다..
}
}
템플릿 메서드.
템플릿 메서드 패턴은 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나입니다.
이 패턴은 알고리즘의 구조를 정의하는데 사용되며, 하위클래스에서 알고리즘의 일부 단계를 재정의할 수 있도록 합니다.
템플릿 메서드 패턴은 크게 추상 클래스와 구체적인 구현 클래스로 구성됩니다.
추상 클래스는 알고리즘의 구조를 정의하는데 사용되며, 구체적인 구현 클래스는 추상 클래스를 상속받아 구체적인 단계를 구현합니다.
알고리즘의 구조를 변경하지 않고 특정 단계를 재정의할 수 있습니다.
공통된 알고리즘의 코드 중복을 줄여줍니다.
추상 클래스를 통해 알고리즘의 구조를 명확히 표현할 수 있습니다.
일반적으로 템플릿 메서드 패턴은 다음과 같은 단계로 구성됩니다:
추상 클래스(Abstract Class):
알고리즘의 구조를 정의하고, 템플릿 메서드를 포함합니다.
템플릿 메서드는 알고리즘의 각 단계를 정의하고, 필요에 따라 추상 메서드나 구현된 메서드를 호출합니다.
구체적인 구현 클래스(Concrete Class):
추상 클래스를 상속받아 알고리즘의 특정 단계를 구현합니다.
추상 메서드를 재정의하여 구체적인 동작을 수행합니다.
정리하면 추상 클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용하여
전체적인 흐름을 정의 하고 하위 클래스에서 다르게 구현되어야 하는 부분은
추상 메서드로 선언하여 하위 클래스에서 구현 하도록 하는 것.
abstract class Animal {
abstract void cry();
abstract void eat();
public void awake() {
System.out.println("동물이 잠에서 꺠어 납니다..");
}
public void sleep() {
System.out.println("동물이 잠듭니다..");
}
final public void routine() {
awake();
cry();
eat();
sleep();
}
}
class Dog extends Animal {
@Override
void cry() {
System.out.println("강아지가 멍멍 웁니다.");
}
@Override
void eat() {
System.out.println("강아지가 강아지 사료를 먹습니다.");
}
}
class Cat extends Animal {
@Override
void cry() {
System.out.println("고양이가 야옹 웁니다.");
}
@Override
public void eat() {
System.out.println("고양이가 고양이 사료를먹습니다.");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
dog.routine();
cat.routine();
/*
동물이 잠에서 꺠어 납니다..
강아지가 멍멍 웁니다.
강아지가 강아지 사료를 먹습니다.
동물이 잠듭니다..
동물이 잠에서 꺠어 납니다..
고양이가 야옹 웁니다.
고양이가 고양이 사료를먹습니다.
동물이 잠듭니다..
*/
}
}
final 예약어.
위에서 루틴 메서드는 final 로 선언되어 있는데 하위 클래스에서 재저으이할 수 없도록 하는 이유다.
- final 변수 : 값이 변경될 수 없는 상수
- final 메서드 : 하위 클래스에서 재정의 할 수 없는 메서드
- final 클래스 : 상속할 수 없는 클래스
여러 자바 파일에서 사용하는 상수 값 정의.
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;
}
자주 사용하는 값이나 불변 값이 있다면 따로 클래스를 정의해 접근할 수 있도록 해주면 가독성 및 안정성에도 좋다.
'BACKEND > JAVA' 카테고리의 다른 글
인터페이스 여러가지 요소와 인터페이스의 상속 (0) | 2023.06.09 |
---|---|
인터페이스와 다형성(DAO) 활용하기 (0) | 2023.06.09 |
상속과 메서드 오버라이딩, 가상 메서드 원리 (0) | 2023.06.08 |
상속과 상속에서 클래스 생성 과정과 형 변환. (0) | 2023.06.08 |
클래스의 속성과 기능 (0) | 2023.06.05 |