-
[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
'프로그래밍 > JAVA' 카테고리의 다른 글
[Java] 다형성을 이용하여 null 처리하기 (0) 2022.08.30 [JAVA] 문자열 클래스 (0) 2020.09.07 [JAVA] 배열 사용법 (0) 2020.09.03 [JAVA] final (0) 2020.08.10 [JAVA] static 멤버, static 메소드 (0) 2020.08.05