☕ Java Static 이해
정보처리기사 Java Static 낚시 문제를 피해보자
📋 목차
ERRORstatic 메소드에서 인스턴스 변수 접근 시도
static 메소드는 클래스 레벨에서 동작하기 때문에 인스턴스 변수에 직접 접근할 수 없습니다. 이는 컴파일 타임에 에러를 발생시킵니다.
import java.util.*;
import java.lang.*;
import java.io.*;
class Person {
private String name;
public Person(String val){
name = val;
}
public static String get() {
return name; // ❌ 컴파일 에러!
}
public void print(){
System.out.println(name);
}
}
class Main {
public static void main(String[] args) {
Person obj = new Person("Yun");
obj.print(); // 이 부분은 정상 동작
}
}
Cannot make a static reference to the non-static field name
static 메소드는 객체 생성 없이도 호출될 수 있기 때문에, 특정 인스턴스에 속한 변수에 접근할 수 없습니다.
SUCCESS일반 메소드에서 static 변수 접근
static 변수는 클래스에 속하므로 일반 메소드에서도 자유롭게 접근할 수 있습니다. 모든 인스턴스가 같은 static 변수를 공유합니다.
import java.util.*;
import java.lang.*;
import java.io.*;
class Person {
private static String name; // static 변수
public Person(String val){
name = val; // static 변수 초기화
}
public static String get() {
return name; // ✅ 정상 동작!
}
public void print(){
System.out.println(name);
}
}
class Main {
public static void main(String[] args) {
Person obj = new Person("Yun");
obj.print();
}
}
Yun
static 변수는 클래스가 로드될 때 메모리에 할당되며, 모든 인스턴스가 공유하는 변수입니다.
INFO인스턴스로 static 메소드 호출
인스턴스를 통해서도 static 메소드를 호출할 수 있습니다. 하지만 권장되지 않는 방식입니다.
import java.util.*;
import java.lang.*;
import java.io.*;
class Person {
private static String name;
public Person(String val){
name = val;
}
public static String get() {
System.out.println(name);
return name;
}
}
class Main {
public static void main(String[] args) {
Person obj = new Person("Yun");
obj.get(); // 인스턴스로 static 메소드 호출
}
}
Yun
BEST클래스명으로 static 메소드 호출
static 메소드는 클래스명을 통해 호출하는 것이 가장 명확하고 권장되는 방식입니다. 인스턴스에서 초기화한 값도 static 변수이므로 접근 가능합니다.
import java.util.*;
import java.lang.*;
import java.io.*;
class Person {
private static String name;
public Person(String val){
name = val;
}
public static String get() {
System.out.println(name);
return name;
}
}
class Main {
public static void main(String[] args) {
Person obj = new Person("Yun");
Person.get(); // 클래스명으로 static 메소드 호출
}
}
Yun
객체 obj에서 name을 초기화해도, name은 static이므로 Person.get()으로 호출해도 "Yun"이 출력됩니다.
WARNING인스턴스 없이 static 메소드 호출
인스턴스를 생성하지 않고 static 메소드를 호출하면 static 변수가 초기화되지 않았을 수 있습니다.
import java.util.*;
import java.lang.*;
import java.io.*;
class Person {
private static String name; // 초기화되지 않음
public Person(String val){
name = val;
}
public static String get() {
System.out.println(name);
return name;
}
}
class Main {
public static void main(String[] args) {
Person.get(); // 인스턴스 생성 없이 호출
}
}
null
인스턴스를 생성하지 않았으므로 생성자가 호출되지 않아 name 변수가 초기화되지 않습니다. 따라서 null이 출력됩니다.
🎯 Static 핵심 정리
- static 변수: 클래스에 속하며 모든 인스턴스가 공유
- static 메소드: 인스턴스 생성 없이 호출 가능
- 접근 규칙: static → static (O), static → instance (X)
- 호출 방식: 클래스명.메소드명() 권장
- 초기화: 생성자를 통한 static 변수 초기화 가능
'정보처리기사' 카테고리의 다른 글
[ 정보처리기사 ] C언어 포인터, 배열 주소 문제 (0) | 2025.07.12 |
---|---|
[ 정보처리기사 ] 프로젝트 관리와 개발 방법론 (2) | 2025.07.09 |
[ 정보처리기사 ] 비용 산정 방법 (1) | 2025.07.09 |
[ 정보처리기사 ] 서브넷팅 FLSM (0) | 2025.07.01 |
[ 정보처리기사 ] 화이트박스 테스트 - 구조적 커버리지 (0) | 2025.07.01 |