Human 이라는 클래스를 만들었지만, 이 용도는 인스턴스화 시키지 않고, 오로지 상속 관계를 맺어 오버라이딩 하도록 만들었지만 다른 개발자가 실수로 Human 클래스를 인스턴스화를 해서 일이 발생했다. 1. 인스턴스화를 시킬 클래스가 아님. 2. 오직 상속관계를 위한 클래스임 이럴 때 abstract 클래스를 사용한다. abstaract클래스 (추상클래스)는 상속받은 클래스에게 문법적인 제한을 줌으로서, abstract 메소드 (추상메소드)를 자신의 클래스에 맞게 구현하라는 강제성을 준다. |
abstract 클래스
클래스 앞에 abstract를 붙히면 abstract 클래스가 된다.
abstract class Human {
내용...
}
메소드 앞에도 abstract가 붙을 수 있다.
class Human {
내용...
public abstract void Info();
}
abstract 메소드도 상속 관계만을 위한 것이므로, 오버라이딩을 위한 메소드라는 것을 알리는 것이다.
--> 중괄호 {} 가 없다.
abstract 메소드는 꼭 서브클래스에서 오버라이딩을 해야한다. 하지만, abstract 메소드를 선언 하려면 그 메소드가 속해있는 클래스도 abstract 클래스로 선언해야 한다. abstract 클래스는 인스턴스 생성 불가능!!( 위 내용에 있음 ) |
Human 객체를 인스턴스화 할려고 하면, 바로 오버라이드가 떠버린다.
즉, abstract 클래스가 되었다고 이야기 하는 것.
예제에서 abstract 클래스는 변수를 저장하지 않고, 메소드만 넣게 된다.
변수도 넣을 수 있지만 주로 메소드만 넣기 때문에 interface 와 비교가 된다
interface
• 인터페이스를 구현하는 자식 클래스는 상속과 구현이 동시에 가능 • 인터페이스 간에도 상속이 가능하다. -> 다수의 인터페이스 구현 가능 -> 다중 상속 가능 ==> abstract와 기능을 비슷하지만 이런 이유에서, interface가 더 괜찮다고 한다. |
인터페이스는 기능에 필요한 메소드를 나열한다 (설계도)
//C를 상속받는 동시에 A를 구현하는 클래스 B
class B extends C implements A {
/* interface A의 멤버가 존재
* 부모 클래스 C의 멤버가 존재
*/
interface A {
void methodA();
}
interface B {
void methodB();
}
interface C extends A, B {
//A와 B를 합친 종합적인 기능을 다루는 인터페이스
}
abstract와 interface를 비교해보면,
abstract class Basic {
public abstract setName(final String name, final int age);
public abstract String getName();
}
public interface Basic {
void setName(final String name, final int age);
String getName();
}
거의 같지만, 여기서 컴파일러를 거치게 되면
public interface Basic {
void setName(final String name, final int age);
//컴파일 후 : public abstract void setName(final String name, final int age);
String getName();
//컴파일 후 : public abstract String getName();
이렇게 자동으로 바뀌게 된다.
그래서 abstract 클래스를 선언하여 길게 쓰지말고, interface를 사용해서 하는것이 편리하다.
이렇게 선언한 인터페이스를 구현 할 때는 implements를 사용한다.
인터페이스에 들어있는 메소드들은 구현할 때, 오버라이드를 해줘야한다.
class Man implements Human {...}
오버라이딩 할때는 IDE가 public을 붙여준다.
안붙여줄 땐 알아서 붙이기..
여행가이드 객체를 만들고, 그 인스턴스는 레저,관광,음식 투어를 진행할 수 있게 만든 프로그램이다.
• 인터페이스는 객체 간 상호작용을 위한 일종의 규약이다.
가이드가 일본에서 근무를 하게 된다는 예시를 들어, Providable 인터페이스를 구현하여 JapaTour클래스 작성
abstract 클래스를 사용하는 경우
• 관련된 클래스 사이에서 코드를 공유하고 싶을 때
• 공통적인 필드나 메소드가 많은 경우, public 이외의 접근 지정자를 사용해야 하는 경우
• 정적이 아닌 필드나 상수가 아닌 필드를 선언하기를 원할 때
일반적인 필드도 선언할 수 있으며, 일반적인 메소드도 정의 가능
interface를 사용하는 경우
• 관련 없는 클래스들이 인터페이스를 구현하기를 원할 때
• 특정한 자료형의 동작을 지정하고 싶지만 누가 구현하든지 신경 쓸 필요 없을 때
• 다중 상속이 필요할 때
모든 메소드들은 public, abstract가 되며, 여러 개의 인터페이스를 상속받아 동시에 구현이 가능
'Backend > JAVA' 카테고리의 다른 글
[JAVA] Object (0) | 2022.03.15 |
---|---|
[JAVA] 오버로딩, 오버라이딩 (Overloading, Overrding) (0) | 2022.03.14 |
[JAVA] 쓰레드 (Thread) (0) | 2022.03.10 |
[JAVA] Stack, Queue, Deque (0) | 2022.03.09 |
[JAVA] 메뉴 구성하기 (0) | 2022.03.08 |