• 정적 메소드는 언제 써야하는가? :: 마이구미
    Java 2017. 11. 17. 21:54
    반응형

    이 글은 정적 메소드(static method) 에 대해 다룬다.

    코드는 Java를 통해 진행하지만, 다른 언어라도 상관없이 볼 수 있는 글이다.

    정적 메소드에 대한 안 좋은 말들이 많다.

    편중된 글이 아닌, 단순히 정적 메소드에 대한 이해를 다뤄볼 예정이다.

    참고 링크 - https://stackoverflow.com/questions/2671496/java-when-to-use-static-methods


    정적 메소드를 언제 써야하는지에 대한 의문이 가장 많을거라 생각한다.

    그에 앞서, 다음의 순서를 통해 알아본다면 훨씬 이해에 도움이 될 것이다.


    정적 메소드(static Method)란 무엇인가?


    정적 메소드는 2가지로 간략히 말할 수 있다.


    1. 클래스의 인스턴스 없이 호출이 가능하며, 인스턴스에서는 호출 할 수 없다. 
    2. 유틸리티 함수를 만드는데 유용하게 사용된다.


    1번의 의미를 코드를 통해 먼저 확인하자.


    class Test {


    Test () {}


    static void m1 () {}

    void m2 () {}


    }


    Test.m1() // O

    Test.m2() // X

    Test test = new Test()

    test.m1() // X

    test.m2() // O


    위처럼 가능한 이유는 말 그대로 정적이기 때문에, 클래스가 메모리에 올라갈 때 정적 메소드가 자동적으로 생성된다.

    그렇기에 인스턴스를 생성하지 않고, 클래스만으로 메소드를 호출할 수 있어, 이점으로 연결된다.


    2번의 의미는 java.util 패키지를 예로 들 수 있다.

    그 중 하나로 Math 클래스를 보자.


    Math.max()

    Math.min()


    위와 같은 Math 클래스도 클래스만으로 메소드를 호출하고 있다.

    여기서 max, min 같은 메소드는 정적 메소드로 구현되어있다.

    유틸리티 클래스는 상태를 가지고 있지 않는 클래스라고 보면 된다.

    Math 클래스를 들여다보면 다음과 같다.


    public final class Math {

    ....

    public static final double PI = 3.14159265358979323846;

    ....

    public static int max (int a, int b) {

    return (a >= b) ? a : b;

    }

    }


    정적 메소드는 무슨 기준으로 정해야하는가?


    한 문장으로 말하자면 다음과 같다.

    "어떤 메소드가 인스턴스가 생성되지 않았더라도, 호출 할 것인가?"  => "그렇다."

    위와 같다면, 그것은 정적이라고 보면 된다.


    조금 더 자세히 말하자면 다음과 5가지를 보자.


    1. 만약 유틸리티 클래스로 작성되고, 변화를 가정하지 않는다.
    2. 만약 메소드가 인스턴스 변수를 사용하지 않는다.
    3. 인스턴스 생성에 의존하지 않는다.
    4. 메소드가 공유되고 있다면, 정적 메소드로 추출해낼 수 있다.
    5. 메소드가 변화되지 않고, 오버라이딩 되지 않는다.


    정적 메소드의 장단점은 무엇인가?


    이점은 Math 클래스와 같은 유틸리티 클래스에서 나오는 장점들을 생각하면 된다.

    단점은 많이 존재한다. (관련 링크)

    가장 큰 문제점은 상태를 가지고 있지 않은 단순히 메소드만 가지고 있는 구조라고 볼 수 있다.

    이러한 이유로 인해 객체지향에 벗어난 개념이 되어 좋지 않은 시선들이 많이 존재한다.


    하지만 목적에 따라 더 효율적이라 판단되면 쓰는 것이 더 좋지 않은가?

    현재 다양한 패턴 방식에서 정적 메소드를 활용하고 있다.

    반응형

    댓글 2

Designed by Tistory.