본문 바로가기
프로그래밍/JAVA

초보 자바 프로그래밍(54) - 인터페이스와 추상클래스

by 머니테크리더 2023. 5. 21.
반응형

자바 인터페이스와 추상클래스 대표 이미지
자바 인터페이스와 추상클래스 대표 이미지

🔖 INDEX

     

     

     

    객체 지향 프로그래밍의 주요 원칙 중 하나는 상속입니다. 이는 기존의 클래스를 기반으로 새로운 클래스를 생성할 수 있게 합니다. 그러나, 때로는 메서드를 실제로 구현하지 않고 클래스의 "청사진"을 정의하고 싶을 때가 있습니다. 이때 추상 클래스와 인터페이스가 등장합니다. 이 글에서는 Java의 두 중요한 개념인 인터페이스와 추상 클래스에 대해 자세히 설명하겠습니다.

     

    추상 클래스

    Java에서 추상 클래스란 인스턴스화할 수 없는 클래스를 말합니다. 즉, 추상 클래스의 객체를 생성할 수 없습니다. 추상 클래스는 하위 클래스의 기반이 됩니다. 추상 클래스의 목적은 여러 파생 클래스가 공유할 수 있는 기본 클래스의 공통 정의를 제공하는 것입니다.

    추상 클래스 정의하기

    추상 클래스를 선언하려면 abstract 키워드를 사용하기만 하면 됩니다. 다음은 간단한 예시입니다:

    abstract class Animal {
        abstract void move();
    }

    이 경우, Animal은 추상 클래스입니다. 그리고 그 안에 move()라는 추상 메서드를 가지고 있습니다. 이 메서드는 선언만 되어 있고, 본체는 없습니다.

     

    추상 클래스 서브클래싱

    클래스에 추상 메서드가 포함된 경우 클래스도 추상적으로 선언해야 합니다. 이 추상 클래스를 사용하려면 다음과 같이 추상 클래스를 확장하고 모든 추상 메서드를 구현하는 하위 클래스를 만들어야 합니다:

    class Bird extends Animal {
        void move() {
            System.out.println("The bird flies.");
        }
    }
    
    class Fish extends Animal {
        void move() {
            System.out.println("The fish swims.");
        }
    }

    여기서 Bird와 Fish 클래스는 Animal 클래스를 상속받아 move() 메서드를 오버라이드합니다. 이렇게 구체적인 구현은 하위 클래스에서 이루어집니다.

     

     

    인터페이스

    Java의 인터페이스는 본문이 없는 관련 메서드를 그룹화하는 완전히 "추상 클래스"입니다. 인터페이스는 클래스가 아니며, 인터페이스를 선언할 때는 interface 키워드를 사용합니다.

     

    인터페이스 정의하기

    다음은 인터페이스의 간단한 예입니다:

    interface Drivable {
        void accelerate();
        void brake();
    }

    이 경우, Drivable은 인터페이스입니다. 그리고 그 안에는 accelerate()와 brake()라는 추상 메서드가 있습니다. 이들 메서드 역시 추상 클래스와 마찬가지로 선언만 되어 있고, 본체는 없습니다.

     

    인터페이스 구현하기

    인터페이스를 사용하려면, 인터페이스를 implements 하는 클래스를 작성하고 인터페이스의 메서드에 대한 정의를 제공해야 합니다:

    class Car implements Drivable {
        void accelerate() {
            System.out.println("The car accelerates.");
        }
    
        void brake() {
            System.out.println("The car brakes.");
        }
    }
    
    class Bicycle implements Drivable {
        void accelerate() {
            System.out.println("The bicycle accelerates.");
        }
    
        void brake() {
            System.out.println("The bicycle brakes.");
        }
    }

    여기서 Car와 Bicycle 클래스는 Drivable 인터페이스를 구현하고 accelerate()와 brake() 메서드를 오버라이드합니다.

     

     

    인터페이스와 추상 클래스의 주요 차이점

    • 인스턴스화: 추상 클래스나 인터페이스는 인스턴스화할 수 없으며, 모두 확장하거나 구현하는 클래스에 대한 템플릿 역할을 합니다.
    • 메서드: 추상 클래스는 추상 메서드(본문이 없는 메서드 선언)와 비추상 메서드(본문이 있는 메서드 선언)를 모두 가질 수 있지만, 인터페이스는 추상 메서드만 가질 수 있습니다(그러나, Java 8부터 인터페이스는 default와 static 메서드를 가질 수 있습니다).
    • Final 변수: Java 인터페이스에서 선언된 변수는 기본적으로 final과 static입니다. 반면에 추상 클래스는 non-final과 final 변수를 포함할 수 있습니다.
    • 다중 상속: 클래스는 여러 인터페이스를 구현할 수 있으며, 이는 Java가 다중 상속을 지원하는 방식입니다. 그러나 클래스는 단 하나의 추상 클래스만 확장할 수 있으며, 다른 일반 클래스는 얼마든지 확장할 수 있습니다.
    • 데이터 멤버의 접근성: Java 인터페이스의 멤버는 기본적으로 public입니다. 추상 클래스는 private, protected 등 일반적인 클래스 멤버를 가질 수 있습니다.

    결론적으로, Java의 추상 클래스와 인터페이스는 사용자로부터 구현 세부사항을 추상화하는 메커니즘을 제공하여, 재사용성과 모듈성을 증진시킵니다. 추상 클래스는 일반적으로 다른 클래스에 대한 공통의 기본 클래스 구현을 제공하고자 할 때 사용되며, 인터페이스는 일반적으로 클래스 계층 어디에서나 구현할 수 있는 계약을 정의하고자 할 때 사용됩니다.

     

     

    댓글