삽질의 현장/- .NET

#007_닷넷(.NET)_.Net Framework 기본 -static & Main & 설비 영역 & APP 영역

shovelman 2015. 10. 22. 16:47


안녕하세요 삽잡이입니다.


이번 시간에는 정적, static에 대해서

그리고 각 영역에 따른 올바른 코드 구현의 필요성(?) 알아보려고합니다.


자... 여러분은 

정적 메서드와 인스턴스 메서드를 구분하실 수 있으십니까?

인스턴스 메서드는 객체가 있어야 호출이 가능합니다.

당연한 소리입니다... 객체 것이기 때문이지요...


정적 메서드는 

'객체 없이 호출하는' , '객체 없이 클래스에서 호출하는' 의 뜻을 가지고 있습니다.

정적 메서드는 객체와 상관이 없습니다. 클래스의 메서드이기 때문입니다.

다시 말하자면, 

객체 없이도 호출이 가능한 클래스의 메소드가 바로 정적 메서드라는 것입니다.

따라서 static을 통해 구분해줘야합니다.


그런데 말입니다... Main 함수는 정적 메소드입니다.

왜냐하면 Main 함수는 객체 없이도 호출이 될 수 있어야되기 때문입니다.


프로그램의 객체 없이도 호출이 가능해야하는 함수가 바로 Main 함수입니다.

Main 함수는 CLR이 실행을 해주지요...

즉, 프로그램을 실행시켜주는 실행자가 바로 Main함수를 호출시키는 것입니다.

아무튼... C#과 Java의 경우 전역 함수가 없기 때문에 

일반 전역 함수처럼 동작시키고 싶다면 정적 메서드로 만들어야되는 사실을 알게됬습니다.


 

이 코드는 과연 옳은 코드일까요?

(물론... 눈에 보이시죠... 저 오류라인이... 허허...)


이 메서드는 호출이 불가합니다.

따라서 객체를 만들어줘야합니다.

왜냐하면, Main 함수는 클래스의 인스턴스와 상관이 없습니다.

객체의 것이 아닌 정적 메서드이기 떄문입니다.


즉, 위의 예제 코드나


 

이 코드나 다를바가 없다는 것입니다.

물론, 이 예시는 바람직한 것은 아닙니다...


아무튼...  Main 함수가 들어있는 class와 별개로 

기능들을 사용하는 class를 따로 빼놓는 것이 바람직합니다.


사실, Program이라는 Class는 쓸데없는 것을 갖지 않는 것이 원칙입니다.

굳이 정말 갖는 경우가 있다면 뭐...

main함수에서 전체적으로 쓰는 

정적 메서드들을 한번씩 갖는 경우가 있긴 합니다...


왜 Class 이름이 Program이겠습니까...

Program 자체가 어플리케이션 자체를 나타내는 것입니다.

따라서 프로그램에 시작점을 결정한다 이겁니다.

그래서... 쓸데 없는 것들을 main에 구현하는 것이 아니라고 하는 것입니다...



프로그램을 실제 기능을 수행하는 영역과 설비하는 영역으로 나뉩니다.

프로그램의 목적을 위해 프로그램을 생성해서 동작(구동)시킨다던지,

필요한 객체를 생성한다던지, 객체간 관계를 설정한다던지에 대해서는

main 함수인 설비 영역에서 구현하는 것입니다.


우리가 실행하는 프로그램이 있다면 

이런 기능들을 Main 함수가 있는 Program 클래스에다가 구현을 합니다.

정말 꼼꼼히 따진다면 우리는 이렇게 나눠서 프로그램을 구현해야합니다.


뭐 사실... 우리가 객체 생성에 관심이 있는 것은 아닌데 말입니다...

객체를 어떻게 실행시키고 동작시킬 것인지,

수행 시킬 것인지에 대해서는 관심이 없는 것이 뭐 사실이지요...

이런 것을 설비 영역인 Main 영역에다가... 허허...


또한, 설비 영역은 GUI 또는 CUI를 사용하겠다는 결정 또한 담당합니다.

기능 영역은 사실 CUI/ GUI가 목적을 달성하는데 관련이 많이 없습니다.

이는 설비 영역의 역할이지요...


그리고 프로그램 목적을 수행하는 곳을 어플리케이션 영역이라고 부릅니다.

즉, 어플리케이션의 목적을 수행하는 기능이 들어가지요...

그리고 이 둘을 합쳐서 어플리케이션이라고 부르지요...


아무튼... 우리가 실행하고자 하는 프로그램이 있다면,

어떤 프로그램이냐, 설비와 하고자하는 목적

그리고 기능에 대한 카테고리로 분류를 시키면 이처럼 바라볼 수 있다 이겁니다.


정리하자면, 로직은 다 목적 영역에 있지만,

CUI, GUI의 선택사항은 모두 설비 영역에 들어갑니다.

따라서, Program 객체에서는 

설비 작업을 하기 때문에 객체 생성할 일이 없어서 static으로 구현을 합니다.

하지만, 기능을 담당할 객체들은 

관계 설정 및 객체 설정을 설비 영역인 Main 함수에서 해주지요...