안녕하세요.
#yeoneeblog 여니입니다 :)
오늘은 자바의 변수구분, 전역변수와 지역변수에 대해 알아보겠습니다.
* 변수구분
* -전역변수 : 클래스 영역에 바로선언하는 변수 => 클래스 내에서면 어디서든 사용 가능
*
* -지역변수 : 클래스 영역 내의 어떤 특정한 구역({})에 선언한 변수(선언한 지역에서만 사용 가능)
* ex) 메소드, 제어문(if , for) 등등
*
* 1. 전연변수 (2가지로 구분이 됨)
* - 멤버변수 == 인스턴스변수 == 필드
* 생성시점 : new 연산자를 통해서 해당 객체가 생성하는 순간 메모리 영역에 할당
* 소멸시점 : 객체 소멸시 같이 소멸
*
* - 클래스변수 == static 변수 : static이라는 예약어가 붙어 있냐 아니냐에 따라 멤버변수냐 클래스변수냐로 구분
* 생성시점 : 프로그램 실행과 동시에(해당 객체 생성이 안되도) 메모리 영역(static 영역)에 할당
* 소멸시점 : 프로그롬이 종료될때 소멸
*
* 2. 지역변수
* 생성시점 : 특정한 구역({}) 실행(호출)시 메모리 영역에 할당(ex) 메소드 실행시)
* 소멸시점 : 특정한 구역({}) 종료시 소멸(ex) 메소드 종료시)
*
*
* (+)public => 어디서든 접근 가능하게 하고싶다
* (#)protected => 같은 패키지라면 무조건 접근가능, 다른 패키지라면 상속구조인 클래스에서만 접근가능
* (~)default => 오로지 같은 패키지 안에서만 접근 가능, 생략가능
* (-)private => 오직 해당 클래스 안에서만 접근가능
*
* 위에서부터 아래로 내려갈수록 접근할수 있는 범위가 좁아진다.
*/
// 변수 선언 위치에 따른 구분(전역변수 , 지역변수 , 매개변수)
public class FiledTest1 { // 클래스 시작부분.
private int global = 1;//멤버변수 == 인스턴스 == 필드
protected String pro ="protected";
String df = "default";
public void test(int num) { // test메소드 시작
// 매개변수(지역변수)
// 지역변수(메소드 영역내에 생성) -> 접근제한자를 붙일수가 없다
int l = 0; // 지역변수
if(true) {
int a = 5; // 지역변수
}
// 해당 클래스 객체 생성시 jvm이 값을 자동으로 초기화 시켜주기 때문에 에러안남
System.out.println(global);
System.out.println(l);
// 매개변수 초기화하지 않아도 에러나지 않는 이유 : 해당 메소드를 호출할때 "반드시" 값을 넘겨줘야 실행이 되기 때문.
System.out.println(num);
}
// 접근제한자 예약어(생략가능) 자료형 변수명;
public static String sta = "static 변수";
/*
* static은 '정적인, 고정된, 움직이지 않는'의 의미를 가진다.
* 즉, static키워드는 특정 변수나 , 메서드를 메모리영역(static)에 "고정"시켜둔다
*
* 이렇게 static영역에 고정된 데이터는 모든 객체에서 "공유"할수 있다.
* 따라서 자주 사용하는 변수, 메서드를 static으로 선언함으로써 메모리영역에 미리 올려두고
* 모든객체에서 공유하면서 사용하게됨.
*
* Math.random();
*
*/
/*
* 상수필드
*
* public static final 자료형 변수명 = 값;
* 한번 지정된 값을 고정해서 쓰기 때문에 무조건 초기화를 해줘야한다.
*
* 예약어 순서는 상관없다.
*
* static : 공유의 개념(재사용)
* final : 한번 지정된 값 변경x(상수)
*
* 값이 변경되어서는 안되는 고정적인 값을 메모리상에 올려두고 공유하면서 사용할 목적
* ex) Math.PI
*
* 상수명은 항상 모든글자가 대문자
*/
public static final int NUM = 10;
public static void test() {
System.out.println("하이");
}
/*
* static필드 생성시점 : 프로그램 실행과 동시에 메모리의 static영역에 할당된다.(굳이 객체생성하지 않아도 된다.)
* 소멸시점 : 프로그램 종료시 소멸된다.
* 따라서 프로그램의 생명주기와 동일한 생명주기를 가지게 되므로 static영역안에 너무 많은 클래스변수, 메서드를 추가
* 하는것은 좋지 못함.
*
*/
public static void main(String[] args) {
//---------------------- 1. FiledTest1 -------------------------
FiledTest1 ft1 = new FiledTest1();
// 객체생성시점에 global 필드 할당 (heap)
//ft1.test(5); // test메소드 호출시 생성되는 변수 : num, l, a(stack)
// test메소드 호출 종료시 num, l, a라는 변수는 소멸
ft1 = null; // 객체 소멸시 global 필드도 소멸
//System.out.println(ft1.pro); 같은 패키지가 아니므로 접근 불가. 만약 상속받았다면 접근가능
//System.out.println(ft1.df); 같은 패키지가 아니므로 접근 불가.
//---------------------------------------------------------------
//FieldTest2 ft2 = new FieldTest2();
System.out.println(FieldTest2.sta);
// sta라는 static변수를 호출하기위해서는 객체 생성을 할필요가 없고,
// 다만 어느클래스에 있는 sta변수인지 명확하게 클래스명만 기술해주면 됨
//Math
FieldTest2.test();
Student std1 = new Student();
std1.setName("홍길동");
}
public class Student {
public static String schoolName = "KH고등학교";
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
'JAVA' 카테고리의 다른 글
자바의 클래스구조(필드부,생성자부,메서드부)3 (0) | 2023.05.08 |
---|---|
자바의 클래스구조(필드부,생성자부,메서드부)2 (0) | 2023.05.08 |
자바 클래스의 구조(필드부,생성자부,메소드부) (0) | 2023.05.08 |
자바 이차원배열 다양한 예제 문제 (3) | 2023.05.07 |
자바 이차원 배열 (0) | 2023.05.07 |