Java 인터페이스와 추상 클래스 실례 분석
대상을 대상으로 프로그래밍하는 데 있어서 추상은 그것의 큰 특징 중의 하나이다.Java에서는 두 가지 형식으로 OOP의 추상성을 나타낼 수 있는데 그것이 바로 인터페이스와 추상류이다.이 둘은 너무 많은 비슷한 점이 있고, 또 너무 많은 다른 점이 있다.많은 사람들이 처음 배울 때 마음대로 바꿀 수 있다고 생각하지만 실제로는 그렇지 않다.오늘 우리는 함께 Java의 인터페이스와 추상적인 종류를 배웁니다.
만약 옳지 않은 점이 있다면, 많은 양해와 비판과 시정을 환영하며, 그다지 고맙지 않다.
하나.추상류
추상류를 이해하기 전에 먼저 추상적인 방법을 알아보자.추상적인 방법은 특수한 방법이다. 그것은 성명만 있을 뿐 구체적인 실현은 없다.추상적인 방법의 성명 형식은 다음과 같습니다.
abstract void fun();
추상적인 방법은 반드시 abstract 키워드로 수식해야 한다.만약에 하나의 클래스가 추상적인 방법을 포함하고 있다면 이 클래스를 추상적인 클래스라고 부른다. 추상적인 클래스는 클래스 앞에서 abstract 키워드로 수식해야 한다.추상류에는 구체적인 실현 방법이 없기 때문에 추상류로 대상을 만들 수 없다.
다음은 주의해야 할 문제이다. 이라는 책에서 추상 클래스를'추상적인 방법을 포함하는 클래스'로 정의했지만 추상적인 방법을 포함하지 않고 abstract로만 수식하면 추상적인 클래스라는 것을 발견했다.즉, 추상류가 반드시 추상적인 방법을 포함해야 하는 것은 아니다.개인적으로 이것은 우각선을 뚫는 문제에 속한다고 생각한다. 만약에 추상류가 어떤 추상적인 방법을 포함하지 않는다면 왜 추상류로 설계해야 하는가?그러니 당분간 이 개념을 기억해라, 왜 그런지 깊이 따질 필요는 없다.
[public] abstract class ClassName {
abstract void fun();
}
여기서 알 수 있듯이 추상류는 계승을 위해 존재한다. 만약 당신이 추상류를 정의했지만 계승하지 않는다면 이 추상류를 헛되이 만든 것과 같다. 왜냐하면 당신은 그것을 사용해서 어떤 일을 할 수 없기 때문이다.하나의 부류에 대해 만약에 그의 어떤 방법이 부류에서 실현된다면 아무런 의미가 없고 반드시 부류의 실제 수요에 따라 서로 다른 실현을 해야 한다. 그러면 이 방법을 abstract 방법으로 성명할 수 있다. 이때 이 종류도 abstract 종류가 된다.추상적인 방법을 포함하는 클래스를 추상적인 클래스라고 하지만 추상적인 클래스에 추상적인 방법만 있다는 것을 의미하지는 않는다. 이것은 일반적인 클래스와 마찬가지로 구성원 변수와 일반적인 구성원 방법을 가질 수 있다.추상류와 일반류의 주요 차이점은 다음과 같다.
1) 추상적인 방법은public 또는protected(private일 경우 이불류가 계승할 수 없기 때문에 자류는 이 방법을 실현할 수 없음)이어야 하며, 부족한 경우 기본적으로public입니다.
2) 추상류는 대상을 만드는 데 사용할 수 없다.
3) 만약에 하나의 클래스가 하나의 추상류에 계승된다면 하위 클래스는 반드시 부류의 추상적인 방법을 실현해야 한다.만약 하위 클래스가 상위 클래스를 실현하는 추상적인 방법이 없다면, 하위 클래스도 abstract 클래스로 정의해야 한다.
다른 방면에서 추상류와 일반류는 결코 차이가 없다.
2.인터페이스
인터페이스, 영어를 인터페이스라고 하는데 소프트웨어 공학에서 인터페이스는 일반적으로 다른 사람이 호출하는 방법이나 함수를 가리킨다.여기서 우리는 자바 언어 디자이너의 초심을 느낄 수 있다. 그것은 행위에 대한 추상적이다.Java에서 다음 형식으로 인터페이스를 지정합니다.
[public] interface InterfaceName {
}
인터페이스에는 변수와 방법이 포함될 수 있다.그러나 인터페이스의 변수는 은밀하게 public staticfinal 변수로 지정되고, 방법은 은밀하게 public abstract 방법으로 지정되며, public abstract 방법만 지정됩니다. (예를 들어private,protected,static,final 등 수식은 오류로 지정됩니다.)그리고 인터페이스의 모든 방법은 구체적인 실현이 있을 수 없다. 즉, 인터페이스의 방법은 반드시 추상적인 방법이어야 한다.여기서 인터페이스와 추상류의 차이를 은근히 알 수 있다. 인터페이스는 극도로 추상적인 유형으로 추상류보다 더'추상적'이며 일반적인 상황에서 인터페이스에서 변수를 정의하지 않는다.클래스가 특정 그룹의 인터페이스를 따르려면 implements 키워드를 사용해야 합니다. 구체적인 형식은 다음과 같습니다.
class ClassName implements Interface1,Interface2,[....]{
}
한 종류가 여러 개의 특정한 인터페이스를 따르도록 허용하는 것을 알 수 있다.만약 비추상적인 클래스가 어떤 인터페이스를 따른다면, 반드시 이 인터페이스의 모든 방법을 실현해야 한다.어떤 인터페이스를 따르는 추상류는 이 인터페이스의 추상적인 방법을 실현하지 않을 수 있다.셋.추상류와 인터페이스의 차이
1. 문법적 차원에서의 차이
1) 추상적인 클래스는 구성원 방법의 실현 디테일을 제공할 수 있고 인터페이스에public abstract 방법만 존재할 수 있다.
2) 추상적인 클래스의 구성원 변수는 여러 가지 유형일 수 있지만 인터페이스의 구성원 변수는publicstaticfinal 유형일 수 있다.
3) 인터페이스에는 정적 코드 블록과 정적 방법이 포함될 수 없고 추상류에는 정적 코드 블록과 정적 방법이 있다.
4) 하나의 클래스는 하나의 추상적인 클래스만 계승할 수 있지만 하나의 클래스는 여러 개의 인터페이스를 실현할 수 있다.
2. 디자인 차원에서의 차이
1) 추상류는 하나의 사물에 대한 추상, 즉 유형에 대한 추상이고 인터페이스는 행위에 대한 추상이다.추상류는 전체 유형 전체에 대해 추상화를 하는데 속성, 행위를 포함하지만 인터페이스는 유형 국부(행위)에 대해 추상화를 한다.간단한 예를 들면, 비행기와 새는 서로 다른 종류의 사물이지만, 그것들은 모두 공통성을 가지고 있는데, 바로 모두 날 수 있다는 것이다.그러면 설계할 때 비행기를 하나의 클래스 Airplane, 새를 하나의 클래스 Bird로 설계할 수 있지만 비행이라는 특성도 클래스로 설계할 수 없기 때문에 이것은 하나의 행위 특성일 뿐 하나의 사물에 대한 추상적인 묘사가 아니다.이때 비행을 하나의 인터페이스 Fly로 설계하여 방법fly()를 포함하고 Airplane과 Bird는 각각 자신의 수요에 따라 Fly를 실현할 수 있다.그리고 서로 다른 종류의 비행기, 예를 들어 전투기, 민용기 등은 에어플레인을 직접 계승하면 되고, 새에 대해서도 유사하며, 서로 다른 종류의 새는 Bird류를 직접 계승하면 된다.여기서 알 수 있듯이 계승은'옳고 그름'의 관계이고 인터페이스 실현은'유무'의 관계이다.만약에 한 종류가 어떤 추상류를 계승한다면 자류는 반드시 추상류의 종류이고 인터페이스 실현은 유무, 구비되지 않은 관계를 가진다. 예를 들어 새가 날 수 있는지(또는 비행이라는 특징을 갖추고 있는지), 비행할 수 있다면 이 인터페이스를 실현할 수 있고 비행할 수 없으면 이 인터페이스를 실현하지 않는다.
2) 디자인 차원이 다르고 추상류는 매우 많은 자류의 부류로서 일종의 모형식 디자인이다.인터페이스는 일종의 행위 규범이고 방사식 설계이다.무엇이 템플릿 디자인입니까?가장 간단한 예는 모두가 ppt 안의 템플릿을 사용한 적이 있다. 만약에 템플릿 A로 ppt B와 ppt C를 설계했다면 ppt B와 ppt C의 공공 부분은 템플릿 A이다. 만약에 그들의 공공 부분을 변경해야 한다면 템플릿 A만 바꾸면 된다. ppt B와 ppt C를 다시 변경할 필요가 없다.복사식 디자인, 예를 들어 어떤 엘리베이터에 어떤 경보기를 설치했는데 경보기를 갱신하려면 반드시 모두 갱신해야 한다.즉, 추상류에 대해 새로운 방법을 추가해야 한다면 추상류에 구체적인 실현을 직접 추가할 수 있고 자류는 변경하지 않을 수 있다.인터페이스에 대해서는 안 되고 인터페이스가 변경되면 이 인터페이스를 실현하는 모든 종류는 상응하는 변경을 해야 한다.
다음은 인터넷에서 가장 광범위하게 전해지는 예: 문과 경보의 예: 문은 모두 오픈()과close() 두 가지 동작이 있는데 이때 우리는 추상적인 종류와 인터페이스를 통해 이 추상적인 개념을 정의할 수 있다.
abstract class Door {
public abstract void open();
public abstract void close();
}
또는:
interface Door {
public abstract void open();
public abstract void close();
}
그러나 지금 만약 우리가 문에 경보 알람 () 기능이 필요하다면 어떻게 실현해야 합니까?다음은 두 가지 사고방식을 제공합니다.1) 이 세 가지 기능을 모두 추상류에 넣는다. 그러나 이렇게 되면 이 추상류에 계승된 모든 자류는 경보 기능을 갖추지만 어떤 문은 반드시 경보 기능을 갖추지 못한다.
2) 이 세 가지 기능을 모두 인터페이스에 넣고 경보 기능을 사용해야 하는 클래스는 이 인터페이스에 있는open()과close()를 실현해야 한다. 아마도 이 클래스는open()과close() 두 가지 기능을 갖추지 못할 것이다. 예를 들어 화재 경보기 등이다.
여기서 알 수 있듯이 Door의open(),close()와alarm()은 근본적으로 두 가지 서로 다른 범주 내의 행위에 속하고 open()과close()는 문 자체의 고유한 행위 특성에 속하며 alarm()는 연장된 부가 행위에 속한다.따라서 가장 좋은 해결 방법은 단독으로 경보를 하나의 인터페이스로 설계하여 알람 () 행위를 포함하고 Door는 단독의 추상적인 유형으로 설계하여 오픈과close 두 가지 행위를 포함한다.경보문 계승 도어 클래스와 알람 인터페이스를 다시 설계합니다.
interface Alram {
void alarm();
}
abstract class Door {
void open();
void close();
}
class AlarmDoor extends Door implements Alarm {
void oepn() {
//....
}
void close() {
//....
}
void alarm() {
//....
}
}
본고에서 기술한 것이 여러분의 자바 프로그램 설계에 도움이 되기를 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.