슬기로운 개발생활

[Java] 정적 메소드(static Method)는 언제 사용할까?

by coco3o
반응형

정적 메소드(static Method)란?

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

 

1. 인스턴스 생성 없이 호출이 가능하다. (인스턴스 생성 후 호출도 가능하지만 지양하고 있다.)

2. 유틸리티 관련 함수를 만드는데 유용하게 사용된다.

 

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

public class Test {

    public static void sm() {
        System.out.println("this is static method!");
    }

    public void m() {
        System.out.println("this is non-static method!");
    }
}

public class Main {
    public static void main(String[] args) {
        Test.sm(); // O
        Test.m(); // X

        Test test = new Test();
        test.sm(); // X
        test.m(); // O
    }
}

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

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

 

2번의 대표적인 유틸리티 클래스는 java.lang.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;
    }

    ...
    
    public static int min(int a, int b) {
        return (a <= b) ? a : b;
    }
    
    ...
}

 

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

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

"인스턴스를 생성하지 않고 호출할 것인가?" →  "그렇다."

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

 

조금 더 자세히 설명하면 다음과 같다.

 

1. 변화를 가정하지 않는다.

2. 메소드가 인스턴스 변수를 사용하지 않는다.

3. 인스턴스 생성에 의존하지 않는다.

4. 메소드가 공유되고 있다면, 정적 메소드로 추출해낼 수 있다.

5. 메소드가 변화되지 않고, 오버라이딩 되지 않는다.

 

 

유틸리티 클래스 활용 예시

public final class CommonUtils {
    
    public static LocalDateTime stringToLocalDateTime(String strDate) {
        return LocalDateTime.parse(strDate, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    public static String localDateTimeToString(LocalDateTime localDateTime) {
        return localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    public static boolean isEmailValid(String email) {
        return Patterns.EMAIL_ADDRESS.matcher(email).matches();
    }
}

상속을 방지하기 위해 final class로 선언하고, 유틸 관련된 함수들을 모아둔다.

 

정적 메소드의 장단점

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

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

상태를 가지고 있지 않은 단순히 메소드만 가지고 있는 구조라고 볼 수 있는데,

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

 

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

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


refs :

https://mygumi.tistory.com/253

https://mangkyu.tistory.com/47

반응형

블로그의 정보

슬기로운 개발생활

coco3o

활동하기