Java에서 추상화는 객체의 필수 기능만 노출하고, 사용자와 무관한 내부 구현 세부사항을 숨기는 것입니다. 복잡성과 노력을 줄여 개발을 단순화합니다. 추상화는 추상 클래스, 추상 메서드, 인터페이스를 통해 달성되며, Java 객체지향 설계의 핵심 개념입니다.
이 튜토리얼에서 배울 내용:
추상 클래스의 정의와 사용 시기
계약을 정의하는 추상 메서드의 역할
추상화를 보여주는 구체적 코드 예제
추상 클래스가 다형성과 코드 재사용을 가능하게 하는 방식
Java에서 final 키워드의 목적
추상 클래스 이해하기
추상 클래스는 자체적으로 인스턴스화할 수 없지만 관련된 서브클래스의 공통 기반을 정의할 수 있는 클래스입니다. 추상 메서드(몸체 없음)와 구현된 메서드(완전 구현)를 모두 포함할 수 있습니다. 추상 클래스의 정의적 특징은 최소 하나의 추상 메서드를 선언하거나, 설계상 명시적으로 abstract로 표시된 것입니다.
많은 Java 튜토리얼에서 사용되는 고전적인 Shape 계층을 살펴보세요:
Shape 클래스는 공통 속성과 calculateArea() 메서드 시그니처를 포함하며, Rectangle, Circle, Triangle이 구체적 구현을 제공합니다. 이론적으로 Shape 클래스는 인스턴스화 가능하지만, 그렇게 하는 것은 의미론적으로 무의미하고 오류를 초래할 수 있습니다. 따라서 abstract로 선언합니다:
abstract class Shape {
// 공통 코드
}
추상 메서드란?
추상 메서드는 구현을 제공하지 않고 메서드 시그니처만 선언합니다. 추상 클래스 내에서 정의되어야 하며 구체적 서브클래스에서 오버라이드되어야 합니다. 추상 메서드는 본문이 없으므로 final이나 static으로 표시할 수 없습니다.
예제 문법:
abstract public void calculateArea();
Shape 예제에서 각 서브클래스는 자신만의 공식으로 calculateArea()를 구현해야 하며, 모든 도형이 면적을 보고할 수 있도록 하면서 공통 인터페이스를 유지합니다.
실전 코드 예제
abstract class Shape {
abstract void calculateArea();
}
class Rectangle extends Shape {
void calculateArea() {
System.out.println("Area of Rectangle");
}
public static void main(String[] args) {
Shape obj = new Rectangle();
obj.calculateArea();
}
}
추상 클래스 핵심 포인트
추상 클래스는 추상 메서드와 구현된 메서드를 모두 포함할 수 있음
추상 메서드 없이도 기본 타입으로 의도된 경우 abstract로 선언 가능
다형성은 추상 타입의 참조로 달성: Shape obj = new Rectangle();
추상 메서드를 선언하는 클래스는 반드시 abstract여야 함
Java의 Final 키워드
final 수정자는 클래스, 메서드, 변수를 잠가서 오버라이드하거나 변경할 수 없게 합니다:
final class – 상속 방지
final variable – 변수를 상수로 만듦; 초기화 후 값 고정
final method – 오버라이딩 금지, 주로 보안이나 성능 최적화에 사용
예제: Abstract와 Final 결합
abstract class Shape {
final int b = 20;
public void display() {
System.out.println("This is display method");
}
abstract public void calculateArea();
}
public class Rectangle extends Shape {
public static void main(String[] args) {
Rectangle obj = new Rectangle();
obj.display();
// obj.b = 200; // 컴파일 에러: final 변수에 할당 불가
}
@Override
public void calculateArea() {
System.out.println("Calculating rectangle area");
}
}
calculateArea() 구현의 주석을 해제하면 컴파일 에러가 해결되며, b 수정 시도는 final 변수의 불변성을 보여줍니다.
추상 메서드 규칙
구현이 없고 시그니처만 있음
추상 메서드를 포함하면 클래스는 반드시 abstract여야 함; 그렇지 않아도 설계상 abstract 가능
구체적 서브클래스는 상속받은 모든 추상 메서드를 구현해야 함(자신도 abstract로 선언하지 않는 한)