프로그래밍/JAVA
[JAVA] 추상 클래스와 인터페이스
노력의천재
2020. 9. 7. 17:49
추상클래스
추상 클래스는 상속에서 슈퍼클래스로 사용 (계층 구조를 만들기에 좋음)
추상 클래스는 추상 메소드를 포함하는 경우, 포함하지 않는 경우가 있음
/* 추상 메소드를 포함하는 클래스 */
abstract class Shape {
public Shape() { }
public void paint() {
draw();
}
abstract public void draw(); // 추상 메소드 선언
}
/* 추상 메소드가 없는 클래스 */
abstract class MyComponent {
String name;
public void load(String name) {
this.name = name;
}
}
추상 메소드란 선언은 되어 있으나 코드 구현은 되어 있지 않은 메소드를 의미
추상 메소드의 구현은 추상 클래스를 상속받는 자식 클래스에서 구현(오버 라이딩)
추상 메소드를 가지고 있으면 반드시 추상 클래스로 선언되어야 함
class Fault {
abstract public void f(); // 오류 발생
}
추상 클래스의 특징
추상 클래스는 객체를 생성할 수 없음
public class AbstractError {
public static void main(String[] args) {
Shape shape;
shape = new Shape(); // 컴파일 오류 발생
}
}
추상 클래스를 상속받는 자식 클래스는 추상 클래스가 됨
- 추상 클래스의 추상 메소드를 그대로 상속받음
- 따라서 abstract 키워드를 붙여 추상 클래스임을 명시해야 컴파일 오류가 발생하지 않음
- 만약 추상 클래스의 모든 추상 메소드를 자식 클래스에서 구현한다면 자식 클래스에 abstract 키워드를 생략 가능
abstract class Shape { // 추상 클래스
public Shape() { }
public void paint() {
draw();
}
abstract public void draw(); // 추상 메소드
}
// class Line extends Shape() 컴파일 오류 발생
abstract class Line extends Shape {
public String toString() {
return "Line";
}
}
추상 클래스의 목적
추상 메소드를 통해 자식 클래스가 구현할 때 메소드를 명료하게 알려주는 인터페이스 역할
자식 클래스는 추상 메소드를 목적에 맞게 구현하는 다형성을 실현
예제
/* Calculator.java */
abstract class Calculator {
public abstract int add(int a, int b);
public abstract int sub(int a, int b);
public abstract double average(int[] a);
}
/* GoodCalc.java */
public class GoodCalc extends Calculator{
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public int sub(int a, int b) {
return a-b;
}
@Override
public double average(int[] a) {
double sum = 0;
for (int i = 0; i < a.length; i++) {
sum+=a[i];
}
return sum/a.length;
}
public static void main(String[] args) {
GoodCalc gc = new GoodCalc();
System.out.println(gc.add(2,3));
System.out.println(gc.sub(2,3));
System.out.println(gc.average(new int[] {2,3,4}));
}
}
// 실행 결과
// 5
// -1
// 3.0
인터페이스
소프트웨어를 규격화 된 모듈로 만들고, 서로 인터페이스가 맞는 모듈을 조립하여 응용프로그램을 작성
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() { // 디폴트 메소드, public 생략 가능
System.out.println("*** Phone ***");
}
}
인터페이스의 특징
구성 요소로 필드(멤버 변수)를 만들 수 없음 (상수 필드인 것을 조심)
인터페이스는 객체를 생성할 수 없음
new PhoeInterface(); // 컴파일 오류
인터페이스 타입의 레퍼런스 변수는 선언 가능
PhoneInterface galaxy; // 인터페이스에 대한 레퍼런스 변수 선언은 가능
인터페이스끼리만 상속 가능 (자바는 인터페이스의 다중 상속을 지원)
// 인터페이스끼리 다중 상속이 가능
interface MusicPhoneInterface extends MobilePhoneInterface, MP3Interface {
void playMP3RingTone();
}
인터페이스를 상속받아 클래스를 작성하면 인터페이스의 모든 추상 메소드를 구현해야 함
인터페이스의 목적
클래스들이 인터페이스를 통해 그 기능을 서로 다르게 구현할 수 있도록 하는 규격 역할
클래스의 다형성을 실현하는 도구
예제
/* PhoneInterface.java */
interface PhoneInterface{ // 인터페이스 선언
final int TIMEOUT=10000; // 상수 필드 선언
void sendCall(); // 추상 메소드
void receiveCall(); // 추상 메소드
default void printLogo() { // default 메소드
System.out.println("*** Phone ***");
}
}
/* MobilePhoneInterface.java */
interface MobilePhoneInterface extends PhoneInterface { // 인터페이스 상속
void sendSMS();
void receiveSMS();
}
/* MP3Interface.java */
interface MP3Interface { // 인터페이스 선언
public void play();
public void stop();
}
/* PDA.java */
class PDA{ // 클래스 작성
public int calculate(int x, int y) {
return x+y;
}
}
/* SmartPhone.java */
// SmartPhone 클래스는 PDA 클래스를 상속받고,
// MobileInterface와 MP3Interface 인터페이스에 선언된 추상메소드를 모두 구현한다.
class SmartPhone extends PDA implements MobilePhoneInterface, MP3Interface{
public void sendCall() {
System.out.println("따르릉따르릉~~~");
}
public void receiveCall() {
System.out.println("전화 왔어요.");
}
public void sendSMS() {
System.out.println("문자가 갑니다.");
}
public void receiveSMS() {
System.out.println("문자 왔어요.");
}
// MP3Interface의 추상 메소드 구현
public void play() {
System.out.println("음악 연주합니다.");
}
public void stop() {
System.out.println("음악 중단합니다.");
}
// 추가로 작성한 메소드
public void schedule() {
System.out.println("일정 관리합니다.");
}
}
/* InterfaceEx.java */
public class InterfaceEx {
public static void main(String[] args) {
SmartPhone phone=new SmartPhone();
phone.printLogo();
phone.sendCall();
phone.play();
System.out.println("3과 5를 더하면 "+phone.calculate(3, 5));
phone.schedule();
}
}
// 실행 결과
// *** Phone ***
// 따르릉따르릉~~~
// 음악 연주합니다.
// 3과 5를 더하면 8
// 일정 관리합니다.
추상 클래스 VS 인터페이스
출처 : http://www.yes24.com/Product/Goods/61269276