추상 클래스 (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://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/556?category=987369
https://haenny.tistory.com/162
https://transferhwang.tistory.com/168
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
오버 로딩(Overloading)과 오버 라이딩(Overriding) (0) | 2021.07.03 |
---|---|
Call by Value와 Call by Reference 란? (0) | 2021.06.29 |
객체 지향 프로그래밍(OOP)란? (1) | 2021.06.22 |
GC(Garbage Collector) 란? (0) | 2021.06.19 |
JVM(Java Virtual Mahcine)이란? (0) | 2021.06.15 |