[Java]변수의 종류와 메모리,static

Lia·2022년 10월 13일
1

☕️ Java

목록 보기
3/5
post-thumbnail

변수란?

이름 붙여진 특정 메모리 공간으로 특정 값을 저장한다.
여기서 메모리(memory)란, 컴퓨터의 핵심 부품으로 기억을 담당한다. 또 다른 핵심 부품으로는 CPU(연산 담당)가 있다.

변수와 메모리

  • 변수는 기본적으로 메모리의 주소를 기억하는 역할을 한다.
  • 변수를 선언한다는 것은 해당 자료형의 크기 만큼의 메모리를 사용하겠다는 것을 의미한다.
  • 변수를 참조할 때는 메모리의 주소가 아닌 해당 주소에 저장된 데이터를 참조한다. 따라서 변수는 데이터가 저장된 메모리의 주소뿐만 아니라 저장된 데이터의 길이와 형태에 관한 정보도 같이 기억해야 한다.

😲 메모리 주소란❓

메모리 공간에서의 정확한 위치를 식별하기 위한 고유 주소(식별자)

변수의 종류

멤버변수는 클래스에 생성한 변수를 의미하며, 지역변수는 메소드 안에서 (지역적으로) 선언한 변수를 말한다.

메모리에 적재되는 위치

  • 인스턴스 변수와 지역변수는 객체가 생성될 때마다 Stack영역에 매번 새로 생성되지만 클래스 변수는 Static Area(클래스영역)에 한 개만 생성되고 하나의 영역을 공유한다.

변수의 선언 위치 및 생명주기

  • 지역변수 : 중괄호 내에서 선언, 중괄호 내에서만 유효
  • 매개변수 : 메소드에 넘겨주는 변수, 메소드가 호출될 때 생명이 시작하고, 메소드가 끝나면 소멸함
  • 인스턴스 변수 : 메소드 밖에, 클래스 안에 선언된 변수, static예약어가 붙지 않음, 객체가 생성될 때 생명이 시작되고 , 그 객체를 참조하고 있는 다른 객체가 없으면 소멸
  • 클래스 변수 = Static변수 : 인스턴스 변수처럼 메소드 밖에, 클래스 안에 선언된 변수 중에서 static 예약어가 붙은 변수, 클래스가 처음 호출될 때 생명이 시작되고, 자바프로그램이 끝날때 소멸
    • Static 변수
      정적 변수라고도 한다. static 변수는 다른 멤버 변수처럼 클래스 내부에 선언한다.
      static 변수는 프로그램이 실행되어 메모리에 올라갔을 때 딱 한번 메모리 공간이 할당된다. 그리고 그 값은 모든 인스턴스가 공유한다.
      다시말해 일반 멤버 변수는 인스턴스가 생성될 때 마다 새로 생성되어 각각 다른 변수로 존재하지만, static 으로 선언한 변수는 인스턴스 생성과 상관없이 먼저 생성되어 그 값을 모든 인스턴스가 공유하게 되는 것이다. static 변수를 클래스에 기반한 변수라 하여 클래스변수 라고도 한다. static 변수는 인스턴스 생성과는 별개이므로 인스턴스보다 먼저 생성된다. 그러므로 인스턴스가 아닌 클래스 이름으로도 참조하여 사용할 수 있다.

😲정적(Static)이란❓
정적(static)은 고정된,정적인 이란 의미다.
Static이라는 키워드를 사용하여 Static변수와 Static메소드를 만들 수 있는데 다른말로 정적필드와 정적 메소드라고도 하며 이 둘을 합쳐 정적 멤버라고 한다. (클래스 멤버라고도 함) 정적 필드와 정적 메소드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버이므로 JVM의 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할때 클래스별로 관리된다. 따라서 클래스의 로딩이 끝나는 즉시 바로 사용할 수 있다.

