개발공부

JAVA쪼렙탈출기: static

Yuniverse. 2023. 6. 16. 10:15
Python과 SQL만 써본 주니어 분석가. '개발공부를 해보고 싶다', '개발도 공부하긴 해야하는데...'는 말만 한지 어연 1년이 넘어가는 중, 이대로는 안되겠다 싶어 냅다 JAVA 수업 수강에 카드를 긁었다. 쪼렙 중의 쪼렙이 JAVA를 배워나가는 여정을 "JAVA 쪼렙 탈출기"라는 시리즈로 남길 예정이다.

 

static

class 공통 멤버로서 객체를 생성하지 않아도 사용할 수 있는 필드와 메서드

 

public class StaticEx {
	
	public static int staValue; // static은 메서드뿐만 아니라 변수에도 사용가능
	private int priValue;
	
	public StaticEx() {
		++staValue;
		++priValue;
		System.out.println("staValue : " + staValue + " - priValue : " + priValue);
	}
	
	// static area를 별도로 지정할 수도 있다.
	static {
		System.out.println("- static area -");
		staValue = 10; // static 변수 초기화도 가능
		// priValue = 1; Error. instance 변수는 x (instance 변수는 객체가 생성되는 순간에 만들어지기 때문에)
	}
	
	// static은 메서드에도 붙일 수 있다. 
	public static void staticMethod() {
		System.out.println("- staticMethod() -");
		System.out.println("staValue : " + staValue);
		// System.out.println("priValue : " + priValue); Error. static이 선언된 메서드 안에서 instance 변수를 사용할 수 없다. 
		// static은 접근제한자만 풀리면 객체가 생성되지 않아도 쓸 수 있기 때문에 객체가 생성되어야만 하는 instance 변수는 사용x
		// static 붙은 애들은 static끼리만 놀아야한다.
	}
	
	// 일반 메서드에서는 staic 변수와 static이 아닌 변수 모두 사용가능 ( 다 생성되어있는 상태이기 때문에 )
	public void info() {
		System.out.println("staValue : " + staValue);
		System.out.println("priValue : " + priValue);
	}

}
public class StaticTest {
	
	public static void main(String[] args) {
		
		StaticEx.staValue = -1; // static 변수는 객체를 만들지 않아도 클래스명을 통해서 직접적인 사용이 가능하다. (공통이니까)
		StaticEx.staticMethod(); // static 메서드 또한 객체를 만들지 않아도 클래스명을 통해서 직접적인 사용이 가능하다.
		
		StaticEx seA = new StaticEx();
		StaticEx seB = new StaticEx();
		
		// static이 안 붙으면 개인 것(객체 고유의 것), static이 붙으면 공용의 것이 된다.
		// static만을 처리하는 지역이 별도로 존재: static area
		
		// static area를 정의해주면
		// 생성자보다도 먼저 출력된다.
		
		seA.staValue = 5; // seA에서 바꿨어도 static은 공용이기 때문에 모두에게 적용된다.
		System.out.println("seA 값");
		seA.info();
		System.out.println("seB 값");
		seB.info();
		
	}

}