정적 메서드

정적 메서드에 대한 네이버 지식인의 답변

네이버 지식인 답변

우선 클래스와 인스턴스라는 두 개념의 차이를 아셔야 할 것 같습니다.

클래스가 어떤 객체에 대한 개념 혹은 설계도라면 인스턴스는 그 설계도대로 만들어진 실체를 뜻하죠.

정적 메서드는 클래스 종속적인 메서드를 말합니다.

이 녀석은 설계도인 클래스에 선언되어 있지만 인스턴스를 만들때 포함되지 않습니다.

또한 메모리에 로드되는 시점도 비정적 메서드...즉 인스턴스측 메서드와 달리 인스턴스메서드는 객체를 생성하는 시점...즉 new 연산자를 사용해서 메모리에 로드되는 시점에 같이 로드되는 반면 정적 메서드는 프로그램이 실행되어 시작되기 바로전에 모두 메모리에 로드됩니다.

어떤 메서드가 실행이 되려면 메모리에 우선 로드되어야 하는데 위에서 설명한 차이로 인해 정적메서드는 인스턴스 생성을 하지 않고도 클래스명을 사용하여 바로 실행이 가능합니다. 이에반해 인스턴스 메서드는 new 연산자를 통해 인스턴스가 생성되고 나면 실행이 가능하죠.


모든게 객체이어야 하는 C# 이나 Java의 경우 정적 메서드가 없으면 Main 은 실행 될 수 없을겁니다. 왜냐하면 정적메서드가 없을 경우 Main 메서드가 포함된 클래스를 누군가가 new 연산자로 인스턴스 생성을 해주어야 실행이 될텐데 사실 프로그램의 시작점이 Main인 마당에 Main 메서드가 포함된 클래스를 인스턴스화 시키는 것은 불가능하죠.

결국 Main 메서드는 인스턴스화할 필요없는 static 메서드의 도움으로 실행이 되는것입니다. 설명드린대로 static 메서드들은 닷넷의 CLR이나 JAVA의 VM이 Main을 실행시키려는 시도를 하기 전에 메모리에 로드되기 때문입니다. 그 후에 Main을 실행하려고 하는데 이미 메모리에 Main이 static으로 로드되었으므로 실행이 가능한 것입니다.

다시 한번 모든 코드들을 살펴보시면 Main은 static으로 필수적으로 선언되어 있을겁니다.

Java나 C#이라면요.



음...내용을 다시 덧붙여서 설명해보겠습니다.

좀 진부한 표현이지만 붕어빵틀을 예를 들어 설명해본다면

붕어빵틀은 클래스일테고 붕어빵은 붕어빵틀로 만들어진 인스턴스겠죠?

여기서 정적메서드는 붕어빵틀에 달려있는 여러가지 도구들입니다.

크림을 넣는 도구나 붕어빵틀의 가스밸브 같은...실제로 붕어빵틀에 포함되어 붕어빵을 만들어내는데 기여를 하긴 하지만 붕어빵...즉 인스턴스에는 이런 도구들이 포함되지 않죠?

하지만 이것들은 붕어빵을 만들어내는 작업( new 연산 )을 하기 전에 미리 사용할 수 있는 상태이어야 합니다. 즉 붕어빵틀은 이미 존재하고 있어야 붕어빵을 만들어 낼 수 있죠? 이렇게 미리 사용할 수 있도록 붕어빵이 만들어지기 전에 갖추어진 도구들이 정적 메서드입니다.

쩝...더 헷갈리게 해드렸나요? 추가 설명한다고 덧붙였는데도 이게 잘 한건지 모르겠네요.



음...그렇다고 static이 꼭 Main때문에 존재하는 건 아닙니다. 다만 Main메서드가 정적메서드의 특성을 이용하는것이란 걸 알려드리고자 한 거구요.

실제로 static은 종속되어 있는 클래스의 인스턴스들의 생성이나 활용을 도우는 목적으로 사용됩니다. 닷넷 프레임워크 내부에는 Console 클래스처럼 라이브러리 형태로 사용하기 위해 선언된 정적 메서드들도 많죠. 필요한 기능을 new 연산자를 통한 귀차니즘에서 벗어나 쉽게 활용할 수 있게 하기 위함입니다.

그 부분에서는 질문하신분께서 작성해놓은신대로

"ms에서 c#을 만들때 프로그래밍을 위해서 만들어 놓은 클래스들을 말한다."

라는 것이 맞습니다.



마지막으로 정적 메서드는 위에서 말씀드린대로 클래스와 인스턴스 중 클래스에 종속적인 녀석입니다. 상속이 되는 부분은 인스턴스 종속적인 녀석들...즉 정적이지 않은 녀석들이 상속이 되는 겁니다.

상속이 되지 않으니 하위 클래스의 인스턴스에서 접근이 불가능하죠. 당연히 상위 클래스의 인스턴스 메서드를 재정의 하는 오버라이딩이 될 수가 없습니다.

this라는것은 클래스와 인스턴스 중 인스턴스를 가리키는 것입니다. 역시 클래스 종속적인 정적메서드가 접근 불가능한것입니다.

super...C#에선 base라고 표현하는데 역시 이것또한 인스턴스측 키워드입니다. 현재 사용중인 클래스 인스턴스의 상위 클래스 인스턴스를 가리키는데 정적 메서드가 상위 클래스의 인스턴스를 참조하는 키워드인 base를 이용하여 접근이 불가능하겠죠?



도움이 되었으면 좋겠네요^^