추상화란 객체의 공통적인 속성과 기능을 추출하여 정의하는 것
구체적인 사물들간의 공통점을 선택하고 차이점을 버리는 일반화를 사용하거나, 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것을 의미한다.
객체 지향 프로그래밍에서 추상화의 핵심은 불필요한 코드를 제거하고 중요한 부분만을 남겨 두어 단순하게 만드는 것이다.
추상화로 흔히 예시를 드는 Animal Class로 예제를 작성해 보자.
아래와 같이 강아지, 고양이, 호랑이가 있다고 가정하자.
public class 강아지 {
public void bark() {
System.out.println("왈 ~ 왈 ~");
}
}
public class 고양이 {
public void bark() {
System.out.println("야옹 ~ 야옹 ~");
}
}
public class 호랑이 {
public void bark() {
System.out.println("어흥 ~ 어흥 ~");
}
}
이들을 모두 짖게 하려면, 프로그래머는 아래와 같이 작성해야 한다.
public class Main {
public static void main(String[] args) {
final 강아지 dog = new 강아지();
final 고양이 cat = new 고양이();
final 호랑이 tiger = new 호랑이();
dog.bark();
cat.bark();
tiger.bark();
}
}
여기서 강아지, 고양이, 호랑이 세 동물 모두 짖는다.는 공통된 속성을 가지고 있다.
이러한 속성을 상위 클래스로 뽑아낼 수 있지 않을까 ?
똑같은 동물이기 때문에 Animal 이라는 상위 클래스를 두어 상속 관계를 만들어도 무방할 것이다.
public abstract class Animal {
public abstract void bark();
}
public class 강아지 extends Animal {
@Override
public void bark() {
System.out.println("왈 ~ 왈 ~");
}
}
public class 고양이 extends Animal{
@Override
public void bark() {
System.out.println("야옹 ~ 야옹 ~");
}
}
public class 호랑이 extends Animal{
@Override
public void bark() {
System.out.println("어흥 ~ 어흥 ~");
}
}
추상 클래스를 사용함으로써 프로그래머는 다음과 같이 다시 작성할 수 있다.
public class Main {
public static void main(String[] args) {
final List<Animal> animals = Arrays.asList(new 강아지(), new 고양이(), new 호랑이());
for (final Animal animal : animals) {
animal.bark();
}
}
}
상위 타입인 Animal을 정의함으로써 공통적인 부분을 빼내고, 불필요한 부분을 제거할 수 있었다.
bark메서드를 상위 타입으로 정의함으로써 프로그래머는 공통적인 부분에 대해서 재정의해야하는 부분을 명시하고, 불필요하게 중복되던 인스턴스 생성을 간소화할 수 있다.
References
https://www.guru99.com/java-data-abstraction.html
https://facingissuesonit.com/2019/09/21/java-oops-concepts/