목적 : 프로그램에서 사용할 값을 메모리에 일시적으로 저장하기 위해.
변수를 선언하는 위치에 따라 다른 변수가 만들어진다.
java에서는 instance variable, static variable, local variable 제공
각각의 변수는 생명주기, 사용범위, 사용방법이 다르다.
class field에 선언하고 객체화하여 객체명으로 사용하는 변수
생성되는 객체마다 변수의 값을 따로 저장하고 사용해야 할 때
자동초기화 ⇒ 개발자가 초기화 값을 넣지 않아도 된다.
class를 객체화하면 메모리에 객체마다 변수 생성
객체가 Garbage Collector에 의해 사라질 때 메모리에서 사라진다.
JVM(Java Virtual Machine)의 heap 메모리에 생성
static영역에서는 instance영역 변수에 직접 접근할 수 없다. ⇒ 객체화 필요
access modifier data type variable name = default value ;
접근지정자 데이터형 변수명 = 초기화값 ;
⇒ 메모리에 올리는 작업 : 객체화 = 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
< 폴더개념 >
public : 패키지에 상관없이 클래스 외부에서 사용 가능
protected : 같은 패키지의 다른 클래스에서는 사용 가능, 패키지가 다르면 상속관계의 자식클래스에서만 사용 가능
private : 클래스 안에서만 사용 가능
default : 같은 패키지의 다른 클래스에서 사용 가능
< 메모리개념 >
static : 공용메모리에 생성
final : 값 변경 불가
transient : 직렬화 방지키워드(IOStream을 타고 나가지 못하도록 막는 일)
/**
* 접근 지정 접근확인연습
* @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
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
공용변수 : 하나의 자원을 여러 대상들이 공유하고 사용
실행중인 JVM에서 하나만 만들어지고 사용
자동초기화
클래스가 실행되면 memory에 올라간다.
instance 변수보다 참조하는 속도가 빠르다.
값이 변경되면 변경된 값으로 모두 사용
사용하지 않아도 메모리를 계속 점유하고 있어서 메모리 낭비 주의
class field에 선언
access modifier static data type variable name ;
접근지정자 static 데이터형 변수명 ;
/**
* 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