회원가입

자바 메모리 구조 - static 메서드

Beany 2024-09-18

static 메서드


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

이해를 돕기 위해 간단한 예제를 만들어보자.

 

특정 문자열을 꾸며주는 간단한 기능을 만들어보자.
예를 들어서 "hello"라는 문자를 꾸미면 앞 뒤에 "*" 을 붙여서 "*hello*" 와 같이 꾸며주는 기능이다.

 

인스턴스 메서드

지금까지 학습한 방식을 통해 해당 기능을 개발해보자.

DecoUtil1

package static2;

public class DecoUtil1 {
    public String deco(String str) {
        return "*" + str + "*";
    }
}

 

DecoMain1

package static2;

public class DecoMain1 {
    public static void main(String[] args) {
        DecoUtil1 decoUtil = new DecoUtil1();
        System.out.println(decoUtil.deco("Hello Java"));
    }
}
*Hello Java*

앞서 개발한 deco() 메서드를 호출하기 위해서는 DecoUtil1 의 인스턴스를 먼저 생성해야 한다. 그런데 deco() 라는 기능은 맴버 변수도 없고, 단순히 기능만 제공할 뿐이다. 인스턴스가 필요한 이유는 맴버 변수(인스턴스 변수)등을 사용하는 목적이 큰데, 이 메서드는 사용하는 인스턴스 변수도 없고 단순히 기능만 제공한다.

 

 

static 메서드

DecoUtil2

package static2;

public class DecoUtil2 {
    public static String deco(String str) {
        return "*" + str + "*";
    }
}

DecoUtil2 는 앞선 예제와 비슷한데, 메서드 앞에 static 이 붙어있다. 이 부분에 주의하자. 이렇게 하면 정적 메서드를 만들 수 있다. 그리고 정적 메서드는 정적 변수처럼 인스턴스 생성 없이 클래스 명을 통해서 바로 호출할 수 있다.

 

DecoMain2

package static2;

public class DecoMain2 {
    public static void main(String[] args) {
        System.out.println(DecoUtil2.deco("Hello Java"));
    }
}
*Hello Java*

 

[ 용어 정리 ]

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

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

 

정적 메서드는 객체 생성없이 클래스에 있는 메서드를 바로 호출할 수 있다는 장점이 있다.
하지만 정적 메서드는 언제나 사용할 수 있은 것이 아니다.

정적 메서드 사용법

  • static 메서드는 static 만 사용할 수 있다.
    • 클래스 내부의 기능을 사용할 때, 정적 메서드static 이 붙은 정적 메서드정적 변수만 사용할 수 있다.
    • 클래스 내부의 기능을 사용할 때, 정적 메서드인스턴스 변수나, 인스턴스 메서드를 사용할 수 없다.
  • 반대로 모든 곳에서 static 을 호출할 수 있다.
    • 정적 메서드는 공용 기능이다. 따라서 접근 제어자만 허락한다면 클래스를 통해 모든 곳에서 static 을 호출할 수 있다.

예제를 통해 정적 메서드의 사용법을 확인해보자

DecoData

package static2;

public class DecoData {
    private int instanceValue;
    private static int staticValue;

    public static void staticCall() {
        // instanceValue++;  인스턴스 변수 접근 (오류)
        // instanceMethod(); 인스턴스 메소드 호출 (오류)

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

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

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

    public void instanceMethod() {
        System.out.println("instanceMethod:instanceValue => " + instanceValue);
    }

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

 

DecoDataMain

package static2;

public class DecoDataMain {
    public static void main(String[] args) {
        System.out.println("1. 정적 호출");
        DecoData.staticCall();
        
        System.out.println("2. 인스턴스 호출");
        DecoData decoData = new DecoData();
        decoData.instanceCall();
    }
}
1. 정적 호출
staticMethod: staticValue => 1
2. 인스턴스 호출
instanceMethod:instanceValue => 1
staticMethod: staticValue => 2

 

0 0
JAVA
이 공간은 개인 공부를 통해 얻은 정보를 체계적으로 정리하고 공유하는 곳입니다. 학습한 내용, 발견한 지식, 그리고 문제 해결 방법 등을 기록하여 나만의 학습 자료를 구축하고, 필요할 때 쉽게 참고할 수 있는 유용한 자원으로 활용할 수 있도록 합니다.
Yesterday: 456
Today: 224