static 메소드 : 객체 없이 실행된다.

코딩/Java 2019. 10. 28. 11:33

 java에서 static 필드에 대해서 배웠습니다. 그러면, 함수 앞에도 static을 붙일 수 없을까요? 이를 정적 함수, 혹은 static 함수라고 하는데요. 예를 들어보겠습니다.

 

 

 저는 myClass 클래스를 선언했습니다.

 

 

 그리고, main 함수에서 myClass.foo()를 호출하고 있습니다. 그래도 될까요? 네. 일단 된다고 합니다. 일반 메서드와 다른 것은, 일반 메서드 (instance method) 는 객체.xxx(); 로 호출을 했습니다. 그런데, 이것은 class 이름.xxx();로 호출을 했다는 점이 다릅니다. 이게 왜 그렇게 될 수 있는지는 나중에 다시 이야기 해 드리도록 하겠습니다. 지금은 그냥, 아. 클래스 이름.함수명() 으로 호출할 수 있는 게 정적 함수구나. 정도만 짚고 넘어가셔도 좋겠습니다.

 

 


 사실, 그렇게 익숙한 개념은 아닌데.. 생각보다 쉽게 정적 함수는 찾을 수 있습니다. 예를 들자면 Math 클래스가 있습니다. max나 min과 같은 수학 함수들은, 죄다 앞에 static이 붙어 있는데요. 이는 왜 그럴까요?

 

 

 잘 생각해 봅시다. 우리가 max를 부를 때, Math 함수 안에 있는 인스턴스 필드들을 쓸 필요가 없습니다. 단지, 우리는 바깥에 선언이 된 두 int형 변수를 매개변수로만 넘기면 됩니다.

 

 

 따라서, static method로 선언을 한 것입니다. 이 부분도 그리 어렵지는 않을 듯 싶어요.

 

 


 이제 아래 예제를 생각해 봅시다.

 

 

 foo는 static 메소드로 선언이 되어 있습니다. 3번째 줄에 iv를 선언했습니다. 인스턴스 변수입니다. 4번째 줄에는 static 변수를 선언했어요. 7번째 줄을 보면 iv를 증가시키는데요. 이 부분에 빨간 줄이 쳐져 있습니다. 이건 왜 그럴까요? 일단 foo는 정적 메소드이기 때문에, myClass.foo(); 이런 식으로도 호출을 할 수 있어요.

 

 

 그러면 이 때, iv가 메모리에 할당이 되어 있느냐고 물어보신다면 그건 또 아닙니다. 이것은 인스턴스 변수이기 때문에, new 연산자로 객체를 생성하지 않는 이상, 메모리에 올라가지는 않습니다.

 

 

 이렇게 될 때는 올라갈 지도 모르겠네요. myClass 객체인 a를 생성했고, 객체 a의 필드 iv에 1을 집어넣는다는 문장을 수행했다고 해 봅시다. 그러면 메모리에는 다음과 같이 그려질 겁니다.

 

 

 a라는 객체가 생성되었고, 그것의 인스턴스 필드인 iv가 메모리에 올라갑니다. 그런데 그냥 19번째 줄만 있었다면 이야기가 달라집니다. iv가 없습니다. 그런데 뜬금없이 iv에 접근하라고 합니다.

 

 

 조금 그렇겠죠? static 함수 내에서, 인스턴스 변수는 사용 불가능합니다. 그러면 일반 메소드는 어떨까요?

 

 


 myClass.bb(); 코드를 Main 함수에 입력해 봅시다.

 

 

 그러면 not visible하다고 뜹니다. call 되기 전에, 객체가 필요하기 때문입니다. iv도 접근하기 전에 객체가 필요했던 것처럼요. 즉, bb는 객체가 없이 실행되지 않습니다.

 

 

 그렇다면 당연하게도, static으로 선언된 foo 안에, 인스턴스 메소드인 bb를 호출을 해 버리면 어떤가요? bb를 호출하는데에는 객체가 필요하다고 했는데, foo는 object 없이 실행할 수 있습니다. myClass.xxx 이렇게요. 정적 메소드에 대해서는 2가지만 기억하시면 됩니다. 객체를 생성하지 않고도 실행히 가능하다는 것. 그렇기 때문에 안에 인스턴스  필드들은 쓸 수 없다는 것. 이것만 기억하셔도 충분하실 듯 싶어요.