반응형
Notice
Recent Posts
«   2024/05   »
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
Today
Total
관리 메뉴

H-Log

[java] 다형성 (Polymorphism) 본문

dev-log/java

[java] 다형성 (Polymorphism)

hong6v6 2023. 10. 22. 22:20
반응형

다형성

  • 다양한 형태가 존재한다는 의미
  • 프로그램을 유연하게, 단순하게 만들어 준다

업 캐스팅

  • super class와 그 클래스를 상속받은 sub class 들이 있을 때, sub class를 super class형 참조변수로 저장
  • Object : 모든 class의 super class이므로, 모든 객체에 사용 가능
  • 다만, super class에는 존재하지 않고, sub class에서 추가된 멤버는 사용이 불가능하다
SuperObject sub1 = new SubObject();
SuperObject sub2 = (SuperObject) (new SubObject);

sub1.subClassMethod();   --> err!
sub1.superClassMethod(); --> ok

Object sub3 = new SubObject();

다운 캐스팅

  • sub class 참조변수는 super class 객체를 가르킬 수 없다
  • 기본적으로는 다운 캐스팅이 불가능하다
  • 업 캐스팅 된 참조변수를 형변환을 통해 다운캐스팅 하는 것은 가능하다
SuperObject sub1 = new SubObject(); --> 업 캐스팅
SubObject sub2 = (SubObject) sub1;  --> 다운 캐스팅하여 sub2 변수에 저장

// 잘못된 예
SubOObject sub3 = new SuperObjet(); --> err!

// 유효한 예
SuperObject sub4 = new SubObject();
SubObject sub5 = (SubObject) sub4

다형성의 활용

  • super class형의 객체 배열을 생성하여, 상속받은 자식 객체들을 포함할 수 있다
  • 매개 변수에 super class형으로 인자를 받으면, sub class 객체를 넘겨받을 수 있음

instanceof

  • 변수가 참조하고 있는 객체가 명시한 클래스로부터 생성되었는지를 검사
  • true / false 반환
SuperObject sub = new SubObject();

if (sub instanceof SubObject()) {
	// SubObject로부터 만들어진 객체
}else{
	// 다른 객체를 참조하고 있음
}

method 재정의

  • sub class에서는 super class의 method를 재정의 할 수 있다
  • 예시) Object class의 equals() 재정의
  • // 기존의 equals와 같은 참조 범위(public)와 반환형(boolean)을 가져야 한다
    public boolean equals(Object obj){
    	boolean result = false
    
    	// 매개변수 받은 객체가 존재하고, MyObj로부터 생성된 객체일 때
    	if(obj != null && obj instanceof MyObj){
    
    		// 다운캐스팅
    		MyObj my = (MyObj) obj;
    
    		// v1 : 정수형 변수 / v2 : 문자형 변수
    		if ((v1 == my.v1) && v2.equals(my.v2)){
    			// v1과 v2의 내용이 같으면 같은 객체라고 하기로 함
    			result = true;
    		}
    	}
    	return result;
    }
    
반응형

'dev-log > java' 카테고리의 다른 글

[java] 상속  (0) 2023.10.16
[java] 배열  (0) 2023.10.16
[java] 난수 생성  (0) 2023.10.16
[java] 패키지(Package)와 모듈(Module)  (0) 2023.10.16
[java] 생성자  (0) 2023.10.16
Comments