JAVA Interface, Abstract

최범균님의 개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴을 보고 느낀건,,,

첫번째 역시나 내가 너무 생각없이 일했구나,,,

두번째 예전에 객체 지향, 디자인 패턴 책을 보았을 때 느낌과는 상당히 틀리구나,,,

셋째 Interface, Abstract 정의

넷째 좌절 또 좌절,,,

어찌되었건,,,

Java에는 Interface란 놈과 Abstract란 놈이 있다.

Interface 정의
– 골격만 가지고 있는 클래스
– 몸체 없는 메서드(추상 메서드)로만 이루어진 클래스

1
2
3
4
5
6
7
8
9
10
11
12
public interface IRemoteControl{
    void powerOn(); //추상 메서드
    void powerOff(); //추상 메서드
    void channelUp(); //추상 메서드
    void channelDown(); //추상 메서드
    /*
    public abstract void powerOn(); //추상 메서드
    public abstract void powerOff(); //추상 메서드
    public abstract void channelUp(); //추상 메서드
    public abstract void channelDown(); //추상 메서드
    */

}

Interface 특징
– 메서드들은 abstract 메서드이기 때문에 abstract 생략 (public abstract)
– 메서드들은 구현 목적이기에 default public 속성 (일반 클래스는 default private)
– abstract 메서드를 포함하고 있기 때문에 객체 생성 불가

Interface 주의사항
– 인터페이스도 클래스의 한 종류이다.
– Interface 메서드를 모두 구현하지 않으면 Abstract가 된다.(모두 구현해야만 객체 생성 가능)

Abstract 정의
– 골격만 가지고 있는 클래스(불완전)
– 몸체 없는 메서드(추상 메서드)로만 이루어진 클래스
– 추상 메서드를 하나라도 포함하고 있으면 추상 클래스

1
2
3
4
5
public abstract class Test{ //추상 클래스를 포함 클래스
        public void sayHello(){  } // 일반 메서드
        public void sayHi(){  } // 일반 메서드
        public void sayHowareyou(); //몸체 없는 메서드 - 추상 메서드
}

Abstract 특징
– 메서드, 클래스 선언부 abstract 키워드 사용
– 미완성 클래스이기 때문에 자체적(Abstract를 이용해서)으로 절대 객체 생성 출가
– 하위 클래스(extends 받은 class)에서는 상위 클래스의 추상 메서드를 하나도 빼지 말고 전부 구현해야 한다.
– Abstract를 상속한 후 추상 메서드를 하나라도 남겨 두었다면 그 자체도 Abstract가 된다.
– 상속을 통해서 추상 메서드를 전부 구현해야만 객체 생성 가능
– Abstract는 메서드의 프로토타입(Prototype)만 가지고 있다.
– 클래스 구조 잡기 위한 방법으로 사용
– 일반 클래스에 abstract 키워드 사용으로 Abstract 구현시 상속 자체만으로 완전한 클래스가 된다.
– 추상 메서드를 포함하지 않는 Abstract를 사용하는 이유(Abstract를 무조건 상속받도록 하기 위해서)

1
2
3
4
5
6
7
/**
추상 클래스 - 2개의 추상 메서드를 포함한 추상 클래스의 예
**/

public abstract class EmptyCan {
    public abstract void printContent(); //추상 메서드
    public abstract void printName(); //추상 메서드
}
1
2
3
4
5
6
7
8
9
/**
추상의 추상 - 추상 클래스의 메서드를 모두 구현하지 않은 예
**/

public abstract class InCompleteCan extends EmptyCan{
    //EmptyCan의 printName() 구현
    public void printName() {
        System.out.println("InCompleteCan에서 printName() 구현");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
모든 추상 메서드의 구현
InCompleteCan에 남아 있던 모든 추상 메서드를 구현한 후 객체를 생성하는 예
**/

public class CompleteCan extends InCompleteCan {
    public void printContent(){//EmptyCan의 printContent() 구현
        System.out.println("CompleteCan에서 printContent() 구현");
    }
    public void sayHello() {//새로운 멤버 메서드 추가
        System.out.println("CompleteCan에서 sayHello() 추가 구현");
    }
    public static void main(String args[]) {
        CompleteCan cc = new CompleteCan(); //객체 생성
        cc.printName();
        cc.printContent();
        cc.sayHello();
    }
}

– Abstract EmptyCan는 두개의 추상 메서드를 가지고 있는데 상속받은 InCompleteCan 클래스에서 한개의 추상 메서드만 구현하였기 때문에 InCompleteCan 클래스 또한 Abstract가 된다. 그리고 InCompleteCan 클래스를 상속받은 CompleteCan에서 남은 추상 메서드를 구현했기 때문에 완전한 클래스가 되어서 객체 생성이 가능한다. InCompleteCan 클래스에서 한개의 추상 메서드만 구현하였지만 상속받은 InCompleteCan 클래스에서 구현한 추상 메서드 또한 실행가능

Abstract 주의사항
– 인터페이스도 클래스의 한 종류이다.
– Interface 메서드를 모두 구현하지 않으면 Abstract가 된다.(모두 구현해야만 객체 생성 가능)

Abstract와 Interface
– Abstract는 클래스의 일부분이 추상 메서드이다.
– Interface는 추상 메서드로만 이루어져 있다.

Abstract와 Interface 2
– 일반 클래스, Abstract는 extends를 이용해서 추상 메서드를 구현(상속)한다.
– Interface는 implements를 이용해서 추상 메서드를 구현(확장)한다.

찾아본 링크들 정리

http://www.okjsp.net/seq/235733

http://okjsp.net/bbs?seq=56298

http://okjsp.net/bbs?seq=133632

http://okjsp.net/bbs?seq=106693

http://okjsp.net/bbs?seq=114903

http://www.okjsp.net/bbs?seq=114923

http://silverktk.tistory.com/134

http://blog.naver.com/PostView.nhn?blogId=rkqnrdlrns&logNo=10177633885

http://iamreo.tistory.com/entry/%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EC%B0%A8%EC%9D%B42

http://chester777.tistory.com/150

5 Comments

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다