자바 static 변수와 static 메소드에 대해서 알아보자.
static변수(정적변수, 클래스변수)
인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 가진다. static 예약어로 정의된 변수를 클래스(정적)변수라고 한다. 클래스변수는 클래스로 직접 접근한다.
static메소드(정적메소드, 클래스메소드)
메소드 앞에 static이 붙어있으면 정적메소드이고 붙어있지 않으면 인스턴스 메소드이다. 클래스 메소드도 클래스 변수처럼 객체를 생성하지 않고도 "클래스이름.메소드이름(매개변수)"와 같은 식으로 호출이 가능하다. 물론 new키워드로 생성된 모든 객체에 의해서 정적메소드는 공유되기 때문에 생성된 객체로도 접근할 수 있다. 반면에 인스턴스 메소드는 객체를 생성해야만 호출할 수 있다.
인스턴스 메소드는 메소드 작업을 수행하는데 인스턴스 변수를 필요로 하는 메소드이다. 인스턴스 변수는 인스턴스를 생성해야만 만들어지므로 인스턴스 메소드 역시 인스턴스를 생성해야만 호출할 수 있다. 반면에 메소드 중에서 인스턴스와 관계없는 메소드를 클래스 메소드로 정의한다.(인스턴스 변수, 클래스 변수를 통칭해서 멤버변수라고 한다.)
클래스 메소드 내에 인스턴스 변수, 인스턴스 메소드, this를 사용할 수 없다.
*static은 언제 붙여야 좋은가?
1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
2. 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
3. 클래스 메소드는 인스턴스 변수를 사용할 수 없다. (인스턴스 변수는 인스턴스가 반드시 존재해야 사용이 가능하지만, 클래스 변수 및 클래스 메소드는 인스턴스 없이 호출이 가능하기 때문이다.)
4.메소드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다. (메소드 호출시간이 짧아지므로 성능이 향상된다. 인스턴스 메소드는 실행 시 호출되어야할 메소드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다.)
ex)
정적메소드인 printA()에서 인스턴스메소드, 인스턴스 변수, this를 사용하면 에러가 발생한다.
정적변수 a는 하나의 저장공간을 공유하기 때문에 s01.a의 값이 변경되면 s02.a의 값도 변경된다. 인스턴스 변수값은 각 객체마다 저장공간이 다르기 때문에 s01.b의 값을 변경해도 s02.b의값이 바뀌지 않는다.
클래스 메소드는 클래스 변수처럼 객체를 생성하지 않고도 "클래스이름.메소드이름(매개변수)"와 같은 식으로 호출이 가능하다. 물론 new키워드로 생성된 모든 객체에 의해서 정적메소드는 공유되기 때문에 생성된 객체로도 접근할 수 있지만(s.setA(200)), 클래스 메소드이기 때문에 객체로 접근하면 더 오래걸리므로 이클립스에서 경고가 뜨게된다.
'언어공부 > Java' 카테고리의 다른 글
자바 메소드 오버라이딩(Overriding), 오버라이딩과 오버로딩 차이 (0) | 2021.05.11 |
---|---|
자바 상속 extends, 단일상속, 최상위 조상클래스 Object (0) | 2021.05.10 |
자바 this 레퍼런스, this. 와 this() (0) | 2021.05.09 |
자바 생성자(Constructor), 생성자 오버로딩(Constructor Overloading), 초기화 블록 (0) | 2021.05.08 |
자바 메소드 오버로딩(메서드 오버로딩, Method Overloading), 자바 가변인자(Varargs, Variable Argument List) (0) | 2021.05.08 |