추상 클래스와 인터페이스에 대해서 알아보겠습니다.
추상 클래스는 말 그대로 추상적인 클래스입니다. 완성하지 않고 개념적으로 존재하는 클래스를 말합니다.
인터페이스는 틀을 말합니다. 추상 클래스의 일부이며 형식을 어느 정도 일치시키도록 고안된 요소입니다.
추상 클래스
가끔씩 보고서를 작성할 때 목차부터 작성하곤 합니다.
1. 인사 2. 글의 목적 3. 글의 결과 4. 마무리
목차를 작성한 후 해당 부분을 채워서 보고서를 마무리합니다.
추상 클래스도 이와 비슷합니다.
미리 목차를 만들어 놓고 그다음 상속을 받아서 완성하여 사용합니다.
추상 클래스는 추상 메서드를 1개 이상 포함하고 있습니다.
즉, 추상 메서드가 1개 있는 클래스는 무조건 abstract를 붙여야 하고 이를 추상 클래스라고 부릅니다.
abstract class A{
abstract void ab(); //미완성 {} 없음
}
하지만 여기서 반대 경우는 해당하지 않습니다.
추상 클래스 안에 추상 메서드를 반드시 가지고 있어야 하는 것은 아닙니다!
<오류 상황>
class A{
abstract void ab(); //미완성 {} 없음
}
abstract 메서드가 존재하기 때문에 반드시 abstract class 선언 필요!
<오류 아님>
abstract class A{
}
추상 클래스를 사용하는 법
추상 클래스는 미완성이기 때문에 완성해야 합니다.
즉, 완성을 해야 객체로 생성할 수 있습니다. 무조건 미완성 메서드를 완성시켜야 합니다. 완성하지 않으면 오류입니다!
객체를 만드는 법은 2가지 있습니다.
1. 상속받아서 사용
이제 미완성이었던 ab 메서드가 자식 B class를 통해 완성되었으니 B객체를 생성하여 사용할 수 있습니다.
추상 클래스는 미완성인 메서드를 자식 클래스를 통해서 완성하기 때문에 "상속한다"가 아닌 "구현한다"로 통용합니다!
2. 익명 이너 클래스로 직정 만들어서 사용
main 함수 안에서 객체를 만듬과 동시에 추상 클래스를 완성하여 사용합니다.
인터페이스
인터페이스는 기본적으로 모든 메서드들이 public abstract로 정의되어 있습니다. 그래서 인터페이스는 추상 클래스의 일부라고 할 수 있으며 어찌 보면 추상 메서드를 인터페이스라는 틀로 묶어 놓은 것이 인터페이스라고 할 수 있습니다.
인터페이스는 필드는 Public static final , 메서드는 public abstract로 정의되어 있습니다. 이는 생략해도 자동적으로 추가되는 제어자입니다.
인터페이스를 사용하는 방법은 implements를 사용하여 완성할 수 있습니다. extends 상속과 다르게 다중 상속이 가능합니다.
그 이유는 데이터 상 static으로 저장공간을 분리하여 사용하기 때문에 충돌 문제가 해결됩니다.
그렇다면 어떻게 사용하며 객체를 만들 수 있을까?
아까 추상 클래스를 만드는 법과 비슷합니다.
1. 상속받아서 사용
2. 익명 이너 클래스 활용
객체를 생성할 때 익명 이너 클래스를 여러 번 사용할 때마다 위와 같은 방법으로 생성해야 하기 때문에
많은 객체를 생성할 때는 상속을 통해 , 적은 객체를 생성할 때는 익명 이너 클래스를 활용하는 것이 좋습니다.
이렇게 인터페이스를 사용하는 이유는 무엇일까?
위 특성들을 종합해보면 추상 메서드를 통해서 전체적인 class에 틀을 규격, 통일시킬 수 있다는 장점이 있습니다.
예시를 보면
A 회사에서 한 개발자가 달리는 기능을 만들었습니다.
void Run();
후임 개발자가 이어받아서 달리는 기능을 다시 만들었습니다.
Void dash();
이렇게 되면 Run() 메서드를 사용하던 다른 부분들은 오류가 날 수밖에 없습니다.
그래서 인터페이스를 만들고 인터페이스를 완성하여 틀을 제한하고 프로그램에 유지보수를 향상할 수 있습니다!
디폴트 메서드
마지막으로 위에서 추상 클래스는 무조건 완성해야 사용할 수 있다고 했습니다!
완성하지 않으면 바로 이때다 싶어서 오류를 발생시켜야 합니다.
하지만 default 메서드를 통해서 이 문제를 해결할 수 있습니다.
비록 default 형식이 {}로 완성된 형태이긴 한데,
자식 클래스마다 abstract 메서드들을 완성시키는 것보다는 훨씬 효율적입니다!!!
디폴트 메서드는 일반 메서드 처럼 작동해서 오버 라이딩이 가능하고 부모 인터페이스 내에서도 호출이 가능합니다!
디폴트 메서드 호출
부모 인터페이스에서 디폴트 메서드를 호출하는 방법은 다음과 같습니다.
부모 인터페이스명.Super.디폴트 메서드명
인터페이스는 다중 상속이 가능하다는 특성 때문에 위와 같은 이름으로 호출합니다!
'Development > Java' 카테고리의 다른 글
[Java, 환경] Mac JavaFx 설치법 (1) | 2022.09.21 |
---|---|
[Java, 개념] 이너 클래스와 이너 인터페이스 (0) | 2022.07.26 |
[Java, 개념] 부모 생성자가 먼저 생성되는 이유 (0) | 2022.07.22 |
[Java, 개념] 객체의 다운캐스팅 (1) | 2022.07.22 |
[Java, 개념] this() 메서드 (0) | 2022.07.21 |