형변환이란 int<->String<->boolean<->Object 간에 서로 타입을 바꿀 수 있도록 하는 것을 말한다.
예를 들면 String "1"을 int 1로 바꿀 수 있고,
Dobule 7.0을 int 7로 바꿀 수 있다.
하지만 여기서 의문인 것은 그동안에 Integer.parseInt("1")과 (int)"1"의 차이에 대해서 생각을 해보지 않았다는 것.
먼저 Integer.parseInt("010")과 (int)"010"의 차이를 보자.

실행과 컴파일을 하기도전에 에러가 생긴다.
에러명은 String는 "그냥" int로는 못 바꾼다는 것.
여기서 말하는 그냥 바꾼다는 의미는 내부적으로 casting을 할 수 있도록 이미 조치가 되어 있는 경우를 말한다.
우리는 C언어에서도 "123"이라는 char[] 배열이 있다면 문자 "1"은 ascii코드로 몇번이고 여기에 100을 곱한 뒤에 "2"를 가져와서 여기에 10을 곱하고... 다시 여기에 3을 더하면서 내부적으로 parsing을 완성시킨다. 이렇게 해야지만 char[] "123" -> int 123으로 변환 시킬 수 있다.
따라서 서로 다른 클래스(또는 타입)일 경우에는 반드시 내부적으로 선언을해주어야하며 이 기능이 Integer.parseInt(String s)라는 메서드에 있는 것이다. 그래서 "그냥" (int)"1"은 안된다.
이 때
dobule a = 5.23;
System.out.printf("%d", (int)a);
는 성립하는 예제다. 이것은 double안에 int로 바꾸기 위해 소수점을 제거하라는 것이 이미 선언되어 있기 때문이다!
여기서 String과 int 관계가 아닌 부모클래스를 자식클래스로 바꾼다면 이야기가 이어진다. 우리는 지금까지 내부적으로 선언되어 있지 않다면 서로 형변환을 할 수 없다고 했다. 이는 class <-> class 간에도 마찬가지이다.
따라서 부모와 자식 클래스라고 한다면 이 부분을 고려해서 어떤 데이터를 가져올지, 가져오지 않을지, 최종 형 변환을 할지를 알려주어야한다.