자바 형변환(Casting, Promotion)과 바인딩(Binding)

Dope
Webdev TechBlog
Published in
5 min readApr 2, 2020

서론

자바의 형변환은 크게 명시적 형변환과(Casting) 묵시적 형변환(Promotion) 이 존재합니다. 형변환 에 대해서 자세하게 알아야 상속에 대해서도 더 자세하게 이해할 수 있습니다. 형변환과 상속이 무슨 관계냐? 라고 생각하실 수 도 있는데 아래에서 왜? 서로 관계가 있는지에 대해서 배우게 됩니다.

이 개념을 배우기 위해서 동적바인딩과 정적 바인딩 에 대한 지식도 필요하므로 따로 아티클을 만들지 않고, 여기서 같이 설명하려 합니다.

묵시적 형변환(Promotion) 과 바인딩(Binding)

묵시적 형변환은 작은 타입이 큰 타입으로 변환 되는 기법을 말합니다. 작은 타입이 큰 타입으로 변환될 때 데이터 앞에 따로 타입을 명시하지 않아도 됩니다.

객체에서도 타입변환이 가능한데 아래 예제를 보겠습니다.

여기서 JVM 지식이 살짝 필요한데, var 변수는 메모리의 어디 영역에 저장되고, new 키워드로 생성된 Subclass 는 메모리의 어디 영역에 저장되는지 알고있어야합니다.

var 는 메모리의 Stack Area 에 저장되며 Subclass 는 Heap Area 에 저장됩니다. 그리고 스택 영역에 저장된 var 는 힙 영역의 Subclass 를 가리킵니다.

하지만 var 변수로 접근가능한 멤버는 Superclass 입니다.

만약, 하위 클래스에서 상위 클래스의 메서드를 오버라이딩해서 구현한 상태면 어떻게 될까요? var 변수로 접근가능한 멤버가 Superclass 니까 부모 메서드가 호출될까요?

정답은 NO 입니다.

예외가 있는데, 바로 하위 클래스에서 상위 클래스의 메서드를 오버라이딩하여 구현한 경우에는 var 변수가 오버라이딩한 자식 클래스의 메서드를 호출하게 됩니다. 이 개념을 정말 처음 자바를 접하고 상속을 배우는 입장이신분들은 잘 기억해야 합니다.

하지만 예외가 안타깝게도 하나가 더있습니다. 그건 바로 상위 클래스에 static 메서드가 선언된 경우입니다.

여기서 동적 바인딩(Dynamic Binding)과 정적 바인딩(Static Binding) 개념이 등장하는데 이걸 또 이해해야 합니다. 예시와 함께 설명하겠습니다.

위 코드를 보면 상위 클래스를 만들고 하나는 인스턴스 메서드 하나는 정적 메서드를 만들고 하위 클래스는 상위 클래스를 상속받아서 메서드 오버라이딩 하는 코드 입니다.

주석을 보면 알 수 있듯이, static 키워드로 선언된 메서드는 하위 클래스에서 오버라이딩이 불가능합니다.

그 이유는, 동적 바인딩(Dynamic Binding) 은 실행시에 성격이 결정되고 정적 바인딩(Static Binding) 은 컴파일시에 성격이 결정되는데, static 키워드가 붙은 애들은 JVM 에서 객체가 생성되기 전에 먼저 메모리에 올리기 때문에, 객체가 생성되지않아도 클래스명.변수명 혹은 클래스명.메서드명 으로 접근이 가능했던이유가 여기에 있습니다.

static 변수의 값 할당은 JVM 의 클래스 로더 시스템의 과정(로딩, 링크, 초기화) 중, 초기화 과정에서 진행됩니다.

동적 바인딩은 런타임(Runtime, 실행)시점에 객체 타입을 기준으로 실행될 함수를 호출하는 것을 의미하고 정적 바인딩은 컴파일(Compile)시점에 객체 타입을 기준으로 실행될 함수를 호출하는것을 의미합니다.

따라서 static 메서드는 new Subclass() 가 메모리에 등록되기 전에 생성되기 때문에 오버라이딩 자체가 불가능한것입니다. 반면 인스턴스 메서드는 런타임 시에 성격이 결정되기 때문에 var 변수로 하위 클래스의 오버라이딩된 메서드를 호출 할 수 있게 되는 것입니다.

명시적 형변환(Casting)

명시적 형변환은 큰 타입을 작은 타입으로 바꿔야 하는 경우에, 데이터 앞에 타입을 명시해줌으로써 타입 변환이 가능하게 하는 기법을 말합니다.

원시 타입(Primitive Type)의 경우에는 데이터앞에 타입만 명시하면 바꿀 수 있습니다.

문제는 객체간의 Casting 인데 예제와 함께 설명하겠습니다.

객체간 Casting 을 하기 위해서는 항상 instanceof 를 사용하여 상속 관계에 있는지 확인해야 합니다. 상속관계에 있는 않은 객체를 형변환 하려면 에러가 발생할 것입니다.

결론

처음에 자바 기본서를 구매하고 공부하다보면 해당 개념이 나오는데, 저도 책을 읽고 공부했던 입장으로서 명시적 형변환과 묵시적 형변환을 이해하는데 이렇게 많은 개념들이 연관되어있을 줄은 몰랐었습니다. 이런게 공부의 매력이기도 한 것같습니다 ㅎㅎ.. (처음에 알고 있던 개념이, 나중에 배운 개념과 합쳐져서 연관되어, 숨겨진 더 큰 개념을 이해하는 그런 과정?..) 이렇게 형변환과 동적 바인딩, 정적 바인딩까지 배워봤는데, 잘못된 정보나 오타 등 피드백은 언제나 환영입니다.

--

--

Dope
Webdev TechBlog

Developer who is trying to become a clean coder.