-
[자바기초] 클래스와 객체 | static 변수와 메서드º Language º/Java 2023. 3. 4. 16:51
# static 변수가 뭐야?
- 여러 개의 인스턴스(instance)들이 같은 메모리의 값을 공유하기 위해 사용하는 클래스 변수야
- static 변수는 데이터영역(=상수영역, 정적영역) 메모리에 따로 저장돼
- static 변수는 class 변수라고도 해
* 인스턴스(instance)란?
- 하나의 클래스에서 생성된 각각의 객체
- 즉 클래스가 구체화되어 클래스에서 정의된 속성과 성질을 가진 실제적인 객체
- 멤버변수는 인스턴스변수라고도 함
코드 예시
여러 instance들이 같은 메모리 값을 사용하도록 static변수 선언 > serialNumber를 static으로 선언하면 모든 student instance 에 대해 하나의 변수로 유지 되고 이러한 변수를 class변수(=static변수)라한다.
# 프로그램에서 쓰는 메모리 (3가지)
1. 데이터 영역
- static 변수(여러 instance들을 하나의 메모리로 공유하여 사용하는 변수)
- literal (데이터 그 자체, 변수에 넣는 변하지 않는 데이터를 의미)
코드예시
int a = 1;
> 여기서 literal은1이고, int 앞에 final을 붙일 시 a 는 상수(constant)가 된다.
* 상수(constant)와 리터럴(literal)의 차이는?
- 상수 : 변하지 않는 변수를 의미하며 메모리 주소값을 변경할 수 없다.
( but 상수는 숫자 말고도 객체 데이터를 넣을 수도 있는데, 참조 변수를 상수로 사용한 경우 메모리 주소 값만 고정인 것이지 인스턴스 안에 있는 데이터들은 수정이 가능하다.)
- 리터럴 : 변수에 넣는, 값이 변하지 않는 데이터를 의미한다.
2. 스택 메모리
- 지역변수(메소드가 호출될 때 메소드 안에 있는 변수)가 쓰는 메모리
- 함수 내부에서만 사용
- 함수가 호출될 때 생성되고 함수가 끝나면 소멸
3. 힙 메모리
- 멤버 변수(인스턴스 변수)가 쓰는 메모리
- 클래스 내부에서 사용 private이 아니면 참조 변수로 다른 클래스에서 사용 가능
- 인스턴스가 생성될 때 힙 메모리에 생성됨. (new할 때 생성됨)
# static 메서드가 뭐야?
- 클래스(class) 메서드라고도 해.
- 메서드에 static 키워드를 사용하여 구현해.
- 주로 static 변수를 위한 기능을 제공해.
+ static 메서드에서 instance 변수를 사용할 수 없음.
( 인스턴스 변수의 경우 꼭 인스턴스가 먼저 생성 되어야 하므로, static 메서드에서는 생성이 불확실한 인스턴스 변수를 사용할 수 없기 때문)
+ static 메서드도 인스턴스 생성과 관계 없이 클래스 이름으로 직접 메서드 호출함.
변수의 유효 범위 # static 응용 : 싱글톤(singleton) 패턴이 뭘까?
- 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미
- 즉 클래스의 객체를 하나로 제한하는 것
- 동일한 자원이나 데이터를 처리하는 객체가 불필요하게 여러 개 만들어질 필요가 없는 경우 사용
장점
- 최초 한번의 new 연산자를 통해 고정된 메모리 영역을 사용하여 추후 해당 객체에 접근할 때 메모리 낭비를 방지함
- 이미 생성된 인스턴스를 활용하여 속도 측면에서도 이점이 있음
- 싱글콘 인스턴스가 전역으로 사용되는 인스턴스라서 다른 클래스의 인스턴스들이 접근하여 사용할 수 있음
단점
- 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하면 동시성 문제가 발생할 수 있어 유의해야 함
- 싱글톤 패턴을 구현하는 코드 자체가 많이 필요함
- 싱글톤 인스턴스는 자원을 공유하고 있기 때문에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화해주어야 하여 테스트 하기 어려움
- 자식클래스를 만들 수 없고, 내부 상태를 변경하기 어려움.
-> 단독으로 사용할 경우 객체 지향에 위반이 되는 사례가 많아 스프링 컨테이너 같은 프레임워크 도움을 받아 문제점을 보완할 수 있음.
코드예시
public class singleton {
private static Singleton instance = new Singleton();
private singleton() {
// 생성자는 외부에서 호출못하게 private 으로 지정해야 한다.
}
public static Singleton getInstance() {
return instance;
}
public void say() {
System.out.println("hi, there");
}
}'º Language º > Java' 카테고리의 다른 글
[자바기초] 배열 | 객체 배열 사용하기 (0) 2023.03.07 [자바기초] 배열 | 배열선언, 초기화, 문자배열 (0) 2023.03.06 [자바기초] 클래스와 객체 | this가 하는 일 (0) 2023.03.01 [자바기초] PART2 구구단 값 입력 및 변수 (0) 2022.08.17 [자바기초] PRAT1 프로그래밍 시작 및 개발환경 구축 (Github토큰 생성하는 법) (0) 2022.08.02