CS/JAVA

자바 - 추상클래스&인터페이스

reko_ 2022. 4. 21. 02:51

추상클래스

추상 메서드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스 - 미완성 설계도

상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없음

 

 

class 앞에 "abstract" 예약어를 사용하여 상속을 통해서 구현해야한다는 것을 알려주고 선언부만 작성하는 추상메서드를 선언할 수 있다.

abstract class 클래스이름 {
    ...
    public abstract void 메서드이름();
}​
 
 

인터페이스

추상클래스 - 미완성 설계도

인터페이스 - 기본 설계도 

 

 

인터페이스도 추상클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성하고 클래스와 다르게 다중상속(구현)이 가능함.

 

interface 인터페이스이름 {
    public static final 상수이름 = 값;
    public abstract void 메서드이름();
}​
 
 

추상클래스 VS 인터페이스 

 

공통점 : 추상메서드를 사용 가능 -> 인터페이스를 왜 사용하는가? -> 다중상속의 가능 여부

 

 

자바의 특성상 한개의 클래스만 상속이 가능하다

-> 만약 부모 클래스의 추상 메소드 중 상속받을 클래스에서 사용하지 않는 메소드가 존재한다면?

    자식 클래스는 부모의 추상 메소드 구현이 필수이기 때문에 비효율 발생  

 

 

해당 클래스의 구분을 추상클래스 상속을 통해 해결, 할 수 있는 기능들은 인터페이스로 구현

 

 

 

추상클래스 인터페이스 예제 (생명체)

인간과 동물은 생명체를 상속

각 생명체들은 구분에 따라 인간과 동물을 상속

각각 할 수 있는 기능들을 인터페이스로 구현

 

Creature 추상클래스

public abstract class Creature {
    private int age;
    public abstract void attack();
    
    public Creature(int age) {
        this.age = age;
    }
}

 

Animal 추상클래스

public abstract class Animal extends Creature{
    
    public Animal(int age) {
        super(age);
    }
    
    @Override
    public void attack() {
        System.out.println("몸을 사용하여 공격");
    }
}​

동물 클래서는 생명체이기 때문에  Creature 추상클래스를 상속

동물은 몸을 사용하여 공격하기 때문에 추상메서드 중에 attack메서드를 오버라이딩

 

Human 추상클래스

public abstract class Human extends Creature implements Talkable{
    public Human(int age) {
        super(age);
    }
    
    @Override
    public void attack() {
        System.out.println("도구를 사용해서 공격");
    }
    
    @Override
    public void talk() {
        System.out.println("사람은 말을 할 수 있다.");
    }
}
 

attack을 추상메서드로 구현

인간 클래스는 동물 클래스와 다르게 Talkable 인터페이스를 구현

 

Talkable 인터페이스

public interface Talkable {
    abstract void talk();
}​

Talk 인터페이스에서는 추상메서드를 하나만 선언

 

Flyable 인터페이스

public interface Flyable {
    void fly();
}​

새 종류의 동물 클래스에 구현시킬 Flyable 인터페이스

 

Pigeon 일반클래스

public class Pigeon extends Animal implements Flyable{
    public Pigeon(int age) {
        super(age);
    }
    
    @Override
    public void fly() {
        System.out.println("비둘기 비행");
    }
}​

동물 클래스를 상속하는 일반 클래스

날수 있는 동물이기에 Flyable 인터페이스를 구현해주고 해당 메서드들을 구현

 

Swimable 인터페이스

public interface Swimable {
    void swimDown();
}​

 

Turtle 일반클래스

public class Turtle extends Animal implements Swimable{
    public Turtle(int age) {
        super(age);
    }
    
    @Override
    public void swimDown() {
        System.out.println("거북이 수영");
        System.out.println("최대 50m 잠수");
    }
}​

거북이 클래스에서 수영 기능 구현

 

Kevin 일반클래스

public class Kevin extends Human implements Programmer, Swimable{
    public Kevin(int age) {
        super(age);
    }
    
    @Override
    public void swimDown() {
       System.out.println("케빈 수영");
       System.out.println("최대 10m 잠수")
    }
}​

Kevin클래스에서도 오버라이딩하여 재정의

 

Kevin은 수영도 할 수 있고 코딩도 할 수 있다 -> 인터페이스의 장점 다중 구현

 

Programmer 인터페이스

public interface Programmer {
    void coding();
}