프로그래밍/자바(Java)

[ 자바 / JAVA ] static 키워드(static 변수, static 메소드)

후르트링 2021. 7. 22. 13:49
728x90

static 변수(클래스 변수)

 

[static 변수의 정의]

  • static 변수는 클래스가 정의만 되었을때도 사용할 수 있는 변수입니다.
  • 클래스 변수, 정적 변수라고도 불려집니다.

 

[static 변수의 특징]

  • 인스턴스 생성과는 관계없이 처음 프로그램이 메모리에 로딩될 때 메모리에 할당 됩니다.
  • 인스턴스 간에 공통으로 사용하는 변수가 필요한 경우에 사용합니다.
  • 아래의 코드를 보면 static 변수 serialNum은 인스턴스에서 공통으로 사용하는 것을 확인 할 수있습니다.
class student{ 
    public static int serialNum = 1000; 
    public int studentId; 
    public String studentName; 
} 

class test{ 
    public static void main(String\[\] args) { 
        Student student1 = new Student(); 
        student1.setStudentName("messi"); 
        System.out.println(student1.serialNum); 

        Student student2 = new Student(); 
        student2.setStudentName("ronaldo"); 
        student2.serialNum++; 
        System.out.println(student1.serialNum); 
        System.out.println(student2.serialNum); 
    } 
} 

// 결과값 
// 1000 
// 1001 
// 1001

 

static 메소드(클래스 메소드)

  • static 메소드는 위에 설명한 static 변수와 성격이 유사합니다.
  • 인스턴스를 생성하지 않아도 static 메소드를 호출할 수 있습니다.
  • **static 메소드 내에서는 인스턴스 변수를 사용할 수 없습니다!!**
    • 인스턴스 생성전에 호출이 가능하므로 static 메서드 내부에서는 인스턴스 변수를 사용할 수 없습니다.
public static void setSerialNum(int serialNum) { 
    int i = 0; studentName = "messi"; //오류발생 
    Student.serialNum = serialNum; 
} 

// studentName은 클래스안의 인스턴스 변수이기 때문에 
// 클래스가 선언되지 않은 상태라면 접근이 불가능합니다. 
// 그러므로 static 메소드 안에서의 인스턴스 변수 사용은 불가능합니다.

 

마지막으로 static에 관하여 정리를 하겠습니다.

[non-static 변수(인스턴스 변수)]

  • 공간적 특성 : 해당 변수는 객체마다 별도로 존재합니다.
    인스턴스 변수라고 부릅니다.

 

  • 시간적 특성 : 객체 생성 시에 변수가 생성됩니다.
    객체 생성 후에 변수 사용이 가능해집니다.
    객체가 소멸 되면 해당 변수도 사라집니다.

 

  • 공유의 특성 : 하나의 인스턴스 내부에서만 사용되어집니다.
    변수는 객체 내에 각각 독립된 공간을 유지하므로 공유되지 않는다.

 

[static 변수]

  • 공간적 특성 : 해당 변수는 클래스 당 하나만 생성됩니다.
    해당 변수는 객체 내부가 아닌 별도의 공간에 생성된다.(프로그램 실행시에 메모리 데이터 영역에 생성됩니다)
    클래스 변수라고도 부릅니다.

 

  • 시간적 특성 : 클래스 로딩 시에 변수가 생성된다.
    객체가 생성되기 전에 이미 생성되므로 객체를 생성하지 않고도 사용이 가능하고, 객체가 소멸되어도 static변수는 남아있습니다.
    static 변수는 프로그램이 종료될 때 소멸됩니다.

 

  • 공유의 특성 : 동일한 클래스의 모든 객체들에 의해 공유됩니다.
    같은 클래스로부터 생성된 여러 객체가 하나의 변수를 공유합니다.