■ Java Abstract Class & Interface
1. 추상 클래스 (Abstract Class)
• 일부 메소드가 구현되지 않고, 선언만 되어있는 클래스(abstract 키워드)
- 자식 클래스에서 구현되지 않은 메소드를 반드시 구현하도록 강제하는 것
- 상속한 모든 클래스가 구현하도록 하기 때문에 안정성을 높임
• 추상 클래스는 객체를 생성할 수 없다.
- 그렇기 때문에 구현된 자식 클래스 객체를 받아야 한다.
abstract class AbstractFoo{
int x, y;
public void method(){
System.out.println("method");
}
public abstract void abstractMethod(); // 세미콜론을 잊지말아야 한다
// 선언만 하고 구현하지 않음
}
class Foo extends AbstractFoo{
@Override
public void abstractMethod() {
System.out.println("implemented abstractMethod");
}
}
2. 인터페이스 (Interface)
- 클래스가 사용되는 방식(접점)만을 선언하는 클래스와 유사한 틀
- 아무런 구현이 되어 있지 않으며, 모든 메소드가 추상 메소드이다.
• 인터페이스 특징
- interface 키워드 사용
- 멤버 변수는 항상 public static final 이다(생략 가능)
- 멤버 메소드는 항상 public abstract 이다(생략 가능)
- 클래스는 하나만 상속할 수 있으나, 인터페이스는 다중 상속이 가능
• 인터페이스 변수명 작성법
- interface IFoo : 한마디로 표현하기 힘든 경우, I를 맨 앞에 붙여준다.
- interface Printable : 형용사 형태로 표현, Runnable 등
public interface IFoo {
public static final int MEMBER_VAR = 10;
int MEMBER_VAR2 = 20; // public static final
public abstract void methodA(int param);
void methodB(int param); // public abstract
}
public class Foo implements IFoo {
@Override
void methodA(int param) {
System.out.println(param);
}
@Override
void methodB(int param) {
System.out.println(param);
}
}
• 인터페이스 상속
- 인터페이스로 인터페이스를 상속하는 경우, extends 키워드 사용
- class와 다르게 다중 상속 가능
interface Walkable {
void walk();
}
interface Runnable{
void run();
}
interface Jumpalbe extends Walkable, Runnable{
void jump();
}
3. JDK 1.8 이후
• Default Method
- 항상 public 이다.
- 인터페이스 철학과 맞지 않다.
- 기존에 사용하던 인터페이스가 개선되어, 모든 자식 클래스에 동일하게 구현되어야 하는 메소드가 생긴 경우에 쉽게 기능을 추가하기 위해 만들어짐
- 부모와 인터페이스 모두에 같은 메소드가 있는 경우, 상속 시 부모 클래스의 메소드를 실행한다.
interface IFoo {
void abstractMethod();
default void defaultMethod() { // 구현 클래스에서 구현할 필요가 없다.
System.out.println("Default method");
}
}
class SuperFoo {
void defaultMethod() {
System.out.println("Super method");
}
}
class FooOne implements IFoo {
void abstractMethod() {
return;
}
}
class FooTwo extends SuperFoo implements IFoo {
void abstractMethod() {
return;
}
}
public class Main {
public static void main(String[] args) {
FooOne fooOne = new FooOne();
fooOne.defaultMethod(); // Default method
FooTwo fooTwo = new FooTwo();
fooTwo.defaultMethod(); // Super method
}
}
• static 메소드
- 인터페이스 이름으로 호출 가능
- 클래스 구현체의 이름으로는 호출 불가능
interface IBar {
static void staticMethod(){
System.out.println("Static Method");
}
}
class Bar implements IBar{
}
public class Interface {
public static void main(String[] args) {
IBar.staticMethod(); // 인터페이스 명으로 클래스 메소드 호출 가능
// Bar.staticMethod(); // 구현체인 자식 클래스로는 클래스 메소드 호출 불가능
}
}
'Coding > Java' 카테고리의 다른 글
Java Generic(제네릭) (0) | 2020.09.17 |
---|---|
Java Enumeration(열거형) (0) | 2020.09.17 |
Java Polymorphism(다형성) (0) | 2020.09.17 |
Java Modifier(제어자) (0) | 2020.09.16 |
Java Inheritance(상속) (0) | 2020.09.16 |