추상 클래스
추상 메소드는 abstract 키워드와 함께 정의만 선언하고, 내용은 작성하지 않는 메소드이다.
특징
1. 추상 메소드를 가지고 있다면 무조건 추상 클래스로 선언을 하여야 한다.
2. 추상 클래스의 인스턴스 생성 불가 (상속 시에도 적용, 배열로는 가능)
3. 추상 클래스를 상속 시 추상 메소드를 반드시 오버라이딩 해야한다.
4. 상속 시 : extends 선언
*목적 : 추상 메소드를 통해 서브 클래스가 구현할 메소드의 원형을 알려주는 인터페이스의 역할을 하기 위해
표현
1. 추상 클래스 생성 및 추상메소드 정의
public abstract class class_name{ ... } ( public 생략 가능 )
1
2
3
|
public abstract class class_name{
public 정의();
}
|
cs |
2. 상속 받은 클래스 추상 메소드 내용 작성
1
2
3
4
|
public class_name extends abstract_classname{
public 정의(){
내용 작성
}
|
cs |
인터페이스
클래스들이 같은 메소드를 사용하면서 다른 출력물을 원할 때 사용한다.
ex) 바나나를 먹는다, 사과를 먹는다, 토마토를 먹는다....
이러한 경우 메소드 오버로딩을 통해 각각 메소드를 정의할 수 있다. 하지만 수가 많아졌을 때는 복잡하고 번거러워진다.
그래서 사용하는 것이 인터페이스이다.
특징
1. 상수필드와 추상 메소드만으로 구성된다. ( 모든 메소드,상수는 abstract 속성이므로 생략 가능 )
2. 인터페이스 상속 시 반드시 모든 메소드를 구현해야 한다.
3. static를 사용하면 인터페이스 내에서 선언이 가능하다.
*목적 : 자바의 다형성을 극대화시키고 코드들을 줄이면서 프로그램 유지보수성을 높이기 위해 사용한다.
메소드 오버로딩을 통해 정의한 ZooKeeper 클래스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
public class Animal {
String name;
public void setName(String name) {
this.name=name;
}}
public class Tiger extends Animal {
}
public class Lion extends Animal {
}
public class ZooKeeper {
public void feed(Tiger Tiger) {
System.out.println("feed Apple");
}
public void feed(Lion lion) {
System.out.println("feed banana");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ZooKeeper z=new ZooKeeper();
Tiger t=new Tiger();
Lion l=new Lion();
z.feed(l);
z.feed(t);
}
}
|
cs |
인터페이스로 구현한 ZooKeeper 클래스
인터페이스로 구현을 하면 ZooKeeper 클래스에서 하나하나 다른 메소드들을 정의할 필요가 없어진다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
public class Tiger extends Animal implements Predator{
public String getFeed() {
return "banana";
}
}
public class Lion extends Animal implements Predator{
public String getFeed() {
return "apple";
}
}
public interface Predator {
public String getFeed();
}
public class ZooKeeper {
public void feed(Predator pre) {
System.out.println("feed "+pre.getFeed());
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ZooKeeper z=new ZooKeeper();
Tiger t=new Tiger();
Lion l=new Lion();
z.feed(l);
z.feed(t);
}
}
|
cs |
인터페이스 클래스
인터페이스 클래스에 메소드를 추가하면 메소드의 이름과 입출력에 대한 정의만 있고 내용은 없어야 한다.
그 이유는 인터페이스의 규칙이다. 그리하여 인터페이스를 구현한 클래스에서 구현을 해야한다.
1
2
3
4
5
6
7
|
접근제어자 interface interface_name {
public 메소드 정의() ;
//인터페이스 구현
}
|
cs |
인터페이스를 구현한 클래스
implemenrts를 하였다면 무조건 메소드를 정의해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
|
class class_name extends parent_class implements interface_name, interface_name2 .... {
public type interface_name(){
정의 .......
}
public type interface_name2(){
정의 .......
}
// 인터페이스를 구현한 클래스 구현
}
|
cs |
인터페이스와 추상클래스의 차이
인터 페이스 | 추상 클래스 | |
1. 구조의 차이 | IS-A 구조 | HAS-A 구조 |
2. 상속 개수의 차이 | 다중 상속 | 단일 상속 |
2. 목적의 차이 | 구현하는 모든 클래스에 대해 특정 메소드가 반드시 존재하도록 강제하는 역할 즉 구현객체가 같은 동작을 한다는 것을 보장하기 위함 |
상속 받아서 기능을 확장시키는 전형적인 상속의 목적을 가짐. |
4. 메소드의 차이 | 모두 추상 메소드로 구성 | 추상 메소드 + (일반메소드 도 존재) |
ex) | 기본적인 것 | 바꾸어 끼어 쓸수 있는 것 |
'JAVA > 기본 문법 내용 정리' 카테고리의 다른 글
컬렉션과 제네릭 (0) | 2021.10.29 |
---|---|
입출력 (0) | 2021.10.07 |
배열 [ ] & enum (0) | 2021.10.05 |
조건문 & 반복문 (0) | 2021.10.05 |
상속 (0) | 2021.10.05 |