ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

    '프로그래밍 > 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

    댓글

Designed by Tistory.