Static 이란 뭘까요?
static : 영단어를 직역하면 말 그대로 “고정된” 이란 의미를 가지고있다. static이라는
키워드를 사용하여 메소드나 변수를 만들 수 있는데 다른 말로는 정적 필드와 정적 메소드를 생성한다고 할 수 있다. 이 둘을 합쳐놓으면 정적맴버라고 말할 수 있다.
정적 필드와 정적 메소드는 인스턴스(객체)에 소속된 맴버가 아니고 클래스에 고정된 맴버이다. 이말은 즉슨 타 클래스에서 객체를 생성해 해당값을 바꾸면 또 다른 클래스에서 쓰고 있는 정적필드 혹은 정적메소드의 값도 달라지는 것이다.
클래스 로더가 클래스를 로딩하고 메소드 메모리 영역에 넣을때 클래스별로 관리가 된다.
그래서 클래스 로딩이 끝나면 어디든지 다 사용할 수 있다.
Ex) 클래스명.변수명 을 사용하여 접근할 수 있다. 객체를 따로 만들필요가 없다는 뜻!
장단점?
- 장점 : static으로 생성된 정적 맴버들은 Heap영역이 아닌 Static영역으로 저장이 된다. Static영역에 할당된 맴버들은 모든 객체가 공유하고
- 사용하기 때문에 어디서든지 참조하고 사용이 가능하다는 장점이 있다.
- 단점 : Garbage Collector의 영역 밖에 존재해서 Static영역에 있는 맴버들은 프로그램의 종료시까지 메모리에 할당된 채로 존재한다.
- 그렇기에 static을 너무 남용하게 되면 만들고자 하는 프로그래밍이 너무 무겁고 성능이 안좋을 수 있다
그렇다면 heap영역과 static 영역은 무엇일지 대략 알아보자.
- Static : 주로 클래스들이 할당, Garbage Collector 관여 X, 모든 객체가 메모리를 공유
- Heap : 주로 객체들이 할당, Garbage Collector 관여 O , 메모리를 공유하지 않음.
정적(Static) 멤버 선언
필드나 메소드를 생성 시 인스턴스로 생성할것인지 정적으로 생성할 것인지에 대한 판단 기준은 다른 클래스들이랑 공용으로 사용하느냐 아니냐로 정의를 하고,
그냥 생성한다면 자동으로 인스턴스(객체) 가 생성되며 정적으로 생성하려면 필드와 메소드 선언시 static 이라는 키워드를 추가적으로 붙이면 된다.
static int num = 0; //타입 필드 = 초기값
public static void static_method(){} //static 리턴 타입 메소드 {}
정적(Static) 필드 예시
class Number{
static int num = 0; //클래스 필드
int num2 = 0; //인스턴스 필드
}
public class Static_ex {
public static void main(String[] args) {
Number number1 = new Number(); //첫번째 number
Number number2 = new Number(); //두번쨰 number
number1.num++; //클래스 필드 num을 1증가시킴
number1.num2++; //인스턴스 필드 num을 1증가시킴
System.out.println(number2.num); //두번째 number의 클래스 필드 출력
System.out.println(number2.num2); //두번째 number의 인스턴스 필드 출력
}
여기서 number의 클래스에서 생성된 객체들 number1,2 들은 각자 다른 필드를 사용했다
number1 ⇒ 클래스(정적) 필드 num을 1증가시켰다.
number2 ⇒ 인스턴스 필드 num을 1증가시켰다.
그렇다면 둘 다 1씩 증가를 했을까? 일단 결과는 아니다!
그 이유는 인스턴스 변수(필드) 는 인스턴스가 생성될 때마다 생성되므로 각기 다른 인스턴스 마다 다른 값을 가지지만.
정적 변수는 모든 인스턴스가 하나의 저장공간을 공유하기에 항상 같은 값을 가지기에 나타난 형상이다!
정적 메소드는 클래스가 메모리에 올라갈 때 정적 메소드가 자동적으로 생성됩니다.
그렇기에 정적 메소드는 인스턴스를 생성하지 않아도 호출을 할 수 있습니다. 정적 메소드는 유틸리티 함수를 만드는데 유용하게 사용됩니다.
(유틸리티 함수(클래스) 란 클래스의 본래의 목적인 데이터와 데이터처리를 위한 로직의 캡슐화!
가 아닌 비슷한 기능의 메서드와 상수를 모아서 캡슐화 한것이 유틸리티 클래스입니다.)
'Java' 카테고리의 다른 글
윤년과 평년을 구별하는 프로그래밍 (0) | 2023.01.13 |
---|---|
추상클래스와 인터페이스 (0) | 2023.01.13 |
2ndArray 2차원배열 (0) | 2023.01.13 |
AutoBoxing, AutoUnboxing 이란? (0) | 2023.01.13 |
JAVA 객체지향프로그래밍 ⇒ OOP? (0) | 2023.01.13 |