static 메서드

  • static 메서드가 필요한 이유 예를 보자🔽
package static2;

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

→ DecoUtil1 이라는 클래스에 deco 메서드만 있다고 가정 하고 이 기능만 사용하는 클래서가 있다고 보면.

package static2;

public class DecoMain1 {
    public static void main(String[] args) {
        String s = "hello Java";
        DecoUtil1 utils = new DecoUtil1();
        String deco = utils.deco(s);

        System.out.println("before: " + s );
        System.out.println("after: " + deco );
        
        String s2 = "hello world";
        DecoUtil1 utils2 = new DecoUtil1(); // <- 또 동일한 기능을 하는 객체를 생성 해야 한다.
        String deco2 = utils2.deco(s);

        System.out.println("before: " + s2 );
        System.out.println("after: " + deco2 );
    }
}

→ 동일한 기능을 사용하기 위해 매번 객체를 새로 생성해주는 번거로움이 발생한다.

→ 이렇게 매번 단순한 동일 작업(메서드)을 생략하기 위해 static 을 메서드에 붙여준다.

  • static 메서드를 사용한 예 🔽
package static2;

public class DecoUtil2 {
    public static String deco(String str) { // <- 메서드에 static을 붙여준다.
        String result = "*" + str + "*";
        return result;
    }
}

package static2;

public class DecoMain2 {
    public static void main(String[] args) {
        String s = "hello Java";
        String deco = DecoUtil2.deco(s);

        System.out.println("before: " + s );
        System.out.println("after: " + deco );

        String b = "static Method";
        String deco2 = DecoUtil2.deco(b); 
        // 2번째 객체 생성없이 바로 클래스 명에 메서드 호출이 가능해진다.
        System.out.println("before: " + b);
        System.out.println("after: " + deco2);
    }
}

→ 이렇게 사용하면 불필요한 객체 생성 없이 편리하게 메서드 사용이 가능해진다.

메서드의 종류

  • 클래스 메서드 : 메서드 앞에 staitc 이 붙은 형태로, 정적 메서드, 클래스 메서드라고 부른다. 인스턴스 생성 없이 마치 클래스에 있는 메서드를 바로 호출 하는 것 처럼 느껴진다.
  • 인스턴스 메서드 : static이 붙지 않은 메서드로 항상 인스턴스(객체)를 생성해야 호출할 수 있다.

static 메서드 사용 시 주의 사항

  • static 메서드는 static 이 선언된 것만 사용 가는하다
  • staitc 메서드가 class 내부의 기능을 사용할때에 → static 메서드는 static 이붙은 메서드나, 변수 만 사용 가능하다.
  • static 메서드는 인스턴스 변수, 인스턴스 메서드를 사용할 수 없다.
  • 접근 제어자가 허용하는 범위 내에서 클래스를 통해 staic변수,메서드를 호출할 수 있다.

static 메서드 결론

  • static 붙은 것만 staitc메서드에서 사용 가능 하고 stiatc 메서드 자신은 접근제한자 범위 내에서 마음껏 사용될 수 있다.

static 메서드 사용 범위 예 🔽

package static2;

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() { // <- private 인스턴스 메서드
        System.out.println("instanceValue = " + instanceValue);
    }

    private static void staticMethod() { // private 정적 메서드
        System.out.println("staticValue = " + staticValue);
    }
}

→ 해당 코드를 작동 시켜 보면

package static2;

public class DecoDataMain {
    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();
    }
}

staticValue = 1 // <- static 변수는 메서드 영역에서 관리되므로 호출 하면 계속 증가 될것
2. 인스턴스 호출1
instanceValue = 1 // <- instance 변수는 힙 영역에 각각 생성 되므로 호출해도 계속 1 유지
staticValue = 2
3. 인스턴스 호출2
instanceValue = 1
staticValue = 3

// 다음과 같이 출력된다.

→ 그림으로 보면 다음과 같다 🔽


static 메서드의 용어 정리

  • 클래스에 정의한 메서드 (맴버 메서드)의 종류
    1. 인스턴스 메서드 : static이 안 붙은 것 → 객체(인스턴스)를 생성해야 사용할 수 있다.
    2. class 메서드(static 메서드) : static이 붙은 것 → 객체생성하지 않고 바로 class 에 접근 해 사용 가능하다.

static 메서드의 main() 메서드

  • main 메서드는 프로그램의 시작점이다.
  • main 메서드는 static 메서드 이므로 객체 생성없이 바로 실행이 된다.
  • 그래서 main 메서드에서 호출할 때는 static 메서드만 호출 했다.

'자바 공부 > [ 完 ] 자바 실전 - 기본편' 카테고리의 다른 글

9-1 상속  (0) 2024.03.14
8-1. final  (0) 2024.03.12
7-3 static 변수  (0) 2024.03.09
7-2 스텍과 큐 자료구조  (0) 2024.03.09
7-1 자바 메모리 구조  (0) 2024.03.09

+ Recent posts