스태틱 메서드(Static Method)?


앞서 코드들을 살펴보시면 메서드 앞에 붙은 static 이 종종 사용되었는데, 이것이 갑자기 왜 쓰였는지 불편하셨으리라 생각듭니다!

 

따라서 스태틱 메서드의 특징은 무엇이고, 이 스태틱 메서드를 언제 사용하는지 대략적으로 알아보도록 하겠습니다.

 

스태틱 메서드(Static Method)는 메서드 앞에 static이 붙은 메서드를 의미합니다.

 

이 스태틱 메서드의 첫 번째 특징은 인스턴스 변수를 사용하지 않고 해당 메서드 내 지역변수를 사용한다는 것입니다. 여기서

 

인스턴스 변수는 인스턴스 즉, 객체를 생성해야 사용 가능 한 것이기 때문에 인스턴스 변수를 사용하지 않는다는 것은 "객체(혹은 인스턴

 

스)의 생성은 필요하지 않다"는 얘기가 됩니다! 두 번째 특징은 인스턴스 변수를 사용하지 않기 때문에 "매개변수(들)를 입력받아"

 

지역변수를 사용해야 한다는 것입니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Calculator {
    int a, b;
    
    int Add() { // 인스턴스 메서드(매개변수 필요없음. why? 인스턴스 변수 사용하기 때문
        return a + b;
    }
    
    static int Add(int a, int b) { // 스태틱 메서드(매개변수 필요. why? 인스턴스 변수 사용하지 않기 때문
        return a + b;
    }
}
 
public class StaticMethod {
 
    public static void main(String[] args) {
        
        System.out.println(Calculator.Add(1020)); // 객체 생성없이 스태틱 메서드의 사용 모습
    }
 
}
cs

 

 

Calculator 클래스에서 인스턴스 메서드와 스태틱 메서드 Add()를 생성해보았습니다. 이때, 중요한 점은 인스턴스 메서드의 경우 인스턴스

 

변수(2행)를 사용하기 때문에 매개변수를 꼭 입력받지 않아도 되지만, 스태틱 메서드의 경우 지역변수를 사용하기 때문에 매개변수를 입력

 

받는다는 것입니다. 또 (17행) 객체의 생성 없이 스태틱 메서드를 사용할 수 있습니다. (클래스명.메서드명(매개변수, ~~)


인스턴스 메서드(Instance Method)?


앞에서 다루었던 스태틱 메서드와의 비교에서 인스턴스 메서드의 특징들을 알아낼 수 있을 것 같습니다.

 

인스턴스 메서드(Method)의 특징은 인스턴스 변수를 사용한다는 것입니다. 인스턴스 변수를 사용한다는 얘기는 "객체(인스턴스)를 생성해

 

야 한다는 것"이고, 이는 "참조변수를 통해 인스턴스 변수와 인스턴스 메서드를 사용해야 함"을 의미합니다. 기존 글들에서 인스턴스 메서

 

드의 사용 코드는 많이 다루었기 때문에 생략하도록 하겠습니다!


+ 스태틱 메서드(Static Method)는 언제 사용하는가?


각 변수를 다뤘던 글(https://developer-vanilla.tistory.com/9)에서 다루었던 클래스 변수가 기억나시나요?? 또한 JVM 메모리 구조 이해 글

 

(https://developer-vanilla.tistory.com/12)에서 다루었던 세 가지 영역이 기억나시나요?? 여기에 정답이 모두 있습니다!

 

클래스를 필요로 할 때 메모리에 올라가면서 자동으로 생성되는 변수라고 하였습니다. 따라서 static이 붙은 변수와 static이 붙은 메서드

 

메서드 영역(메모리)에 저장하게 되는데, 저장하는 이유는 이 클래스 변수(static 변수)의 공유한다는 특성상 값을 하나로 유지할 필요가 있

 

고, 모두 같은 값을 공유하므로 메모리 공간을 낭비할 필요가 없기 때문이라고 하였습니다.

 

하지만 사실 좀 더 간단하고 정확하게 말씀드리자면!

 

"인스턴스 멤버(인스턴스 변수, 인스턴스 메서드)를 사용하지 않는 메서드에 static을 붙인다!"가 되겠습니다. 인스턴스 멤버와의 정확한 구

 

분을 위해 static 변수 및 메서드를 사용할 때에는 클래스명을 붙인다는 것도 그 이유가 될 수 있겠습니다.


두 메서드 간의 호출


 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Test {
    void instanceMethod() {} // 인스턴스 메서드
    static void staticMethod() {} // static 메서드
    
    void Call() { // 인스턴스 메서드 (앞에 static 붙지 않음)
        instanceMethod(); // 인스턴스 메서드 호출 성공
        staticMethod(); // 스태틱 메서드 호출 성공
    }
    
    static void Call2() {
        // instanceMethod(); // 인스턴스 메서드 호출 실패
        staticMethod(); // 스태틱 메서드 호출 성공
    }
}
cs

 

해당 예제를 살펴보시면, static이 붙지 않은 인스턴스 메서드 내에서는 인스턴스 메서드와 스태틱 메서드 모두 호출할 수 있습니다.

 

하지만 static이 붙은 스태틱 메서드 내에서는 스태틱 메서드는 정상적으로 호출할 수 있지만 인스턴스 메서드를 호출할 수 없습니다.

 

그 이유는 무엇일까요?

 

인스턴스 메서드는 인스턴스 변수들을 모아놓은 것인데, 인스턴스 변수를 사용해야 한다는 것은 객체를 생성해야 함을 의미합니다.

 

따라서 객체의 생성 없이 동작하는 스태틱 메서드가 객체를 필요로 하는 인스턴스 메서드를 호출하려고 하니 실패하는 것입니다.

 

이해가 되셨으면 좋겠습니다! 

'java > 객체지향' 카테고리의 다른 글

9. 생성자(constructor)  (0) 2023.01.16
8. 오버로딩(overloading)  (0) 2023.01.15
6-2. 참조타입 매개변수  (0) 2023.01.14
6-1. 기본타입 매개변수  (2) 2023.01.14
6. JVM 메모리 구조 이해  (0) 2023.01.13

+ Recent posts