클래스 구성요소 → 멤버 (메소드, 필드)
1.메소드
2.필드(변수)
2-1. 멤버변수
a.
클래스 멤버변수(static variable): 객체 내부가 아닌 별도의 공간에 생성, 모든 객체가 공통적으로 똑같은 속성 가질 때
b.
인스턴스 멤버변수(instance variable): 객체 내부에 생성, 각 객체마다 개별적인 속성 가져야 할 때
2-2. 지역 변수(local variable)
*변수를 선언위치에 따라 크게 나누면 멤버 변수(클래스 영역)/지역 변수(메서드나 생성자 내부)
static 멤버
•
객체 밖에 static 멤버를 만들면 객체가 만들어지기 전에도 선언가능
•
객체끼리 static 멤버 공유 가능 (메모리 절약)
•
적용: 객체에 따라 달라지지 않는 메서드나 변수(≒클래스가 본사, 객체가 대리점이면 static 멤버는 본사 직원)
◦
대부분 static field는 상수를 선언할 때 많이 사용 (final static 으로 선언)
•
접근방법:
◦
클래스 이름을 통해서 접근
WiseSaying foundWiseSaying = WiseSayingService.findById(paramId);
→ findById가 무조건 static 멤버
(WiseSayingService 클래스 타입의 객체 생성 전에도 사용가능하므로)
◦
객체를 통해서 접근
WiseSaying foundWiseSaying = wiseSayingService.findById(paramId);
→ 이론적으로는 findById가 static 멤버여도 되고, 아니어도 됨
(그렇지만 findById 기능상 non-static 멤버인 것이 맞음)
staitc 멤버는 객체를 통해서 접근할 수도 있지만 첫번째 방법과 같이 Class를 통해서 접근하는 방법이 권장됨. 왜? 객체를 통해 접근하면 멤버 변수를 접근하고 있는지 static 변수를 접근하고 있는지 쉽게 구분이 안되기 때문
static 메서드의 제약 조건
•
static 메서드는 오직 static 멤버만 접근할 수 있다.
◦
이유? static 메서드는 객체가 생성되지 않은 상황에서도 사용이 가능하므로 객체에 속한 인스턴스 메소드, 인스턴스 변수 등을 사용불가
◦
그러나 인스턴스 메서드는 static 멤버들을 모두 사용 가능
non-static 멤버 vs static 멤버
non-static 멤버 | static 멤버 | |
공간적 특성 | 멤버는 객체마다 별도로 존재(=인스턴스 멤버) | 객체 내부가 아닌 별도의 공간에 생성(=클래스 멤버 변수) |
시간적 특성 | 객체 생성 시에 멤버 생성, 객체 사라지면 멤버도 사라짐 | 클래스 로딩 시에 멤버가 생성→객체가 생기기 전 생성 및 사용 가능, 프로그램 종료 시 사라짐 |
공유 특성 | 공유 X (객체 내 각각 생성되므로 각각의 공간 유지) | 공유 O (공유의 특성: 동일한 클래스의 모든 객체들에 의해 공유) |
static의 활용
•
전역 변수와 전역 함수를 만들 때 활용
◦
캡슐화 원칙(관련이 있는 변수와 함수를 하나의 클래스로 묶고 외부에서 쉽게 접근하지 못하도록)→자바에서는 C/C++와 달리 어떤 변수나 함수도 클래스 바깥에 존재할 수 없으며 클래스의 멤버로 존재하여야 함
◦
그러나 응용프로그램 작성 시 모든 클래스에서 공유하는 전역 변수나 모든 클래스에서 언제든지 호출할 수 있는 전역 함수를 만들어 사용할 필요가 생김
⇒static으로 해결 가능
주제: static 멤버 개념 정리
클래스 구성요소 → 멤버 (메소드, 필드)
1.메소드
2.필드(변수)
2-1. 멤버변수
a.
클래스 멤버변수(static variable): 객체 내부가 아닌 별도의 공간에 생성, 모든 객체가 공통적으로 똑같은 속성 가질 때
b.
인스턴스 멤버변수(instance variable): 객체 내부에 생성, 각 객체마다 개별적인 속성 가져야 할 때
2-2. 지역 변수(local variable)
*변수를 선언위치에 따라 크게 나누면 멤버 변수(클래스 영역)/지역 변수(메서드나 생성자 내부)로 나눌 수 있음
static 멤버
•
객체 밖에 static 멤버를 만들면 객체가 만들어지기 전에도 선언가능
•
객체끼리 static 멤버 공유 가능 (메모리 절약)
•
적용: 객체에 따라 달라지지 않는 메서드나 변수(≒클래스가 본사, 객체가 대리점이면 static 멤버는 본사 직원)
◦
대부분 static field는 상수를 선언할 때 많이 사용 (final static 으로 선언)
•
접근방법:
(현재 위치가 같은 패키지의 다른 클래스, WiseSayingController 클래스라고 할 때)
◦
클래스 이름을 통해서 접근
WiseSaying foundWiseSaying = WiseSayingService.findById(paramId);
→ findById가 무조건 static 멤버
(WiseSayingService 클래스 타입의 객체 생성 전에도 사용가능하므로)
◦
객체를 통해서 접근
WiseSaying foundWiseSaying = wiseSayingService.findById(paramId);
→ 이론적으로는 findById가 static 멤버여도 되고, 아니어도 됨
(그렇지만 findById 기능상 non-static 멤버인 것이 맞음. 예시를 위한 예시)
staitc 멤버는 객체를 통해서 접근할 수도 있지만 첫번째 방법과 같이 Class를 통해서 접근하는 방법이 권장됨. 왜? 객체를 통해 접근하면 멤버 변수를 접근하고 있는지 static 변수를 접근하고 있는지 쉽게 구분이 안되기 때문
static 메서드의 제약 조건
•
static 메서드는 오직 static 멤버만 접근할 수 있다.
◦
이유? static 메서드는 객체가 생성되지 않은 상황에서도 사용이 가능하므로 객체에 속한 인스턴스 메소드, 인스턴스 변수 등을 사용불가
◦
그러나 인스턴스 메서드는 static 멤버들을 모두 사용 가능
non-static 멤버 vs static 멤버
non-static 멤버 | static 멤버 | |
공간적 특성 | 멤버는 객체마다 별도로 존재(=인스턴스 멤버) | 객체 내부가 아닌 별도의 공간에 생성(=클래스 멤버 변수) |
시간적 특성 | 객체 생성 시에 멤버 생성, 객체 사라지면 멤버도 사라짐 | 클래스 로딩 시에 멤버가 생성→객체가 생기기 전 생성 및 사용 가능, 프로그램 종료 시 사라짐 |
공유 특성 | 공유 X (객체 내 각각 생성되므로 각각의 공간 유지) | 공유 O (공유의 특성: 동일한 클래스의 모든 객체들에 의해 공유) |
static의 활용
•
전역 변수와 전역 함수를 만들 때 활용
◦
캡슐화 원칙(관련이 있는 변수와 함수를 하나의 클래스로 묶고 외부에서 쉽게 접근하지 못하도록) → 자바에서는 C/C++와 달리 어떤 변수나 함수도 클래스 바깥에 존재할 수 없으며 클래스의 멤버로 존재하여야 함
◦
그러나 응용프로그램 작성 시 모든 클래스에서 공유하는 전역 변수나 모든 클래스에서 언제든지 호출할 수 있는 전역 함수를 만들어 사용할 필요가 생김
⇒static으로 해결 가능