위로 아래

Static 

객체를 생성하지 않고도 Static 자원에 접근이 가능하다.(static 변수와 static 메소드는 static 메모리 영역에 존재하므로, 객체가 생성되기 이전에 이미 할당되어 있다. 그래서 객체 생성 없이 접근할 수 있다.)

-----------------------Car.java 파일-------------------------
public class Car {
	static void move() {
		System.out.println("달리다.");
	}
}
-----------------------Main.java 파일-------------------------
public class Main {
	public static void main(String[]args) {
		Car.move ()   // static은 객체 생성 없이 기본 메소드처럼 그냥 쓴다.
	}
}

 

특징

  1. 프로그램이 시작되기 전, 실행 코드가 다 로드되고 나면, 그 중에서 static 키워드가 붙은 변수와 메서드만 먼저 골라 method 영역 안의 static 영역에 먼저 추려진다.
  2. static 키워드를 사용한다는 건, 메모리에 한 번 할당되어 프로그램이 종료될 때 해제되는 것.
  3. 스태틱 변수 = 전역 변수
  4. JVM은 가장 먼저 method 영역 안의 static 영역에서 main 메서드를 찾는다. 그래서 main 메서드에 static이 붙는다.
  5. 일반적으로 static은 상수의 값을 경우가 많아서, public static final로 많이 쓴다.
  6. 힙 영역을 사용하지 않고 메서드 영역의 일부만 사용하므로 메모리 사용이 비효율적이고, 객체지향 프로그래밍의 캡슐화 은닉화를 무시하는 행위이기에, 자주 사용해서 좋을 건 없다

 


정적 멤버 static 멤버

 

정적 변수 (static variable) or 클래스 변수 (class variable)

  1. 객체 생성 개수를 파악하는 등, 모든 객체가 공유하는 변수가 필요할 때 사용한다.
  2. 중복 코딩을 줄이기 위해 사용
  3. Static 변수는 클래스 변수이다.
  4. 간단하게 static PI = 3.14; 정도는 초기화할 수 있으나, 인스턴스 변수처럼 생성자로 초기화할 수는 없어서, for문이 들어가거나 하는 복잡한 초기화를 희망할 때는 정적 블럭을 이용한다.
  5. 단일 값을 계산하고 싶을 때가 아니라, 계산을 해서 값을 전달하고 싶을 때 영역을 static으로 만든다.
  6. 클래스명으로 호출한다. Circle.numofCircles (static이 아닌 애들은 C1.numCircle)
  7. 모든 클래스가 공통으로 사용하는 static 변수가 아닌 경우, 인스턴스들이 독립적으로 사용하는 변수라는 의미에서 instance 변수라고 한다.

정적 변수 예시

더보기
------------------------같은 패키지에 Circle.java 파일-------------------------
public class Circle5 {
	double radius;
	static int numOfCircles = 0;
	int numCircle = 0;
	
	public Circle5(double radius){
		this.radius = radius;
		numOfCircles++;
		numCircle++;
	}
}

----------------------같은 패키지에 CircleDemo.java 파일-----------------------
public class Circle5Demo {
	public static void main (String[] args) {
		Circle5 C1 = new Circle5(10.0);
		Circle5 C2 = new Circle5(5.0);
		
		System.out.println("원의 개수 : " + Circle5.numOfCircles);   // 스태틱 호출방법. 결과 2
		System.out.println("원의 개수 : " + C1.numCircle);   // 결과 1
		System.out.println("원의 개수 : " + C2.numOfCircles);   // 결과 2
	}
	void print() {
		System.out.println("인스턴스 메서드입니다.");
	}
}

 

 

정적 메소드 (static method) or 클래스 메소드 (class method)

  1. new로 선언하지 않고 사용한다.
  2. 자주 사용하는 유틸리티 성격의 메서드의 경우, 코드를 중복으로 작성하지 않기 위해서 static을 붙여서 사용한다. 
  3. static 메서드는 어느 클래스에서 얼마큼 사용하던 간에, static 메모리에 딱 한 번만 올라와 있는다.
  4. 객체 자신을 가리키는 this 키워드, 인스턴스 변수와 인스턴스 메소드를 사용할 수 없다.
  5. 정적 메소드가 아닌, 인스턴스마다 독립적으로 사용하는 메소드는 인스턴스 메소드(instance method) 라고 한다
  6. System.out.println()도 정적 메소드다.
    1. System : 클래스 이름 (그래서 맨 앞글자가 대문자)
    2. out. : static 변수. (괄호가 없으니 변수 멤버이다) new 클래스 사용 없이 변수를 호출할 수 있다.
    3. println() : static 메소드. new 클래스 사용 없이 메서드를 호출할 수 있다.
    4. import java.lang.System : 따로 입력하지 않아도 자바 컴파일러가 자동으로 System 클래스를 import 시키고 있다.(java.lang은 패키지 이름)

 

정적 메소드 예시

더보기
------------------------같은 패키지에 Util.java 파일-------------------------
public class Util {
	public static int adder(int a, int b) {
		return a+b;
	}
}

----------------------같은 패키지에 UtilDemo.java 파일-----------------------
public class UtilDemo {
	public static void main(String[] args) {
		System.out.println(Util.adder(1,2));   // 결과 3
	}
}

 

 

정적 블럭 (static block)

  1. 정적 변수는 생성자로 초기화할 수 없다 (객체를 생성하기 전이므로)
  2. 정적 변수를 초기화할 때에는 정적 블럭을 사용한다.

정적 블럭 예시

더보기
public class Ex07 {
	static int sum;
	
	static {
		int result = 0;
		for(int i=0 ; i<=10 ; i++) {
			result += i;
			sum = result;
		}
	}
	
	public static void main(String[] args) {
		System.out.println(sum);   // 결과 55
	}
}