본문 바로가기

Java/객체지향 프로그래밍

인스턴스 변수, 클래스변수, 로컬변수

728x90

변수의 종류

1. 인스턴스 변수 : 클래스 영역에 선언. 클래스의 인스턴스를 생성할 때 만들어진다.

     -> 인스턴스마다 고유한 상태를 유지해야하는 속성의 경우, 인스턴스 변수로 선언

2. 클래스 변수 : 모든 인스턴스가 공통된 저장공간(변수)을 공유한다.

     ->한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성

3. 로컬 변수 : 메서드 내에 선언되어 메서드 내에서만 사용 가능, 메서드가 종료되면 소면되어 사용할 수 없다.


클래스 변수와 인스턴스 변수

  • 클래스 변수

- 여러 개의 인스턴스가 static 변수를 공유한다.

- 클래스 변수는 여러 인스턴스가 하나의 메모리 값을 공유할 때 필요하다.

- 기준이 되는 값을 static 변수로 생성하여 유지한다.

 

데이터 영역 스택 메모리 힙 메모리
1001 <- studentLee -> studentLee인스턴스
<- studentSon -> studentSon인스턴스

 

각 학생이 생성될 때 마다 static 변수 값을 복사해 와서 하나 증가시킨 값을 생성된 인스턴스의 학번 변수에 저장해 줌

 

public class Student {
	private static int serialNum = 10000;
    
    int stuentID;
    String studentName;
    
    public Student() {
      serialNum++;
      studentID = serialNum;
    }
    
    public static int getSerialNum() {
    	int i = 10; // 지역변수
        
        i++;
        System.out.println(i);
        
        // studentName = "홍길동"; // 멤버변수, 인스턴스 변수
        // 쓰지 못하는 이유 : 인스턴스 변수를 쓰게 되면 생성되지 않은 인스턴스 변수인 홍길동을 넣게 되는 것
        // 그래서 static 메서드에서는 사용할 수 없다.
        
        return serialNum; // static 변수, 클래스 변수
    }
}

 

public class StudentTest1 {
	public static void main(String[] args) {
    	
        //static 변수는 객체 생성을 굳이 하지 않고 클래스이름으로 바로 사용할 수 있다.
        System.out.println(Student.serialNum);
        
        /*
        Student studentJ = new Student();
        System.out.println(studentJ.studentID);
        
        Student studentT = new Student();
        System.out.println(studentT.studentID);
        System.out.println(Student.serialNum);
        */
    }
}

 

  • 인스턴스 변수

인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있다.

 

 

변수의 유효 범위

 

변수 유형 선언위치 사용 범위 메모리 생성과 소멸
로컬변수 함수 내부에 선언 함수 내에서만 사용 스택 함수가 호출될 때 생성되고 함수가 끝다면 소멸함
인스턴스 변수 클래스 영역 클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서 사용가능 인스턴스가 생성될 때 힙에 생성되고, 가비지 컬렉터가 메모리를 수거할 때 소멸됨
static변수
(클래스 변수)
클래스내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용 가능 데이터 영역 프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸됨

 

출처 : 자바의 정석, do it 자바프로그래밍

 

'Java > 객체지향 프로그래밍' 카테고리의 다른 글

클래스 멤버와 인스턴스 멤버간의 참조와 호출  (0) 2021.09.19
메서드  (0) 2021.09.17