C#과 Java언어 비교(9) - Versioning

C# and JAVA 2007. 5. 29. 11:11
13. 버전관리(Versioning)

버전관리 문제를 해결하는 것은 .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 한정자(프로그래머의 의도를 표현하여) 없이 선언될 수도 있었기 때문에, 런타임은 D 클래스의 foo 메소드가 B 클래스의 foo 메소드를 재정의하지 않고 숨겨야 함을 알게 된다.

C# 레퍼런스 문서로부터 한가지 흥미로운 것을 인용해본다: “C# 이러한 버전관리 문제를 개발자들로 하여금 그들의 의도 명확히 하게하여 해결한다”. 비록 override 키워드를 사용하는 것이 의도를 나타내는 가지 방법이긴 하지만 메소드가 컴파일 시점에 재정의를 수행하는지를(선언하기 보다는) 확인함으로써 컴파일러에 의해 자동적으로 생성되도록 수도 있다. 이는 여러분이 여전히 Java스러운 언어(virtual override 키워드를 사용하지 않는) 가지고도 버전관리 문제를 적절히 해결할 있음을 의미한다.

필드 한정자(Field Modifiers) 살펴보아라.

: