1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package zon; public class VariableEx3 { int x; // instance 변수 static int y; // static 변수 public void increment(int x) { x++; } public void increment() { int z=0; // local x++;y++;z++; System.out.printf("%s=%d, %s=%d, %s=%d\n", "x", x, "y",y, "z",z); } public static void main(String[] args) { VariableEx3 v1 = new VariableEx3(); VariableEx3 v2 = new VariableEx3(); int x=5; v1.increment(x); System.out.printf("x=%d", x); System.out.println(); v1.increment(); // 1 1 1 v1.increment(); // 2 2 1 v1.increment(); // 3 3 1 v2.increment(); // 1 4 1 } } | cs |
클래스에 선언된 변수는 모두 멤버 변수라고 부른다. 즉, int x와 static int y는 멤버변수라고 할 수 있다.
멤버 변수 중 static이 붙은 것은 클래스 변수, 붙지 않은 변수는 인스턴스 변수이다.
- 📌 static(클래스)변수
인스턴스 변수 앞에 static만 붙이면 된다. 인스턴스마다 독립적인 저장공간을 갖는 인스턴스 변수와 달리,
클래스 변수는 모든 인스턴스가 공통된 변수(공간)을 공유한다.
한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야 하는 속성일 경우, static변수로 선언한다.
new를 하지않아도 자동으로 생성된다.
즉, 클래스에 고정된 멤버로, 객체 없이도 사용할 수 있다.
ObjectEx4 클래스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package comBitBasic.obj; public class ObjectEx4 { //속성 (data) static int staticValue; // new하지 않아도 만들어지는애. int instanceValue; public ObjectEx4() { // 인스턴스변수를 초기화할 목적, new할때 만들어짐. staticValue = 100; // 스태틱이 먼저 메모리에 만들어지기 때문에 접근이가능하다. 그래서 가능. } public static void main(String[] args) { staticValue = 9; // 가능하다. new하지 않아도 먼저 만들어졌기 때문에 main메소드에서 호출 가능 // instanceValue =0; // 얘는 안됀다. 생성을 안했기 때문이다. } } | cs |
ObjectEx5 클래스
1 2 3 4 5 6 7 8 9 10 11 | package comBitBasic.obj; public class ObjectEx5 { public static void main(String[] args) { // staticValue = 9; // 얘는 안됀다. 클래스가 달라서이다. ObjectEx4.staticValue = 9; // 이렇게해야 ObjectEx4클래스에 있는 staticValue에 들어간다. } } | cs |
- 📌 instance(인스턴스) 변수
클래스 영역에 선언하며, 클래스의 인스턴스를 생성할 때 만들어진다.
따라서 인스턴스 변수의 값을 읽어 오거나 저장하기 위해서 먼저 인스턴스를 생성한다.
인스턴스 변수는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다.
인스턴스마다 고유한 상태를 유지해야하는 속성일 경우 instance 변수로 선언한다.
이 값은 생성된 객체마다 다르며 각 객체 간 공유되지 않기 때문에 인스턴스라고 부른다.
즉, 객체에 소속된 멤버로, 객체를 생성해야만 사용할 수 있다.
- 📌 local(지역) 변수
메서드 내에 선언하며, 메서드가 종료되면 소멸되어 사용하지 못한다.
즉, { }을 벗어나면 참조할수 없게된다.
로컬 변수는 정적(static) 키워드로 선언할 수 없다. 인스턴스 변수만 가능하다.
(1)
v1.increment(x) 메소드 호출에서 x 값이 5로 유지되는 이유는 자바에서 기본형 변수(primitive type)는 값에 의한 호출(call by value) 방식으로 동작하기 때문이다.
메소드 increment(int x)는 매개변수로 x를 받지만, 이 x는 메소드 내에서 새로운 지역 변수이다. 따라서 메소드 내에서 x의 값을 증가시켜도, 메소드 외부에 있는 변수 x의 값에는 영향을 주지 않는다.
즉, v1.increment(x) 메소드를 호출하더라도 x 변수의 값은 그대로 유지되며, 출력 결과로 x=5가 나타난다.
(2)
v1.increment()와 v2.increment()를 출력해보면, 각 클래스에서 increment() 메소드를 받아 연산하는데,
instance 변수와 static 변수, 그리고 local 변수를 모두 연산한다.
첫번째, v1.increment() 에서 값이 1 1 1 이 되는 이유는,
- instance변수 x와 static 변수 y는 선언하면서 0으로 정의되었고, z는 지역변수로 0으로 정의되면서 증감 연산자를 통해 출력한다.
두번째와 세번째, v1.increment()에서 값이 2 2 1, 3 3 1 이 되는 이유는,
- instance변수와 static 변수는 모두 증가하지만, 지역변수는 계속 0에서 ++되면서 값이 나오기 때문에 1으로 고정된다.
그에비해 v2.increment()는 새로운 변수에서 다시 증가되는 연산이지만, 이미 VariableEx3 객체에서 static 변수는 3이기 때문에 여기서 시작한다. 반면, instance 변수는 다시 처음 시작하기 때문에 0으로 정의되는 것이다.
'✨ Java > etc' 카테고리의 다른 글
자바(JAVA) - 달력 만들기 (0) | 2023.07.07 |
---|---|
자바(JAVA) - 가변인자 (variable arguments) 란 무엇인가? (0) | 2023.07.07 |
자바(JAVA) - 자료형 변환 (byte, int, long, char, boolean) 연산 (0) | 2023.07.06 |
자바(JAVA) - 제네릭(Generic) (0) | 2023.07.06 |
자바(JAVA) - 자바의 특징 (0) | 2023.07.06 |
댓글