추상 메서드없이 추상 클래스 정의


114

추상 메서드를 추가하지 않고 추상 클래스를 정의 할 수 있습니까?


1
데코레이터 패턴에서 좋은 예를 찾을 수 있습니다 . 여기를 참조 하세요 . 모두 WindowDecorator하고 CoffeeDecorator있는 abstract클래스는, 그러나 어느 쪽도 포함하지 않는 abstract방법.
MS Dousti 2017

답변:


168

물론이야.

클래스 초록을 선언한다는 것은 자체적으로 인스턴스화되는 것을 허용하지 않는다는 의미 일뿐입니다.

메서드 추상을 선언한다는 것은 하위 클래스가 해당 메서드에 대한 구현을 제공해야 함을 의미합니다.

두 가지 개념은 별개이지만, 비추 상 클래스에서는 추상 메서드를 가질 수 없습니다. final메서드 가있는 추상 클래스를 가질 수도 있지만 그 반대는 아닙니다.


14

예, 할 수 있습니다. 그냥 해보지 그래?


6
그리고 그것은 단지 OP가 아닙니다. 질문이받은 모든 찬성표를보세요!
Marc W

54
@ karim79 높은 말과 모든 소스를 쏟을 필요가 없습니다. 그것을 시도하는 것은 그것이 허용되는 이유를 밝히지는 않지만 그것을 물어볼 수 있습니다.
biziclop 2011 년

7
@bizclop-스스로 시도해 보면 더 생산적인 질문이 나올 수 있습니다. 높은 말이 없습니다. 이것은 매우 간단합니다. 그의 질문은 '왜 이런 일을 하는가 ...'가 아니라 '할 수 있을까'였다.
karim79 2011 년

8
질문에 간단한 예 또는 아니오로 대답 할 수있는 경우 질문자는 다른 말을 바꾸거나 Google을 사용하거나 단순히 시도해 보는 것을 고려해야합니다.
Tyler Treat

3
@ karim79 예, 질문이 더 잘 표현 될 수 있었지만 한발 앞서 보는 데 그렇게 많은 노력이 필요하지 않은 것 같습니다.
biziclop

8

그래 넌 할수있어. Java에서 사용되는 추상 클래스는 클래스의 객체를 만들 수 없음을 나타냅니다. 그리고 서브 클래스가 해당 메서드에 대한 구현을 제공해야하는 추상 메서드입니다.

따라서 추상 메서드없이 쉽게 추상 클래스를 정의 할 수 있습니다.

예 :

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

이건 괜찮아.


6

YES 추상 메소드없이 추상 클래스를 생성 할 수 있습니다. 추상 메소드가없는 추상 클래스의 가장 좋은 예는 HttpServlet입니다.
추상 메서드는 본문이없는 메서드입니다. 클래스에 적어도 하나의 메서드를 선언 한 경우 클래스는 다음과 같이 선언되어야합니다. 추상 클래스를 선언 한 경우 필수를 추상화하지만 클래스 내부에서 추상 메서드를 선언하는 것은 필수가 아닙니다.

추상 클래스의 개체를 만들 수 없습니다. 즉, 인스턴스화 할 수 없습니다.


4

예, 이미 구현 된 메서드만으로 자체적으로 인스턴스화 할 수없는 클래스를 선언 할 수 있습니다. 이것은 나중에 추상 메서드를 추가하거나 추상 속성이없는 경우에도 클래스를 직접 인스턴스화하지 않으려는 경우에 유용합니다.


질문은 빈 추상 클래스가 아니라 추상 메서드가없는 추상 클래스에 관한 것이 었습니다. 완전히 비어있는 추상 클래스를 사용하는 한 유효한 이유가 없습니다.
biziclop 2011 년

1
답변이 수정되었습니다. 나중에 추상 메서드를 추가하고 다른 부모 클래스를 리팩토링 할 필요가없는 경우 빈 추상 클래스를 사용하는 것이 유용 할 수 있습니다.
Gordon Gustafson 2011 년

1
계층 구조의 중간에서 해당 클래스의 파생이 부모의 다른 파생의 계약 의무와 다른 계약 의무를 가질 경우 완전히 비어있는 (상속 사양 제외) 추상 클래스가 의미가있을 수 있습니다.
supercat dec

3

예, 추상 메서드없이 추상 클래스를 선언 할 수 있습니다. 클래스를 추상으로 선언하는 목적은 클래스를 인스턴스화하는 것이 아닙니다.

