본문 바로가기

Java

[Java] 추상 클래스 (Abstract Class)

728x90

Java는 객체지향 프로그래밍(OOP)을 지원하는 강력한 언어입니다. Java의 주요 개념 중 상속, 추상 클래스, final 키워드 등은 Java를 더욱 유연하고, 안정적이며 재사용 가능한 코드 작성에 필수적인 요소들입니다. 이번 글에서는 Java의 추상 클래스final 키워드에 대해 간단하고 쉽게 설명해 보겠습니다. 이를 통해 Java에서 객체지향 개념을 보다 잘 이해하고, 실무에서 어떻게 활용할 수 있을지에 대한 통찰을 얻을 수 있을 것입니다.


1. 추상 클래스 (Abstract Class)

추상 클래스는 Java에서 객체로 생성할 수 없는 클래스입니다. 이 클래스는 주로 기본적인 구조를 제공하고, 그 구조를 바탕으로 자식 클래스들이 구체적인 기능을 구현하도록 합니다.

  • 추상 클래스의 특징
    • 객체 생성 불가: 추상 클래스 자체로는 객체를 생성할 수 없습니다.
    • 추상 메소드: 추상 클래스는 추상 메소드를 가질 수 있으며, 자식 클래스에서 이를 반드시 구현해야 합니다.
    • 상속 제한: 추상 클래스는 다른 클래스를 단일 상속하기 때문에, 자식 클래스가 다른 클래스를 상속할 수 없습니다.
// 추상 클래스 정의
abstract class Abstract1 {

    private int num;

    // 추상 메소드
    public abstract int plus(int num1, int num2); 
}

// 추상 클래스를 상속받은 클래스
public class Abstract2 extends Abstract1 {

    // 추상 메소드 오버라이딩
    @Override
    public int plus(int num1, int num2) {
        return num1 + num2;  // 실제 구현
    }
}

위 예시에서 Abstract1 클래스는 추상 클래스로 plus라는 추상 메소드를 선언하고 있습니다. 이를 상속받은 Abstract2 클래스는 plus 메소드를 구체적으로 구현합니다. 추상 클래스는 자식 클래스에서 반드시 구현해야 하므로, 이를 통해 자식 클래스들이 공통된 기능을 가져가도록 유도할 수 있습니다.

2. 추상 메소드 (Abstract Method)

추상 메소드는 선언만 되어 있고, 구현부가 없는 메소드입니다. 추상 클래스 안에서 정의되어 자식 클래스가 반드시 구현해야 합니다. 추상 메소드를 사용하면, 상속받은 클래스들이 공통된 메소드 이름을 갖게 하고, 각 클래스에서 구체적인 구현을 하도록 강제할 수 있습니다.

  • 추상 메소드의 특징
    • 메소드 선언부만 있고, 구현부는 존재하지 않습니다.
    • 자식 클래스에서 **반드시 오버라이드(구현)**해야 합니다.
    • 추상 클래스 내에서만 정의 가능합니다.
// 추상 클래스에 있는 추상 메소드
public abstract class Animal {
    // 추상 메소드
    public abstract void makeSound();
}

// 추상 메소드를 구현한 자식 클래스
public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("멍멍!");
    }
}

public class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("야옹!");
    }
}

위 예시에서 Animal 클래스는 **makeSound()**라는 추상 메소드를 선언하고 있습니다. Dog와 Cat 클래스는 makeSound() 메소드를 구현하여, 각각 다른 소리를 출력합니다. 이처럼 추상 메소드는 상속받은 클래스에서 구체적인 기능 구현을 강제하는 중요한 역할을 합니다.

 

3. final 키워드

final 키워드는 Java에서 변경 불가능한 상태를 설정할 때 사용됩니다. final은 클래스, 변수, 메소드에 적용될 수 있으며, 그 사용에 따라 다르게 동작합니다.

 

final 클래스: final 클래스는 상속할 수 없습니다.

final class MyClass {
    // 내용 생략
}

class AnotherClass extends MyClass {  // 에러! final 클래스는 상속할 수 없음
    // 내용 생략
}

 

final 변수: final 변수는 한 번 값을 설정하면 변경할 수 없습니다.

final String str = "Apple";
str = "Banana";  // 에러! final 변수는 값을 변경할 수 없음


final 메소드: final 메소드는 오버라이딩할 수 없습니다.

class Class1 {
    final String method1() {
        return "안녕하세요!";
    }
}

class Class2 extends Class1 {
    @Override
    String method1() {  // 에러! final 메소드는 오버라이딩할 수 없음
        return "반갑습니다!";
    }
}

 

final 키워드는 의도치 않게 값을 변경하거나, 메소드가 오버라이드되는 것을 방지하여 불변의 상태를 유지하게 도와줍니다.


마무리

이번 글에서는 추상 클래스, 추상 메소드, final 키워드에 대해 알아보았습니다. 추상 클래스자식 클래스에서 반드시 구현해야 할 메소드를 선언하여 코드의 일관성을 유지하게 하고, 추상 메소드는 그 구현을 자식 클래스에 강제하여 각 클래스가 원하는 기능을 구현하도록 합니다. 또한 final 키워드상속, 변수 재할당, 메소드 오버라이딩을 제한하여 코드의 안전성을 높여줍니다.

이러한 Java의 기본 개념들은 코드의 유연성, 재사용성, 안정성을 향상시키는데 큰 도움이 됩니다. Java에서 객체지향 개념을 이해하고 잘 활용하는 것이 매우 중요합니다. 추상 클래스와 final 키워드를 활용하면, 더 나은 코드를 작성할 수 있을 것입니다. 앞으로 Java 개발을 할 때 이 개념들을 잘 적용해 보세요!

728x90