instance variable / static variable / 객체화

이승우·2023년 6월 29일

JAVA

목록 보기
12/14
post-thumbnail

▣ 변수(Variable)

  • 목적 : 프로그램에서 사용할 값을 메모리에 일시적으로 저장하기 위해.

  • 변수를 선언하는 위치에 따라 다른 변수가 만들어진다.

  • java에서는 instance variable, static variable, local variable 제공

  • 각각의 변수는 생명주기, 사용범위, 사용방법이 다르다.


■ instance(member) variable

  • class field에 선언하고 객체화하여 객체명으로 사용하는 변수

  • 생성되는 객체마다 변수의 값을 따로 저장하고 사용해야 할 때

  • 자동초기화 ⇒ 개발자가 초기화 값을 넣지 않아도 된다.

  • class를 객체화하면 메모리에 객체마다 변수 생성

  • 객체가 Garbage Collector에 의해 사라질 때 메모리에서 사라진다.

  • JVM(Java Virtual Machine)의 heap 메모리에 생성

  • static영역에서는 instance영역 변수에 직접 접근할 수 없다. ⇒ 객체화 필요

access modifier data type variable name = default value ;
접근지정자 데이터형 변수명 = 초기화값 ;

  • 객체화 사용 방법
  • instance 변수는 코드가 눈에 보여도 메모리에 올라가지 않으면 사용 불가

⇒ 메모리에 올리는 작업 : 객체화 = instanc화 = object화

클래스명 객체명 = new 클래스명();

사용) 객체명.변수명 

▶ 실습 - instance 변수

/**
 * instance(member) variable의 사용. -특정 객체에 속해(member)있는 변수. 
 * -같은 이름의 변수를 여러 객체에서 가지고 있다. 객체마다 따로 사용한다. 
 * -객체화 후 사용.
 * @author seungwoo
 */
public class UseInstanceVariable {
//1.선언 :
	private int age; // instance 변수
	private int time;

	public static void main(String[] args) {
		// age=10; //static 영역에서는 instance변수를 직접 사용할 수 있다.
		// 2.객체 생성) 인스턴스 변수를 사용하기 위해서
		// 클래스명 객체명 = new 클래스명();
		UseInstanceVariable uiv = new UseInstanceVariable();
		UseInstanceVariable uiv2 = new UseInstanceVariable();

		// uiv객체가 가진 변수를 수정하면 uiv만 변경된다. 다른 객체에 영향을 주지 않음
		uiv.age = 25;
		System.out.println("uiv객체가 가진 age : " + uiv.age);
		System.out.println("uiv2객체가 가진 age : " + uiv2.age);

	}// main

}// class

▶ 실행결과
uiv객체가 가진 age : 25
uiv2객체가 가진 age : 0


● Variable의 access modifier (접근지정자)

< 폴더개념 >

  • public : 패키지에 상관없이 클래스 외부에서 사용 가능

  • protected : 같은 패키지의 다른 클래스에서는 사용 가능, 패키지가 다르면 상속관계의 자식클래스에서만 사용 가능

  • private : 클래스 안에서만 사용 가능

  • default : 같은 패키지의 다른 클래스에서 사용 가능

    < 메모리개념 >

  • static : 공용메모리에 생성

  • final : 값 변경 불가

  • transient : 직렬화 방지키워드(IOStream을 타고 나가지 못하도록 막는 일)


▶ 실습 - 접근지정자 instance 변수

/**
 * 접근 지정 접근확인연습
 * @author user
 */
public class ModifiersA {
	public int a;
	protected int b;
	int c;
	private int d;

	public static void main(String[] args) {
		ModifiersA ma = new ModifiersA();

		System.out.println("public a " + ma.a);
		System.out.println("protected b " + ma.b);
		System.out.println(" c " + ma.c);
		System.out.println("private d " + ma.d);
	}

}

▶ 실행결과
public a 0
protected b 0
c 0
private d 0

▶ 실습 - 같은 패키지 다른 클래스에서 위 변수 사용

public class UseModifiersA {

	public static void main(String[] args) {
		// 같은 패키지의 다른 클래스에서는 private을 제외한 모든 자원을 사용할 수 있다.
		ModifiersA ma = new ModifiersA();

		System.out.println("public a " + ma.a);
		System.out.println("protected b " + ma.b);
		System.out.println(" c " + ma.c);
//		System.out.println("private d "+ ma.d);   //private은 사용할 수 없다.
	}

}

▶ 실행결과
public a 0
protected b 0
c 0


