Casting에 대하여..

cutiepazzipozzi·2023년 3월 25일
2

지식스택

목록 보기
11/35
post-thumbnail

제네릭 관련 포스팅을 작성하게 되면 형변환을 해주는 의미로 cast, casting이라는 말이 정말 자주 쓰인다. 대충 어떨 때 쓰인다는 느낌만 알았던 나는 또 혼자서 물음표를 던지며 찾아보기 시작했다.

그래서 나도 알아본다! cast!

Cast?

아마 제네릭을 작성하면서 대충 의미를 정의한 적이 있을 것이다.
간단하게 한마디로 정의하면 형변환이라고 말할 수 있겠다.

나의 경우를 예시로 들면, 제곱수를 표현하며 int num = Math.pow(a, b)로 표현할 때 항상 오류가 떴었다. Math.pow는 double형으로 반환을 해줄 뿐더러 소수점까지 표현하기 때문에 int로 저장이 되면 원래 값의 소수점 아래 부분은 삭제가 되면서 값이 손실될 가능성이 생기기 때문이다. 그래서 꼭 int num = (int) Math.pow(a, b) 이런 식으로 형변환을 시켜줘야 한다(소수점 아래 값이 존재하지 않는다면!).

(그냥 추가적으로 설명하자면 기본 자료형 끼리의 연산이기 때문에 double a = 1은 잘 컴파일 된다.)

기본 자료형간의 연산에서 cast는 데이터 손실에 의미를 두지만, 객체 지향 프로그래밍의 다형성 측면에서 (제네릭도 아마 이런 의미로..) 사용하는 경우가 대다수이다.

캐스팅의 종류

  • 보통은 상속 관계에서 부모 클래스, 자식 클래스 간의 형변환을 위해 사용된다.

업캐스팅

  • 자식 -> 부모 클래스
  • 서브 클래스 객체가 수퍼 클래스 타입으로 형변환 되는 것
Child child = new Child;
Parent parent = child;
혹은 Parent parent = (Parent) child;
(그러나 이런 명시적인 형변환을 시켜주지 않아도 됨)
  • 다형성을 가져 장점이 생김 (공통적인 부분을 더 편하게 바꿔줌)
    => 부모 클래스 아래 상속받은 다양한 자식 클래스 중 특정 클래스를 골라 선언할 때 더 편리함! (없다면 조건문으로 타입 검사를 해줘야함)

** 알아두면 좋은 Super 키워드

= 부모 객체에서 상속받은 필드, 메서드를 자식 객체에서 사용될 때 사용하는 참조 변수

public class Person {
	String name;
	public Person(String name) {
    	this.name = name;
    }
}

public class Student extends Person {
	public Student(String name) {
    	super(name);
    }
  	public void display() {
    	System.out.println(this.name);
        System.out.println(name);
        System.out.println(super.name);
        //모두 Person 객체에서 주어진 name값이 출력되겠지만
        //이 Student 클래스 내의 name값이 따로 존재한다면
        //위의 두개 출력값은 Student 클래스 내의 값으로 출력될것
    }
}
  • super()는 부모 클래스의 생성자를 호출할 때 사용됨!
class Parent {
    int a;
    Parent() {a = 10;}
    Parent(int n) {a = n;}
} 

class Child extends Parent {
    int b;
    Child() {
        super(20); //이를 통해 a는 20이라는 값이 저장됨
        //아니라면 기본 생성자로 a는 10이라는 값이 저장
        b = 20;
    }
    void print() {
    	System.out.println(a+" "+b); 
    }

다운캐스팅

  • 말그대로 형변환을 낮춘다? 부모 클래스 -> 자식 클래스

Child child = new Parent가 가능할까?
상속받은 child의 데이터가 더 많기 때문에 상식적으로 성립하지 않는다. 그래서 다운 캐스팅은 불가능하지만 성립할 수 있는 경우가 있다.

아래를 보자.

Parent parent = new Child();
Child child = (Child) parent;

아래처럼 업 캐스팅이 선행된 경우에는 태생이 child 클래스이기 때문에 다운 캐스팅이 가능하다. 또한 명시적으로 타입을 지정해주어야 한다.

참고

https://velog.io/@sezzzini/Java-Casting
https://mommoo.tistory.com/40 -> 41, 51도
https://sundrystore.tistory.com/17
http://www.tcpschool.com/java/java_inheritance_super

profile
노션에서 자라는 중 (●'◡'●)

0개의 댓글