[펌] [STAThread]

Programming/C# 2015. 9. 2. 10:43

출처: http://grandmaster.tistory.com/9



자주 보이지만 무슨일을 하는지 모르고 항상 궁금하다고 생각됬던 [STAThread]

오늘은 찾아보았다..이놈의 귀차니즘..

네이버 지식in의 답변부터 듣도록 해보자

[System.STAThread]
[STAThread]

최초 어플리케이션 스레드 모델을 단일 스레드 어파트먼트로 지정하는 것을 의미한다.



아직까지는 먼소린지 모르겠다...

그래서 데브피아에 물어봤다.

Q. 

 [STAThread]

 

라는걸 찾아보다 보니

 

C# 코드에서 [STAThread] 가 의미하는 바는 : 
기본적으로, VS .NET에 의해 만들어진 응용 프로그램의 Main()메소드에는 [STAThread] 어트리뷰트가 첨가되어 있다. 
이 어트리뷰트는 해당 응용 프로그램이 COM형식을 이용하는 경우에 (단지 이 경우에만 해당하는 것인데) 해당 응용 프로그램이 
단일 스레드 아파트(single threaded apartment, STA) 모델로 설정되어야 한다는 것을 런타임에게 알려주는 역할을 한다. 
해당 응용 프로그램에서 COM 형식을 이용하지 않는다면, [STAThread] 어트리뷰트는 무시되기 때문에 삭제해도 무방하다

<출처 : 서비의 다락방 ( http://www.yunsobi.com )>

 
라고하는데요 com형식이 무엇인지 잘모르겠네요 검색해도 너무많은 결과가 나와서 어떤건지 잘모르겠구요.

 

도대체 com형식이 무엇인지  [STAThread] 가 왜필요한지 조금 쉽게 설명해주실분 계신가요?


A.


우선 com 형식이란 com 객체를 말합니다. 그리고 .net은 기본적으로 MTA(멀티쓰레드아파트먼트)로 동작됩니다. 그런데 전통적으로 com 객체는STAThread 기반이어서 이를 명시해줘야 합니다. 만약 명시하지 않고 단일쓰레드아파트먼트 기반인 com 객체를 사용시엔 런타임때 오류가 발생합니다. 이를 직접 눈으로 확인해보시려면 간단하게 form위에 웹브라우져 컨트롤을 올리고 [STAThread] 애트리뷰트를 주석처리하고 실행해보세요.




글쎄..........com객체라는걸 알아야 알수 있을꺼 같다...

그래서 com객체를 조사해보았다.

com 은요 Component Object Model 의 약자이지만 일반적으로 컴포넌트라고 발음합니다. 정확한 해석은 아니지만 줄여서 부르는 셈이지요. 

기존의 프로그램을 살펴보면 여러가지 문제점이 있었지요. 그 많은 문제점중 하나가 예를 들어 dll 의 이름 문제점을 들수 있는데요. 많이 보셨을 겁니다. ****.dll 이라고 하는 파일을요. 이는 메인 프로그램에서 다 처리하지 못하거나 특정한 모듈을 따로 처리하기 위해 만든 일종의 메인에 딸린 하부적인 실행파일이라고 볼수 있는데(일단은 dll 도 실행파일입니다. 자체 실행파일은 아닙니다만...) 이는 dll 의 이름을 가지고 접근하고 있습니다. 하지만 소프트 웨어를 만드는 회사가 많은만큼 같은 dll의 이름을 가진 실행파일들이 많아지고, 또 그것을 인스톨 하면서 윈도우 폴더에 복사하면 문제가 생기지요. 전혀 다른 회사에서 개발한 dll 이 이름만 같고 전혀 다른 기능을 하는데도 이를 모르고 덮어 쓰기 해버리면... 

이를 해소하기 위한 하나의 방법이 컴포넌트 입니다. 사용해 보셨는지는 모르지만 컴포넌트는 GUID 라는 128비트의 일종의 아이디 비슷한게 있습니다. 이걸로 접근하므로 이름의 문제로 인한 충돌이 일어나지 않는 것입니다.

여기까지는 com 을 사용하는 목적중의 하나만 예를 든것이고 com 을 한마디로 정의하자면 객체 지향적 모듈개발이라고 정의하고 싶네요. 아니 이건 제가 개인적으로 내린 정의입니다. 제가 느낀 바로는요...^^ 다른 분들은 어떻게 생각하실지 모르겠습니다. 

어떤 프로그램을 짤때, 예를 들어 메신져를 생각해 보겠습니다. 메신져를 짜려면 접속자 파악, 파일전송, 메시지 보내기 등의 작업들이 있습니다. 그런데 이경우 com 을 사용하지 않고 짜려면 한사람이 설계한 프로그램에 다른 사람들이 달라붙어서 거기에 맞춰가면서 프로그래밍 할 수 밖에 없습니다. 상당히 비효율적이고 또 그렇게 프로그래밍한 소스는 그 메신져에서 밖에 쓸수가 없죠. 하지만 컴포넌트화 해버리면... 쉽게 말해서 모듈별로 따로 만들어 버리면, 넌 메시지 보내는 루틴을 만들어, 난 파일 전송하는 루틴을 만들게 그리고 만들때는 com 으로 만들자. 라고 하면 쉽게 끝나는 거죠. 조립만 하면 되기 때문이죠. 

여기까지 말씀을 드리면 그렇다면 com 은 일정한 형식을 가지고 있어야 한다. 왜냐하면 조립을 하려면 표준형식이 있어야 하기 때문이다. 라고 생각하시는 분이 계실지 모릅니다. 네 맞습니다. 일정한 형식을 맞춰서 프로그램을 짜야 합니다. 그래서 com 을 하시는분들 보면 머리붙잡고 쥐어 뜯습니다.(으아..미쵸미쵸 하면서요...^^ 저도 그런 기억이 있죠) com 의 표준형식을 공부하는게 쉬운게 아니거든요. 그리고 객체지향적 설계가 필요합니다. 그래서 com 에 관해서는 바이블도 따로 나와 있습니다. 공부하시려면 com 은 바이블을 꼭 사셔야 합니다. 아니 꼭은 아니더라도 사시는게 좋습니다. 인터넷으로 공부하려고 하시면... 한계가 보일겁니다.

이외에 책에 적어진 com 의 장점을 적어보겠습니다. 이하는 책에 적혀있는 내용입니다.

1. 이식성이 강하다 : 새로운 프로그램에 대한 강력한 이식성은 개발기간을 단축시킨다.
2. 유연성이 있다 : 컴으로 작업한 소프트웨어를 업그레이드 하고자 할 경우 단순히 업그레이드된 컴포턴트만 복사하면 되고 업그레이드 되지 않은 컴포넌트를 사용하지 않은 경우에도 잘 수행된다.
3. 재 컴파일할 필요가 없다. 
4. 객체지향 개발 방법론(com) 은 프로그램의 구현방법을 획기적으로 바꾸었다. 
5. com 의 경우 플랫폼에 독립적이다. 

출처 : 네이버



어느정도 이해는 됬지만 깊숙하게 알기위해서는 좀더 내공을 길러야 할듯하다.



결론 : 지우면 혼난다.


Posted by 세모아
,