[Java] 다형성

나무나무·2025년 1월 10일

자바

목록 보기
2/6

다형성(polymorphsim)

  • 한 객체가 여러 타입의 객체로 취급될 수 있는 능력.
  • 부모 클래스의 참조 변수에 자식 클래스의 객체들을 대입해서 다루는 것을 의미함.
  • 핵심은 "부모는 자식을 담을 수 있다" 이다.

1) 다형적 참조

  • 부모 클래스의 인스턴스가 자식 클래스 인스턴스를 참조하는 것을 의미한다.
  • 부모는 자식을 담을 수 있지만, 자식은 부모를 담을 수 없음.
  • 자식을 담은 부모는 자식의 기능을 호출할 수는 없음.
    ex) p.parentMethod(); 는 호출이 가능하지만, p.childMethod();는 호출할 수 없음.
  • 만약 자식이 부모 메서드를 오버라이딩한 경우 부모 메서드가 호출되지 않고 자식에서 오버라이딩 한 메서드가 호출되게 됨. → 이걸 "동적 바인딩" 이라고 한다.
public class Parent{
	// 부모 클래스 객체
}
public class Child extends Parent{
	// 자식 클래스 객체
}
public class PolyMain{
	public static void main(String[] args{
    	// 부모 클래스 참조 변수에 자식 클래스 인스턴스를 참조
    	Parent p = new Child();
        // Child 인스턴스 생성 시, Parent인스턴스, Child 인스턴스 둘 다 생성됨
        p.parentMethod(); // 호출 가능
        p.childMethod();  // 호출 불가능
    }
}

2) 캐스팅

업 캐스팅(Up casting)

  • 자식 타입 객체 -> 부모 타입 객체로 형변환 되는 것을 의미함.
  • 업 캐스팅은 자동으로 형변환이 이루어지기 때문에 변환할 타입을 명시해주지 않아도 괜찮다.
  • 부모 타입으로 형변환 된 이후에는 부모 타입의 메서드와 필드만 사용이 가능하다. 단, 오버라이드한 메서드의 경우는 자식 메서드로 호출된다.

다운 캐스팅(Down Casting)

  • 부모 타입 객체 -> 자식 타입 객체로 형변환 되는 것을 의미함.
  • 다운 캐스팅은 자동으로 일어나지 않기 때문에 따로 타입을 명시해주어야 한다.
  • 부모 타입으로만 생성된 인스턴스는 다운 캐스팅이 불가능하다.
  • 자식 인스턴스 생성(부모 인스턴스도 같이 생성) -> 자식 인스턴스부모 인스턴스로 업캐스팅 -> 이를 다시 자식 인스턴스로 다운 캐스팅 하는 과정에서만 사용.
// 부모 클래스 객체
public class Parent{
	// 부모한테만 있는 메서드
    public void parentMethod(){
    	...
    }
    // 오버라이드 하는 메서드
    public void over(){
    	System.out.println("부모");
    }
}

// 자식 클래스 객체
public class Child extends Parent{
    // 자식한테만 있는 메서드
    public void childMethod(){
    	...
    }
    // 오버라이드 하는 메서드
    public void over(){
    	System.out.println("자식");
    }
}

public class PolyMain{
	public static void main(String[] args{
    	// 부모 클래스 참조 변수에 자식 클래스 인스턴스를 참조
        // Child 인스턴스 생성 시, Parent인스턴스, Child 인스턴스 둘 다 생성됨
    	Parent p = new Child();
        // Child 인스턴스가 Parent 참조 변수에 캐스팅 됨 -> 업 캐스팅
        p.parentMethodd(); 
        p.childMethod(); // -> 오류 발생
        p.over(); //        -> '자식'이 출력됨.
        
        // Parent 참조형을 Child 형으로 다시 다운 캐스팅
        ((Child)p).parentMethod(); 
        ((Child)p).childMethod(); 
        ((Child)p).over();   // -> '자식'이 출력됨.
        
    }
}

참조 타입 확인(instance of)

  • 자식 클래스의 객체를 생성하면 부모 객체도 같이 생성이 되기 때문에 위로만 타입을 변경하는 업캐스팅의 경우 항상 안전함. 이 때문에 따로 명시적으로 타입을 적지 않아도 괜찮음.

  • 부모 클래스의 객체를 생성하면 자식 객체는 생성되지 않는데, 이는 어떤 자식의 객체를 생성할지를 모르기 때문. 이 때문에 다운 캐스팅의 경우, 하위 타입의 객체가 생성되어 있는지를 꼭 확인하고 진행해야 함.
  • instance of :인스턴스가 어떤 인스턴스를 참조하는지를 확인하는 키워드
  • p instance of Class : p가 참조하는 객체가 Class 형인지? (왼쪽 p가 Class에 들어갈 수 있는 객체인지 대입해보면 됨)
public class Parent{
	// 부모 클래스 객체
}
public class Child extends Parent{
	// 자식 클래스 객체
}
public class PolyMain{
	public static void main(String[] args{

    	Parent p = new Child();
        System.out.println(p instanceof Child);  // true
    }
}

profile
백엔드 개발자 나무입니다

0개의 댓글