오버로딩 & 오버라이딩 & 다형성

오버로딩 & 오버라이딩 & 다형성

오버로딩(Overloading)

같은 이름의 메서드 여러개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술

import java.util.*;

class Cat{
	public Cat(){
		System.out.println("야옹");
	}
	public Cat(String text){
		System.out.println(text);
	}
}
public class Main extends Cat{
	public static void main(String[] args){
		Cat c1 = new Cat();
		Cat c2 = new Cat("멍멍");
	}
}

오버라이딩(Overriding)

상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용

import java.util.*;

class Animal{
	public void sound(){
		System.out.println("zzz");
	}
	public void sound(String text){
		System.out.println(text);
	}
}

class Cat extends Animal{
	@Override
	public void sound(String text){
		System.out.println("text : "+text);
	}
}

public class Main extends Cat{
	public static void main(String[] args){
		Cat c = new Cat();
		c.sound();
		c.sound("ttttt");
	}
}

다형성이란? (polymorphism)

다형성이란 하나의 객체나 메소드가 여러가지 다른 형태를 가질 수 있는 것을 말합니다.
자바에서 다형성을 나타내는 것으로는, 오버라이딩과 오버로딩 그리고 상속받은 객체의 참조변수 형변환등이 있으며, 여기에서는 예제를 통해서 상속받은 객체의 참조변수 형변환에 대해서 알아보도록 하겠습니다.

형변환(Casting) 및 사용예제

상속받은 객체에 대해서 형변환이 의미하는 것은, 객체에 속한 멤버들에 대한 사용범위가 달라진다는 것을 의미합니다.

업캐스팅(upcasting)

(자식클래스의 인스턴스에 대한) 자식클래스의 타입의 레퍼런스 변수를 부모클래스 타입으로 형변환 하는 것. (타입변환 구문 생략 가능, 자동 형변환 됨)

다운캐스팅(downcasting)

(자식클래스의 인스턴스에 대한) 부모클래스 타입의 레퍼런스 변수를 자식클래스 타입으로 형변환 하는 것. (타입변환 구문 생략 불가, 형변환 타입을 명시해야됨)

1. Person 클래스 정의 (부모클래스)

public class Person {
	String name;
	int age;
		
	public void speak() {
		System.out.println(name + ": 안녕하세요");
	}
}

2. Dancer 클래스 정의 (자식클래스)

public class Dancer extends Person {
	public void dance() {
		System.out.println(name + ": 춤을 춥니다");
	}
}

3. 객체 생성 및 실행

public class HelloWorld {
	public static void main(String[] args) {

		//==================================
		System.out.println("==== 예시1 ====");
		//==================================
		Person p1 = new Dancer();
		
		p1.name = "홍길동";
		p1.speak();
		// p1.dance();  // 사용불가 
		
		Dancer d1 = (Dancer) p1;	// 다운캐스팅
		d1.name = "이순신";
		d1.speak();
		d1.dance();
		
		//==================================
		System.out.println("==== 예시2 ====");
		//==================================
		Dancer d2 = new Dancer();
		
		d2.name = "제갈공명";
		d2.speak();
		d2.dance();
		
		Person p2 = (Person) d2;	// 업캐스팅 - (Person) 생략가능
		p2.name = "신사임당";
		p2.speak();
		// p2.dance();  // 사용불가
	}
}

형변환(Casting)의 장점 및 instanceof 연산자

1. 형변환(Casting)의 장점

형변환의 장점으로는 여러 자식클래스 타입의 레퍼런스 변수들을 하나의 부모클래스 타입의 레퍼런스 변수로 다룰수 있다는 것입니다.
만약 아래와 같이 Person이라는 부모클래스를 가진 자식클래스 Dancer, Singer, Actor가 있을 경우, 부모클래스 타입으로 형변환하여 사용하게 되면 아래와 같은 장점이 있습니다.

  • 여러 자식클래스 객체를 하나의 배열로 다룰수 있습니다.
  • 메소드의 매개변수를 부모클래스 타입 하나로 전달받아 사용할 수 있습니다.

2. instanceof 연산자

앞서 형변환의 장점대로 부모클래스 타입으로 형변환하여 사용하게 되면, 실제 생성된 인스턴스는 여러 자식클래스 중에 어느 것인지 알아야 하는 경우가 생깁니다. 이때 사용할 수 있는 연산자가 instanceof 연산자입니다.
instanceof 연산자는 해당 레퍼런스 변수가 형변환이 가능한지 여부를 확인할 때 사용합니다.

  • 사용법 : 레퍼런스변수 instanceof 클래스명
  • 반환값 : 형변환 가능하면 true, 아니면 false 반환
예제
  1. 클래스 정의
    • 부모클래스 : Person
    • 자식클래스 : Dancer, Actor
public class Person { 	}

class Dancer extends Person {    }

class Actor extends Person {    }
  1. 객체 생성 및 실행
    public class HelloWorld {
     public static void main(String[] args) {
    		
         Dancer d1 = new Dancer();
         Person p1 = (Person) d1;
    		
         System.out.println("Person? " + (p1 instanceof Person)); // true
         System.out.println("Dancer? " + (p1 instanceof Dancer)); // true
         System.out.println("Actor?  " + (p1 instanceof Actor)); // false
     }
    }
    

© 2023 Lee. All rights reserved.