Small Grey Outline Pointer 지역변수/전역변수/static변수
본문 바로가기
Dev./java

지역변수/전역변수/static변수

by sso. 2022. 6. 6.

[지역변수 stack영역]
지역 안에서 선언된 변수
그 영역의 닫는 중괄호 } 를 만났을 때
메모리에서 해제 된다
사용자가 직접 초기화 해야 한다
다른 영역에서 접근할 수 없기 때문에 보안성이 뛰어나다



[전역변수 data영역]
클래스 영역 안에 있고 전체 영역에서 사용 가능한 변수
클래스 영역 외의 어떠한 영역에도 포함되어 있지 않다
new를 만났을 때 초기화 된다
프로그램 종료시 메모리에서 해제 된다
다른 영역에서도 접근할 수 있기 때문에 보안성이 상대적으로 낮다
*new를 만나도 초기화 되지 않게 하려면 static을 붙여 주면 된다


[static변수 data영역]
컴파일을 하게 되면 가장 먼저 메모리에 올라가고 
어떠한 경우에도 초기화가 되지 않는다
단, 프로그램 종료시 메모리에서 해제 된다
메모리에 고정되기 때문에 남용시 메모리 부족 혹은 프로그램 실행 속도에 악영향을 준다

 

 

 

 

전역변수와 static 변수의 차이

package day16;

public class VariableTest {
	//전역 변수
	int data=0;
	
	void f() {
		System.out.println(++data);
	}
	
	void f2() {
		data=20;
	}
	
}
package day16;

public class VariableTest2 {
	public static void main(String[] args) {
		VariableTest vt = new VariableTest(); 
		//객체화
		//VariableTest(클래스: 추상적 개념)을 실체화 시키는 객체: vt
		vt.f();
		vt.f();
		vt.f();
		vt.f2(); //f2 함수에서는 20으로만 바꿔주고 값의 증감은 없다
		vt.f(); //위의 20 값을 증가 시켜 21이 나온다
	}
}

1
2
3
21

 

 

 

 

package day16;

public class VariableTest2 {
	public static void main(String[] args) {
		VariableTest vt = new VariableTest(); 
		//객체화
		//VariableTest(클래스: 추상적 개념)을 실체화 시키는 객체: vt
		vt.f();
		vt.f();
		vt.f();
		vt.f2();
		vt = new VariableTest(); //new를 만나 다시 초기화 된다
		vt.f(); //data는 초기값 0 이며, f함수 증감식으로 결과값이 1이 나온다
	}
}

1
2
3
1

 

 

초기화가 되지 않게 하려면 전역변수 앞에 static을 붙여준다

 

static int data=0;

static은 프로그램을 종료할 때 까지 초기화가 안된다

전역변수는 new를 만나는 순간 다시 들어가 읽어들이기 때문에 초기화 된다

 

 

 


상속(inheritance)
기존에 사용중인 클래스의 필드를
다른 클래스에서 계속 사용을 해야 한다면 상속을 받는다 
그렇게 되면 부모 클래스의 필드를 마치 자신의 것 처럼 사용할 수 있다



*클래스를 만들었지만 눈에 안보이는 것은 기본 생성자
class A{
A필드
}

class B extends A{ //B가 A를 상속받기
A,B 필드
}

A : 부모 클래스, 상위 클래스, 슈퍼 클래스, 기반 클래스

B : 자식 클래스, 하위 클래스, 서브 클래스, 파생 클래스

 

 

 

 

부모 클래스로부터 상속 받은 멤버 변수의 접근 권환이 private 일 때 
1. 부모 클래스의 생성자를 호출해서 초기화 시켜야 한다
2. 부모 클래스에 setter메서드를 통해서 초기화 시킬 수 있다
3. 변수에 저장된 값은 getter메소드를 통해서 가져온다



부모 클래스로부터 상속 받은 멤버 변수의 접근 권환이 protected 일 때 
1. 자식 클래스에서 접근이 가능
2. 자식 클래스에서 접근이 가능하므로 getter 메소드를 사용하지 않고 변수명으로 값에 직접 접근하면 된다



-자식 클래스의 생성자가 실행되기 전에 부모 클래스의 생성자가 먼저 실행 된다
-실행할 부모 클래스의 생성자를 지정하지 않으면 부모클래스의 기본 생성자가 자동으로 실행 된다
-자동으로 입력되는 super()를 지우더라도 자바 컴파일러가 자동으로 넣어준다

 

 

 

728x90

'Dev. > java' 카테고리의 다른 글

Java 상속  (0) 2022.06.11
상속 / 다형성  (0) 2022.06.07
Java 항공 관리 프로그램  (0) 2022.05.26
Java :: 접근 권한 제어자  (0) 2022.05.23
Java :: Class(생성자)  (0) 2022.05.23

댓글