Java에서의 static 정의

고 연우·2022년 10월 27일
0

Java

목록 보기
5/6

인프런의 "Do it! 자바 프로그래밍 입문" 강의에서 정리한 내용


🔶static

  • 정적 변수란 의미
  • 여러 개의 인스턴스가 같은 메모리의 값을 공유하기 위해 사용
  • 상수 영역, 정적 영역
  • static 변수는 인스턴스가 생성될 때 마다 다른 메모리를 가지는 것이 아니라 프로그램이 메모리에 적재(load)될 때 데이터 여역의 메모리에 생성 됨.
    • 클래스 이름으로 직접 참조 함.
    		Student.serialNum = 100;	// serailNum이 static 변수
    • 클래스 변수라고도 함.

🔸예제 1

학생들이 생설될 때 마다 학번을 부여해 줌.
학번은 증가할 때 마다 1씩 증가함.

<Student.java>

package staticEx;

public class Student {

    static int serialNum = 10000;

    int studentID;
    String studentName;

    public Student() {

        serialNum++;
        studentID = serialNum;
    }

}

<StudentTest1.java>

package staticEx;

public class StudentTest1 {

    public static void main(String[] args) { // 단축키 psvm

        Student studentJ = new Student();
        System.out.println(studentJ.studentID);

        Student studentT = new Student();
        System.out.println(studentT.studentID);

        System.out.println(studentJ.serialNum);
        System.out.println(studentT.serialNum);
    }

    // 출력
    // 10001
    // 10002
    // 10002
    // 10002
}
  • new Student()를 생성할 때 마다, static 변수인 serialNum이 1씩 증가 됨.
    • Student studentJ = new Student(); -> 내부에서 serialNum++ 이 진행되고 studentID에 저장 됨.
    • Student studentT = new Student();
  • 인스턴스 객체에 static 변수를 사용할 때, 아래와 같은 경고문이 뜸
    • 클래스 이름으로 static 변수는 참조해줘야 함. -> Student.serialNum 식으로 수정해줘야 함.

🔻static 변수 예

  • 여러 인스턴스가 하나의 메모리 값을 공유할 때 필요
  • 기준이 되는 값은 static 변수로 생성하여 유지 함.

🔸예제 2

만약, student.java를 아래와 같이 수정한다면...

package staticEx;

public class Student {

    private static int serialNum = 10000;

    int studentID;
    String studentName;

    public Student() {

        serialNum++;
        studentID = serialNum;
    }

    public static int getSerialNum() {

        int i = 10; // 지역 변수

        i++;
        System.out.println(i);

        studentName = "test";   // 멤버 변수, 인스턴스 변수 => 에러남

        return serialNum;   // static 변수, 클래스 변수
    }

}
  • static 메서드 안에서는 멤버 변수(인스턴스 변수) 사용 불가능.
    • 왜냐하면 static은 프로그램이 로드 될 때, 메모리에 적재가 되지만 멤버 변수(인스턴스 변수)는 new로 객체가 생성될 때(인스턴스가 생성 될 때?) 생성이 되기 때문에 에러가 남.
    • 즉, 인스턴스 변수의 경우 꼭 인스턴스가 먼저 생성되어야 하므로 static 메서드에서는 생성이 불확실한 인스턴스 변수를 사용할 수 없음.

🔶변수의 유효 범위 정리

0개의 댓글