본문 바로가기
Language/JAVA

인터페이스와 특수 클래스

by 전전긍긍 2023. 11. 9.

1. 추상 클래스란?

1. 1. 추상 클래스 개념 & 특징

- 메서드 본체를 완성하지 못한 메서드. 더 구체적으로 설명한다면, 실체 클래스의 공통적인 부분들(변수, 메서드)를 추출해서 선언한 클래스 (자식 멤버를 통일)

- 실체성이 없고 구체적이지 않아서 "객체" 생성 불가능

- 추상 클래스는 보통 하나 이상의 추상 메서드를 포함하는데, 포함하지 않을 수도 있음.

- 추상 클래스와 상속 클래스는 "상속" 관계

- 실체 클래스들은 반드시 추상 메서드를 상속받아 오버라이딩(재정의) 해야 한다.

1.2 추상 클래스 용도

- 필드와 메서드 이름을 통일하여 유지보수성을 높이고 통일성을 유지

- 설계시, 시간절약

1.3 추상 클래스 선언

- 추상 클래스에 생성자도 포함이 가능하다. → 자식 클래스가 부모 생성자 super()를 호출할 수 있기 때문

abstract class 클래스이름 {
            //필드
            //생성자
            //메서드
        }

추상메서드

- 추상 클래스와 같이 abstract 키워드를 붙여서 선언한다.

- 추상 메서드는 실체가 없음. 말 그대로 추상적인 메서드. 자식이 이 추상 메서드를 상속 받아서 오버라이딩 해야하기 때문에 본체(중괄호)가 없다.

abstract 반환타입 메서드이름() ;

2. 인터페이스란?

2.1 인터페이스 개념

- 클래스 간에 상호작용하는 규격

- 추상 클래스의 극단적인 예   모든 멤버를 추상화한다.

- 추상 클래스가 미완성 설계도라면, 인터페이스는 기본 설계도(가이드라인, 규격 등)이다.

2.2 인터페이스 구성 요소 

- 인스턴스 변수 선언 X, 객체 생성 X  → 생성자 X

- 추상 메서드 상수만 가능  → 추상 메서드는 반드시 상속받아서 오버라이딩 해야 하고, 상수 필드는 제공해주는 값만 사용할 것

- 자바 8부터 디폴트 메서드 정적 메서드 사용 가능

  디폴트 메서드를 왜 써야 하는가?

기존 인터페이스에 새로운 기능을 추가할 때 사용한다. 새로운 추상 메서드를 추가하고 싶은데 어떤 클래스는 구현하지 않으면 전체적인 에러가 나기 때문에 전체적인 오류를 발생하지 않기 위해 디폴트 메서드를 사용한다. + 오버라이딩 가능 + 인스턴스 메서드이므로 객체를 생성한 후 호출

  정적 메서드?

구현된 본체를 가진다. 하지만 오버라이딩이 될 수 없고 인터페이스로 직접 호출한다.

2.3 인터페이스 상속

- 인터페이스를 상속하려면 extends 키워드 사용

- 인터페이스를 구현하려면 implements 키워드를 사용


프로그래밍 문제

* 쉽게 배우는 자바 프로그래밍 책을 기반으로 작성합니다.

 

✅ 추상 클래스와 구현 클래스를 작성한 후 테스트 프로그램 실행

public class practice01 {
    public static void main(String[] args) {
        Concrete c = new Concrete(100, 50);
        c.show();
    }
}

abstract class Abstract {
    int i;

    public Abstract(int i) {
        this.i = i;
    }
    //추상메서드
    abstract void show();
}
class Concrete extends Abstract {
    int j;

    public Concrete(int i, int j) {
        super(i);
        this.j = j;
    }

    @Override
    void show() {
        System.out.println("i = " + i + ", j = " + j);
    }
}

✅ Talkable 인터페이스와 Talkable 인터페이스를 구현하는 Korean 클래스와 American 클래스를 구현하고 테스트 프로그램 완성하기

public class practice04 {
    static void speak(Talkable t) {
        t.talk();
    }
    public static void main(String[] args) {
        speak(new Korean());
        speak(new American());
    }
}

interface Talkable {
    void talk();
}

class Korean implements Talkable {
    @Override
    public void talk() {
        System.out.println("안녕하세요!");
    }
}

class American implements Talkable {

    @Override
    public void talk() {
        System.out.println("Hello!");
    }
}

 Controller 추상클래스와 상속받는 TV, Radio 클래스.

public class practice05 {
    public static void main(String[] args) {
        Controller[] c = {new TV(false), new Radio(true)};

        for (Controller controller : c)
            controller.show();
    }
}

abstract class Controller {
    boolean power;

    void show() {
        if (power)
            System.out.println(getName() + "가 켜졌습니다.");
        else
            System.out.println(getName() + "가 꺼졌습니다.");
    }

    abstract String getName();
}

class TV extends Controller {

    public TV(boolean power) {
        this.power = power;
    }

    @Override
    String getName() {
        return "TV";
    }
}

class Radio extends Controller {

    public Radio(boolean power) {
        this.power = power;
    }

    @Override
    String getName() {
        return "라디오";
    }
}

Reference

[JAVA] 추상 클래스란?

https://limkydev.tistory.com/188

 

[JAVA] 자바 추상클래스란?

[JAVA] 자바 추상클래스란? 추상클래스 이 글 하나로 박살내자. 추상클래스의 문법적인 특징이나, 객체생성이 되고 안되고 이런 특징들이 중요한게 아닙니다. 도대체 추상클래스가 무엇이고 왜

limkydev.tistory.com

[JAVA] 인터페이스란?

https://limkydev.tistory.com/197?category=957527 

 

[JAVA] 자바 인터페이스란?(Interface)_이 글 하나로 박살내자

1. 인터페이스 개념과 역할 인터페이스....이 글하나로 박살내자. (회사에서 존댓말을 많이 쓰기때문에 여기서라도 반말로 글을 써보고 싶음 ㅎ) 인터페이스는 뭘까?? 결론부터 말하면, 극단적으

limkydev.tistory.com