
이 내용은 Backend/OOP logic in Java 영역(객체지향 설계)에서 쓰이는 개념이다. 추상 클래스는 “상속을 전제로 한 설계 도구”로, 공통 기능은 부모(추상 클래스)에 모으고, 자식 클래스가 반드시 구현해야 할 규칙(추상 메서드)을 강제하는 역할을 한다.
abstract는 “추상적인”이라는 뜻이고, 자바에서는 구현이 없는 메서드(추상 메서드)를 만들 수 있게 해준다.
그리고 중요한 차이: 추상 클래스는 객체를 직접 생성할 수 없다. (즉, new Factory() 같은 직접 인스턴스화가 원칙적으로 불가능)
일반 메서드는 구현부가 있다.
// 일반 메서드 (implementation exists)
public void showInfo() {
System.out.println("My name is " + name + ".");
}
public double calcAvg(double[] scores) {
double sum = 0;
for (double score : scores) {
sum += score;
}
return sum / scores.length;
}
추상 메서드는 선언만 있고 구현부가 없다.
// 추상 메서드 (declaration only)
public abstract void showInfo();
public abstract double calcAvg(double[] scores);
아래 예제는 Factory를 추상 클래스로 만들고, produce(), manage()를 자식 클래스에서 반드시 구현하도록 강제한다.
/*
Backend/OOP logic in Java: Abstract Class + Abstract Method + Override + Anonymous Class
*/
public abstract class Factory {
// field
private String name;
// abstract methods (must be implemented by subclasses)
public abstract void produce(String model);
public abstract void manage();
// getter / setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// concrete method (reusable common behavior)
public void showInfo() {
System.out.println("Factory info\nFactory name: " + name);
}
}
public class PhoneFactory extends Factory {
@Override
public void produce(String model) {
System.out.println("Phone factory: " + getName() + " produces [" + model + "]");
}
@Override
public void manage() {
System.out.println("Managing phone factory.");
}
}
public class TableFactory extends Factory {
@Override
public void produce(String model) {
System.out.println(getName() + " produces [" + model + "]");
}
@Override
public void manage() {
System.out.println("Managing tablet factory.");
}
public void upgrade(String model) {
System.out.println("Upgrading to " + model);
}
그리고 아래는 “추상 클래스는 원래 객체 생성이 안 되지만”, 익명 클래스를 이용하면 그 자리에서 구현을 붙여 임시 인스턴스를 만들 수 있다는 예시다.
public class FactoryMain {
public static void main(String[] args) {
// Anonymous class: temporary implementation for abstract class
Factory factory1 = new Factory() {
@Override
public void produce(String model) {
System.out.println(getName() + " produces [" + model + "]");
}
@Override
public void manage() {
System.out.println("Managing home appliance factory.");
}
};
factory1.setName("Temp Factory");
factory1.produce("Monitor");
factory1.manage();
factory1.showInfo();
System.out.println("---------------------------------------------");
PhoneFactory phoneFactory1 = new PhoneFactory();
phoneFactory1.setName("Apple Phone Factory");
phoneFactory1.produce("iPhone Air2");
phoneFactory1.manage();
phoneFactory1.showInfo();
System.out.println("---------------------------------------------");
TableFactory tableFactory1 = new TableFactory();
tableFactory1.setName("Google Tablet Factory");
tableFactory1.produce("Pixel Tablet");
tableFactory1.manage();
tableFactory1.upgrade("Pixel Tablet Gen2");
System.out.println("---------------------------------------------");
Factory factory2 = new Factory() {
@Override
public void produce(String model) {
System.out.println("Producing computer: " + model);
}
@Override
public void manage() {
System.out.println("Managing computer factory.");
}
};
factory2.setName("Samsung Computer Factory");
factory2.showInfo();
}
}
Factory f = new PhoneFactory();) showInfo())가 있다면, 자식에서 중복 구현하지 말고 “그냥 재사용”하는 게 유지보수에 유리하다. 추상 클래스는 “객체 생성은 막고”, “상속을 통해 구현을 강제하는” OOP 설계 도구다. 공통 기능은 부모에 모아서 재사용하고, 자식 클래스가 반드시 구현해야 하는 기능은 추상 메서드로 규칙을 만들 수 있다. 단, 직접 객체 생성은 불가능하며(원칙), 필요할 때만 익명 클래스로 임시 구현을 붙여 한 번성 객체로 사용할 수 있다.