본문 바로가기
프로그래밍 언어

인스턴스,static 개념

by do_ng 2021. 1. 24.

클래스(설계도)로 부터 객체를 생성하는 과정을 인스턴스화 한다고 말한다. 

클래스를 new 해서 생성된 것을 객체 또는 인스턴스라고 말함 


변수의 종류) 

- 인스턴스(instance) 변수 : 클래스 영역 안에 선언되며 new를 통해 인스턴스를 생성할 때 만들어진다.

클래스 안에 있는 인스턴스 변수를 사용하기 위해서는 객체가 생성되어 있어야 한다.

 

- 클래스 변수 : 모든 객체가 공유한다는 의미로 static(정적,고정된)을 붙인다고 하여 static 변수라고도 불린다. 

클래스가 메모리 상에 올라갈 때 static을 붙인 변수나 메서드도 같이 메모리에 올라가게 되므로 인스턴스(객체)를 생성하지 않고도 클래스(static) 변수 또는 클래스(static) 메서드를 사용할 수 있다.

 

- 지역(local) 변수 : 메서드 내에서 선언되어 메서드 내에서만 사용이 가능하며 메서드의 실행이 끝나면 소멸되어서 사용할 수 없다. for이나 while도 마찬가지로 {}(블록) 안에서만 사용 가능하며 해당 블록을 벗어나면 사용할 수 없다. 


static 메서드나 변수가 메모리에 올라가는 시점) 

 

자바 컴파일러가 자바소스코드를 컴파일한후 생성된 class파일이 JVM에 의해서 로딩이 될때 Runtime Data Area의 영역중의 하나인 클래스(메서드)영역에 static으로 선언한 변수나 메서드의 정보를 넣게된다. 

출처 : https://ict-nroo.tistory.com/19

 

공유 메모리 영역이라고도 불리는 클래스 영역에 static으로 선언한 변수나 메서드가 들어감

 

언제 static을 붙이는가??) 

 

1.클래스를 설계할 때 멤버 변수 중 모든 인스턴스가 공통으로 사용하는 것에 static을 붙인다

-> static이 붙은 변수나 메서드들은 하나의 저장공간 안에 놓여있기 때문에 관리하기가 훨씬 수월하다.

 

2. 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것을 고려해본다. 

-> 해당 메서드가 인스턴스 변수나 인스턴스 메서드를 필요로 하지 않는다면 static을 붙여주자.

메서드의 호출시간이 짧아지므로 성능이 향상된다.

단) 메서드 내에서 인스턴스 변수를 필요로 한다면 static을 붙여줄 수 없다.

 

멤버 변수 : 클래스 영역에 선언된 모든 변수(인스턴스, static)를 멤버 변수라고 뜻함 

 


코드)

public class Test2 {

	private int power = 0;
	
	// TV의 전원을 켜는 함수 
	public void on() {
		this.power = 1;
	}
	
	// TV의 전원을 끄는 함수 1
	public void off() {
		this.power = 0;
	}
	
	// TV의 전원을 끄는 함수 2
	public static void off1() {
		System.out.println("클래스내의 인스턴수 변수 사용이 불가능함!");
		/*
        this.power = 0; -> static 메서드를 정의하면 인스턴스 변수 사용이 불가능함 
        (클래스가 메모리상에 올라갈때 static을 붙인 메서드도 같이 올라가는데 인스턴스 변수는
         객체를 생성할때 메모리에 올라가므로 static메서드 안에 인스턴스 변수를 선언할수 없음)
        */
	}
	
	public static void main(String[] args){
		
		Test2 tv = new Test2(); //tv 객체 생성 
		tv.on(); //전원켜기 
		tv.off(); //전원끄기 
		
		Test2.off1(); //객체 생성 없이 클래스 안에 있는 메서드를 바로 호출 가능 
	}

}

프로그램이 실행되는 시점에 main 메서드가 먼저 클래스 영역에 올라가고 그다음 static으로 선언한 변수나 메서드의 정보가 클래스 영역에 올라가게 된다.

클래스 영역에 off1()라는 메서드가 올라가 있기 때문에 Test2 객체(인스턴스)를 생성하지 않고 off1() 메서드를 호출 할 수 있다. 

'프로그래밍 언어' 카테고리의 다른 글

추상클래스 , 인터페이스 개념  (0) 2021.01.28
배열 vs 리스트  (0) 2021.01.26
Call Stack(호출스택)  (0) 2021.01.24
자바 ArrayList 안에 List 넣기  (0) 2020.12.24
JSON 이란?  (0) 2020.12.18