2015년 8월 13일 목요일

C# "비정적 필드, 메서드 또는 속성 '***'에 개체 참조가 필요합니다." 에러가 발생. 그리고 "Static"은 무엇인가.


프로그램을 짜다 이런 에러가 발생했다.


원래 쓰던걸 그냥 대충 붙여 넣기 했더니만...

에러 문구가 항상 그렇듯이 좀 애매모호 한데, 알고 보면 별거 아님.
해결책은 2가지가 있는데...


이렇게 개체를 생성하고 사용하면 됨.
하지만, 이건 내가 만든 함수를 잘못쓴 경우고, 이런 에러가 나는 대부분의 경우는 호출 하는 함수가 static 일 경우라서 발생하는 경우가 많음.

호출할려는 함수가 static 함수 일경우는 메모리에 항상 로드되어 있으므로 저렇게 개체 생성하지 않고, 바로 쓸수 가 있음.

즉... 내가 구현한 암호화 소스는...


이런 일반적인 함수 이지만... 이걸...


이렇게 static 함수로 바꾸면 ... (물론 그냥 static 으로 선언만 한다고 끝나는게 아니라 조금 수정을 해줘야 함. 생성자를 사용할 수 없고, this 키워드를 사용 할 수 없는 등... 약간의 수정이 필요함.)


이렇게 개체를 생성하지 않고 바로 쓸수 가 있음.

즉, "static" 은 항상 메모리에 로드 되어 있으므로(그러므로 여러 군데에서 사용할 경우 각각의 사용처에서 하나의 메소드를 공유해 사용하는게 되므로 사용에 주의할 필요가 있음) , 궂이 개체를 생성하지 않고도 쓸수가 있다는 것. 편리하긴 하지만, 많이 쓰면 그만큼 많은 메모리를 사용하므로 자주 사용하는 기능이 아니라면 사용하지 않는게 좋다.

그리고, 나의 경우는 static 함수가 아닌걸 static 함수 처럼 쓸려고 해서 오류가 난것이지만(원래 참고한 소스에는 static 으로 구현되어 있어서...), 만약 static 함수가 아닌것을 개체를 생성해서 호출할려고 했는데도 같은 오류가 난 것이라면, 그 호출한 함수 내에서 static 함수를 호출하는 구문이 있기 때문.

쉽게 말해 static 함수를 참조하는 함수는 static 함수라야 한다... 라는 것인데...
이 부분은 나도 좀 애매 모호... 하여튼 원칙상 그렇다.
그냥 static 을 호출하는 함수를 만들때는 그 함수도 static 으로 만들어야 한다... 정도만 기억해도 된다.