C#과 Java언어 비교(9) - Versioning
C# and JAVA 2007. 5. 29. 11:11버전관리 문제를 해결하는 것은 .NET 프레임워크의 주요 고려사항이었다. 이러한 고려사항의 대부분은 어셈블리(assemblies)에 해당된다. 그러한 것들 중에는 동일한 프로세스에서 여러버전의 동일한 어셈블리들을 실행하는 것과 같은 꽤 강력한 특성이 몇 가지 있다.
C# 언어는 새로운 버전의 코드(거의 대부분 닷넷 라이브러리)가 만들어질 때 발생하는 소프트웨어 실패를 방지한다. C# 언어 레퍼런스에서 이것에 관해 자세하게 설명하고 있지만, 나는 그러한 문제를 하나의 상당히 함축한 예로 요약해 보겠다.
Java에서 JVM과 함께 배포된 B라는 클래스를 파생하는(derive) D라는 클래스를 배포한다고 가정해 보자. D 클래스는 foo라는 메소드를 하나 갖고 있는데, B가 배포될 당시에는 B에는 그 메소드가 포함되어 있지 않았다. 나중에 B가 업데이트되어 이제는 B 클래스에 foo라는 메소드를 포함하게 되었으며, D 클래스를 이용하는 소프트웨어를 실행하는 컴퓨터에 새 VM이 설치되었다. D 클래스를 이용하는 소프트웨어는 오작동을 일으킬지도 모르는데, 왜냐하면 B 클래스의 새로운 구현체는 D 클래스에 대하여 가상 호출(virtual call)을 하여 B 클래스에서는 전적으로 의도하지 않은 구현에 대한 행위를 수행할 것이기 때문이다. C#에서는 D클래스의 foo 메소드는 override
C# 레퍼런스 문서로부터 한가지 흥미로운 것을 인용해본다: “C#은 이러한 버전관리 문제를 개발자들로 하여금 그들의 의도를 명확히 하게하여 해결한다”. 비록 override 키워드를 사용하는 것이 의도를 나타내는 한 가지 방법이긴 하지만 한 메소드가 컴파일 시점에 재정의를 수행하는지를(선언하기 보다는) 확인함으로써 컴파일러에 의해 자동적으로 생성되도록 할 수도 있다. 이는 여러분이 여전히 Java스러운 언어(virtual과 override 키워드를 사용하지 않는)를 가지고도 버전관리 문제를 적절히 해결할 수 있음을 의미한다.
필드 한정자(Field Modifiers)도 살펴보아라.