프로그래밍Java 개발자

자바에서 동적 바인딩 메커니즘은 어떻게 작동하며, 정적 바인딩과 동적 바인딩의 메서드 간의 차이점은 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

답변

자바에서 동적 바인딩 (dynamic binding) 메커니즘은 어떤 메서드가 실행 시간(runtime) 동안 호출될지를 결정하고, 컴파일 시간에 결정되지 않습니다. 정적 바인딩 (static binding)과의 주요 차이점은 private, static, final 메서드와 같은 것들은 정적으로 바인딩되고(runtime 시에 재정의되지 않음) (바인딩이 컴파일 시간에 이루어짐), 동적으로는 일반 인스턴스 메서드(재정의된 메서드 포함)가 바인딩되는 점입니다. 이는 다형성을 가능하게 합니다.

예제:

class Animal { void makeSound() { System.out.println("어떤 소리"); } } class Dog extends Animal { void makeSound() { System.out.println("멍멍"); } } public class Test { public static void main(String[] args) { Animal a = new Dog(); a.makeSound(); // 출력: 멍멍 (동적 바인딩) } }

여기서 makeSound() 메서드는 동적으로 바인딩됩니다. JVM은 실행 시간에 어떤 변형을 호출할지를 결정합니다.

트릭 질문

질문: "인터페이스 또는 추상 클래스 타입의 변수를 선언하고 자식 클래스의 인스턴스를 할당하면, 재정의된 메서드에 접근할 때 어떤 메서드가 호출됩니까? 컴파일러는 어떻게 이를 결정합니까?"

종종 잘못 알고 있는 점: 많은 사람들이 컴파일 시간에 참조의 타입을 기준으로 메서드가 호출된다고 생각하지만, 이는 실행 시간에 JVM에 의해 수행됩니다.

정답: JVM은 메서드를 호출할 때 참조의 타입이 아닌 실제 객체의 타입을 사용합니다 (동적 바인딩).

Shape s = new Circle(); s.draw(); // Circle의 draw()가 호출되며, Shape의 것이 아님

주제에 대한 세부사항 모르는 것에서 발생한 실제 오류 예시


이야기

큰 은행 프로젝트에서 한 개발자가 toString() 및 equals() 메서드를 재정의했으나, 인터페이스를 통해 변수를 선언하면 인터페이스의 메서드가 호출될 것이라고 생각했습니다. 이로 인해 객체 비교가 잘못 이루어졌고 — 참조가 비교되었으며, 값이 아닌 참조가 비교되어 중복 검색 시에 고객의 비교 논리에 오류를 초래했습니다.


이야기

전자 상거래 프로젝트에서 개발자는 기본 클래스 Product와 이를 상속한 ElectronicProduct를 생성했습니다. Product[] 배열에 두 가지 타입의 객체가 저장되었습니다. ElectronicProduct에서 재정의된 메서드를 통해 제품을 출력할 때, 기본 클래스의 정보만 출력되었습니다. 왜냐하면 정적 메서드가 호출되었기 때문입니다! 오류는 출판 전 발견되었습니다.


이야기

교통 모델링 프로젝트에서 팩토리 패턴이 사용되었습니다. 개발자는 메서드가 아닌 필드와 작업하고 있음을 인식하지 못했습니다. 파생 클래스의 필드에 접근하는 것이 기본 클래스의 값을 반환했으며, 재정의된 값이 아닌 기본 클래스의 값을 반환했습니다. 왜냐하면 필드는 다형적이지 않기 때문입니다! 시스템은 경로를 잘못 계산하여 모든 객체에 "Transport" 타입을 출력했습니다.