● instance variable의 자동 초기화 값

  • int (정수형) : 0

  • char (문자형) : \u0000

  • double (실수형) : 0.0

  • boolean (논리형) : false

  • 참조형 : null


▶ 실습 - 인스턴스 변수의 자동 초기화 값

/**
 * instance variable이나 static variable은 선언하면 기본값을 가진다.
 * @author user
 */
public class TestDefaultValue {
	//// 기본형 데이터 형
	int a;
	char b; // \u0000 - unicode 0
	double c; // 0.0
	boolean d; // false

	//// 참조형 데이터 형
	TestDefaultValue tdv; // class - null
	String s; // null
	int[] arr; // null

	public static void main(String[] args) {

		// 객체생성) 인스턴스 변수가 생성된다. 초기값을 가진다.
		TestDefaultValue test = new TestDefaultValue();
		System.out.println("정수형 : " + test.a); // 0
		System.out.println("문자형 : [" + test.b + "]"); // \u0000이 unicode에 대응되는 문자가 없으므로
		System.out.println("실수형 : " + test.c); // 0.0
		System.out.println("불린형 : " + test.d); // false

		System.out.println("참조형-클래스 : " + test.tdv); // null
		System.out.println("참조형-String : " + test.s); // null
		System.out.println("참조형-array : " + test.arr); // null

	} // main

} // class

▶ 실행결과
정수형 : 0
문자형 : [ ]
실수형 : 0.0
불린형 : false
참조형-클래스 : null
참조형-String : null
참조형-array : null


■ static(class) variable

  • 공용변수 : 하나의 자원을 여러 대상들이 공유하고 사용

  • 실행중인 JVM에서 하나만 만들어지고 사용

  • 자동초기화

  • 클래스가 실행되면 memory에 올라간다.

  • instance 변수보다 참조하는 속도가 빠르다.

  • 값이 변경되면 변경된 값으로 모두 사용

  • 사용하지 않아도 메모리를 계속 점유하고 있어서 메모리 낭비 주의

  • class field에 선언

access modifier static data type variable name ;

  접근지정자  static  데이터형  변수명 ;
  

▶ 실습 - static 변수와 instance 변수 비교

/**
 * static (class) variable의 사용. (객체화없이 클래스명.변수명으로 클래스의 모든 영역에서 사용할 수 있는 변수) <br>
 * 1.선언)-자동초기화<br>
 * 접근지정자 static 데이터형 변수명;
 * <p>
 * 2.값할당) 클래스명.변수명=값;<br>
 * 3.값사용) 클래스명.변수명
 * 
 * @author user
 */

public class UseStaticVariable {
	// class field : 변수선언, method의 정의만 기술할 수 있다.
	// 1.선언) - 하나만 생성되고 사용된다. (공용변수 - 모든 객체가 하나의 변수를 사용)
	// 값을 변경하면 변경된 값을 계속 사용하게 된다.

	public static int age;
	static int year;

	public void test() { // static이 붙어있지 않은 instance 영역에서도 사용가능
		age = 20;
		System.out.println("test영역 " + age + "/" + year);
	}

	public static void main(String[] args) {

		// 영역이 달라도 사용가능
		UseStaticVariable usv = new UseStaticVariable();
		usv.test();

		// 2.값 할당
		UseStaticVariable.age=10;
		year=2023;

		// 3.값 사용
		System.out.println("나이 : " + age + ", 올해 : " + UseStaticVariable.year);

		// 공용의 특징 : 모든 객체가 하나의 변수를 사용
		// 클래스명 객체명=new 클래스명();
		UseStaticVariable usv2 = new UseStaticVariable();
		UseStaticVariable usv3 = new UseStaticVariable();

		// usv2객체와 usv3객체는 같은 static 변수를 사용한다.
		// 야! 니네 집전화번호 뭐야?
		// 답) 우리집 전화번호는~(올바른 표현), 내 집전화는(사용은 되나 올바른 표현 X)
		// static 변수는 특정 객체에 속해있는 변수가 아니다!!! 객체명.변수명은 올바른 표현 아님.

		usv2.year = 2024; // 특정객체 usv2의 year변수를 값변경 했는데
		System.out.println("usv2.객체의 year : " + usv2.year);
		System.out.println("usv3.객체의 year : " + usv2.year); // usv3까지 함께 변경된다.

	}

}

▶ 실행결과
test영역 20/0
나이 : 10, 올해 : 2023
usv2.객체의 year : 2024
usv3.객체의 year : 2024

profile
🧑🏻‍💻

0개의 댓글