본문 바로가기

java(자바)

[java(자바)] 추상 클래스와 인터페이스의 차이 _디버깅의 눈물

객체 지향 프로그래밍의 특징 중 하나인 추상화(Abstraction)은 자바에서 추상 클래스와 인터페이스로 구현됩니다.

 

 

추상 클래스

 

// 추상 클래스 Animal
public abstract class Animal {
    private String name;
    
    public Animal(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
    
    // 추상 메서드 
    public abstract void speak();
}

// 추상 클래스 Animal을 상속하는 Dog 클래스 
public class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
    
    // 추상 메서드 구현
    @Override
    public void speak() {
        System.out.println("멍멍!");
    }
}

// 추상 클래스 Animal을 상속하는 Cat 클래스 
public class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }
    
    // 추상 메서드 구현
    @Override
    public void speak() {
        System.out.println("야옹~");
    }
}

 

-클래스 내 '추상 메서드'를 하나 이상 가지고 있고, abstract 키워드를 이용해 정의된 클래스입니다.

-추상 메서드는 메서드의 선언부만 있고, 구현부는 없는 메서드를 말합니다. 클래스가 설계도라면, 추상 클래스는 일종의 '미완성 설계도'입니다. 따라서 인스턴스를 생성할 수 없습니다.

-추상 클래스는 새로운 클래스를 작성하는데 바탕이 되는 조상 클래스로서 중요한 의미를 갖습니다. 서로 다른 클래스들의 공통적인 특징을 추출한 추상 클래스를 이용하면, 이를 상속 받은 각각의 하위 클래스를 효율적으로 구현할 수 있습니다.

-자바에서는 다중 상속의 모호성 때문에 단일 상속만 가능합니다.

 

위의 코드는 Animal 추상 클래스를 정의하고, DogCat 클래스에서 상속받아 추상 메소드인 speak()를 구현하는 예시입니다. Animal 클래스에서는 getName() 메소드를 정의하여 하위 클래스에서 사용할 수 있게 합니다.

 

 

 

인터페이스

 

// Shape 인터페이스
public interface Shape {
    // 면적 구하는 메서드
    double getArea();
    // 둘레 구하는 메서드
    double getPerimeter();
}

// Shape 인터페이스를 구현한 Circle 클래스
public class Circle implements Shape {
    private double radius;
    
    public Circle(double radius) {
        this.radius = radius;
    }
    
    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
    
    @Override
    public double getPerimeter() {
        return 2 * Math.PI * radius;
    }
}

// Shape 인터페이스를 구현한 Rectangle 클래스
public class Rectangle implements Shape {
    private double width;
    private double height;
    
    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }
    
    @Override
    public double getArea() {
        return width * height;
    }
    
    @Override
    public double getPerimeter() {
        return 2 * (width + height);
    }
}

 

-클래스들이 구현해야 하는 동작을 지정하는데 사용되는 추상 자료형입니다.

-추상 메서드와 상수(constant)만을 구성 요소로 가질 수 있습니다.

-추상 클래스보다 추상화 정도가 높으며, 구현된 것은 아무 것도 없고 밑그림만 그려진 '기본 설계도'라고 할 수 있습니다.

-다중 상속을 지원합니다.

 

위의 코드는 Shape 인터페이스를 정의하고, CircleRectangle 클래스에서 구현하는 예시입니다. Shape 인터페이스에서는 getArea()getPerimeter() 메소드를 추상 메소드로 정의합니다. CircleRectangle 클래스에서는 이 두 메소드를 구현하여 면적과 둘레 길이를 계산합니다.

 

 

*추상 클래스와 인터페이스는 존재 목적이 다릅니다.

-추상 클래스의 존재 목적은 해당 추상 클래스를 상속받아 그 기능을 이용하고 확장시키는 것에 있습니다.

-반면 인터페이스는 메서드의 껍데기만 존재하는데, 이는 그 메서드의 구현을 강제하기 위함입니다. 메서드의 구현을 강제함으로써 구현 객체의 동일한 동작을 보장하는 것입니다. 

-즉, 추상 클래스는 기존 기능의 재사용, 인터페이스는 설계를 강제하는 것에 목적을 두었다고 할 수 있습니다.