(C++) 8.10 정적 멤버 함수

이준우·2021년 11월 23일
0

앞에선 정적 멤버 변수에 대해 배웠지만, 이번에는 정적 멤버 함수에 대해 알아보자. 비슷하면서도 다르니깐 제대로 이해해보자.


앞에서 정적 멤버 변수에 대해 알아봤으니 이에 대한 코드는 이해할 것이다. class안의 static int s_value 는 직접 초기화를 할 수 없으니 scope 밖에서 멤버 접근으로 초기화 해주고 있는 것을 볼 수 있다. 그럼 다음 코드를 보자.
이 부분만 바뀌어 있는 형태이다. main()을 보면 오류가 떡하니 있는데, 당연히 private로 선언하였으니 사용할 수가 없는 것이다. 근데 getValue()함수에는 접근이 가능하다? 그렇다면 s1.getValue()와 s1.s_value는 같은 값을 리턴할 것이므로 아래의 내용은 주석으로 없애도 된다.
뭐 해당 클래스의 특정 인스턴스를 사용하여 구현하면 문제가 없겠지만, 특정 인스턴스를 사용하지 않고 구현하고 싶다면 어떻게 해야하는가?

이럴 경우에 정적 멤버 함수를 사용하는 것이다.

이러면 접근이 가능하다.


이ㄸ
this를 사용한다는 것은 특정 인스턴스의 주소를 받아다가 그 인스턴스에 속해있는 멤버들의 주소를 가져가 그걸 사용하겠다는 뜻이다. 보통 일반적인 멤버들에 접근할때 사용하는 방식인데, static 함수에서는 가능할까?
아니다. 사용할 수 없다. 즉, this는 non-static에서 사용할 수 있다는 것이다.

그럼 여기서 static 변수가 아닌 m_value를 static함수에 집어넣으면 어떻게 될까?
오류가 난다. 정적 함수 내에는 정적 변수만 들어갈 수 있다는 것이다.


이를 좀더 이해하기 쉽게 설명을 해보겠다. 이해가 안되도 반복하자! 우리가 class안의 멤버 함수의 포인터를 가져오는 방법이 있다.
이 모든 방법을 사용해도 build 오류가 난다. 이유가 무엇일까? 그 이유는 temp라는 함수의 포인터는 하나만 존재한다. ??? 무슨 소리지 라고 생각할텐데, 예를 들어 보겠다.

이와 같은 코드에 Something s1, s2;로 되어 있는데, 여기서 s1.m_value와 s2.m_value는 분명히 다른 주소를 갖고 있다. 이건 실제로 본인들이 찍어보면 알게 된다. 근데 class안에 있는 member function은 하나의 주소만 갖고 있다. 즉, class안의 temp()를 사용할 때, s1의 포인터를 주고 s1에 속해있는 멤버를 가지고 작동시켜라. s2를 작동시킬땐, s2의 포인터를 주고 s2에 속해있는 멤버를 작동시켜라 라는 뜻이다. 즉, temp()가 갖는 주소는 하나고 s1과 s2는 자신들의 포인터를 던지고 작동하는 것이다.

따라서 저 위의 문법은 아예 맞지 않게 되는 것이다.
왜냐하면 class안의 member function은 s1과 s2의 것이 아니라 온전히 class의 member function이기 때문이다.
따라서 이와 같이 구현하면 된다.
사용 방법은 다음과 같다.

따라서 non-static같은 경우에는 s1 혹은 s2의 인스턴스를 가져다가 this 포인터를 사용하는 형태로 작동한다. 따라서 this 포인터를 사용하기 위해선 s1과 s2의 인스턴스가 무조건 존재해야한다.


그럼 static function은 가능할까? 확인해보자.

ㅠㅠ 오류가 난다. 당연한 것이 this 포인터를 사용할 수 없는 상황이므로 오류가 날 수 밖에 없다.

이를 이와같이 구현하면 오류가 나지 않고 제대로 동작한다. static member function 같은 경우에는 분명히 Something class안의 member function이지만, 특정 인스턴스 없이 동작하기 때문에 저렇게 표현을 해야한다.

결론 : static member function에서는 this 포인터를 사용할 수 없다.


그럼 이번에는 static 변수를 초기화하는 방법에 대해 알아보자.

기본적으로 우리가 class의 변수를 초기화할때 생성자를 사용하여 초기화를 했었다.
하지만 static으로 선언된 변수는 당연히 생성자에서 초기화를 할 수 없을 것이다. 좀만 생각하면 당연한 것. 그럼 어떤 방법이 있을까?

  1. 생성자가 static이면 된다.

-> 하지만 이건 불가능하다. C++에서는 생성자가 static일 수 없다.

  1. 이중 class를 사용하여 구현한다.

-> 쌉 가능
아직 제대로 이해하진 못했지만, 계속 반복해서 보고 이해하자!

0개의 댓글