Class에 대해 간략히 짚어보자
자바에서 클래스(class)란 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용됩니다.
자바에서는 이러한 설계도인 클래스를 가지고, 여러 객체를 생성하여 사용하게 됩니다.
클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성됩니다.
즉, 필드(field)란 클래스에 포함된 변수(variable)를 의미합니다.
또한, 메소드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라 할 수 있습니다.
- 추상 클래스 특징
1) 추상 클래스는 키워드 abstract를 붙여 표현한다.
2) 추상 메서드 미포함 해도 abstract를 붙여서 추상 클래스로 지정할 수도 있다.
3) 클래스를 abstract로 지정하면 new를 통해 객체를 직접 생성할 수 없다.
4) 메소드에 abstract를 사용할 경우 interface의 메소드와 같이 구현 부분은 없다.
5) abstract로 선언한 메소드를 자식 클래스에서 반드시 구현해야 한다. (오버라이딩)
// 추상클래스 선언방법
abstract class 클래스이름 {
...
public abstract void 메서드이름();
}
// 예시코드
public abstract class Engine {
// Field
private int volume;
// Constructor
public Engine(int volume) {
this.volume = volume;
}
// Method
abstract void showEngine() { }; //메소드가 선언은 되어있으나 내용이 없는 추상 메서드
}
public class Car extends AbstractTest {
public Car(int volume){
super(volume); // 부모의 생성자에 할당을하여 사용한다.
}
// 추상메서드로 선언된 부분은 자식에서 선언을 해줘야한다.
@Override
void showEngine() {
System.out.println("이차량은 " + volume + "기통 엔진입니다.");
}
}
- 인터페이스 규칙
1) 추상 클래스처럼 불완전한 것이기 때문에 그 자체만으로 사용되기 보다,
2) 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다.
3) 일반 메서드 또는 멤버 변수를 구성원으로 가질 수 없다.
4) 모든 멤버 변수는 public static final이어햐 하며, 이를 생략할 수 있다.
5) 모든 메서드는 public abtract이어야 하며, 이를 생략할 수 있다.
(단, JDK1.8부터 static 메서드와 default 메서드를 사용할 수 있다.)
TIP) interface이름 설정
인터페이스 명은 대부분 "~을 할 수 있는"의 의미인 able로 끝나는 것들이 많다고 한다.
//인터페이스 선언방법
interface 인터페이스이름 {
...
public void 메서드이름(); //일반 메서드 선언
public abstract void 메서드이름(); // 추상메서드 선언문
public default void 메서드이름() {
//public default void를 사용하면 인터페이스에서 메서드가 정의된다.
};
}
// 예시코드
public interface Movable {
void move(int x, int y);
}
interface Attackable {
void attack(int u);
}
// 인터페이스는 클래스와 다르게 다중 상속이 가능하다.
interface Fightable extends Movable, Attackable {
// TODO Auto-generated method stub
}
class Person implements Attackable, Movable {
@Override
public void move(int x, int y) {
// TODO Auto-generated method stub
}
@Override
public void attack() {
// TODO Auto-generated method stub
}
}
// 메서드이름이 똑같은 interface를 상속받을경우 하위클래스에서 Override해서 재선언 해주어야한다.
추상 클래스는 이를 상속할 각 객체들의 공통점을 찾아 추상화시켜 놓은 것으로,
상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속하며
부모 클래스가 가진 기능들을 구현해야할 경우 사용한다.
인터페이스는 상속 관계를 타고 올라갔을 때
다른 조상 클래스를 상속하더라도, 같은 기능이 필요할 경우 사용한다.
클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용한다.
위의 그림을 예시로 들었을때 생물체라는 추상클래스에서 동물과 사람이 추가로 상속받는 추상클래스가 되고 이때 동물은 식물과 다르게 짖는다(Barkable)이라는 기능이 있으므로 이러한 기능을 분리하기 interface가 사용된다.
그리고 동물을 상속받은 모든 클래스와 식물을 상속받는 FlyHellPlanet은 다른 추상클래스를 상속받지만 Eatable이라는 먹는 기능은 동일하다. 이때도 다른 클래스지만 같은 기능을 가지고 있으므로 interface가 사용된다.
각각의 적절한 사용 케이스 정리
- 추상 클래스
1) 관련성이 높은 클래스 간에 코드를 공유하고 싶은 경우
2) 추상 클래스를 상속 받을 클래스들이 공통으로 가지는 메소드와 필드가 많거나,
3) public이외의 접근자(protected, private) 선언이 필요한 경우
4) non-static, non-final 필드 선언이 필요한 경우 (각 인스턴스에서 상태 변경을 위한 메소드가 필요한 경우)
- 인터페이스
1) 서로 관련성이 없는 클래스들이 인터페이스를 구현하게 되는 경우.
ex) Comparable, Cloneable 인터페이스는 여러 클래스들에서 구현되는데, 구현클래스들 간에 관련성이 없다.
2) 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지는 신경쓰지 않는 경우.
3) 다중상속을 허용하고 싶은 경우
참고
감사합니다.