1. 추상 클래스(Abstract class)
추상클래스는 미완성 도면이라고 생각하면 이해하기 쉬울거야.
예를 한 번 들어볼게.
1. A회사가 만든 문은 손으로 닫는 문
2. B회사가 만든 문은 자동으로 닫는 문
3. C회사가 만든 문은 양쪽으로 닫는 문
이상 A,B,C 회사 문은 닫히는 방법은 각기 다르지만 결국 '닫히다' 라는 공통점이 있어.
'닫힌다' 라는 행위를 메소드라고 본다면, 공통된 메소드만 정의해 놓은 클래스가 바로 추상 클래스라고 할 수 있어.
"추상 메서드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스"
이제는 이렇게 표현해도 이해할 수 있겠지?
추상 클래스가 가질 수 있는 것들은 다음과 같아.
1) 필드
2) 생성자
3) 추상메서드
생성자를 가지기 때문에 객체화가 가능하고 인터페이스와 다르게 필드도 가질 수 있어.
<추상클래스의 표현>
public abstract class Hello {
public String words;
//추상메소드. 선언만 해주자.
public abstract void voice();
}
클래스 앞에 abstract 만 붙여주면 끝!
그럼 추상클래스를 정리해보자.
"
추상클래스는 추상메소드 및 생성자나 필드를 가진 클래스이다.
상속 관계가 있을 때 추상클래스가 사용될 수 있다.
단일상속이다.
"
2. 인터페이스(Interface)
인터페이스는 기본 설계도라고 보면 이해하기 쉬울거야.
예를 들어볼게.
1. 문을 만들도록 지시가 내려졌다.
2. 가로길이 90cm, 참나무를 사용한 여닫이 문을 만들어야한다.
추상클래스는 원리만 같다면 어떻게든 만들어도 돼- 라는 식이었다면
인터페이스는 내가 지정한 규격대로 만들어야해! -라는 식이야.
인터페이스가 가질 수 있는 것들은 다음과 같아.
1) 상수
2) 추상메소드
3) 정적메소드
4) 디폴트 메소드
상수, 추상메소드, 정적메소드 들은 변경이 불가능한 것들이야. 인터페이스에 정해진 규격대로 만들어야 하지.
그러나 4번의 디폴트 메소드 는 변경이 가능하다는 특징을 갖고있어.
인터페이스를 사용해서 만든 시스템이 환경적 변화 등으로 인해서 반드시 바꾸거나 추가해야하는 부분이 생길 경우
오버라이딩을 통해 변경 가능하게 만들어둔게 디폴트 메소드라고 보면 돼!
<인터페이스의 표현>
public interface Sing{
// K-pop을 부르다
public String singKpop(String str);
// pop을 부르다
public String singPop(String str);
}
public class Singer implements Sing {
public String singKpop(String str) {
// K-pop을 부르다
}
public String singPop(String str) {
// pop을 부르다
}
Sing sing = KpopSing();
String str = sing.singKpop(str);
}
인터페이스를 사용하려면 implements 를 사용하면 돼.
여기서 추상클래스와 다른점은 다른 클래스를 상속받은 상태로 인터페이스 상속이 가능하다는 점이야.
이를 다중상속이라고 해. JAVA는 원래 단일상속만을 지원하는데, 인터페이스만은 예외적으로 다중상속이 가능해!
그럼 인터페이스를 정리해보자.
"
인터페이스에 정의된대로 구현해야한다.
인터페이스는 상수, 추상메소드, 정적메소드, 디폴트메소드를 가진다.
다중상속이 가능하다.
"
3. 추상클래스 VS 인터페이스
자, 우리는 추상클래스와 인터페이스에 대해서 살펴봤어.
그렇다면 언제 추상클래스를 사용하고 인터페이스를 사용해야할까?
지금까지 공부해오면서 내 나름의 정의를 해보자면,
추상클래스는 방향성만 갖는다.
인터페이스는 방향성 및 가는 방법이 정해져있다.
정도야. 그래서 나는,
공통된 내용(필드나 메소드)들을 추출하여
통일된 내용으로 작성하도록 규격화하고자 한다면
추상클래스
이미 추상클래스를 상속하는데 공통 기능이 필요하거나,
개발하는데 정확한 규칙과 방향성, 기능 구현이 중요하다고 한다면
인터페이스
- 를 사용하는것이 적절하지 않을까라고 생각해.
'JAVA > 이론' 카테고리의 다른 글
주석에 대하여(작성중) (0) | 2021.01.20 |
---|---|
[JAVA] String을 import 없이 사용할 수 있는 이유 (0) | 2021.01.05 |
[JAVA] JVM (자바가상머신) (0) | 2021.01.04 |