본문 바로가기
JAVA

[JAVA] static 멤버(static 필드, static 메서드)

by 정공자씨 2024. 4. 22.

 

 

 

정적 멤버(static member, class member)

정의

  • 클래스에 소속된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메서드
  • 클래스에 소속된 멤버이기 때문에 클래스 멤버라고 함
    • 특정한 인스턴스에 속해 있는 멤버가 아님
    • 즉, 인스턴스와 무관함

 

 

종류

  1. static 필드(class 필드)
  2. static 메서드

 

 

특징

class StaticTest {
    static int count; // static 필드

    static void printHello() { // static 메서드
        System.out.println("hello");
    }​
}
  • 클래스의 인스턴스를 생성하지 않더라도 static 멤버에 접근이 가능
    • 즉, 클래스가 정의만 되어도 static 메서드와 static 필드에 접근이 가능
  • 클래스명과 도트 연산자(.)를 이용하여 static 멤버에 접근할 수 있음
    • StaticTest.count;    // 클래스명.필드명
    • StaticTest.printHello();     // 클래스명.메서드명

 

 

static 멤버의 생성과 소멸

  • JVM에 의해서 클래스가 메모리 공간에 올라가는 순간(로드)에 생성되고, 프로그램이 종료되는 시점에 소멸
    • 클래스가 메모리 공간에 올라가는 순간에 static 멤버도 함께 올라감
  • 해당 클래스의 인스턴스가 여러개 생성되더라도, 클래스가 이미 로드된 경우에는 더 이상 클래스 멤버가 메모리에 로드되지 않음
    • 즉, 클래스가 처음 사용될 때에 단 1번만 Method Area 메모리에 로드되며, 다시 로드되지 않음

 

[ 인스턴스 멤버(instance member) ]

정의
- non static member
- 특정 인스턴스에 속하는 멤버

종류
- 인스턴스 변수
- 인스턴스 메서드

Instance Variable (인스턴스 변수)
- 새로운 인스턴스가 생성될 때마다 heap area 메모리에 생성되는 변수

Instance Method (인스턴스 메서드)
- 인스턴스가 생성된 후에 인스턴스의 참조를 이용하여 호출할 수 있는 메서드

 

 

 

 

static 필드(class 필드)

class StaticTest {
	public static int count; // static 필드, method area 메모리에 할당
	int count2; // instance 필드, 인스턴스 생성 시 heap area 메모리에 할당
}

 

특징

  • 필드(멤버변수) 선언 시에 static 키워드를 붙여서 선언
  • main() 메서드가 실행되기 전에 method area 메모리 영역에 생성되어 사용이 가능
[ instance 필드 ]
인스턴스의 생성 시(new 연산을 사용하여 인스턴스 생성)에 heap area 메모리에 할당되고, 인스턴스 소멸 시에 메모리 해체됨

 

 

 

사용

  • static 필드를 사용할 때는, 참조변수가 필요 없음
  • static 필드를 사용할 때는, 클래스명.필드명으로 사용
StaticTest.count

 

 

 

 

static 메서드(class 메서드)

class StaticTest {
    public static int count; // static 필드
	
    public static int counting() { // static 메서드
    	count++;
    }
}

 

특징

  • 메서드의 선언부에 static 키워드가 있는 메서드
  • main() 메서드가 실행되기 전에 method area 메모리 영역에 생성되어 사용이 가능
  • 인스턴스 생성과 무관하게 사용하는 메서드는 static으로 선언하여 사용

 

 

사용

  • 클래스의 인스턴스를 생성하지 않고도 접근이 가능하므로, 클래스명으로 접근
    • 참조변수를 사용하지 않아도 됨
  • static 메서드를 사용할 때는, 클래스명.메서드명으로 사용
StaticTest.counting();

 

 

 

static 메서드에서 다른 메서드, 다른 필드 접근하기

 

1. static 메서드에서는 인스턴스 필드와 인스턴스 메서드를 사용할 수 없음

  • static 메서드는 클래스의 객체를 생성하지 않고도 사용이 가능하지만
  • 인스턴스 멤버는 클래스의 인스턴스를 생성한 이후에 사용이 가능하므로
    • static 메서드에서는 인스턴스 멤버를 사용할 수 없음
static 메서드 호출 시에, 해당 인스턴스가 생성되어 있지 않을 수 있기 때문에

 

2. static 메서드에서는 static멤버를 사용할 수 있음

 

3. static 메서드는 this 포인터 사용 불가

  • this는 클래스 내의 멤버변수(필드)를 가리키는 용도
  • 해당 멤버변수가 사용 시점에 메모리에 할당 되어 있는지를 알 수 없음

 

4. 인스턴스 메서드에서는 인스턴스 필드를 사용할 수 있음

  • 인스턴스 메서드 호출 시에는 이미 인스턴스가 생성되어 있다는 뜻이고
  • 인스턴스 필드 역시 메모리에 생성되어 있음

 

 

예제

static 변수, static 메서드 사용하기
public class StaticTest {
 
    static int num;
 
    public static void main(String[] args) {   // main() 메서드
 	
    	//static int num으로 선언하고, main()안에서 share = 20; 해놓으면 전역변수로 정의
        num = 20;
        int result = func(5, 7);
 
        System.out.println(num); // 12
        System.out.println(result);  // -2
    }
 
    private static int func(int m,int n){   // func 메서드    
    
            num = m + n; // 12, func함수 호출로 인해 20이었던 것이 12로 변경
            return  m - n; // -2
        }
    }

 

인스턴스 변수, 인스턴스 메서드 사용하기
public class StaticTest {
 
    int num;
 
    public static void main(String[] args) {   // main() 메서드
    	
    	// static 변수, static 메서드가 아니라면 클래스의 객체 생성하여 사용
    	StaticTest stTest = new StaticTest();
    	
    	int num = 30; // main()의 내 지역변수
    	
    	stTest.num = 20;  // 인스턴스변수 사용, 참조변수.변수명로 접근
        int result = stTest.func(5, 7);   // 인스턴스메서드 사용, 참조변수.메서드명
 
        System.out.println(num); // 30, main()의 내 지역변수 num
        System.out.println(stTest.num); // 12, 전역변수 num
        System.out.println(result);  // -2
    }
 
    int func(int m,int n){   // func 메서드       
            num = m + n; // 12, 전역변수 num 
            return  m - n; // -2
    }
}

 

 

 

 

static 변수(class 변수)와 instance 변수 차이점

 

 

 

 

 

 

출처

 

https://autosw.tistory.com/33

 

 

https://velog.io/@balparang/%EC%B2%98%EC%9D%8C-%ED%95%B4%EB%B3%B4%EB%8A%94-%EC%9E%90%EB%B0%94%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-6.2-%EC%A0%95%EC%A0%81-%EB%A9%A4%EB%B2%84-%EC%84%A0%EC%96%B8-static-%ED%95%84%EB%93%9C-static-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%A0%95%EC%A0%81-%EC%BD%94%EB%93%9C-%EB%B8%94%EB%A1%9D

 

 

https://micropilot.tistory.com/3041

https://aomee0880.tistory.com/141