본문 바로가기
프로그래밍/Java-문법정리

【OOP】05_다형성

by 코이킹 2022. 1. 20.
반응형

안녕하세요 코이킹입니다.

 

이번 포스트에선 다형성에 대해서 설명하겠습니다. 

 


1. 다형성이란?

 하나의 기능이 상황에 따라서 다른 결과를 내는 것으로, 
Java에서는 부모 클래스 또는 인터페이스를 정의하고, 부모를 상속한 자식 클래스에서 기능을 재정의 하여 
부모의 참조변수에서 자식의 인스턴스를 참조하여, 부모의 참조변수로부터 자식 클래스 별로 재정의된 메서드를 호출하도록 하는 것이라 할 수 있습니다. 

 

1) 다형성의 장점 

 - 여러 종류의 인스턴스를 하나의 부모클래스로 관리가 가능하므로 코드의 양이 줄고 코드의 유지보수가 편해집니다. 

 - 하나의 부모를 공유하는 자식클래스를 늘려 기능을 재정의 하는 것으로 새 기능 추가가 가능하므로 확장이 유리하고,

결합도가 강하지 않도록 코드를 짤 수 있습니다..

 

2) 다형성의 단점

 - 제대로 활용하려면 어렵기에 개발자의 능력(OOP의 이해도)에 따라 코드 품질이 달라진다.

 

※ 예제코드 

package objective.basic05;

import objective.basic04.Animal;

public class Cat extends Animal {

	protected String breed;
	protected String cryingSound = "Niya~!";
	
	public Cat(String name, int age, String breed) {
		super(name, age);
		this.breed = breed;
	}
	
	public void crying() {
		System.out.println(this.cryingSound);
	}
	
	public void crying(int count) {
		if (count < 1) return;
		
		StringBuilder sb = new StringBuilder();
		
		for (int i=0; i<count; i++) {
			System.out.println(this.cryingSound);
			sb.append(this.cryingSound);
		}
		System.out.println(sb.toString());
	}
	
	@Override
	public void printName() {
		System.out.println("Cat's Name : "+ this.name);
	}
}

 

2. 메서드 오버 로딩과 오버라이드

 오버로딩과 오버라이드 모두 다형성의 의미에 부합하지만, 내용 자체는 상이하므로 제대로 이해하고 사용해야 합니다.  
※ 오버로딩 : 동일한 이름의 메서드를 매개변수에 따라 다른 기능을 수행할 수 있게 하는 것을 말합니다.  

public void crying() {
    System.out.println(this.cryingSound);
}
	
public void crying(int count) {
    if (count < 1) return;
		
    StringBuilder sb = new StringBuilder();
		
    for (int i=0; i<count; i++) {
    System.out.println(this.cryingSound);
        sb.append(this.cryingSound);
    }
        System.out.println(sb.toString());
}

 

※ 오버라이드 : 부모의 메서드를 자식에서 재정의 하는 것, 자식 클래스 별로 다르게 메서드를 재정의 하여 다른 결과를 만들어 내는 것을 말합니다. 

Dog dog = new Dog("Happy", 3, "Akita");
Person person = new Person("David", 20, "English");
Cat cat = new Cat("Mike", 10, "KoreanShotHair");
		
Map<String, Animal> map = new LinkedHashMap<String, Animal>();
map.put("dog", dog);
map.put("person", person);
map.put("cat", cat);
		
for (String key : map.keySet()) {
    Animal animal = map.get(key);
    animal.printName();
}


 

 

3. 부모클래스의 참조 변수에서 호출할 수 있는 것?

 자식의 인스턴스를 부모의 참조변수에서 참조한다고 해서 자식의 모든 메서드와 멤버 변수를 사용할 수 있는 것은 아닙니다.
부모의 참조변수에서 호출할 수 있는 것은 부모에서 정의한 메서드와 멤버변수에 한정됩니다. 

Animal animalInCat = map.get("cat");
animalInCat.printName();
animalInCat.getAge();
// animalInCat.crying();   // 子クラスのメソッドは使えない。

 

4. 자식 클래스의 기능을 다시 사용하고 싶다면?

자식의 기능을 다시 사용하고 싶다면 인스턴스의 형변환을 해주면 됩니다. 
부모에서 자식 클래스의 참조자료형으로 형 변환하는 것을 다운 캐스팅이라 하며, 자식 클래스에서 부모 클래스의 참조자료형으로 형 변환하는 것을 업 캐스팅이라 합니다. 

다운 캐스팅의 경우 반드시 캐스팅 연산자를 사용해 명시적 형변환을 해주어야 합니다. 

 

Cat catFromAnimal = (Cat)animalInCat;
catFromAnimal.crying();


5.  instanceof 연산자 

 부모 클래스가 여러 자식 클래스를 가지는 경우 부모의 참조 변수에 어떤 자식이 들어있는지 확인해야 하는 상황이 있을 수 있습니다. 이 경우 instanceof연산자를 사용하여 어떤 클래스의 인스턴스인지 확인할 수 있습니다.

 

map.put("animal", new Animal());
for (String key : map.keySet()) {
    Animal animal = map.get(key);
    if (animal instanceof Dog) {
        System.out.println(key+"'s instanceof Dog");
        
    } else if (animal instanceof Person) {
        System.out.println(key+"'s instanceof Person");
        
    } else if (animal instanceof Cat) {
        System.out.println(key+"'s instanceof Cat");
        
    } else if (animal instanceof Animal) {
        System.out.println(key+"'s instanceof Animal");
        
    } 
}

※ 예제 코드

https://github.com/leeyoungseung/algorithmBasic/tree/master/algorithm/src/objective/basic04

https://github.com/leeyoungseung/algorithmBasic/tree/master/algorithm/src/objective/basic05

 

※ qiita에 투고한 URL

https://qiita.com/Koiking-L/items/d2e586b0d1325763abc1

반응형

'프로그래밍 > Java-문법정리' 카테고리의 다른 글

【Java문법】스레드  (0) 2022.01.27
【OOP】06_추상화  (0) 2022.01.23
【OOP】04_상속  (0) 2022.01.18
【OOP】03_캡슐화  (0) 2022.01.16
【OOP】02_멤버변수·메서드·생성자  (0) 2022.01.15

댓글