개발/Java

Java에서의 변수 유형 및 static 키워드

ju_ni_ 2023. 7. 17. 16:47
반응형

자바 프로그래밍에서는 변수를 사용하여 데이터를 저장하고 처리합니다. 이 때, 변수들은 그 선언 위치에 따라 여러 가지 유형으로 구분됩니다. 오늘은 이러한 변수 유형에 대해 알아보고, 특히 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 키워드를 사용하는 경우는 대체로 두 가지입니다.

 

  1. 변수의 경우, 객체가 공통적으로 공유해야 하는 속성에 static을 붙여 사용합니다. 예를 들어, 학생 클래스에서 모든 학생이 동일한 학교에 다니는 경우, '학교' 변수에 static을 붙여 공유하게 합니다.
  2. 메소드의 경우, 인스턴스 멤버들을 사용하지 않을 때 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

위 출력을 보면, 처음에 AliceBob이 각각 ABC High School에 다닌다고 소개합니다. 그러나 Student.changeSchool("XYZ High School")를 실행한 후에는, 모든 학생이 XYZ High School에 다닌다고 소개하는 것을 볼 수 있습니다. 이는 school이 클래스 변수로 설정되어 있어서, 해당 값을 변경하면 모든 학생 객체가 이 변경을 공유하기 때문입니다.

반응형