static과 인스턴스(instance)
1. static 이란?
static이란 사전적 의미로 static은 정적인, 고정적인 이라는 뜻이다.
사실 static이란 개념은 java에서만 쓰이는 개념은 아니다.
넘어가서, static은 변수를 선언하거나 메소드를 생성할 때 같이 붙여 써주는데
이렇게 static으로 선언한 변수는 "프로그램이 실행될 때 Java메모리에 할당되며, 이는 프로그램이 종료될 때 해제된다"
고 한다.
Java메모리에 대한 부분은 나중에 공부하기로 하고 오늘은 static에 대한 부분만 보겠다.
위 굵은 글시를 해석하면 static은 "해당 클래스의 객체를 생성하지 않고도 static자원에 접근이 가능하다"라는 뜻이다.
이건 또 무슨뜻인가
우선 예시를 보자
public class Calculator{
public static int num1 = 5;
public int num2 = 10;
public static void Add(){
System.out.println("This is a add() function!");
}
}
Calculator라는 클래스가 있다. num1이란 변수와 Add)라는 메소드를 static으로 선언 하였고, num2는 static이 없다.
기본적으로 Calculator라는 클래스 내부의 자원에 접근하려면 아래처럼 해당 클래스의 인스턴스(객체)를 생성해야 한다.
Calculator cal = new Calculator();
cal.num1;
cal.Add();
하지만 static을 사용하게 되면 위와 같이 인스턴스(객체)를 생성하기전에 메모리에 static변수가 할당되어 인스턴스를 생성할 필요가 없다.
Calculator.num1;
Calculator.Add();
위와 같이 이미 메모리에 static변수가 할당되어 있어 인스턴스 생성없이 바로/접근 할 수 있는 것이며, 이는 메모리를 통해 해당 변수를 모두가 공유하기 때문이다. 따라서 static으로 공유된 변수를 사용할때 그만큼 메모리를 따로 할당하지 않고 절약할 수 있는 것이다.
만약 num2를 Add()메소드에서 사용하려면 어떻게 될까??
"Cannot make a static reference to the non-static field num2"라는 메세지를 볼수 있는데
해석하면 static영역에서는 non-static 필드인 num2를 사용 할 수 없다고 나오며 , num2를 static으로 바꾸라는 뜻이다.
이는 num2라는 일반적인 변수가 인스턴스화 되기 전에 static으로 선언된 Add()메소드가 프로그램 실행시 이미 메모리 영역에 할당되었기 때문에 static영역에서는 일반변수를 사용할 수가 없는 것이다.
2. 인스턴스(Instance)란?
위에서 말하는 인스턴스란 무엇인가?
인스턴스란 클래스에 속하는 객체를 말한다.
예를들어 위처럼 계산기(Calculator)라는 클래스가 있고, 프로그램을 개발하며 계산이 필요한 부분에서 계산을 위해
계산기(Calculator) 객체를 생성하면 계산기(Calculator)라는 인스턴스가 생성되는 것이다.
클래스를 객체를 만들기 위한 틀이라 생각하면 되는데,
쉽게말해 피자를 만드는 과정을 예로 들겠다.
피자라는 클래스는 도우, 토핑, 소스, 재료 등 피자를 만드는데 필요한 여러가지 구성요소(멤버변수)를 가지고 있다.
여기서 만들어지는 결과물(Object)은 피자라는 객체가 되며, 만들어지는 방식에 따라 여러가지 피자(Instance)가 생성될 수 있으며
이러한 피자가 만들어지는 과정, 즉 피자를 굽는다는 행위가 '인스턴스화 하다'라고 보면 된다.
1) 피자(클래스)라는 틀에서 -> 2) 피자를 만든다(인스턴스화) -> 3) 이에 결과물로 피자(인스턴스)가 생성된다
피자를 굽는 과정에 따라 여러가지 다른 피자들이 만들어 지는데 이 피자들을 인스턴스라고 말한다.
이번 포스팅은 static과 인스턴스에 대해 알아보았다.
정리하면,
static은 프로그램이 실행될 때 메모리 영역에 할당되므로, 인스턴스 과정(객체생성)없이 모두가 접근할 수 있는 공유자원인 것이다.
여기서 추가로 볼 것은, 모두가 접근할 수 있는 공유자원이기 때문에 static에는 this라는 내것이라는 개념이 존재하지 않는다.
'JAVA' 카테고리의 다른 글
[JAVA] 접근 제어자(public, private,protected) (0) | 2019.12.23 |
---|---|
[JAVA]생성자(constructor)와 this (0) | 2019.12.23 |
[JAVA] 객체지향 프로그래밍 이란 (0) | 2019.12.14 |
[JAVA] Queue 정리 (0) | 2019.12.13 |
[java] Stack 스택 정리 (0) | 2019.12.13 |