메모든 실체들이 가지고 있는 메소드의 실행 내용이 동일하면 추상클래스에 메소드를 작성하는 것이 좋다.
하지만 메소드의 선언만 통일하고 실행 내용은 실체 클래스마다 달라야 하는 경우가 있다.
예시로 모든 동물은 소리를 내기에 Animal이라는 추상 클래스에서 sound() 라는 메소드를 정의했다면
동물마다 다른 소리를 내야하므로 sound() 메소드를 추상 메소드로 선언한 뒤 실체 클래스에서 재정의(오버라이딩)을 해준다.
1. 추상 메소드 선언
: 메소드의 선언부만 있는 메소드로 자식 클래스에서 재정의(오버라이딩)되어 실행 내용을 결정해야한다
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package chapter07_03;
public abstract class Animal {
public String kind;
public void breathe() {
System.out.println("숨을 쉽니다.");
}
public abstract void sound(); // 추상메소드
}
|
cs |
2. 추상 메소드 재정의(오버라이딩)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package chapter07_03;
public class Cat extends Animal{
public Cat() {
this.kind = "포유류";
}
@Override
public void sound() {
System.out.println("야옹");
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package chapter07_03;
public class Dog extends Animal{
public Dog() {
this.kind = "포유류";
}
@Override
public void sound() {
System.out.println("멍멍");
}
}
|
cs |
아래의 코드에서 animalSound()를 new Dog() 라는 구현객체를 넣으면 매개변수
animalSound() 메소드의 매개변수 타입이 Animal 클래스 타입으로 자동형변환된다( Animal 클래스가 부모이므로)
또한 메소드가 재정의되어 있으므로 자식 메소드가 호출되는 다형성 특징이 그대로 반영된다. (메소드 다형성)
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
|
package chapter07_03;
public class Animal_example {
public static void main(String[] args) {
Dog dog1 = new Dog();
Cat cat1 = new Cat();
dog1.sound();
cat1.sound();
System.out.println("------------");
//변수 자동 타입변환
Animal animal = null;
animal = new Dog();
animal.sound();
animal = new Cat();
animal.sound();
System.out.println("------------");
//메소드 다형성
animalSound(new Dog());
animalSound(new Cat());
}
public static void animalSound(Animal animal) {
animal.sound();
}
}
|
cs |
'Java' 카테고리의 다른 글
[Java] - ArrayList 객체와 데이터 클래스 객체 연계사용 - 메소드 체이닝(Method Chaining)을 위한 제네릭(Generic)선언 (0) | 2020.09.28 |
---|---|
[Java] - 자바 인터페이스, 다중 인터페이스, 인터페이스의 사용방법 (0) | 2020.09.24 |
[Java] - 추상 클래스 (0) | 2020.09.24 |
[Java] - Getter, Setter 메소드 (0) | 2020.09.21 |
[Java] - 접근제한자 (0) | 2020.09.21 |