본문 바로가기

JAVA

정적(Static) 멤버 변수 | 21/12/29

 

코드 작성
package ex_static;

public class Ex1 {

	public static void main(String[] args) {

		/*
		 * 정적(static) 멤버 변수 = 클래스 멤버 변수
		 * 
		 * < 정적(클래스) 멤버 정의 기본 문법 >
		 * static 데이터타입 변수명[ = 초기값];
		 * 
		 * < 정적(클래스) 멤버 사용 문법 > 
		 * 클래스명.변수명;
		 * 
		 */
		
		// StaticEx 클래스의 클래스 변수 a는 클래스가 메모리에 로딩될 때 함께 로딩되므로
		// 인스턴스 생성 전에 메모리에 로딩되며, 인스턴스 생성 없이도 클래스명만으로 접근 가능한 멤버!
		System.out.println("StaticEx.a = " + StaticEx.a);
//		System.out.println("StaticEx.a = " + StaticEx.b); // 오류 발생!
		// => 인스턴스 멤버변수 b는 반드시 인스턴스를 통해서만 접근 가능!
		
		// StaticEx 클래스의 인스턴스 생성
		StaticEx se = new StaticEx();
		// => 인스턴스 생성 시 Heap 영역에 인스턴스 멤버도 함께 로딩
		System.out.println("b = " + se.b); // 반드시 인스턴스를 통해 접근
		System.out.println("se.a = " + se.a);
		// => 클래스 멤버변수도 일반 인스턴스 멤버변수처럼 접근 할 수 있으나
		//    가급적 static 접근 방식(클래스명.변수명)으로 접근하도록 하자!
		
		// StaticEx 클래스의 변수 a의 값을 100으로 변경, b의 값을 200으로 변경 후 출력
		se.a = 100;
//		StaticEx.a = 100;
		System.out.println("StaticEx.a = " + StaticEx.a);
		se.b = 200;
		
		System.out.println("변경 후 se.a = " + se.a);
		System.out.println("변경 후 se.b = " + se.b);
		
		// StaticEx 클래스의 새로운 인스턴스(se2) 생성
		StaticEx se2 = new StaticEx();
		System.out.println("se2.a = " + se2.a); // 변경된 100이 출력
		System.out.println("se2.b = " + se2.b); // 새 인스턴스 값 20 출력
		// => 인스턴스를 새로 생성하더라도 정적 멤버변수는
		//    하나의 메모리 공간을 모든 인스턴스에서 공유하므로
		//    하나의 인스턴스에서 값을 변경하면 모든 인스턴스가 변경된 값을 공유
		
		// 대표적인 static 멤버변수의 예
		// 수학관련 기능을 제공하는 Math 클래스의 멤버변수는 모두 static
		double pi = 3.141592;
		System.out.println("파이 값 : " + pi);
		
		// Math 클래스 상수 PI가 제공되며 static 멤버변수로 제공
		// => 별도의 인스턴스 생성없이 클래스명만으로 접근 가능
		System.out.println("파이 값: " + Math.PI);
		
		// 정수를 다루는 Integer 클래스의 멤버변수 static
		System.out.println("INT형 표현범위 최소값 : " + Integer.MIN_VALUE);
		System.out.println("INT형 표현범위 최대값 : " + Integer.MAX_VALUE);
	}
}

class StaticEx {
	
	static int a = 10; // 클래스(정적) 멤버 변수 선언
	int b = 20; // 인스턴스 멤버 변수 선언
	
}

정적(Static)멤버 변수 선언 방법 및 예시

출력 결과

StaticEx.a = 10
b = 20
se.a = 10
StaticEx.a = 100
변경 후 se.a = 100
변경 후 se.b = 200
se2.a = 100
se2.b = 20
파이 값 : 3.141592
파이 값: 3.141592653589793
INT형 표현범위 최소값 : -2147483648
INT형 표현범위 최대값 : 2147483647

 

나의 소감

   정적 멤버 변수는 인스턴스 생성 필요 없이 클래스명만으로 접근할 수 있다
   그러면 왜 이런 기능이 있을까?
   예상컨데 단순히 편의만을 위해서 만든건 아닌것 같고 Math 같은 모두가 공통으로 많이 쓸만한걸
   모아놓은 모음집??? 같은게 아닐까... ㅎㅎ