프로그래밍/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 인터페이스

transferhwang.tistory.com/26

 

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

인터페이스와 추상 클래스가 유사한 점은 다음과 같다. 객체를 생성할 수 없고, 상속을 위한 슈퍼 클래스로만 사용 클래스의 다형성을 실현하기 위한 목적 표를 통해 차이점을 알아보면 비교 목

transferhwang.tistory.com

 

 

출처 : http://www.yes24.com/Product/Goods/61269276
 

명품 JAVA Programming

자바(Java)는 그 이전 시대에 있었던 프로그래밍 언어에서 한 차원 진화된 개념으로 개발된 가히 혁명적 언어이며 플랫폼이다. 한 번 작성된 자바 프로그램은 어느 컴퓨터, 어떤 운영체제에서도 �

www.yes24.com