우와한 개발자

[Java] 객체지향프로그래밍 - 다형성

by 우와한개발자

객체지향프로그래밍의 주요 특징으로는 추상화, 캡슐화, 상속, 다형성이 있다.

다형성(polymorphison)은 하나의 객체가 여러 가지 유형으로 사용되는 것으로, 상속을 전제로 한다.

 

1. 다형적 객체

  • 부모 클래스로 선언한 변수는 상속 관계에 있는 자식클래스의 인스턴스를 할당 받을 수 있다.
  • 다형적 객체 : 부모로 선언하고 자식 인스턴스를 참조하는 객체
class Parent{ ... }
class Child1 extends Parent{ ... }

public class Test{
	public static void main(String[] args) {
		Parent p = new Child(); //다형적 객체
	}
}

 

2. Virtual Method Invocation

  • 다형적 객체의 메서드를 호출하면 자식클래스의 재정의된 메서드를 호출
  • 다형적 객체의 메서드를 호출할 때는 부모로부터 상속받은 것이나 오버라이드한 메서드만 호출 가능 (즉, 호출하고자 하는 메서드는 반드시 선언된 클래스에 존재해야함)
class Parent{
	public void method(){ System.out.println("parent");}
}

class Child extends Person{
	@Override
	public void method(){ System.out.println("child");}
	
	public void method2(){ System.out.println("only child");}
}

public class Test{
	public static void main(String[] args) {
		Parent p = new Child();
		p.method(); // child 출력
		p.method2(); // 컴파일 에러 발생
	}
}

 

3. 이종모음 (Heterogeneous Collection)

  • 배열은 원래가 동종모음(Homogeneous Collection) 구조 : 같은 형식의 데이터 저장
  • 다형성을 적용하면 이종모음(Heterogeneous Collection) 구조 가능
class Parent{
	public void method(){ System.out.print("parent\\t");}
}

class Child1 extends Person{
	@Override
	public void method(){ System.out.print("child1\\t");}
	
}
class Child2 extends Person{
	@Override
	public void method(){ System.out.print("child2\\t");}
	
}

public class Test{
	public static void main(String[] args) {
		Parent [] pArr = new Person[3];
		pArr[0] = new Person();
		pArr[1] = new Child1();
		pArr[2] = new Child2();
		
		for(Parent p: pArr){
			p.method();
		}
		// parent child1 child2 출력
	}
}

 

4. Wrapper Class

  • 원시 데이터 유형의 데이터를 객체로 사용할 수 있도록 구현해 놓은 클래스
  • JDK 9버전부터 Wrapper 클래스의 생성자 deprecated 됨. → 래퍼클래스의 valueOf() 메서드 이용
Primitive Data Type Wrapper Class
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character

 

5. 오토박싱(autoboxing)과 오토 언박싱(autounboxing)

  • 오토박싱 : 기본형(primitive) → Wrapper 객체로 자동 변환해주는 기능
  • 오토 언박싱 : Wrapper 객체 → 기본형으로 자동 변환해주는 기능
  • Java SE 5 이상
int a = 10;
Integer b = a;   // 오토박싱 : Integer.valueOf(a);와 같음.

Integer x = 20;
int y= x;   // 오토언박싱

 

6. 다형적 인자

  • 메서드에 전달되는 인자가 여러 가지 타입으로 제공될 수 있는 것
class Parent{ ... }
class Child1 extends Parent{ ... }
class Child2 extends Parent{ ... }

public class Test{
	public static void printInfo(Person p){
		p.method();
	}
	public static void main(String[] args) {
		Parent p = new Parent(); 
		Child1 c1 = new Child1();
		Child1 c2 = new Child2();
		printInfo(p);
		printInfo(c1);
		printInfo(c2);
		
	}
}

 

7. instanceof 키워드

obj instanceof ClassName
  • 객체가 특정 클래스의 인스턴스인지 확인할 때 사용하는 연산자
  • 왼쪽 항의 obj가 오른쪽 항의 클래스의 인스턴스이면 true 반환.

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기