본문 바로가기
Back-End/Java

[Java] instance(인스턴스), static(스태틱, 정적) 변수/메소드

by 찐코딩 2021. 8. 17.

자바에서 사용되는 용어들

 1. 변수

프로그램이 끝날때까지 언제든지 변할 수 있는 속성(데이터).
          ==> 소문자로 시작

 2. 상수

프로그램이 끝날때까지 절대 변하지 않는 속성(데이터)
          ==> 모든 글자가 대문자 
           

 3. instance(인스턴스) 변수 / 메소드

   - 객체의 생성과 동시에 만들어지는 변수 / 메소드
   - 객체는 heap 메모리 공간에 만들어짐
      반드시 객체 생성 후 사용이 가능함
   - 호출방법 : 참조변수.멤버변수 / 참조변수.멤버메소드
     

 4. static(스태틱, 정적) 변수 / 메소드

스태틱 변수 = 클래스 변수(class variable)

   - 객체의 생성과 상관없이 별도로 만들어지는 변수 / 메소드

   - static 메모리(method 영역)에서 별도로 만들어짐

   - 인스턴스가 생성될 때 마다 다른 메모리를 가지는 것이 아니라 프로그램이 메모리에 적재(load)될 때 데이터 영역의 메모리에 생성 됨. 따라서 인스턴스의 생성과 관계 없이 클래스 이름으로 직접 참조함

   - 공통으로 사용되는 변수 / 메소드

     => 한 클래스의 모든 인스턴스 들이 공통적인 값을 유지해야하는 속성의 경우, 스태틱변수(클래스변수)로 선언해야 함

   - 객체를 생성하지 않아도 어느 클래스나 접근 가능

   - 접근하는 방법이 쉬우나 실제로 항상 메모리에 상주하게 되어 메모리 회수가 안되는 단점이 있음
     시스템이 며칠, 몇 주, 몇 달 정도 가동이 되면 점점 느려지는 현상이 발생함
   - 호출방법 : 클래스이름.멤버변수 / 클래스이름.멤버메소드

 

출처 : 인프런 Do it! 자바 프로그래밍 입문

 

참고 : 자바의 정석 3판 p.246 ~248

인스턴스 메소드, 정적 메소드 예문

package Class;

class Static {

	// 멤버변수
	int su1 = 200;            // 인스턴스 변수
	int su2 = 100;            // 인스턴스 변수
	static int num = 500;     // static(정적) 변수
	
	// 멤버메서드
	void sum() {              // 인스턴스 메서드
		System.out.println("sum >>> " + (su1 + su2));
	}
	
	static int adder(int n1, int n2) {   // static(정적) 메서드
		return n1 + n2;
	}
		
}


public class Ex08_Static {

	public static void main(String[] args) {
		
		System.out.println(Static.num);
		System.out.println
			("adder() 메서드 호출 결과 >>> " + Static.adder(150, 36));
		
		Static static1 = new Static();
		System.out.println("su1 >>> " + static1.su1);
		System.out.println("su2 >>> " + static1.su2);
		static1.sum();

	}

}

 

결과

500
adder() 메서드 호출 결과 >>> 186
su1 >>> 200
su2 >>> 100
sum >>> 300

정적 메소드인 adder() 메소드는 Static클래스의 인스턴스를 생성하지 않았는데도 에러없이 메소드를 수행한다.

반면 인스턴스 메소드인 sum() 메소드는 static1이라는 인스턴스가 생성되어 수행되었다.

 

예제02) Static 변수 특징을 이용해서 학생 생성을 해보자

학번이 생성될 때마다 학번이 증가해야 하는 경우, 기준이 되는 값은 static 변수로 생성하여 유지함

package Statics;

public class Student {
		
	static int serialNum = 10000;
		
	int studentId;
	String studentName;
	
	// 학생 객체가 생성됨면 뭐가 호출 된다? 생성자가 호출 된다
	public Student() {
		serialNum++;
		studentId = serialNum;
	}
}

 

package Statics;

public class StudentTest {
	
	public static void main(String[] args) {
		
		// 학생 이름이 James 라는 객체 생성
		Student studentJ = new Student();
		System.out.println("studentJ>>> " + studentJ.studentId);
		
		// 학생 이름이 Tom 라는 객체 생성
		Student studentT = new Student();
		System.out.println("studentT>>> " + studentT.studentId);
		
		System.out.println();
		
		// serialNum은?
		System.out.println("studentJ>>> " + studentJ.serialNum);
		System.out.println("studentT>>> " + studentT.serialNum);
		
	}
}

학번이 10000으로 시작되었으면 좋겠다, 근데 객체를 생성할 때마다 값을 지정하는 것 보다는

기준이 되는 값, 즉 10000을 Static 변수로 지정하여

생성자가 호출될 때마다 증가시켰고(Static 변수는 공유되면서 증가될 것)

studentId는 시리얼넘버에서 복사되어 각각! 저장된다.

 

결과

studentJ>>> 10001
studentT>>> 10002

studentJ>>> 10002
studentT>>> 10002

 

스태틱변수인 시리얼넘버는 10002로 모두 같은 것을 볼 수 있고(객체가 2개 생성되었으니 2가 증가한 것이 맞음)

인스턴스변수인 각각의 studentId는 호출될 때마다 1씩 증가된 것을 볼 수 있다.

 

 

댓글