변수 구분
- 전역 변수 : 클래스 영역에 바로 선언한 변수 --> 클래스 내에서면 어디서든 적역으로 다 사용 가능하다.
(외우는 팁! 전체지역!!)
- 지역 변수 : 클래스 영역내에 어떤 특정한 구역 ({})에 선언한 변수 --> 선언된 해당 그 지역에서만 사용 가능하다.
* 특정한 구역 : 메소드 {}, 제어문(if, for){} 등등 ...
1. 전역변수
- 필드 == 멤버변수 == 인스턴스 변수
* 생성시점 : new 연산자를 통해서 객체 생성
* 소멸시점 : 객체 소멸시 같이 소멸
- 클래스 변수 == static 변수 => 예약어 쓸 수 있는데 static이라는걸 쓰면 클래스 변수가 된다.
* 생성시점 : 프로그램 실행(해당 객체 생성 안돼도)과 동시에 무조건 메모리 영역(static) 영역
* 소멸시점 : 프로그램 종료될때 소멸
2. 지역변수
* 생성시점 : 지역변수가 속해있는 특정한 구역({}) 실행(호출)시 메모리 영역에 할당
* 소멸시점 : 특정한구역({}) 종료시 소멸
테스트 1)
// 전역변수
private int a;
public void method1() {
int b = 10; // 클래스 입장에서 지역변수, 메소드 입장에서 전역변수
System.out.println(b);
if(true) {
int c = 20;
}
//system.out.println(c); // 안됨
}
실행 Class
// 멤버변수 (인스턴스변수) => 전역변수
private int global;
public void test(int num) { // test 메소드 시작
// 매개변수(일종의 지역변수 즉, 메소드 영역 내에서만 쓸 수 있음)
// 지역변수(메소드 영역내에 선언) => 지역변수에는 접근제한자 같은거 붙이는거 아님
// int local; // 초기화 안하면 안됨. 근데 전역변수는 왜 됨?
int local = 10;
// 멤버변수 출력 => 멤버변수는 해당 이 객체 생성시 JVM이 기본값으로라도 초기화
System.out.println(global); // 초기화 안돼있음. 근데 오류 안남. heap영역에 생성될때 초기화
// 매개변수 출력 => 매개변수는 해당 이 메소드 호출시 반드시 값이 전달될것이기 때문에 초기화 안돼있어도됨.
System.out.println(num); // 초기화 안돼있음. 근데 오류안남. 매개변수로 무조건 하나는 넘어올거니까
// 지역변수 출력
System.out.println(local); // local이 초기화 안되있으면 오류남.
} // test 메소드 영역 끝
컴파일
테스트 2)
package com.kh.chap04_field.model.vo;
// 필드들의 접근제한자를 테스트 해보기 위한 클래스
public class FieldTest2 { // 클래스 시작
/*
* * 필드(멤버변수)에서 사용가능한 접근제한자 4가지
*
* public => 어디서든(같은패키지, 다른패키지 모두) 접근 가능
* protected => 같은 패키지 접근 가능, 다른 패키지일 경우 상속구조(부모자식간의 관계)에서는 접근 가능 -> 나중에
* default => 같은 패키지에서만 접근 가능(다른패키지 일 때는 절대 불가)
* private => only 해당 클래스에서만 접근 가능
*
* 위에서부터 아래로 내려갈수록 접근할 수 있는 범위가 좁아짐
*/
public String pub = "public";
protected String pro = "protected";
String def = "default"; // 안쓰면 default
private String pri = "private";
} // 클래스 종료
실행 Class
package com.kh.chap04_field.run;
import com.kh.chap04_field.model.vo.FieldTest2;
public class FieldRun {
public static void main(String[] args) {
FieldTest2 f2 = new FieldTest2();
// public
System.out.println(f2.pub);
// protected : 같은 패키지내에서는 접근가능, 다른 패키지라면 상속구조에서만 접근가능
// System.out.println(f2.pro);
// default : 오로지 같은 패키지 내에서만 접근가능
// System.out.println(f2.def);
// private : only 해당 클래스에서만 접근 가능!!
// System.out.println(f2.pri);
}
}
컴파일
테스트 3)
package com.kh.chap04_field.model.vo;
// 클래스변수 (Static)
public class FieldTest3 {
// static은 공유의 개념
// static이 붙은 애들은 프로그램 실행과 동시에 메모리의 static 영역에 올라감!!
// 프로그램 실행과 동시에 메모리상에 한번 올려놓고 여기저기서 가져다 쓰는 개념!!
// public이랑 같이 쓰자!
public static String sta = "static_FieldTest3";
// static : 공유의 개념
// final : 상수의 개념(한번 지정된 값 변경x)
// 상수필드 (Static final) : 프로그램 시작시 값이 저장되면 더이상 변경되지 않고 공유하면서 사용할 목적
public static final String STA_FIN = "static_final";
}
실행 Class
package com.kh.chap04_field.run;
import com.kh.chap04_field.model.vo.FieldTest3;
public class FieldRun {
public static void main(String[] args) {
System.out.println(FieldTest3.sta);
// 수정하고 싶다면 ?
FieldTest3.sta = "ㅋㅋㅋ";
System.out.println(FieldTest3.sta);
// 근데 절대 변경 안되게 하고싶다면 ? => 상수필드로 선언해야함
System.out.println(FieldTest3.STA_FIN);
// FieldTest3.STA_FIN = "ㅎㅎㅎ";
System.out.println(Math.PI);
// Math.PI = 2.53; // 상수라 변경불가능
System.out.println(Math.random()); // static : 기울임
}
}
컴파일