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

원글 페이지 : 바로가기

정적 멤버(static member, class member) 정의 클래스에 소속된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메서드 클래스에 소속된 멤버이기 때문에 클래스 멤버라고 함 특정한 인스턴스에 속해 있는 멤버가 아님 즉, 인스턴스와 무관함 종류 static 필드(class 필드) 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

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다