1. 정적이란?
정적(static)이란 사전적의미는 다음과 같습니다.
- 형용사 (변화움직임이없이)고정된[고정적인]
- 형용사 [물리]정지 상태의
자바에서 static키워드를 이용하여 static변수와 static메소드를 생성할 수 있는데 다른말로 정적 필드와 정적 메소드라고 합니다. 그리고 정적 필드와 정적 메소드를 합쳐 정적 멤버 또는 클래스 멤버라고 합니다.
정적 필드와 정적 메소드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버입니다. 그래서 클래스 로더가 클래스를 로딩하면 메모리에 할당시키게되고, 클래스 로딩이 끝나면 바로 사용할 수 있습니다.
정적(static)필드
static키워드로 할당된 정적멤버들은 메모리에서 heap이 아닌 static영역에 할당됩니다. static영역에 할당된 메모리는 모든 객체가 공유하며 하나의 멤버를 어디서나 참조할 수 있는 장점을 가지지만 Garbage Collector의 관리 영역을 벗어나게 되기 때문에 한번 선언되면 프로그램 종료시까지 메모리에 할당된채로 남게 됩니다.
따라서 static을 남발하면 프로그램의 성능에 안좋은 영향을 미칠 수 있습니다.
2. 정적 멤버 생성
정적멤버는 전역변수처럼 사용이 가능하기 때문에 변수를 선언할때 공용으로 사용할 것인가 아닌가로 판단하여 생성기준을 잡아야 합니다. 그래서 생성시 정적으로 선언할지 인스턴스로 생성할것인지를 판단해야 합니다.
일반적으로 생성한다면 자동으로 인스턴스로 생성되며 정적으로 생성되면 필드와 메소드 생성시 static 키워드를 붙여서 생성할 수 있습니다.
기본적인 형식은 다음과 같습니다.
static int num = 0; // static 타입 필드 = 초기값
public static void static_methoid() {} // static 리턴 타입 메소드 {}
3. 정적(static) 필드 사용 예시
class Number {
static int num = 0; // 클래스 필드
int num2 = 0; // 인스턴스 필드
}
public class prac1 {
public static void main(String[] args) {
Number number1 = new Number(); // 첫번째 number
Number number2 = new Number(); // 두번째 number
number1.num++; // 클래스 필드 num을 1증가시킴
number1.num2++; // 인스턴스 필드 num2을 1증가시킴
System.out.println(number2.num); // 두번째 number의 클래스 필드 출력
System.out.println(number2.num2); // 두번쨰 number의 인스턴스 필드 출력
}
}
결과)
1
0
Number라는 클래스안에 클래스 변수 num과 인스턴스 변수 num2를 생성하였고 2개의 Number 인스턴스 number1과 number2를 생성했을때 number1을 이용해서 클래스 필드 num과 인스턴스 필드 num2를 각각 증가시키고 인스턴스 number2에서 클래스 필드 num과 인스턴스 필드 num2를 출력했을때의 결과는 서로 다르게 나오게 됩니다.
인스턴스 변수는 인스턴스가 생성될떄마다 생성되므로 인스턴스마다 각기 다른 값을 가지게 되지만 정적 변수는 모든 인스턴스가 하나의 저장공간을 공유하기 때문에 어디서 출력해도 같은 값을 가지고 있게 됩니다.
4. 정적(static) 메서드 사용 예시
class Name {
static void print() { // 클래스 메소드
System.out.println("내 이름은 홍길동입니다.");
}
void print2() { // 인스턴스 메소드
System.out.println("내 이름은 이순신입니다.");
}
}
public class prac1 {
public static void main(String[] args) {
Name.print(); // 인스턴스를 생성하지 않아도 호출 가능
Name name = new Name();
name.print2(); // 인스턴스를 생성해야만 호출 가능
}
}
결과)
내 이름은 홍길동입니다.
내 이름은 이순신입니다.
정적 메소드는 클래스가 메모리에 올라갈 때 정적 메소드가 자동적으로 생성됩니다. 그렇기에 정적 메소드는 인스턴스를 생성하지 않아도 호출을 할 수 있습니다. 정적 메소드는 유틸리티 함수를 만드는데 유용하게 사용됩니다.
'[WEB]' 카테고리의 다른 글
[Java] 자바 참조변수 (0) | 2022.10.06 |
---|---|
[Java] 자바 Optional (0) | 2022.10.01 |
[Java] 윈도우 자바 환경변수 설정방법 (0) | 2022.09.29 |
[Java] 자바 컬렉션 2 (0) | 2022.09.25 |
[Java] 자바 컬렉션 (0) | 2022.09.24 |