위로
아래
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은 객체 생성 없이 기본 메소드처럼 그냥 쓴다.
}
}
특징
- 프로그램이 시작되기 전, 실행 코드가 다 로드되고 나면, 그 중에서 static 키워드가 붙은 변수와 메서드만 먼저 골라 method 영역 안의 static 영역에 먼저 추려진다.
- static 키워드를 사용한다는 건, 메모리에 한 번 할당되어 프로그램이 종료될 때 해제되는 것.
- 스태틱 변수 = 전역 변수
- JVM은 가장 먼저 method 영역 안의 static 영역에서 main 메서드를 찾는다. 그래서 main 메서드에 static이 붙는다.
- 일반적으로 static은 상수의 값을 경우가 많아서, public static final로 많이 쓴다.
- 힙 영역을 사용하지 않고 메서드 영역의 일부만 사용하므로 메모리 사용이 비효율적이고, 객체지향 프로그래밍의 캡슐화 은닉화를 무시하는 행위이기에, 자주 사용해서 좋을 건 없다
정적 멤버 static 멤버
정적 변수 (static variable) or 클래스 변수 (class variable)
- 객체 생성 개수를 파악하는 등, 모든 객체가 공유하는 변수가 필요할 때 사용한다.
- 중복 코딩을 줄이기 위해 사용
- Static 변수는 클래스 변수이다.
- 간단하게 static PI = 3.14; 정도는 초기화할 수 있으나, 인스턴스 변수처럼 생성자로 초기화할 수는 없어서, for문이 들어가거나 하는 복잡한 초기화를 희망할 때는 정적 블럭을 이용한다.
- 단일 값을 계산하고 싶을 때가 아니라, 계산을 해서 값을 전달하고 싶을 때 영역을 static으로 만든다.
- 클래스명으로 호출한다. Circle.numofCircles (static이 아닌 애들은 C1.numCircle)
- 모든 클래스가 공통으로 사용하는 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)
- new로 선언하지 않고 사용한다.
- 자주 사용하는 유틸리티 성격의 메서드의 경우, 코드를 중복으로 작성하지 않기 위해서 static을 붙여서 사용한다.
- static 메서드는 어느 클래스에서 얼마큼 사용하던 간에, static 메모리에 딱 한 번만 올라와 있는다.
- 객체 자신을 가리키는 this 키워드, 인스턴스 변수와 인스턴스 메소드를 사용할 수 없다.
- 정적 메소드가 아닌, 인스턴스마다 독립적으로 사용하는 메소드는 인스턴스 메소드(instance method) 라고 한다
- System.out.println()도 정적 메소드다.
- System : 클래스 이름 (그래서 맨 앞글자가 대문자)
- out. : static 변수. (괄호가 없으니 변수 멤버이다) new 클래스 사용 없이 변수를 호출할 수 있다.
- println() : static 메소드. new 클래스 사용 없이 메서드를 호출할 수 있다.
- 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)
- 정적 변수는 생성자로 초기화할 수 없다 (객체를 생성하기 전이므로)
- 정적 변수를 초기화할 때에는 정적 블럭을 사용한다.
정적 블럭 예시
더보기
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
}
}