07-03 스태틱
스태틱(static)은 클래스에서 공유되는 변수나 메서드를 정의할 때 사용된다. 이번 절에서는 스태틱에 대해서 자세히 알아보자. [TOC] ## static 변수 다음과 …
wikidocs.net
스태틱(static)은 클래스에서 공유되는 변수나 메서드를 정의할 때 사용된다.
위 링크를 보고 공부했기 때문에 아래 예시를 보면서 static을 더 자세히 이해했다.
- static이 있는 경우
class HouseLee {
static String lastname = "이";
}
public class Sample {
public static void main(String[] args) {
HouseLee lee1 = new HouseLee();
HouseLee lee2 = new HouseLee();
// lee1.lastname을 변경
lee1.lastname = "리";
// 출력
System.out.println("lee1.lastname: " + lee1.lastname); // 출력: 리
System.out.println("lee2.lastname: " + lee2.lastname); // 출력: 리
}
}
# lee1.lastname: 리
# lee2.lastname: 리
- static이 없는 경우
class HouseLee {
String lastname = "이";
}
public class Sample {
public static void main(String[] args) {
HouseLee lee1 = new HouseLee();
HouseLee lee2 = new HouseLee();
// lee1.lastname을 변경
lee1.lastname = "리";
// 출력
System.out.println("lee1.lastname: " + lee1.lastname); // 출력: 리
System.out.println("lee2.lastname: " + lee2.lastname); // 출력: 이
}
}
# lee1.lastname: 리
# lee2.lastname: 이
맨 아래 부분의 결과값을 보면 확연히 다르다. 어떤 점이 다를까?
1. Static 변수가 있는 경우에는 두 인스턴스가 동일한 값을 갖지만,
2. Static 변수가 없는 경우에는 각 인스턴스가 독립적인 값을 갖게 된다.
이것을 풀어 설명하자면,
1. lastname 변수는 클래스 수준에 속하게 된다. 즉, 모든 HouseLee 클래스의 인스턴스가 이 변수를 공유한다. 따라서 lee1.lastname 또는 lee2.lastname을 통해 접근할 수 있다. 이 변수의 값은 모든 HouseLee 인스턴스에 동일하게 적용된다. 즉, lee1.lastname을 변경하면 lee2.lastname도 같은 값으로 변경된다.
2. lastname 변수는 인스턴스 수준에 속하게 된다. 따라서 각 HouseLee 인스턴스마다 별도의 lastname 변수가 생성된다. 예를 들어, lee1.lastname을 변경하더라도 lee2.lastname에는 영향을 주지 않는다. 인스턴스마다 독립적인 값을 가진다.
따라서 static의 역할은 이렇게 정리할 수 있다.
- 클래스 수준의 변수 및 메서드 생성: static 키워드를 사용하면 해당 변수 또는 메서드가 클래스 수준에 속한다. 즉, 클래스에 하나의 변수 또는 메서드가 생성되며, 모든 인스턴스가 이를 공유하게 된다.
- 인스턴스 생성 없이 접근 가능: static 멤버는 클래스에 직접 접근할 수 있으므로 인스턴스를 생성하지 않고도 접근할 수 있다.
- 메모리 효율성: static 멤버는 한 번만 메모리에 할당되며, 모든 인스턴스가 이를 공유하므로 메모리를 효율적으로 사용할 수 있다.
- 상수 정의: static final로 선언된 변수는 상수로 간주되어 값을 변경할 수 없다. 이러한 상수는 프로그램 내에서 일관성 있는 값을 사용할 때 유용하다.
- 정적 메서드: static 키워드가 메서드에 사용될 경우, 해당 메서드는 인스턴스에 속하지 않으며 클래스 수준에 존재다. 따라서 인스턴스를 생성하지 않고도 해당 메서드를 호출할 수 있다. 정적 메서드는 주로 유틸리티 함수 또는 헬퍼 함수를 정의할 때 사용된다.
'언어 > Java' 카테고리의 다른 글
[JAVA] 스레드 (0) | 2024.04.13 |
---|---|
[Java] record (0) | 2024.04.12 |
[Java] JVM 개요 (0) | 2024.04.11 |
[Java] 추상 클래스란? (0) | 2024.04.07 |
Java 객체 속성 설정 관련 공부 (1) | 2024.04.06 |