그래서 두 가지 경우

1) 추상 메서드가있는 추상 클래스.

이러한 유형의 클래스에서는이 추상 클래스에서 클래스를 상속해야하며 클래스의 추상 메서드를 재정의해야합니다 (예 : GenricServlet 클래스).

2) 추상 메서드가없는 추상 클래스.

이러한 유형의 클래스는이 추상 클래스에서 클래스를 상속해야합니다. 예 : HttpServlet 클래스의 목적은 자식 클래스에서 논리를 구현하지 않으면 부모 논리를 얻을 수 있다는 것입니다.

HttpServlet 소스 코드를 확인하십시오


2

예, 둘 다 독립적 인 개념이기 때문에 추상 메서드없이 추상 클래스를 가질 수 있습니다. 클래스 추상을 선언한다는 것은 자체적으로 인스턴스화 할 수 없으며 하위 클래스 만 가능함을 의미합니다. 메서드 추상을 선언한다는 것은 Method가 하위 클래스에 정의된다는 것을 의미합니다.


클래스를 인스턴스화 할 수없는 이유는 무엇입니까? 좋은 이유가 있습니까?
karlihnos

1

네, 할 수 있습니다.

클래스 추상을 선언한다는 것은 클래스가 다른 클래스에 의해 인스턴스화되지 않음을 의미합니다.

그리고 그 안에 적어도 하나의 추상 메서드가 있어야하며 그 의미는 ok보다 메서드를 선언하지 않으면 해당 클래스에서 추상 메서드를 선언 할 수 있습니다.

예:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

이것은 확실히 작동합니다.


1

그래 넌 할수있어. 때때로 당신은 이것을하는 목적이 무엇인지에 대한 질문을받을 수 있습니다. 대답은 : 때때로 우리는 클래스가 자체적으로 인스턴스화하지 못하도록 제한해야합니다. 이 경우 사용자가 Abstract 클래스를 확장하고 자식 클래스를 인스턴스화하기를 원합니다.


1

예, 추상 메서드없이 추상 클래스를 정의 할 수 있습니다. 그러나 내부에 메소드가 없으면 인터페이스를 사용하는 것이 좋습니다.


4
최소 30 자 제한을 사용하는 것이 좋습니다.
Marc W

1
추상적 인 방법이 없다면 어떻게 인터페이스를 사용할 수 있습니까? 인터페이스에는 기본적으로 모든 메서드가 추상화되어 있습니다.
Usman Rana

1

당신은 할 수 있습니다. 처음부터 딱딱하고 빠른 대답은 없다고 말 할게요. 현재 상황에 맞는 일을하십시오.

나에게 상속은 'is-a'관계를 의미합니다. 좀 더 전문화 된 하위 유형 (Alsatian, Poodle 등)으로 확장 할 수있는 개 클래스를 상상해보십시오. 이 경우 개 클래스를 추상적으로 만드는 것은 하위 유형이 개이기 때문에 옳은 일이 될 수 있습니다. 이제 개에게 목걸이가 필요하다고 상상해 봅시다. 이 경우 상속은 의미가 없습니다. 개와 목걸이 사이에 'is-a'관계를 갖는 것은 말도 안됩니다. 이것은 확실히 '가져온'관계이고, 칼라는 협업 대상입니다. 개가 하나를 가질 수 있도록 칼라를 추상화하는 것은 말이되지 않습니다.

나는 종종 추상 메서드가없는 추상 클래스가 실제로 'has-a'관계를 표현하고 있음을 발견합니다. 이 경우 상속을 사용하지 않고도 코드를 더 잘 분석 할 수 있다는 것을 알 수 있습니다. 또한 추상 메서드가없는 추상 클래스는 종종 코드 냄새이며 최소한 코드 리뷰에서 질문을 제기해야합니다.

다시 말하지만 이것은 전적으로 주관적입니다. 추상 메서드가없는 추상 클래스가 의미가있는 상황이있을 수 있습니다. 그것은 전적으로 해석과 정당화에 달려 있습니다. 어떤 작업을하든 최선의 결정을 내리십시오.


1

사실 추상 클래스에 추상 메서드가 없다면 의미가 없습니다. 추상 클래스는 아버지와 같습니다. 이 아버지는 어렸을 때 아버지의 아이가되고 싶을 때 몇 가지 특성과 행동을 가지고 있습니다. 내 아이가 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.