반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

Yeonee's Story

자바 변수구분(전역변수, 지역변수) 본문

JAVA

자바 변수구분(전역변수, 지역변수)

yeonee 여니 2023. 5. 9. 07:00
728x90
반응형
SMALL

안녕하세요.

#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;

}

 

728x90
반응형
LIST