-
[Java] Variable, Method, JVMProgramming Lang/Java 2022. 9. 5. 00:13
변수와 메서드란?
variable (변수)
something that is variable
method (메서드, 방법)
a procedure or process for attaining an object
- a way, technique, or process of or for doing somethingETC
static 스태틱 (정적인) : standing or fixed in one place
instance : 어떤 집합에 대해서, 그 집합의 개별적인 요소
class : 수업, 과목, 반, 학급 등변수의 종류
- 클래스 변수
- 인스턴스 변수
- 지역 변수
변수의 선언된 위치가 중요!
class VarMethod { void main(String[] args) { Variables.cv = 0; //Variables.iv = 0; //Cannot make a static reference to the non-static field Variables.iv } } class Variables { // 클래스 영역 int iv = 1; // 2. 인스턴스 변수 static int cv = 5; // 1. 클래스 변수 (static 변수, 공유변수) // **전역(global) 변수와는 다름!! void method() { // 메서드 영역 int lv = 0; // 3. 지역 변수 } }
클래스 변수, 인스턴스 변수, 지역 변수
더보기class VarMethod {
void main(String[] args) {
Variables.cv = 0;
//Variables.iv = 0;
//Cannot make a static reference to the non-static field Variables.iv
}
}
class Variables { // 클래스 scope
int iv = 1; // 2. 인스턴스 변수
static int cv = 5; // 1. 클래스 변수 (static 변수, 공유변수)
// **전역(global) 변수와는 다름!!
void method() { // 메서드 scope
int lv = 0; // 3. 지역 변수
}
}
변수
인스턴스 변수
- 클래스 영역에 선언
- 클래스의 인스턴스 생성 시, 생성
- 인스턴스를 생성해야만 사용 가능
- 독립적인 저장공간(변수)을 가진다 => 만들때마다 객체 생성
- 서로 다른 값을 가질 수 있다
- 각 인스턴스마다 고유한 상태를 유지해야하는 속성
클래스 변수
- 인스턴스 변수 앞에 static을 붙인다.
- 인스턴스를 생성하지 않고도 사용 가능
- 공통된 저장공간(변수)을 공유한다
- 각 인스턴스들이 공통적인 값을 유지해야하는 속성
- 클래스(참조변수 동일)가 메모리에 ‘로딩(loading)’될 때 생성되어 프로그램 종료까지 유지
- main method 앞에 public static 을 붙이면 다른 클래스의 클래스 변수에 접근 가능 => 프로그램 내 어디서나 접근 가능한 전역 변수(global variable) 성격을 가진다.
지역 변수
- 메서드 내 선언
- 메서드(반복문 스코프, 함수, 생성자 및 초기화 블럭 포함) 내에서만 사용 가능
- 메서드가 종료 시 소멸
- 블럭{} 내에 선언된 지역변수는 해당 scope 안에서만 사용 가능
class MethodHeaderBody { private static int a = 10; private static int b = 5; public static void main(String[] args) { Add add = new Add(a, b); int result = add(a, b); System.out.println("==객체생성x 사용(static)=="); System.out.println(result); System.out.println(add(a, b)); System.out.println("==객체생성 후 사용=="); System.out.println(add); System.out.println(add.AddResult(a, b)); } // 메서드 호출 시, 실행을 잠시 멈추고 메서드의 문장들이 실행 후, 끝나면 기존 실행 진행 public static int add(int a, int b) { //반환은 한 개의 값일 수도, array나 map 같은 collection 일 수도 있다. return a+b; // 반환문 int 위치 void 올 경우 삭제 } } public class Add { public Add(int a, int b) {} // 생성자 public int AddResult(int a, int b) { a = 1; b = 2; return a+b; } }
JVM 메모리 구조
- method area (=static memory)
- heap memory
- stack memory
◆ 메서드 영역, 스태틱 메모리 (컴파일 과정에서 사용되는 메모리)
- 바이트 코드 및 컴파일 되면서 생기는 클래스 파일(.class 파일), 클래스 변수
- 원시형 및 리터럴 값(실데이터)
◆ 힙 메모리 (런타임 과정에서 사용되는 메모리)
- 인스턴스 변수
- 참조 주소
◆ 스택 메모리 (작업이 끝나면 종료)
- 메서드 실행 시 (main 포함)
- 지역변수 (매개변수 포함)
- 메서드 실행 시, 연산의 중간결과 등
기본형 매개 변수와 참조형 매개변수
- 기본형 매개변수 : 변수의 값을 읽기만 가능 (read only)
- 참조형 매개변수 : 변수의 값을 읽고 변경 가능 (read & write)
원본이 아닌 복사본 변경
//기본형 매개변수 class Data1 { int x; //static int x = 10; //final int x = 10; } public class PrimitiveParamEx { public static void main(String[] args) { Data1 d = new Data1(); d.x = 10; //The final field Data1.x cannot be assigned System.out.println("main() : x = " + d.x); change(d.x); System.out.println("After change(d.x)"); System.out.println("main() : x = " + d.x); } static void change(int x) { x = 1000; System.out.println("change() : x = " + x); } } // 결과는 10
값이 저장된 주소의 데이터를 변경
//참조형 매개변수 class Data2 { int x; } public class ReferenceParamEx { public static void main(String[] args) { Data2 d = new Data2(); d.x = 10; System.out.println("main() : x = " + d.x); change(d); System.out.println("After change(d)"); System.out.println("main() : x = " + d.x); } static void change(Data2 d) { // 참조형 매개변수(클래스)를 넘겨줌. d.x = 1000; System.out.println("change() : x = " + d.x); } } // 결과는 1000 (값이 변경된다.)
그러므로, 값이 ‘복사(copy)’ 되는 건 기본형 매개변수이다.
참조형 반환타입
- return 타입이 참조형이라는 것은 주소를 반환한다는 의미
- 새로운 주소를 생성하여 복사한다
- 새로운 주소를 생성했다는 것은 새로운 객체가 생겼다는 의미
참조형 반환타입
class Data {int x;} public class ReferenceReturnEx { public static void main(String[] args) { Data d = new Data(); d.x = 10; Data d2 = copy(d); System.out.println("d.x="+d.x); System.out.println("d2.x="+d2.x); } static Data copy(Data d) { Data tmp = new Data(); tmp.x = d.x; return tmp; } }
Q. static 과 final 의 차이는?
A. 목적이 다르다.
static
- 객체생성 없이 사용하기 위함이다.
- 재사용성(공유 값 사용) 때문이다.
final
- 고정된 값(수치)이 필요. 변경될 시, 문제가 생길 여지 자체를 아예 제거한다. (ex> final int PIE = 3.14)
- 굳이 고정데이터를 변수에 담는 이유는 개발자가 알아보기 쉽기 위함이다.
더보기참고자료 : 자바의 정석, 자바의 신
(+ 개인 생각)
'Programming Lang > Java' 카테고리의 다른 글
[Java] Inheritance, Overriding (0) 2022.09.09 [Java] Class, Instance, Constructor (0) 2022.09.07 [Java] String Array (0) 2022.08.28 [Java] Operator (0) 2022.08.27 [Java] Type Casting (0) 2021.07.01