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

추상 클래스(Abstract Class) 와 인터페이스(Interface)

by 검은도자기 2021. 7. 7.

추상 클래스 (Abstract Class) 란?

- 한 개 이상의 추상 메소드를 가지는 클래스

 

* 추상메소드 : 내용 구현(정의)을 하지 않고 선언만 한 메소드

 

 

추상 클래스 특징

- class 앞에 abstract 예약어를 이용해서 정의

- 추상 메소드는 리턴 타입 앞에 abstract라는 키워드를 붙여야 함

- 객체(인스턴스) 생성이 불가능 (왜? 아직은 실체성이 없고 구체적이지 않기 때문)

- 자식 클래스에서 추상 메소드의 구현을 강제하도록 합니다.

- Is-a (~이다)

 

 

추상 클래스 사용목적

- 필드와 메소드 이름을 통일하여 유지보수성을 높이고 통일성을 유지

- 소스 수정 시 다른 소스의 영향도를 적게 가져가면서 변화에는 유연하게 만들기 위해 사용

- 규격에 맞게 소스가 구현되어 있기 때문에 해당 규격에 대한 구현 부만 수정하면 손쉽게 수정이 가능하기 때문

 

 

추상 클래스 예제

abstract class Bird{
    public abstract void sing();

    public void fly(){
        System.out.println("날다.");
    }
}

class Duck extends Bird{
    @Override
    public void sing() {
        System.out.println("꽥꽥!!");
    }
}


public class Test {

    public static void main(String[] args) {
        Duck duck = new Duck();
        duck.sing();
        duck.fly();
    }
}

결과

꽥꽥!!
날다.

 


인터페이스란?

- 추상 메서드와상수로만 이루어진 클래스

 

 

인터페이스 특징

- class가 아닌 interface라는 키워드를 이용하여 작성

- 객체 생성 불가능

- 100% 추상 메소드로 구성 (abstract, public생략 가능)

- 다중 상속 가능

- Has-a (~을 할 수 있는)

 

 

인터페이스의 목적

- 클래스들이 인터페이스를 통해 그 기능을 서로 다르게 구현할 수 있도록 하는 규격 역할

- 클래스의 다형성을 실현하는 도구

 

 

인터페이스 예제

interface IDog {
    void LargeDog();
    void SmallDog();
}

class DogImpl implements IDog {

    @Override
    public void LargeDog(){
        System.out.println("리트리버, 보더콜리");
    }

    @Override
    public void SmallDog(){
        System.out.println("시츄, 말티즈");
    }
}


public class Test {

    public static void main(String[] args) {
        DogImpl docImpl = new DogImpl();
        docImpl.LargeDog();

    }
}

결과

리트리버, 보더콜리

 


추상 클래스 VS 인터페이스 공통점 및 차이점 

추상 클래스는 IS - A "~이다". 인터페이스는 HAS - A "~을 할 수 있는".

이렇게 구분하는 이유는 다중 상속의 가능 여부에 따라 용도를 정한 것 같습니다. 자바의 특성상 한 개의 클래스만 상속이 가능하여 해당 클래스의 구분을 추상 클래스 상속을 통해 해결하고, 할 수 있는 기능들을 인터페이스로 구현합니다.

 

 

  추상클래스(Abstract Class) 인터페이스(Interface)
공통점 선언만 있고, 구현 내용이 없다.
자기 자신이 new를 통해 객체를 생성할 수 없으며 상속받은 자식만이 객체를 생성할 수 있다.
상속받은 자식이 구현을 반드시 하도록 한다.
차이점 추상클래스를 상속받아 기능을 이용하고,
확장시키기 위해 사용한다.
구현 객체의 같은 동작을 보장하기 위해 사용한다.
다중 상속 불가능 다중 상속 가능
일반메드와 추성메드 사용 가능 추상메소드만 사용 가능
일반변수 + 일반메드 + 추상메드 형태 상수 + 추상메드 형태
생성자와 일반변수 모두 가질 수 있다. 생성자와 일반변수를 가질 수 없다.
extends implements
드의 부분적인 구현 가능하다. 드 선언만 가능하다.

 

마무리

상속과 추상 클래스를 알고는 있었지만 정작 어디에 사용해야 할지 감이 안 왔었는데, 공부를 다시 해보니 객체지향적으로 짜려면 필요하겠구나 하고 생각이 들었습니다. 좀 더 설계에 대해 공부해야겠구나?라고 필요성을 느끼면서 이번 포스팅은 마무리하면서 다음 포스팅에서 뵙겠습니다

 

 

참고

https://limkydev.tistory.com/188

https://myjamong.tistory.com/150

https://wikidocs.net/219

https://programmers.co.kr/learn/courses/5/lessons/188

https://velog.io/@gillog/Java-Abstract-Class% EC% B6%94% EC%83%81-%ED%81% B4% EB% 9E%98% EC% 8A% A4

https://velog.io/@gillog/Java-Interface-vs-Abstract-Class-%EC% A0%95% EB% A6% AC

https://mozi.tistory.com/555

https://mozi.tistory.com/556?category=987369 

https://haenny.tistory.com/162

https://ralp0217.tistory.com/entry/JAVA-%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4abstract-class-interf ace

https://transferhwang.tistory.com/168