본문 바로가기
Java

[JAVA] Final , abstract(추상)

by 임혁진 2025. 1. 11.

Final, Abstract 는 Java에서 클래스 설계와 상속 관계를 효율적으로 관리하고, 재사용성과 확장성을 높이기 위한 핵심 요소입니다.

 

1. Final

Final은 변수, 메소드, 클래스에 적용되어 특정 동작이나 속성을 변경하지 못하도록 제한합니다.

특징

  1. Final 변수
    • 초기화 이후 값을 변경할 수 없습니다.
    • 반드시 초기화가 필요합니다(선언과 동시에 또는 생성자를 통해).
     
     
  2. Final 메소드
    • 오버라이딩 금지를 의미합니다.
    • 메소드의 구현을 고정하여 하위 클래스에서 변경하지 못하게 할 때 사용합니다.
  3. Final 클래스
    • 상속 금지를 의미합니다.
    • 해당 클래스를 그대로 사용해야 하며, 더 이상 확장하지 못합니다.
public final String nation = "대한민국"; // 초기화 완료
public final String ssn; // 생성자를 통해 초기화

2. Abstract

Abstract는 추상적인 설계를 제공하며, 추상 클래스와 추상 메소드를 통해 자식 클래스에서 구체적인 동작을 정의하도록 강제합니다.

특징

추상 클래스

  • abstract 키워드를 클래스에 붙이면 추상 클래스가 됩니다.
  • 추상 클래스는 추상 메소드와 일반 메소드, 멤버 변수를 모두 가질 수 있습니다.
  • 단독으로 객체를 생성할 수 없으며, 반드시 상속을 통해 사용됩니다.
// 추상 클래스
public abstract class Animal {

    // 공통 속성
    private String name;

    // 생성자
    public Animal(String name) {
        this.name = name;
    }

    // 일반 메소드
    public String getName() {
        return name;
    }

    // 추상 메소드 (자식 클래스에서 구현 필수)
    public abstract void eat();
}

// 구체적인 클래스
public class Dog extends Animal {

    public Dog(String name) {
        super(name);
    }

    @Override
    public void eat() {
        System.out.println(getName() + "는 사료를 먹습니다.");
    }
}

public class Cat extends Animal {

    public Cat(String name) {
        super(name);
    }

    @Override
    public void eat() {
        System.out.println(getName() + "는 생선을 먹습니다.");
    }
}

// Main 클래스
public class MainClass {
    public static void main(String[] args) {
        // 추상 클래스는 객체 생성 불가, 자식 클래스를 통해 사용
        Animal dog = new Dog("강아지");
        dog.eat();

        Animal cat = new Cat("고양이");
        cat.eat();
    }
}

추상 메소드

  • 메소드 선언부만 있고, 구현부가 없는 메소드를 의미합니다.
  • 상속받는 클래스에서 반드시 오버라이딩해야 합니다.
// 추상 클래스
public abstract class Shape {
    
    // 추상 메서드 (구현부가 없음)
    public abstract double calculateArea();  // 도형의 넓이 계산 메서드
    public abstract double calculatePerimeter();  // 도형의 둘레 계산 메서드
}

// 구체적인 클래스
public class Circle extends Shape {

    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double calculateArea() {
        return Math.PI * radius * radius;  // 원의 넓이 공식
    }

    @Override
    public double calculatePerimeter() {
        return 2 * Math.PI * radius;  // 원의 둘레 공식
    }
}

public class Rectangle extends Shape {

    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double calculateArea() {
        return width * height;  // 직사각형의 넓이 공식
    }

    @Override
    public double calculatePerimeter() {
        return 2 * (width + height);  // 직사각형의 둘레 공식
    }
}

// Main 클래스
public class MainClass {
    public static void main(String[] args) {
        Shape circle = new Circle(5);  // 원 객체 생성
        System.out.println("원의 넓이: " + circle.calculateArea());
        System.out.println("원의 둘레: " + circle.calculatePerimeter());

        Shape rectangle = new Rectangle(4, 7);  // 직사각형 객체 생성
        System.out.println("직사각형의 넓이: " + rectangle.calculateArea());
        System.out.println("직사각형의 둘레: " + rectangle.calculatePerimeter());
    }
}

 

출력

원의 넓이: 78.54
원의 둘레: 31.42
직사각형의 넓이: 28.0
직사각형의 둘레: 22.0

결론

  • 추상 클래스는 공통 속성과 동작이 있는 객체의 구조를 설계할 때 적합합니다.