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
반응형
'전공 > 객체지향프로그래밍' 카테고리의 다른 글
[객체지향프로그래밍][Java] 모듈과 패키지 개념 (Object, Wrapper, Integer, String, StringBuffer, StringTokenizer, Math, Calendar) (0) | 2023.05.31 |
---|---|
[객체지향프로그래밍][Java] 인터페이스의 구성 요소 심화 내용 (0) | 2023.05.31 |
[객체지향프로그래밍][Java] 상속 2 (오버라이딩) (0) | 2023.04.27 |
[객체지향프로그래밍][Java] 상속 1 (객체 생성, 접근 지정자, 업캐스팅, 다운캐스팅, instanceof 연산자) (0) | 2023.04.27 |
[객체지향프로그래밍][Java] 클래스와 객체 2 (접근 지정자, static, final) (0) | 2023.04.18 |