static 메서드

한라봉봉·2023년 12월 16일

JAVA

목록 보기
10/16

1. static이 붙은 메서드에 대해 알아보자.

1. 인스턴스가 필요한 이유는 멤버 변수(인스턴스 변수)등을 사용하는 목적이 크다.(메서드는 메서드영역에 고정이므로) 아래 deco() 라는 기능은 멤버 변수도 없고, 단순히 기능만을 제공한다. 여러개의 인스턴스를 만들어 쓸 이유가 없다.

public class DecoUtil1 {

    public String deco(String str) {
        String result = "*" + str + "*";
        return result;
    }
}

2. 아래와 같이 static을 붙여 정적 메소드를 만들면, 인스턴스를 만들 필요없이 클래스명으로 바로 호출 가능하다.

public class DecoUtil2 {

    public static String deco(String str) {
        String result = "*" + str + "*";
        return result;
    }
}

2. 메서드 구분

1. 클래스 메서드

메서드 앞에도 static을 붙일 수 있다. 이것을 정적 메서드 또는 클래스 메서드라 한다. 정적 메서드는 static의 문자 그대로 의미이고, 클래스 메서드라는 용어는 인스턴스 생성없이 마치 클래스에 있는 메서드를 바로 호출 하는 것처럼 느껴지기 때문이다.

2. 인스턴스 메서드

static이 붙지 않은 메서드는 인스턴스를 생성해야 호출할 수 있다. 이것을 인스턴스 메서드라 한다.

3. 정적 메서드 사용법: 정적 메서드는 언제나 사용할 수 있는 것이 아니다.

1. static 메서드는 static만 사용할 수 있다.

  1. 클래스 내부의 기능을 사용할때, 정적메서드는 static이 붙은 정적 메서드나 정적 변수만 사용할 수 있다.
  2. 클래스 내부의 기능을 사용할때, 정적메서드는 인스턴스 변수나, 인스턴스 메서드를 사용할 수 없다.
public class DecoData {

    private int instanceValue;
    private static int staticValue;

    public static void staticCall() {
        //instanceValue++; //인스턴스 변수 접근, compile error
        //instanceMethod(); //인스턴스 메서드 접근, compile error

        staticValue++; //정적 변수 접근
        staticMethod(); //정적 메서드 접근
    }

    public void instanceCall() {
        instanceValue++; //인스턴스 변수 접근
        instanceMethod(); //인스턴스 메서드 접근

        staticValue++; //정적 변수 접근
        staticMethod(); //정적 메서드 접근
    }


    private void instanceMethod() {
        System.out.println("instanceValue=" + instanceValue);
    }

    private static void staticMethod() {
        System.out.println("staticValue=" + staticValue);
    }
}

2. 반대로 모든 곳에서 static을 호출할 수 있다.

  1. 정적 메서드는 공용 기능이다. 따라서 접근 제어자만 허락 한다면 클래스를 통해 모든 곳에서 static을 호출 할 수 있다.
    public static void main(String[] args) {
        System.out.println("1. 정적 호출");
        DecoData.staticCall();

        System.out.println("2. 인스턴스 호출1");
        DecoData data1 = new DecoData();
        data1.instanceCall();

        System.out.println("3. 인스턴스 호출2");
        DecoData data2 = new DecoData();
        data2.instanceCall();

        //추가
        //인스턴스를 통한 접근
        DecoData data3 = new DecoData();
        data3.staticCall();

        //클래스를 통한 접근
        DecoData.staticCall();
    }

3. 정적 메서드 내에서 인스턴스 변수, 인스턴스 메서드를 사용할 수없는 이유

정적 메서드는 클래스의 이름을 통해 바로 호출할 수 있다. 그래서 힙영역에 위치하지 않고, 인스턴스처럼 참조값의 개념이 없다.
특정 인스턴스의 기능을 사용하려면 참조값을 알아야 하는데, 정적 메서드는 참조값 없이 호출된다. 따라서 정적 메서드 내부에서 인스턴스 기능을 사용할 수 없다.

4. 당연한 이야기지만, 객체의 참조값을 직접 매개변수로 전달하면 정적 메서드도 인스턴스의 변수나 메서드를 호출할 수 있다.

그러나 동일 클래스 내부에서 이용하는 것이 아닌 외부에서 받은 매개변수를 이용하게 된다.

    public static void staticCall(DecoData data) {
        data.instanceValue++;
        data.instanceMethod(); //인스턴스 메서드 접근
    }

4. 정리, +@

1. 멤버 메서드의 종류

  1. 인스턴스 메서드: static이 붙지 않은 멤버 메서드
  2. 클래스 메서드: static이 붙은 멤버 메서드. 클래스 메서드, 정적 메서드, static 메서드 등으로 부른다.

2. 정적 메서드 활용

정적 메서드는 간단한 메서드 하나로 끝나는 유틸리티성 메서드에 자주 사용된다. 수학의 여러가지 기능을 담은 클래스를 만든다면 인스턴스 변수 없이 입력한 값을 계산하고 반환하는 것이 대부분이다. 이럴때 정적 메서드로 만들면 좋다.

3. static 메서드 접근

인스턴스를 통한 접근과 클래스를 통한 접근(클래스명.메소드명()) 방법이 있다. 클래스를 통한 접근이 더 명확하므로 클래스를 통해 접근하자.

4. static import

정적 메서드를 사용할때 해당 메서드를 자주 호출해야 한다면 static import 기능을 고려하자. 이기능을 사용하면 클래스명을 생략하고 메서드를 호출할 수 있다. 정적 변수에도 사용가능하다.

import static static2.DecoData.staticCall;
//import static static2.DecoData.*; staticCall 외 모든 정적 메소드 호출시

public class DecoDataMain {

    public static void main(String[] args) {
        System.out.println("1. 정적 호출");
        staticCall();

5. main() 메서드도 정적 메서드

인스턴스 생성없이 실행하는 가장 대표적인 메서드가 바로 main() 메서드이다.
main() 메서드는 프로그램을 시작하는 시작점이 되는데, static 이기 때문에 객체를 생성하지 않아도 메서드가 동작했던 것이다.

main() 메서드가 같은 클래스에서 호출하는 메서드도 정적 메서드로 선언해서 사용해야 한다.

profile
백엔드 개발공부 로그를 기록합니다

0개의 댓글