제공 : 한빛 네트워크
저자 : 임영규
limlinux @ gmail.com
1. 서론
abstract란 단어의 원형적 해석과 같으며, 추상 클래스란 추상 메서드를 하나 이상 가지고 있는 class이다. 이런 추상 클래스를 만들어 파생 클래스로 객체 인스턴스를 생성하고 abstract Method를 재정의하는 방법에 대하여 알아본다. 또한 일반 Method와 virtual Method의 활용, library와 netmodule의 비교에 대하여 알아본다. 물론 닷넷 환경에서의 어셈블리와 모듈에 대한 선수 학습이 되어 있다는 가정을 한다.
2. 본론
우선 간단한 추상 클래스를 하나 만들어 AbsClass.cs로 생성한다. 그리고 이것을 csc 또는 mcs (모노 프로젝트:: 리눅스 기반)로 컴파일한다. 그림 1은 csc를 이용한 것이다.
[그림 1] netmodule 생성
소스는 다음과 같이 간단하다.
[그림 2] AbsClass.cs
abstract class를 사용하기 위해서는 파생클래스인 DerivedClass를 다음과 같이 간단히 만들기로 한다. fx() 메서드는 외부에 노출시키기 위해 public으로 한다.
[그림 3] Derivedclass.cs
[그림 3]에서 밑줄 친 부분에 대하여 의아해 할 필요는 없다. 추상 클래스란 파생 클래스에서 자신이 가지고 있는 추상 메서드들 구현하라는 의미를 포함하고 있기 때문에 fx 메서드를 구현한 파생 클래스를 이용하여 객체의 인스턴스를 생성하고 있다.
[그림 4] noetmodule 추가에러
컴파일을 하면 다음의 에러 메시지를 볼 수 있는데, 이는 AbsClass를 닷넷 모듈로 만들어 두었기 때문에 발생하는 에러이다. 따라서 다음과 같이 컴파일 하여야 한다.
[그림 5] netmodule 추가 정상
그리고 이제 완성된 프로그램을 실행하면 다음과 같은 결과를 볼 수 있다.
[그림 6] 실행결과
참고로 DerivedClass를 다른 응용 프로그램에서 재사용 가능하다. 이것이 닷넷의 큰 장점이다. 닷넷은 모듈(쉽게 말해 .cs 파일을 컴파일한 것)로 배포하여 사용가능하기 때문에 DerivedClass를 사용할 수 있다. Main 메서드가 있다고 문제되지 않으며 다음의 방법을 이용한다.
[그림 7] DerivedClass module 만들기
그리고 필요로 하는 App에서 이를 /addmodule:DerivedClass /main:App App.cs 로 사용할 수 있다. 여러개의 source에 각각의 Main()이 있는 경우에 /main 옵션을 사용하여 지정할 수 있다.
[그림 8] App.exe 생성 전체 Process
3. 결론
이제 IL(Intermediate Language)를 disassemble해 보겠다.
[그림 9] AbsClass.netmodule DisAssemble
[그림 10] DerivedClass의 manifast 및 DisAssembl
DerivedClass에 Main() 메서드가 있는데 모듈로 만들고 App에서 이것을 사용하기 위해 /t:module DerivedClass로 컴파일 한다. [그림 10]에서 보면 DerivedClass가 모듈로 빌드된 것을 볼 수 있다. [그림 10]에서 보는 바와 같이 모듈이 생성되었으며, Main() 메서드를 가지고 있는 것을 볼 수 있다. 그러나 DerivedClass 어셈블리가 모듈로 사용되는 경우에 Main() 메서드는 더 이상 App의 entryPoint가 아니며, 일반 Method 처럼 취급된다.
그리고 APP.exe를 생성할 때 /addmodule로 붙인다는 것이다. 최종 결과를 그림에서 확인 할 수 있다. 일련의 과정을 리눅스 기반에서 실행하고자 한다면 mono를 사용하길 권하며, 옵션을 참고해 보기 바란다. 다음은 간단한 App.cs 소스이다.
[그림 11] App.cs
이제 마지막으로 App.exe을 보기로 한다. App.exe를 실행시키기 전까지 파일로 존재하는 App.exe는 IL임을 잊지 말아야 한다.
[그림 12] App.exe IL의 DisAssemble
두 개의 외부 netmodule과 하나의 Main이 있음을 확인 할 수 있다. 굳이 그림으로 표현한다면 다음과 같을 것이다.
또한 App.exe가 하나의 어셈블리로 생성된 것을 확인 할 수 있다. abstract로 시작해서 abstract class를 초기화하고 메서드를 override 하기까지, 기존 응용을 타 응용 프로그램의 모듈로 삽입시켜 실행하는 일체의 과정에 대하여 고찰하였다.
위 내용을 참고로 하여 분산된 App을 모듈화하고 재사용하는 일은 여러분의 숙제로 남기고자 한다. 다음에는 abstract와 virtual의 성능 차이점에 대하여 알아 보고자 한다.