반응형
자바 프로그래밍에서는 변수를 사용하여 데이터를 저장하고 처리합니다. 이 때, 변수들은 그 선언 위치에 따라 여러 가지 유형으로 구분됩니다. 오늘은 이러한 변수 유형에 대해 알아보고, 특히 static 키워드가 어떤 역할을 하는지 자세히 알아보겠습니다.
변수의 종류
자바에서는 변수의 유형을 아래와 같이 세 가지로 분류합니다.
- 지역 변수(Local Variable) : 메소드 내부에 선언된 변수로, 해당 메소드 내에서만 사용 가능합니다.
- 인스턴스 변수(Instance Variable) : 클래스 영역, 즉 메소드 외부에 선언된 변수로, 해당 클래스의 객체에서 사용 가능합니다.
- 클래스 변수(Class Variable) : 클래스 영역에 선언되면서 static이 붙은 변수로, 모든 객체가 공유합니다. 공통적인 속성을 가질 때 사용합니다.
public class VariableExample {
int instanceVariable; // 인스턴스 변수
static int classVariable; // 클래스 변수
void method() {
int localVariable; // 지역 변수
}
}
static 키워드란?
static 키워드는 클래스 멤버(클래스 변수, 메소드)에 붙여 사용합니다.
- static 메소드 : 객체 생성 없이 클래스 이름을 통해 호출 가능하며, 인스턴스 멤버들을 사용할 수 없습니다. static 메소드 내에서는 static 변수와 지역변수만 사용 가능합니다.
- 인스턴스 메소드 : 객체 생성 후, 참조변수를 통해 호출하며, 인스턴스 변수를 사용할 수 있습니다.
public class StaticExample {
static int staticVariable; // 클래스 변수
static void staticMethod() { // static 메소드
System.out.println(staticVariable);
}
void instanceMethod() { // 인스턴스 메소드
staticMethod(); // 인스턴스 메소드 내에서 static 메소드 호출 가능
}
}
static 키워드를 사용하는 경우는 대체로 두 가지입니다.
- 변수의 경우, 객체가 공통적으로 공유해야 하는 속성에 static을 붙여 사용합니다. 예를 들어, 학생 클래스에서 모든 학생이 동일한 학교에 다니는 경우, '학교' 변수에 static을 붙여 공유하게 합니다.
- 메소드의 경우, 인스턴스 멤버들을 사용하지 않을 때 static을 붙여 사용합니다. 예를 들어, 두 숫자의 최대 공약수를 구하는 메소드는 특정 객체의 상태에 의존하지 않기 때문에 static을 붙여 사용할 수 있습니다.
예제)
아래 예제에서는 '학생' 클래스를 이용해 인스턴스와 클래스 변수의 차이와 활용법을 살펴보겠습니다. 인스턴스 변수는 각 객체의 고유한 특성을, 클래스 변수는 공유되는 속성을 나타냅니다.
class Student {
// 인스턴스 변수들: 이 변수들은 각 학생 객체별로 서로 다른 값을 가질 수 있습니다.
String name;
int age;
// 클래스 변수: 이 변수는 모든 학생 객체들이 공유하는 하나의 값입니다.
static String school = "ABC High School";
// 인스턴스 메소드: 이 메소드는 각 학생 객체별로 호출될 수 있습니다.
// 학생이 자신을 소개하는 문장을 출력합니다.
void introduce() {
System.out.println("My name is " + name + ", I'm " + age + " years old and I go to " + school);
}
// static 메소드: 이 메소드는 클래스 전체에 적용되며, 모든 학생 객체들이 이 메소드의 효과를 공유합니다.
// 학생들이 다니는 학교 이름을 변경합니다.
static void changeSchool(String newSchool) {
school = newSchool;
}
}
public class Main {
public static void main(String[] args) {
// 두 개의 학생 객체를 생성합니다.
Student student1 = new Student();
Student student2 = new Student();
// 각 학생 객체에 대해 이름과 나이를 설정합니다.
student1.name = "Alice";
student1.age = 16;
student2.name = "Bob";
student2.age = 17;
// 각 학생 객체에 대해 자신을 소개하는 메소드를 호출합니다.
student1.introduce();
student2.introduce();
// 구분 선
System.out.println("-------------------------------------")
// 클래스 메소드를 호출하여 모든 학생이 다니는 학교를 변경합니다.
Student.changeSchool("XYZ High School");
// 학교 이름이 변경된 후, 다시 학생들이 자신을 소개하게 하여 변경된 학교 이름을 확인합니다.
student1.introduce();
student2.introduce();
}
}
위 코드를 실행했을 때의 출력:
My name is Alice, I'm 16 years old and I go to ABC High School
My name is Bob, I'm 17 years old and I go to ABC High School
-------------------------------------
My name is Alice, I'm 16 years old and I go to XYZ High School
My name is Bob, I'm 17 years old and I go to XYZ High School
위 출력을 보면, 처음에 Alice와 Bob이 각각 ABC High School에 다닌다고 소개합니다. 그러나 Student.changeSchool("XYZ High School")를 실행한 후에는, 모든 학생이 XYZ High School에 다닌다고 소개하는 것을 볼 수 있습니다. 이는 school이 클래스 변수로 설정되어 있어서, 해당 값을 변경하면 모든 학생 객체가 이 변경을 공유하기 때문입니다.
반응형
'개발 > Java' 카테고리의 다른 글
Java에서의 오버로딩, 오버라이딩, 그리고 super() (0) | 2023.07.18 |
---|---|
Java에서의 클래스 상속 (0) | 2023.07.18 |
Java에서의 클래스(Class): 이해와 활용 (0) | 2023.07.17 |
Java에서의 메소드(Method): 이해와 활용 (0) | 2023.07.13 |
Java에서의 배열: 활용 (0) | 2023.07.13 |