Java/문법

Java Static 키워드

ssury94 2024. 12. 13. 12:24
 
 
 

 

Static 변수에 대해 알아봅시다~

 

Student의 변수들을 지정해주면서

serialNumber는 static으로 지정했습니다.

 

어떤 차이가 있을까요?

package entity;

public class Student {

    public String name;
    public int id;

    public static int serialNumber;

    public Student() {
    }


    public void print(){
        System.out.println("이름: "+name+" 아이디: "+id);
        System.out.println("스태틱 변수: "+serialNumber);
    }



}

 

 

 

메인클래스에서

s1. 자동 완성 기능 사용 시

Student클래스에서 작성한 변수와 함수들( s1.id, s1.name, s1.print() )은 자동입력 되는데

s1.serialNumber만 보이지 않습니다? Why??

 

s1.serialNumber는 안보이는 이유?

        //메모리 위치가 다르다!
        //s1.name, s1.id = 메모리 영역의 heap에 위치
        //s1.serialNumber는? -> 메모리 영역의 data에 위치

 

 

메모리 영역이 다르면 어떤 차이가 있지?

        // 객체 생성( new ()  )안해도 이 변수를 마음대로 사용할 수 있다!
        // 클래스이름. 입력시 사용가능

 

 

        // static 변수는 공유되는 데이터

          홍길동의 스태틱 변수 = 김나나의 스태틱 변수

 

 

 

static의 의미와 특징

static을 사용하면 메모리에 한 번만 할당되어 프로그램이 종료될 때까지 유지됩니다.
이는 다음과 같은 특징을 가집니다.

  • 클래스 변수/메소드: static으로 선언된 변수나 메소드는 객체가 아닌 클래스에 속합니다.
  • 공유: 모든 객체가 동일한 static 멤버를 공유합니다.
  • 메모리 효율: 여러 객체가 같은 값을 공유할 때 메모리 사용을 줄일 수 있습니다.
  • 객체 생성 없이 사용: static 멤버는 객체 생성 없이 클래스 이름으로 직접 접근할 수 있습니다.
  • private가 아니라면 클래스 외부에서도 사용가능
  • 프로그램이 시작할 때부터 끝날때까지 상주하므로 크기가 너무 큰 변수를 static으로 선언하는건 좋지 않다.
import entity.Student;

public class StaticTest {
    public static void main(String[] args) {

        //학생 데이터를 저장하려 합니다.
        Student s1=new Student();
        s1.name="홍길동";
        s1.print();

        //s1.serialNumber는 안보이는 이유?
        //메모리 위치가 다르다!
        //s1.name, s1.id = 메모리 영역의 heap에 위치
        //s1.serialNumber는? -> 메모리 영역의 data에 위치
        // = 객체 생성 안해도 이 변수를 마음대로 사용할 수 있다!
        // new () 안해도된다. 클래스이름. 하면 사용가능
        Student.serialNumber=Student.serialNumber+1;
        s1.print();

        Student s2=new Student();
        s2.name="김나나";
        s2.print();


    }
}

 

 

변수 유형에 따른 용도

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

 

 

클래스의 여러 메소드에서 사용할 변수를 지역변수로 선언하면 다른 메서드에서 그 변수를 사용해야 할 때 지역 변수를 메서드의 매개 변수로 전달해야하므로 번거롭다.

그렇다고 모든 변수를 멤버변수나 static변수로 선언하면 메모리 낭비, 가독성이 떨어진다.

특성에 맞게 선언하여 사용하는것이 중요!