객체 지향 프로그래밍에서 추상 클래스 및 인터페이스를 통해 구현할 수 있는 일반화된 개념을 나타내기 위해서입니다. 추상화는 구현 세부 정보를 숨기고, 핵심적인 기능을 강조하는데 사용됩니다. 추상화를 통해 소프트웨어 시스템을 더 유연하게 만들 수 있으며, 코드의 가독성 및 유지 보수성을 향상시킵니다.
예를 들어, 동물 클래스를 생성하고 싶다고 가정해보겠습니다. 동물 클래스는 다양한 서브 클래스들을 가지며, 이 서브 클래스들은 모두 공통적인 속성과 기능을 가지고 있습니다. 이때, 추상 클래스를 사용하여 동물 클래스를 정의할 수 있습니다. 추상 클래스는 공통적인 속성과 기능을 가지는데, 서브 클래스에서 이를 구체화하게 됩니다.
public abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public abstract void move();
public abstract void eat();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
위의 코드에서 Animal 클래스는 추상 클래스로 정의되어 있습니다. move()와 eat() 메서드는 추상 메서드로 정의되어 있으며, 이 메서드들은 서브 클래스에서 구체화됩니다. 또한, Animal 클래스는 name 필드와 getName()/setName() 메서드를 가지고 있습니다. 이 메서드들은 모든 서브 클래스에서 공통으로 사용될 수 있습니다.
이제 Animal 클래스를 확장한 Cat 클래스를 생성해보겠습니다.
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
public void move() {
System.out.println(getName() + " is walking");
}
public void eat() {
System.out.println(getName() + " is eating fish");
}
}
위의 코드에서 Cat 클래스는 Animal 클래스를 확장하고 있으며, move()와 eat() 메서드를 구체화하고 있습니다. 이제 Cat 클래스에서 move()와 eat() 메서드는 모두 구체적으로 정의되었기 때문에 Cat 클래스를 인스턴스화하여 사용할 수 있습니다.
public static void main(String[] args) {
Animal animal = new Cat("Tom");
animal.move(); // 출력: Tom is walking
animal.eat(); // 출력: Tom is eating fish
}