클래스 멤버와 인스턴스 멤버
- 클래스 맴버(Static 멤버라고도함) : 클래스 변수와 클래스 메소드 = 선언할 때 앞에 static이라고 붙은 경우
- 또한, 클래스 변수는 전역변수라고 할 수 있음
- 인스턴스 맴버(Unstatic 멤버라고함) : 인스턴스 변수와 인스턴스 메소드 = 선언할 때 앞에 static이라고 붙지 않은 경우
- (참고) 전역변수 종류는 두가지로 인스턴스 변수(객체 변수), 클래스 변수(static 변수)가 있다
static int static_variable = 1;
⇒ 스테틱(클래스)변수 ⇒ 인스턴스 생성없이 클래스에서 바로 접근 가능
int instance_variable = 2;
⇒ 인스턴스 변수 ⇒ 인스턴스를 만들어야지만 생성됨
클래스 변수
클래스 변수의 용도를 정리해보면 아래와 같다.
-
변수 앞에 static
이라는 용어가 붙으면 클래스 변수이다
-
클래스 변수는 인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우
-
즉, 인스턴스 생성 없이 접근 가능
-
인스턴스에 따라서 변하지 않는 값이 필요한 경우 (위의 예에서는 PI)(이런 경우 final
을 이용해서 상수로 선언하는 것이 바람직 하지만 final
을 아직 배우지 않았기 때문에 언급하지 않았다)
- (참고)
final
: final은 (어떠한 경우에도) 상속/변경을 금지
하는 규제다. <> abstract 반대 개념
-
값의 변경 사항을 모든 인스턴스가 공유해야 하는 경우
클래스 메소드
- 인스턴스를 만들지 않고 클래스 자체에서 method를 호출함
즉, 클래스에 직접 접근해서 method 호출 가능
- ex)
Calculator3.sum(10, 20);
c1.setOprands(10, 20)
=> 이런건 c1이라는 인스턴스가 10, 20이라는 값을 지닐 필요가 있을때 인스턴스로 만들때 이값들도 넣어주는거라 보면 됨
- 이와 달리, 클래스 메소드를 쓰는 경우는 일회성으로 특정 값을 가지고 method 활용하려고 할때 쓴다고 볼 수 있음
- 이경우
굳이 메모리를 쓰면서 인스턴스를 만들지 않기 때문에
메모리가 절약
된다고 볼 수 있음
- 아래 스샷처럼 같은 클래스 내에서 static으로 method를 만들어주면
class이름.method
형식이 아니라 다이렉트로 method
사용 할 수 있음
클래스 vs 인스턴스 맴버들 간의 관계
- 인스턴스 메소드는 클래스 맴버에 접근할 수 있다.
- 클래스 메소드는 인스턴스 맴버에 접근할 수 없다.
- 쉽게 생각해서 클래스는 인스턴스 만들지 않고 접근 가능하기때문에 인스턴스 멤버에서 클래스 멤버로 접근 가능.
- 반대로 인스턴스는 클래스가 만들어진 다음에 만들어지기 때문에 ⇒ 클래스 멤버에서 인스턴스 멤버로 접근할 수 없다
- 클래스를 만들고 ⇒ 이후에 인스턴스를 만들어짐.
- 그렇기 때문에, 클래스 멤버는 이후에 만들어진 인스턴스멤버에는 접근하지 못한다
- 1) 클래스 만들어지고 이후에 만들어 지는 것이기 때문에, 아직 안 만들어진 상태일 수 있고
- 2) 어떤 인스턴스 인지 알 수 없음
- 반대로 인스턴스가 만들어졌다는 거는 클래스가 만들어졌다는 것을 의미하기때문에 인스턴스 ⇒ 클래스로는 접근 가능
정리
- 인스턴스 변수와 클래스 변수는 아래와 같이 부르기도 하기 때문에 아래와 같은 용어로 쓰여도 헷갈리지 말자
- 인스턴스 변수 ⇒ Non-Static Field
- 클래스 변수 ⇒ Static Field
- 변수 <> Field 서로 대체 가능한 용어
- 클래스 메소드를 인스텐스를 만들지 않기 때문에 일회성으로 특정 값을 가지고 method 활용하려고 할때 쓴다고 볼 수 있음 ⇒
굳이 메모리를 쓰면서 인스턴스를 만들지 않기 때문에
메모리가 절약
된다고 볼 수 있음
References