Java static 키워드 - 클래스 메서드와 클래스 변수
요약
Java static 키워드의 개념과 사용법을 알아봅니다. static 메서드와 static 변수의 특징, 인스턴스 없이 클래스명으로 호출하는 방법 등 정보처리기사 실기에 출제되는 핵심 개념을 정리합니다.
static 핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| static 메서드 | 인스턴스 없이 클래스명으로 호출 가능 | Gamja.check(1) |
| static 변수 | 모든 인스턴스가 공유하는 변수 | static int count = 0; |
| 인스턴스 메서드 | 객체를 생성해야 호출 가능 | new Gamja().check(1) |
| main 메서드 | 프로그램 시작점, 항상 static | public static void main(...) |
static이란? 쌩기초
static은 "클래스에 소속된"이라는 의미의 키워드입니다. static이 붙은 메서드나 변수는 객체(인스턴스)를 만들지 않아도 사용할 수 있습니다.
클래스는 원래 객체를 만들기 위한 **설계도(틀)**입니다. 일반 변수와 메서드는 설계도로 객체를 찍어내야 비로소 생기지만, static이 붙으면 설계도 자체에 바로 존재합니다.
- static 멤버: 설계도(클래스)에 소속 → 객체 없이 접근 가능
- 인스턴스 멤버: 객체에 소속 → 객체를 만들어야 접근 가능

그래서 static 변수를 "클래스 변수", static 메서드를 "클래스 메서드"라고 부릅니다 — 객체가 아니라 클래스에 소속되니까요.
일반 메서드 vs static 메서드
일반적으로 메서드를 호출하려면 객체를 먼저 생성해야 합니다.
하지만 static을 붙이면 클래스명으로 바로 호출할 수 있습니다.
| 호출 방식 | static 필요 여부 | 예시 |
|---|---|---|
객체.메서드() | 불필요 | new Gamja().check(1) |
클래스명.메서드() | 필요 | Gamja.check(1) |
static 메서드 (클래스 메서드) 기초
static이 붙은 메서드를 static 메서드 또는 클래스 메서드라고 합니다.
static 메서드의 제약
static 메서드 안에서는 인스턴스 변수와 인스턴스 메서드에 직접 접근할 수 없습니다. static 메서드는 객체 없이도 호출되므로, 객체에 소속된 멤버를 사용할 수 없기 때문입니다.
| static 메서드에서 | 접근 가능 여부 |
|---|---|
| static 변수 | 가능 |
| static 메서드 | 가능 |
| 인스턴스 변수 | 불가능 |
| 인스턴스 메서드 | 불가능 |
static 메서드와 오버라이딩
static 메서드는 클래스에 소속되어 있기 때문에 오버라이딩이 적용되지 않습니다. Parent ref = new Child()에서 ref.id()를 호출하면, 실제 객체(Child)가 아니라 선언 타입(Parent)의 id()가 호출됩니다.
왜 이렇게 동작하는지, 인스턴스 메서드와의 차이는 메서드 오버라이딩 - static 메서드와 인스턴스 메서드 페이지에서 자세히 설명합니다.
static 변수 (클래스 변수) 기초
static이 붙은 변수를 static 변수 또는 클래스 변수라고 합니다. 모든 인스턴스가 하나의 값을 공유합니다.
| 구분 | 인스턴스 변수 | static 변수 |
|---|---|---|
| 키워드 | static 없음 | static 있음 |
| 소속 | 각 객체마다 별도 | 클래스에 하나만 존재 |
| 공유 여부 | 객체마다 독립적 | 모든 객체가 공유 |
| 접근 방법 | 객체.변수 | 클래스명.변수 또는 객체.변수 |
main 메서드가 static인 이유 기초
Java 프로그램의 시작점인 main 메서드는 항상 static으로 선언됩니다.
프로그램이 시작될 때 아직 아무 객체도 생성되지 않은 상태이기 때문입니다. 객체 없이도 호출할 수 있어야 하므로 main은 반드시 static이어야 합니다.
String[] args는 뭔가요?
String[] args는 프로그램 실행 시 외부에서 전달하는 문자열 배열입니다. Java가 정한 main 메서드의 고정된 형식이라서, 사용하지 않더라도 반드시 써야 합니다. 빼면 Java가 main 메서드를 인식하지 못해서 프로그램이 실행되지 않습니다. 시험에서는 args를 실제로 사용하는 경우가 거의 없으므로, main 메서드의 고정 형식 정도로 알고 넘어가면 됩니다.
이것이 main 메서드 안에서 같은 클래스의 일반 메서드를 호출할 때 객체를 생성하거나 해당 메서드를 static으로 선언해야 하는 이유입니다.
문제 풀이: 21년 2회 기출 심화
이 문제는 빈칸에 들어갈 키워드를 찾는 문제입니다.
풀이 과정
1단계: 호출 방식 확인
Gamja.check(1) - 클래스명(Gamja) 으로 직접 메서드를 호출하고 있습니다.
2단계: 키워드 판단
클래스명으로 직접 호출하려면 해당 메서드가 static이어야 합니다.
3단계: check 메서드 동작 확인
num에 1이 전달됨1 >= 0은 참 ->"positive"반환- 출력: positive