자바 static 키워드란 무엇인가?
자바에서 클래스를 다룰 때는 일반적으로 해당 클래스의 멤버에 접근하기 전에 먼저 인스턴스(객체)를 생성해야 합니다. 하지만 클래스의 인스턴스를 만들지 않고도 멤버를 정의하고 싶은 상황이 종종 발생합니다.
바로 이럴 때 static 키워드가 유용합니다. 자바의 static 키워드는 클래스의 인스턴스를 생성하지 않고도 바로 접근할 수 있는 클래스 멤버를 정의할 때 사용됩니다.
이 글에서는 예제 코드와 함께 자바 static 키워드의 기본 개념과 실전 활용 방법을 자세히 살펴보겠습니다.
자바 클래스의 기본 개념
자바에서 클래스(class)는 객체를 만들기 위한 설계도 역할을 합니다. 예를 들어 'OrderCoffee'라는 클래스에는 커피 주문과 관련된 모든 기능, 즉 주문하기, 기존 주문 변경하기, 주문에 새로운 항목 추가하기 같은 함수들이 포함될 수 있습니다.
그다음 이 클래스의 인스턴스인 객체를 생성할 수 있습니다. 예를 들어 'CoffeeOrder12'라는 객체는 CoffeeOrder 클래스라는 설계도를 바탕으로 개별 커피 주문 데이터를 저장하며, CoffeeOrder 클래스 내부에 선언된 모든 함수와 메서드에 접근할 수 있습니다.
클래스의 기본 개념을 이해했으니, 이제 자바 static 키워드에 대해 본격적으로 알아보겠습니다.
자바 static 메서드 (정적 메서드)
static 메서드는 '클래스 메서드'라고도 불리며, 특정 인스턴스가 아닌 클래스 자체에 속하는 메서드입니다. static 메서드는 클래스에 소속되어 있기 때문에 객체를 통해서가 아니라 반드시 클래스 자체를 통해서만 호출할 수 있습니다.
static 메서드를 호출하는 기본 문법은 다음과 같습니다.
Class.methodName();
실제 예제를 통해 어떻게 동작하는지 확인해 보겠습니다.
커피숍의 주문을 관리하는 프로그램을 만든다고 가정해 봅시다. 커피 주문과 관련된 모든 기능을 담는 'CoffeeOrder' 클래스를 생성하려 합니다.
여기서 우리는 새로운 주문이 접수되었을 때 바리스타 콘솔에 알림을 출력하는 기능이 필요합니다. 이 알림 기능은 주문 객체 내부의 다른 코드에 의존하지 않으므로 static으로 선언하는 것이 적합합니다. 다음 코드로 구현할 수 있습니다.
class CoffeeOrder {
int createOrder() {
// Code here
int orderNumber = 92;
return orderNumber;
}
static void printOrder(int order) {
System.out.println("Order #" + order + " order has been placed.");
}
}
class Main {
public static void main(String[] args) {
CoffeeOrder order92 = new CoffeeOrder();
int number = order92.createOrder();
System.out.println("Order number: " + number);
CoffeeOrder.printOrder(number);
}
}실행 결과는 다음과 같습니다.
Order number: 92 Order #92 has been placed.
코드를 단계별로 분석해 보겠습니다. 먼저 'CoffeeOrder' 클래스를 선언했습니다. 이 클래스에는 createOrder()와 printOrder() 두 개의 메서드가 포함되어 있습니다.
createOrder()는 일반 메서드로, 주문을 생성하고 주문 번호를 반환합니다. 반면 printOrder()는 static 메서드로, 콘솔에 새 주문 접수 알림 메시지를 출력하여 바리스타에게 알려주는 역할을 합니다.
메인 프로그램에서는 'order92'라는 CoffeeOrder 객체를 생성하고, createOrder() 메서드로 주문 번호를 받아와 콘솔에 출력합니다.
createOrder() 메서드를 호출할 때는 order92.createOrder()처럼 객체를 통해 접근합니다. 이 메서드는 static이 아니기 때문에 객체를 조작할 때 접근할 수 있기 때문입니다.
반면 코드 마지막 부분에서는 CoffeeOrder.printOrder() 형태로 호출하여 콘솔에 알림 메시지를 출력합니다. printOrder()가 static 메서드이므로 객체가 아닌 클래스(CoffeeOrder)를 통해 접근해야 하기 때문입니다.
만약 createOrder()를 호출했던 것처럼 order92.printOrder() 형태로 객체를 통해 호출하려 한다면, 컴파일러가 경고를 표시하게 됩니다.
자바 static 변수 (정적 변수)
자바의 static 키워드는 static 변수를 생성할 때도 사용할 수 있습니다. static 변수는 클래스에 소속되며, 프로그램 실행 시작 시점에 단 한 번만 초기화됩니다.
static 변수는 특정 객체에 속하지 않기 때문에, 접근하려면 해당 클래스를 참조해야 합니다. 자바에서 static 변수를 선언하는 문법은 다음과 같습니다.
static String COFFEE_NAME = "Espresso";
위 예제에서는 'COFFEE_NAME'이라는 static 변수를 선언하고 문자열 값 "Espresso"를 할당했습니다.
이번에는 static 변수가 실제로 어떻게 활용되는지 예제를 살펴보겠습니다.
커피숍에서 주문을 처리하는 프로그램을 만든다고 가정해 봅시다. 이 프로그램은 근무 중인 바리스타 수를 저장하고, 주문이 생성되면 해당 주문을 준비할 바리스타의 이름을 주문과 연결해야 합니다.
다음 코드로 프로그램을 작성할 수 있습니다.
class CoffeeOrder {
int baristasOnDuty = 2;
static String name = "Hannah Johnson";
public static void main(String[] args) {
CoffeeOrder order111 = new CoffeeOrder();
System.out.println("Baristas on duty: " + baristasOnDuty);
System.out.println("Assigned barista: " + order111.name);
}
}실행 결과는 다음과 같습니다.
Baristas on duty: 2 Assigned barista: Hannah Johnson
이 코드에서는 두 개의 변수를 선언했습니다.
- baristasOnDuty: 일반 변수입니다. 클래스 전체 범위에서 접근할 수 있습니다.
- name: static 변수입니다. 값을 조회하려면 해당 변수가 연결된 클래스 또는 객체를 참조해야 합니다.
메인 프로그램에서는 CoffeeOrder 클래스의 인스턴스를 생성해 'order111'이라 이름 붙였습니다. 그런 다음 "Baristas on duty:"라는 메시지와 함께 baristasOnDuty 변수의 내용을 출력합니다. 이것은 일반 변수이므로 클래스 이름을 참조할 필요가 없습니다.
다음 줄에서는 "Assigned barista:"라는 메시지와 함께 주문이 배정된 바리스타의 이름을 출력합니다. 하지만 바리스타의 이름은 static 변수에 저장되어 있습니다.
따라서 바리스타의 이름을 가져오려면 해당 변수가 연관된 객체의 이름을 참조해야 합니다. 여기서는 order111.name을 사용해 바리스타 이름을 조회했습니다. name 변수가 static이므로 order111 객체를 참조하는 방식으로만 접근할 수 있기 때문입니다.
자바 static 블록 (정적 블록)
static 키워드는 static 블록을 만들 때도 활용할 수 있습니다. 하나의 클래스 안에 서로 다른 static 변수들이 개별적으로 초기화되어야 하는 경우 static 블록을 사용하는 것이 좋습니다.
static 블록은 클래스가 처음으로 메모리에 로드될 때 딱 한 번만 실행됩니다. 자바에서 static 블록의 문법은 다음과 같습니다.
static {
// Code here
}예제를 통해 static 블록이 어떻게 동작하는지 확인해 보겠습니다. 프로그램이 주문을 바리스타에게 배정하기 전에 콘솔에 "A new order is incoming …"라는 메시지를 먼저 출력하여 바리스타들이 미리 준비할 수 있도록 해달라는 요청을 받았다고 가정해 봅시다. 이는 static 블록을 만들어 구현할 수 있습니다. static 블록은 프로그램이 처음 실행될 때 가장 먼저 동작합니다.
앞서 언급한 메시지를 출력한 후 주문을 바리스타에게 배정하는 static 블록의 예제입니다.
class CoffeeOrder {
int baristasOnDuty = 2;
static String name = "Hannah Johnson";
static {
System.out.println("A new order is incoming …");
}
public static void main(String[] args) {
CoffeeOrder order111 = new CoffeeOrder();
System.out.println("Baristas on duty: " + baristasOnDuty);
System.out.println("Assigned barista: " + order111.name);
}
}실행 결과는 다음과 같습니다.
A new order is incoming … Baristas on duty: 2 Assigned barista: Hannah Johnson
코드에서는 먼저 baristasOnDuty와 name 변수를 초기화했습니다. 그다음 프로그램은 "A new order is incoming …"라는 메시지를 콘솔에 출력했습니다. 이 메시지는 static 블록 내부에 저장되어 있던 것입니다. static 블록의 내용이 실행된 후에야 메인 프로그램이 실행되어 이전 예제와 동일한 결과를 출력했습니다.
마무리
자바의 static 키워드는 다양한 용도로 활용됩니다. static 메서드, static 변수, 그리고 static 코드 블록을 만들 때 사용할 수 있습니다.
이 글에서는 예제와 함께 static 키워드의 기본 개념과 메서드, 변수, 코드 블록에서의 활용 방법을 살펴보았습니다. 이제 자바 static 키워드를 능숙하게 활용할 준비가 되셨기를 바랍니다.