Static 정리
1) 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙인다. 인스턴스를 생성하게되면 각 인스턴스들을 서로 독립적이기 때문에 서로 다른 값을 유지한다.
하지만 인스턴스들이 공통적으로 같은 값을 유지해야 하는 경우 static을 붙이면 관리가 편리하다.

2) static이 붙은 멤버변수는 객체를 생성하지 않아도 사용할 수 있다.
static이 붙은 멤버변수(클래스변수)는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문이다.

3) static이 붙은 함수에서는 인스턴스 변수를 사용할 수 없다. static이 붙은 함수는 인스턴스 생성 없이 호출가능한 반면, 인스턴스 변수는 인스턴스를 생성해야만 존재한다.그러므로 static이 붙은 함수(클래스메소드)를 호출 할 때 인스턴스가 생성되어 있을 수도, 그렇지 않을 수도 있어서 static이 붙은 메소드에서 인스턴스 변수 사용을 허용하지 않는다.
하지만, 반대의 경우인 인스턴스 변수나 인스턴스 함수에서는 static이 붙은 멤버들을 사용하는 것이 언제나 가능하다. 인스턴스 변수가 존재한다는 것은 static이 붙은 변수가 이미 메모리에 존재한다는 것을 의미하기 때문이다.

4) 함수 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다. 함수의 작업 내용중에서 인스턴스 변수를 필요로 한다면,static을 붙일 수 없다.
반대로 인스턴스 변수를 필요로 하지 않는다면, 가능하면 static을 붙이는 것이 좋다. 함수 호출시간이 짧아지기 때문에 효율이 높아지기 때문이다.(static을 안붙인 함수는 실행시 호출되어야할 함수를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다.)

5)
클래스 설계시 static의 사용지침

  • 먼저 클래스의 멤버 변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 살펴보고 있다면 static을 붙여준다.

  • 작성한 함수 중에서 인스턴스 변수를 사용하지 않는 함수에 대해서 static을 붙일 것을 고려한다.일반적으로 인스턴스 변수와 관련된 작업을 하는 함수는 인스턴스 메소드(static이 안붙은 메소드) 이고 static 변수(클래스 변수)와 관련된 작업을 하는 메소드는 클래스 메소드(static이 붙은 메소드)라고 보면 된다.

정적(Static) 멤버 생성

그럼 모든 멤버에 static을 붙여주면 되겠네?라는 생각이 들 수도 있다😲
장점이 있으면 단점도 있는 법❗️

Static 키워드를 통해 생성된 정적멤버들은 Heap영역이 아닌 Static영역에 할당된다. Static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있는 장점을 가지지만 Garbage Collector의 관리 영역 밖에 존재하기에 Static영역에 있는 멤버들은 프로그램의 종료시까지 메모리가 할당된 채로 존재하게 됩니다. 그렇기에 Static을 너무 남발하게 되면 만들고자 하는 시스템 성능에 악영향을 줄 수 있다.

클래스변수 vs 인스턴스변수

클래스 변수(Static 멤버)

  • 클래스 내에 Static 키워드로 선언된 변수
  • 처음 JVM이 실행되어 클래스가 메모리에 올라갈 때 ~ 프로그램이 종료될 때까지 유지
  • 클래스가 여러 번 생성되어도 Static 변수는 처음 딱 한 번만 생성됨
  • 동일한 클래스의 모든 객체들에 의해서 공유됨

인스턴스 변수(Non-static 멤버)

  • 클래스 내에 선언된 변수
  • 객체 생성 시마다 매번 새로운 변수가 생성됨
  • 클래스 변수와 달리 공유되지 않음

📍 Reference

[JAVA] 자바의 변수 (클래스 변수, 인스턴스 변수, 지역 변수)

어떤 종류의 변수를 어떤 목적을 가지고, 적절하게 사용하기 위해선 각 변수의 차이와 특징을 꼭 알고 있어야겠다. 그리고 자꾸 헷갈리는 static개념도 중요하니 꼭 머리속에 정리해두자 !

profile
꺾이지않기ᕙ༼*◕_◕*༽ᕤ

0개의 댓글