제네릭 관련 포스팅을 작성하게 되면 형변환을 해주는 의미로 cast, casting이라는 말이 정말 자주 쓰인다. 대충 어떨 때 쓰인다는 느낌만 알았던 나는 또 혼자서 물음표를 던지며 찾아보기 시작했다.
그래서 나도 알아본다! 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;
(그러나 이런 명시적인 형변환을 시켜주지 않아도 됨)
= 부모 객체에서 상속받은 필드, 메서드를 자식 객체에서 사용될 때 사용하는 참조 변수
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