본문 바로가기
Programming Language/Java & Kotlin

[JAVA] 추상 클래스와 인터페이스의 차이

by happy coding! 2022. 9. 22.
반응형

개요

이번 포스팅에서는 추상 클래스와 인터페이스의 차이점에 대해 알아보겠습니다.
차이점에 대해 알아보기에 앞서 추상 클래스와 인터페이스의 개념에 대해 설명드리겠습니다.

추상 클래스 (abstract class)

추상 클래스(abstract class)란 하나 이상의 추상 메서드 (abstract method)를 포함하는 클래스 입니다.
추상 메서드는 선언만 있고 본체는 없는 함수이며 선언부에 'abstract'라는 키워드를 붙입니다.
추상 메서드가 포함되어 있다면 클래스도 추상 클래스이므로 클래스명 앞에도 'abstract' 키워드를 붙여야 합니다.

abstract class Animal {
    public String sName;
    public void move() { }
    abstract void howl(); 
}
  • 추상 클래스는 추상 메서드를 포함하고 객체화할 수 없다는 점만 제외하고 일반 클래스와 동일하게 생성자, 멤버변수와 일반 메서드도 가질 수 있습니다.
  • 추상 클래스 자체는 클래스 역할을 하지 못하며 객체를 생성할 수 없지만 부모 클래스로서 중요한 역할을 합니다.
  • 위의 예시에서 Animal 클래스는 직접 객체를 생성하지 못하고 이를 상속받는 자식 클래스에서는 추상 메서드의 구체적인 본체를 가질 수 있습니다.
abstract class Animal {
    public String sName;
    public void move() { }
    abstract void howl(); 
}

class Dog extends Animal {    
    public void move() {        
        System.out.println("팔짝 팔짝");    
    }    

    void howl() {            
        System.out.println("멍멍");    
    }
}

class Cat extends Animal {    
    void howl() {            
        System.out.println("냐옹");    
    }
}

public class Main {
    public static void main(String[] args) {
        Dog happy = new Dog();
        Cat julia = new Cat();
        happy.move();
        happy.howl();
        julia.move();
        julia.howl();
    }
}
  • 추상 메서드의 접근 지정자로 private은 사용할 수 없다. 이는 자식 클래스에서 받아서 구현되어야 하므로 당연하다.
  • 다른 접근지정자 (public, protected)는 사용할 수 있고 생략되면 default(같은 패키지 안에서만 접근 가능)인 것은 일반 클래스와 동일하다.
  • 위의 예처럼 추상 클래스는 다른 클래스들에게 공통으로 가져야하는 메서드들의 원형을 정의하고 그것을 상속받아서 구현하도록 하는데 사용된다.
  • 어떤 추상 클래스를 상속받은 자식 클래스에서 추상 메서드를 구현하지 않았다면 자식 클래스도 추상 클래스가 되어야 한다.

자바 인터페이스(interface)

자바 인터페이스는 추상 클래스와 비슷한 점이 있지만 한 단계 더 추상화된 클래스입니다.
기본적으로 아래와 같이 정의합니다.

interface IA {
    int ia = 11;
    void fun();
}
  • 인터페이스도 추상클래스와 마찬가지로 직접 객체를 생성할 수 없으며 이것을 구현하는 클래스는 객체화할 수 있다.
public class Main {
    public static void main(String[] args) {
        Violin v1 = new Violin();
        v1.ready();
        v1.play();

        Guitar g1 = new Guitar(); 
        g1.ready();
        g1.play();
    }
}


interface Playable {
    String player = "살레시오";
    void ready();
    void play();
}

class Violin implements Playable {
    public void ready() {
        System.out.println(player+ "의 바이올린이 준비되었다.");
    }
    public void play() {
        System.out.println(player+ "의 기타가 준비되었다.");
    }
}

class Guitar implements Playable {
    public void ready() {
        System.out.println(player + "의 기타가 준비되었다.");
    }
    public void play() {
        System.out.println("디리링~디리링~");
    }
}
  • 위의 예시에서는 Playable 이라는 인터페이스를 구현한 Violin과 Guitar ㅡㄹ래스르 작성하였습니다.
  • 이와 같이 인터페이스는 구현하고자 하는 여러 클래스의 공통적인 부분만 기술해 놓은 기초 설계도와 같고 인터페이스를 구현하는 클래스에서 추상 메서드의 몸체를 모두 정의하도록 강요합니다.
  • 만약 인터페이스를 구현하는 어떤 클래스가 추상 메서드를 구현하지 않는다면 그 클래스는 추상 클래스가 되어야 합니다.

추상클래스인터페이스차이

출처

https://studymake.tistory.com/426

반응형

댓글