[Java] - 추상 메소드와 오버라이딩 ( 메소드 다형성)

메모든 실체들이 가지고 있는 메소드의 실행 내용이 동일하면 추상클래스에 메소드를 작성하는 것이 좋다.

 

하지만 메소드의 선언만 통일하고 실행 내용은 실체 클래스마다 달라야 하는 경우가 있다.

 

예시로 모든 동물은 소리를 내기에 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