Java 추상 클래스와 메서드 완벽 가이드
Java 추상 클래스와 메서드
이 튜토리얼은 Java 추상 클래스와 메서드에 대한 명확하고 예제 중심의 탐구를 제공하며 Java에서 추상화가 어떻게 구현되는지 설명합니다.
Java 추상 클래스
Java에서 추상 클래스는 인스턴스화할 수 없습니다. abstract 키워드가 클래스를 추상으로 표시합니다. 예:
// 추상 클래스 생성 abstract class Language { // 필드와 메서드 } ... // 객체 생성 시도 Language // 에러 발생 Language obj = new Language();
추상 클래스는 구체적(일반) 메서드와 추상 메서드를 모두 포함할 수 있습니다. 예:
abstract class Language { // 추상 메서드 abstract void method1(); // 일반 메서드 void method2() { System.out.println("This is regular method"); } }
일반 메서드에 대한 자세한 내용은 Java 메서드 참조.
Java 추상 메서드
추상 메서드는 본문이 없으며 하위 클래스가 이행해야 할 계약을 선언합니다. abstract 키워드로 정의합니다, 예:
abstract void display();
본문이 없으므로 문장은 세미콜론으로 끝납니다. 클래스가 추상 메서드를 선언하면 클래스 자체가 추상으로 선언되어야 하며, 그렇지 않으면 컴파일러가 에러를 냅니다:
// 에러 // 클래스가 추상이어야 함 class Language { // 추상 메서드 abstract void method1(); }
예제: Java 추상 클래스와 메서드
추상 클래스는 직접 인스턴스화할 수 없지만, 구체적 하위 클래스가 확장하여 멤버를 사용할 수 있습니다. 예:
abstract class Language { public void display() { System.out.println("This is Java Programming"); } } class Main extends Language { public static void main(String[] args) { Main obj = new Main(); obj.display(); } }
출력
This is Java programming
여기서 추상 클래스 Language가 구체적 메서드 display()를 정의합니다. 하위 클래스 Main이 이 메서드를 상속받아 인스턴스를 통해 호출합니다.
추상 메서드 구현
추상 클래스가 추상 메서드를 선언하면 모든 구체적 하위 클래스는 구현을 제공해야 합니다. 예:
abstract class Animal { abstract void makeSound(); public void eat() { System.out.println("I can eat."); } } class Dog extends Animal { public void makeSound() { System.out.println("Bark bark"); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.makeSound(); d1.eat(); } }
출력
Bark bark I can eat.
하위 클래스 Dog가 추상 makeSound() 메서드를 구현하고 구체적 eat() 메서드를 상속받습니다.
참고: Dog가 makeSound()를 오버라이딩하지 않으면 스스로 추상으로 선언해야 합니다.
추상 클래스 생성자 접근
추상 클래스도 일반 클래스처럼 생성자를 정의할 수 있습니다. 하위 클래스는 super()로 슈퍼클래스 생성자를 호출합니다. 예:
abstract class Animal { Animal() { // 초기화 로직 } } class Dog extends Animal { Dog() { super(); // 추가 초기화 } }
super()는 하위 클래스 생성자의 첫 문장이어야 함을 기억하세요.
Java 추상화
추상 클래스와 메서드는 Java에서 추상화를 달성하는 주요 도구입니다. 추상화는 불필요한 구현 세부 사항을 숨기고 사용자에게 필수 인터페이스만 제시합니다. 이는 복잡한 시스템을 단순화하고 유연성을 증진합니다.
예를 들어 오토바이 브레이크는 모델마다 내부 메커니즘이 다를 수 있지만 동일한 고수준 기능(자전거 감속)을 수행합니다.
예제 3: Java 추상화
abstract class MotorBike { abstract void brake(); } class SportsBike extends MotorBike { public void brake() { System.out.println("SportsBike Brake"); } } class MountainBike extends MotorBike { public void brake() { System.out.println("MountainBike Brake"); } } class Main { public static void main(String[] args) { MountainBike m1 = new MountainBike(); m1.brake(); SportsBike s1 = new SportsBike(); s1.brake(); } }
출력:
MountainBike Brake SportsBike Brake
각 구체적 하위 클래스가 고유한 brake() 구현을 제공하여 추상화가 인터페이스와 구현을 분리하는 방식을 보여줍니다.
참고: 인터페이스로도 Java에서 추상화를 달성할 수 있습니다.
기억해야 할 핵심 포인트
abstract 키워드로 추상 클래스와 메서드 선언
- 추상 메서드는 본문이 없으며 세미콜론으로 끝남
- 추상 메서드를 포함하는 클래스는 반드시 추상이어야 함
- 추상 클래스는 직접 인스턴스화 불가
- 구체적 하위 클래스가 추상 클래스를 상속하고 추상 메서드 구현
- 하위 클래스는 모든 추상 메서드를 오버라이딩해야 함(자신이 추상이 아닌 경우)
- 추상 클래스의 정적 멤버는 클래스 이름으로 접근 가능:
Animal.staticMethod();