전공/객체지향프로그래밍

[객체지향프로그래밍][Java] 상속 3 (추상 메소드, 추상 클래스, 인터페이스)

Campus Coder 2023. 5. 8. 15:46
728x90
반응형

추상 메소드

선언되어 있으나 구현되어 있지 않은 메소드

public abstract String getName();
public abstract void setName(String s);

추상 메소드는 서브 클래스에서 오버라이딩하여 구현해야 함

 

추상 클래스

추상 메소드를 하나라도 가진 클래스

→ 클래스 앞에 반드시 abstract라고 선언해야 함

추상 메소드가 하나도 없지만 abstract로 선언된 클래스

 

추상 클래스는 객체 생성 불가

 

추상 클래스의 상속

1. 추상 클래스의 단독 상속

추상 클래스를 상속받아 메소드를 구현하지 않으면 추상 클래스 됨

서브 클래스도 abstract로 선언해야 함

abstract class Shape { // 추상 클래스
    public Shape() { }
    public void paint() { draw(); }
    abstract public void draw(); // 추상 메소드
}
abstract class Line extends Shape { // 추상 클래스(draw()를 상속받기 때문)
    public String toString() { return "Line"; }
}

 

2. 추상 클래스 구현 상속

서브 클래스에서 슈퍼 클래스의 추상 메소드 구현(오버라이딩)

서브 클래스는 추상 클래스 아님

 

추상 클래스의 용도

1. 설계와 구현 분리

슈퍼 클래스에서는 개념 정의

- 서브 클래스마다 다른 구현이 필요한 메소드는 추상 메소드로 선언

 

각 서브 클래스에서 구체적 행위 표현

- 서브 클래스마다 목적에 맞게 추상 메소드 다르게 구현

 

2. 계층적 상속 관계를 갖는 클래스 구조를 만들 때

 

인터페이스

  • 클래스가 구현해야 할 메소드들이 선언되는 추상형
  • 인터페이스 선언 - interface 키워드 사용
  • 인터페이스에는 필드(멤버 변수) 선언 불가

 

인터페이스 사례

interface PhoneInterface { // 인터페이스 선언
    public static final int TIMEOUT = 10000;
    // 상수 필드 public static final 생략 가능
    public abstract void sendCall();
    // 추상 메소드 public abstract 생략 가능
    public abstract void receiveCall();
    // 추상 메소드 public abstract 생략 가능
    public default void printLogo()
    {   // default 메소드 public 생략 가능
        statem.out,println("Phone");
    };  // 디폴트 메소드
}

 

인터페이스의 구성 요소들의 특징

상수

  • public만 허용, public static final 생략

 

추상 메소드

  • public abstract 생략 가능

 

default 메소드

  • 인터페이스에 코드가 작성된 메소드
  • 인터페이스를 구현하는 클래스에 자동 상속
  • public 접근 지정만 허용, 생략 가능

 

private 메소드

  • 인터페이스 내에 메소드 코드가 작성되어야 함
  • 인터페이스 내에 있는 다른 메소드에 의해서만 호출 가능

 

static 메소드

  • public, private 모두 지정 가능, 생략하면 public

 

자바 인터페이스의 전체적인 특징

인터페이스의 객체 생성 불가

new PhoneInterface(); // 오류, 인터페이스 객체 생성 불가

 

인터페이스 타입의 레퍼런스 변수 선언 가능

PhoneInterface iPhone; // iPhone는 인터페이스에 대한 레퍼런스 변수

 

인터페이스 구현 - 인터페이스를 상속받는 클래스는 인터페이스의 모든 추상 메소드 반드시 구현

다른 인터페이스 상속 가능

인터페이스의 다중 상속 가능

 

인터페이스 구현

인터페이스의 추상 메소드를 모두 구현한 클래스 작성

  • implements 키워드 사용
  • 여러 개의 인터페이스 동시 구현 가능

 

인터페이스 구현 사례

class SamsungPhone implements PhoneInterface { // 인터페이스 구현
    // PhoneInterface의 모든 메소드 구현
    public void sendCall() { System.out.println("Ring Ring"); }
    public void receiveCall() { System.out.println("The phone is ringing."); }
    // 인터페이스의 메소드를 구현할 때 public 생략시 오류 발생
    
    // 메소드 추가 작성
    public void flash() { System.out.println("The light is on."); }
}
  • PhoneInterface 인터페이스를 구현한 SamsungPhone 클래스
  • SamsungPhone 클래스는 PhoneInterface의 dafault 메소드 상속

 

인터페이스 상속

interface MobilePhoneInterface extend PhoneInterface {
    void sendSMS();    // 새로운 추상 메소드 추가
    void receiveSMS(); // 새로운 추상 메소드 추가
} // extend 키워드 이용
interface MP3Interface {
    void play(); // 추상 메소드
    void stop(); // 추상 메소드
}

interface MusicPhoneInterface extends MobilePhoneInterface, MP3Interface {
    void playMP3RingTone(); // 새로운 추상 메소드 추가
} // 다중 인터페이스 상속

 

인터페이스의 목적

인터페이스는 스펙을 주어 클래스들이 그 기능을 서로 다르게 구현할 수 있도록 하는 클래스의 규격 선언

클래스의 다형성을 실현하는 도구

 

추상 클래스와 인터페이스 비교

  비교 추상 클래스 인터페이스
유사점 유사점 - 객체 생성 불가, 상속을 위한 슈퍼 클래스로만 사용
- 클래스의 다형성을 실현
차이점 목적 - 추상 클래스는 서브 클래스에서 필요로 하는 대부분의 기능을 구현, 서브 클래스가 상속받아 활용
- 서브 클래스에서 구현할 수밖에 없는 기능만을 추상 메소드로 선언하여 서브클래스에서 구현하도록 함
- 인터페이스는 객체의 기능을 모두 공개한 표준화 문서와 같은 것
- 개발자가 인터페이스를 상속받는 클래스의 목적에 따라 인터페이스의 모든 추상 메소드를 만들도록 하는 목적
구성 - 추상 메소드와 일반 메소드 모두 포함
- 상수, 변수 필드 모두 포함
- 변수 필드(멤버 변수)는 포함하지 않은
- 상수, 추상 메소드, 일반 메소드, default 메소드, static 메소드 모두 포함
- protected 접근 지정 선언 불가
- 다중 상속 지원
728x90
반응형