Java. 형변환(Casting) - 객체타입의 자동형변환, 수동형변환

kimkim·2024년 9월 26일
0

Java. 공부내용정리

목록 보기
29/38

객체 타입 형변환

일반적인 개념

  • 일반적으로 개념이 서로 연관되지 않는 다른 객체끼리의 형변환은 불가능하다.
  • 예시로 연관 되지 않는 강아지 클래스로 만든 참조변수에 고양이 객체가 들어갈 수 없다.

객체를 형변환 하려면

  • 객체를 형변환 시키기 위해서는 그 객체를 아우르는 상속관계에서 형변환을 할 수 있다
  • 예시로 동물 클래스를 상속받은 강아지 객체는 동물 클래스로 만든 참조변수에 강아지 객체를 들어가게 할 수 있다.

자동형변환

: 자식 객체가 부모 클래스의 참조변수에 들어올 때 자동형변환이 가능하다.
: 단, 자식 객체가 부모 클래스의 참조변수에 들어갔을 때는 자식 객체 본인이 고유로 가지고 있는 메서드나 속성을 사용할 수 없다.
: 자식 객체가 부모 클래스 참조변수에 들어올 수 있었던 건 부모객체를 하위로 가지고 있었기 때문이다.
: 실질적으로 들어오는건 자식 객체 상속된 부모 객체가 담기는 것이다.

수동형변환

: 위험성 : 부모참조변수가 부모객체를 가지고 있는지 다른 자식 객체를 가지고 있는지 알 수 없을 수가 있다.
: 만약 A 자식이 있는 부모참조 값을 B자식의 참조변수에 넣어버리면 에러가 난다
: 이를 방지하기 위해 부모 객체가 자식 클래스의 참조변수에 들어가는 자동형변환이 되지 않는다.

: (클래스명)을 사용해 강제로 변경할 수 있지만 그전 변수에 무엇을 담고있는지 주의해야한다.

public class Casting2{
	public static void main(String[] arge){
    	// 객체간의 형변환
        Dog d1 = new Dog();
        d1.bark();
        
        Cat c1 = new Cat();
        c1.moew();
        
    	// d1 = c1; 
        // Dog변수에 Cat이 들어올 수 없다.
        // 완전히 개념이 다르기 때문
        
        // 1. 고양이를 동물이 지나간다 라고 해도 상관은 없다
        // 2. 동물이 지나가는데 고양이가 지나간다라고 
        // 말하면 오류를 범할 수 있다.
        // 3. 동물 영역에 고양이가 속할 수 있지만 
        // 고양이 영역에 동물이라는 범위가 들어갈 수 없다.
        
        
        // ㄱ. 관련있는 속성, 상속x >> 형변환 불가능
        // Animal a1 = c1;
        // cat 객체는 상속 받지 못해서 Dog변수에 Cat이 못들어 간 것처럼 못들어감
        // Dog는 Animal과 관계가 있지만 
        // Cat은 Animal과 관계가 없어서 형변횐 대상이 되지 않음
       
        //  ㄴ. 관련있는 속성, 상속o, 부모클래스 참조변수에 자식객체가 들어갈 때 
        // >> 형변환 가능
        Animal a1 = d1;
        // 가능
        // Animal 타입변수에 Dog가 대입되었다.(x)
        // Dog가 Animal로 모습을 바꿔서 대입(o)
        // > 객체간의 형변환은 상속 관계에서 허용된다.
        // >> 객체간 자동형변환
        
        // a1.bark(); // 자식 객체의 Dog의 속성은 사용 불가
        a1.eat(); // 자식 객체안의 부모객체 Animal의 속성은 사용 가능
        
        // ㄷ. 관련 있는 속성, 상속x, 자식클래스 참조변수에 자식객체가 들어갈 때 
        // >> 강제로만 형변환 가능 
        // d1=a1; >  불가능
        d1=(Cat)a1; // Animal을 Cat으로 수동형변환 => 위험
        
       a1 = d1 ;// a1 -> Dog
       // c1 = a1 ;// == c1 = d1; >> 에러
       c1 = (Cat)a1 ;// >> 강제로 형변환 시킴
       // c1.moew 
       // >> c1d은 Dog 속성을 가지고 있지 않기 때문에 에러
       c1.eat();
       // >> Cat과 Dog는 같은 부모 속성을 가지고 있기 때문에 
       // 부모의 기능은 사용 가능
      
    }
}

// Animal 큰 범위를 Dog 객체가 상속받음
class Animal {
	public void eat(){
    	System.out.println("먹다")
	}
}

class Dog extends Animal{
	public void bark(){
    	System.out.println("멍멍")
	}
}

class Cat {
	public void moew(){
    	System.out.println("야옹")
	}
}

결론

  1. 객체간 형변환은 상속관계일때 가능하다.
  2. 자식 객체가 부모객체로 모습을 바꾸는 것은 안전하다.
    자식은 부모의 기능을 무조건 가지고 있기 때문에
  3. 부모 객체가 자식 객체로 모습을 바꾸는 것은 위험하다.
    부모 객체는 여러 자식 객체 포함할 수 있기 때문에

0개의 댓글