Goal : 추상화란 무엇인지 알아보고, 코드에서는 어떻게 구현되는지 알아본다.
추상화란?
객체 지향 프로그래밍 이론에서 추상화 는 작업을 수행하고 상태를 보고하며 시스템의 다른 객체와 "통신"할 수 있는 추상적인 "행위자"를 나타내는 객체를 정의하는 기능을 포함합니다. 캡슐화 라는 용어 는 상태 세부 정보 를 숨기는 것을 의미 하지만 이전 프로그래밍 언어에서 데이터 유형 의 개념을 확장하여 동작 을 데이터와 가장 강력하게 연관시키고 다양한 데이터 유형이 상호 작용하는 방식을 표준화하는 것이 추상화 의 시작입니다 .
추상화 클래스란?
An Abstract class is a class that represents a concept and whose objects can’t be created. A class that contains at least one abstract method (method without any implementation or method body) is called an abstract class.
An abstract class is declared with the help of an abstract keyword. There is always a default constructor in an abstract class, it can also have a parameterized constructor.
-> 추상화 클래스란 인스턴스화 할수 없는 (=객체가 생성될 수 없는) 개념을 가진 클래스다. 적어도 하나의 추상화메소드 (구현체나 바디가 없는 메소드)를 가져야 하며, abstract라는 키워드로 표기한다. 기본생성자가 있고, 파라미터를 가질 수 있다.
백문이 불여일타. 코드로 개념을 이해해보자!
예제 1
Animal Class
abstract public class Animal {
abstract public void bark();
}
- 추상 메서드는 구현이 없는 메서드(=바디가 없다)
- 추상 메서드는 추상 키워드로 선언된다 ---> abstract
- 추상 메서드의 선언은 세미콜론으로 끝나야 한다
Dog Class
public class Dog extends Animal{
private String name = "강아지";
@Override
public void bark() {
System.out.println("나는 "+name+" 몽몽몽");
}
}
- 추상 클래스의 자식 클래스는 상속된 추상 메서드의 구현을 제공해야 한다--> 부모클래스의 bark()를 오버라이딩하여 재구현함.
AnimalRunner Class
public class AnimalRunner {
public static void main(String[] agrs){
Dog dog = new Dog();
dog.bark();
}
}
결과
나는 강아지 몽몽몽
예제 2
AbstractRecipe Class
public abstract class AbstractRecipe{
// 1.prepare
// 2.recipe
// 3.cleanup
AbstractRecipe(){
System.out.println("나는 abstractRecipe의 생성자");
}
public void execute(){
getReady();
doTheDish();
cleanup();
}
abstract void getReady();
abstract void doTheDish();
abstract void cleanup();
}
- abstract 메소드- abstract void geReady(), abstract void doTheDish(), abstract void cleanup()와 non-abstract메소드 - public void execute() 모두 가질 수 있다.
- 생성자를 가질 수 있다.
Recipe1 Class
public class Recipe1 extends AbstractRecipe{
Recipe1(){
super();
System.out.println("나는 recipe1의 생성자");
}
@Override
void getReady() {
System.out.println("get the raw mateials");
System.out.println("get the raw utensils ");
}
@Override
void doTheDish() {
System.out.println("do the dish");
}
@Override
void cleanup() {
System.out.println("cleanup the utensils");
}
}
- 추상클래스의 생성자에 접근하기 위해서는 super()메소드를 이용한다.
RecipeWithMicrowave Class
public class RecipeWithMicrowave extends AbstractRecipe{
@Override
void getReady() {
System.out.println("get the raw mateials");
System.out.println("switch on the microwave");
}
@Override
void doTheDish() {
System.out.println("get stuff ready");
System.out.println("put it in the microwave");
}
@Override
void cleanup() {
System.out.println("cleanup the utensils");
System.out.println("switch off the microwave");
}
}
RecipeRunner Class
public class RecipeRunner {
public static void main(String[] args){
Recipe1 recipe = new Recipe1();
recipe.execute();
System.out.println("------------------");
RecipeWithMicrowave recipeWithMicrowave = new RecipeWithMicrowave();
recipeWithMicrowave.execute();
}
}
AbstractRecipe라는 추상클래스를 각 Recipe1, RecipeWithMicrowave라는 자식클래스에서 상속을 받아 getReady(), doTheDish(), cleanup()을 오버라이딩하여 재정의 하였고 결과는 다음과 같다.
결과
나는 abstractRecipe의 생성자
나는 recipe1의 생성자
get the raw mateials
get the raw utensils
do the dish
cleanup the utensils
------------------
나는 abstractRecipe의 생성자
get the raw mateials
switch on the microwave
get stuff ready
put it in the microwave
cleanup the utensils
switch off the microwave
추상클래스의 객체를 만들수 없는 이유
구현이 없는 불완전한 클래스이기 때문에 추상 클래스를 인스턴스화할 수 없다. 추상 클래스에는 메서드 본문이 없는 추상 메서드가 있을 뿐이며, Java가 이 클래스의 객체를 생성하고 누군가가 추상 메소드를 호출하는 경우 호출된 메소드의 실제 구현은 없기 때문이다. 추상 클래스는 구현을 위해 하위 클래스에 의해 확장되어야 하는 일반 구조 또는 템플릿과 같다.
추상화가 필요한 이유
이 질문에 답하기 위해 모든 메소드의 완전한 구현을 제공하지 않고 특정 개념의 구조 또는 일반 형식을 선언하는 클래스를 만들고자 하는 상황을 가정해 보자.
은행 애플리케이션이나 소프트웨어의 예를 들면, 예금() 및 인출() 메서드가 있는 BankAccount 클래스와 SavingsAccount, CurrentAccount, FixedDepositAccount 등과 같은 하위 클래스가 있다고 가정 해보자.
입출금 과정이 계정마다 다르기 때문에 부모 클래스 BankAccount에서 이 두 가지 방법을 구현할 필요가 없다. 이는 모든 자식 클래스가 이러한 메서드를 재정의하고 구현을 제공해야 하기 때문이다. 따라서 부모 클래스에서 이러한 메서드를 추상으로 선언할 수 있다. 즉, 추상클래스를 상속받은 하위클래스에서는 추상 메서드를 구현만 하면된다. 그렇지 않으면 컴파일 오류가 발생한다.
정리
추상화 클래스란 인스턴스화 할수 없는 (=객체가 생성될 수 없는) 개념을 가진 클래스다. 적어도 하나의 추상화메소드 (구현체나 바디가 없는 메소드)를 가져야 하며, abstract라는 키워드로 표기한다. 기본생성자가 있고, 파라미터를 가질 수 있다.
특징
- 추상 메서드는 구현이 없는 메서드이며 바디가 없다.
- 추상 메서드는 추상 키워드로 선언된다 abstract
- 추상 메서드의 선언은 세미콜론으로 끝나야 한다
- 추상 클래스의 자식 클래스는 상속된 추상 메서드의 구현을 제공해야 한다
- 추상 클래스는 생성자를 가질 수 있다.
- 추상클래스의 생성자에 접근하기 위해서는 super()메소드를 이용한다.
***주의
추상클래스는 final 메소드를 가질 수 있지만, final로 선언하면 상속받은 자식클래스는 메소드를 재정의 할 수 없다.
객체지향의 다른 꽃 추상화 정리 완료 !! 항상 쓰던 코드만 보고, 개념은 알고 있지만서도 abstract는 또 처음 작성해본다. 실무에서는 아무래도 interface에서 오버라이딩을 해서 쓰다보니 abstract 추상화를 쓸 기회도 별로 없었긴 했다. 다음편은 그러므로 인터페이스와 추상화의 차이를 포스팅하겠다.
https://techvidvan.com/tutorials/java-abstract-class/ 그리고
@ The teacher Mr. Ranga 강의를 참조하고 있습니다.
'JAVA > 객체지향의 원리' 카테고리의 다른 글
[객체지향의 원리와 이해 1] 사람을 사랑한 기술 (0) | 2023.06.26 |
---|---|
[OOP] interface / 인터페이스 (0) | 2022.09.07 |
[OOP] Inheritance / 상속 (0) | 2022.08.19 |
[OOP] Composition / 구성 (0) | 2022.08.15 |
[OOP] Constructor / 생성자 (0) | 2022.08.09 |