본문 바로가기
Back-end/java spring

[Java] 자바 공부 - 2 (static vs non-static)

by kkkdh 2022. 11. 28.
728x90

이번에는 static과 이에 반대되는 non-static의 개념을 정리해보려 합니다!

 

일단 자바는 객체지향 언어로 program을 객체의 집합으로 구성합니다.

 

그리고 객체를 정의하는 class에 static keyword로 정의된 멤버 혹은 메서드를 class 변수 또는 메서드라 부르고, 그렇지 않은 변수와 메서드를 instance(혹은 객체의) 변수와 메서드라고 부릅니다.


static과 non-static 개념 정리

static (클래스 변수 or 메서드)

  • 클래스 내에서 static 키워드로 선언된 변수 or 메서드
  • 처음 JVM이 실행된 이후 클래스가 메모리에 올라간 시점부터 프로그램 종료 시점까지 유지된다.
  • 인스턴스가 여러 개 생성되어도 static 변수 or 메서드는 한 번만 생성된다.
  • 동일한 클래스에 의해 생성된 모든 인스턴스(객체)가 공유한다.
  • 메모리 탑재 시점 문제로 인해 static method에서는 static 변수만 사용 가능합니다.

non-static (인스턴스 변수 or 메서드)

  • 클래스 내에 그냥 선언된 변수 or 메서드
  • 인스턴스(객체)가 생성될 때마다 새롭게 변수 or 메서드가 생성
  • 인스턴스 간에 공유되지 않는다.

이러한 이유로 main method는 반드시 static으로 정의되어야 합니다. (class는 객체를 정의하기 위해 사용하기 때문에, 프로그램의 시작을 알리는 main method를 외부에서도 접근 가능하도록 선언해야 하기 때문입니다.)

 

// class 변수와 메서드 호출 방식
ClassName.ClassVariable;
ClassName.ClassMethod;

ClassName obj = new ClassName();

// object(instanct) 변수와 메서드 호출 방식
obj.ObjectVariable;
obj.ObjectMethod;

이러한 특성에 따라 위와 같이 java code에서 변수, 메서드의 호출 방식 또한 차이점이 있게 됩니다.


클래스 변수(메서드)와 인스턴스(객체) 변수(메서드)가 메모리에 적재되는 위치

메모리에 탑재되는 위치와 시점

  • 클래스 변수와 메서드는 main memory에 JVM 실행 시점부터 프로그램 종료 시까지 유지
  • 인스턴스(객체) 변수와 메서드는 객체 생성시마다 stack 영역에 탑재

<주의할 점>

  • 객체를 만들어 변수 혹은 method에 접근해야하며, 객체를 만드는 순간 메모리의 heap 영역에 생성됩니다.
  • 생성된 객체의 메서드와 변수는 stack 영역에 할당됩니다.
  • non-static method에서는 static 변수 혹은 method를 사용할 수 있습니다. (이미 메모리에 탑재된 이후이기 때문) 

Reference

https://sujinhope.github.io/2021/03/03/Java-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%B3%80%EC%88%98,-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EB%B3%80%EC%88%98-%EC%B0%A8%EC%9D%B4(Static%EB%B3%80%EC%88%98%EC%99%80-Non-Static%EB%B3%80%EC%88%98).html 

 

[java] 클래스변수, 인스턴스 변수 차이(static변수와 non Static변수) - Break Out of Your Comfort Zone

목차 클래스 변수, 인스턴스 변수 클래스 변수, 인스턴스 변수, 지역 변수가 메모리에 적재되는 위치 클래스 변수(Static)의 주의점, 클래스 변수가 필요한 이유 클래스 변수, 인스턴스 변수

sujinhope.github.io

 

728x90

댓글