코코아 Study_JAVA 변수의 스코프(지역변수, 객체의 동적 할당, Static) #3

11004 단어 Java코코아Java

21.12.03(금)


지역변수

1. 변수의 종류

- 변수의 종류는 3가지가 있고, 선언위치(영역)에 따라 다르다.

1) 선언위치 - 클래스 영역

  • 클래스 변수(CV : Class Variable) : 클래스가 메모리에 로딩될때 생성(객체 생성 필요 X)
  • 인스턴스 변수(IV : Instance Variable) : 인스턴스가 생성되었을때(객체 생성될때) 생성

2)선언위치 - 클래스 영역 이외의 영역 or 메서드 영역(메서드 생성자, 초기화 블럭 내부)

  • 지역변수(LV : Local Variable) : 변수 선언문이 수행되었을때 생성
class Variables
{//클래스 영역 시작
    int iv; // 인스턴스 변수
    static int cv; // 클래스 변수(static이 붙은 변수, 공유변수)

    @Override
    public void actionPerformed(ActionEvent e) { //메서드 영역 시작
        String setsText = settingField.getText(); // 지역변수들
        String repsText = repsField.getText(); 
        String restTimeText = restTimeField.getText();
        String tempoText = tempoField.getText();
        String pauseText = pauseField.getText();

        int setsInt = Integer.parseInt(setsText); //Static Int 로 수정하면 CV가됨
        int repsInt = Integer.parseInt(repsText);
        int restTimeInt = Integer.parseInt(restTimeText);
        int tempoInt = Integer.parseInt(tempoText);
        int pauseInt = Integer.parseInt(pauseText);
    } //메서드 영역 종료
} //클래스 영역 종료

2. 지역변수의 특징

- 메서드가 끝나기 전까지만(범수의 범위:Scope) 유효하다.

정적할당과 동적할당

1. 메모리란?

- 데이터와 명령어를 저장하는 공간으로, 자바에서는 크게 Class, Stack, Heap 3가지 영역으로 구분된다.
- 정적할당 : 메모리의 크기가 하드코딩되어 있기 대문에 프로그램이 실핼 될 때 이미 해당 메모리의 크기가 결정되어 있다.
	  (나중에 메모리의 크기 조절 불가)
- 동적할당 : 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는것


출처 : http://huelet.tistory.com/entry/JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0
출처 : http://huelet.tistory.com/entry/JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0

2. Stack 영역 특징

- Stack 영역 : 지역변수, 사용자 정의함수, 잠깐 사용하고 삭제할 데이터 저장공간. 
	      함수(메서드)의 호출과 함께 할당되며 함수 호출 완료 시 소멸

              하기와 같이 a라는 변수가 main메서드에 호출될때 Stack영역에 할당된 후, a의 변수값이 5,4,3,2순으로 할당되었기
	      때문에 이전 데이터는 지워지고 2라는 값만 출력된다.
public class StackAreaEx {
	public static void main(String[] args) {
		int a = 5;   a = 4;	a = 3;	a = 2;
		System.out.println(a);
	}
}
[출처] [JAVA/자바] 메모리 구조(static, stack, heap)|작성자 JOKER

3. Heap 영역 특징

- Heap 영역 : 동적할당, 사용자의 의사에 의해 원하는 데이터를 사용자 정의에 의해 
	     할당된 메모리에 저장하거나 해제하는것
	     Stack영역의 공간에서 실제 데이터가 저장된 Heap영역의 참조값을 new 연산자를 통해 리턴받는다.
             Heap영역에 보관되는 메모리는 메서드 호출이 끝나도 소멸되지 않고 GC or JVM에 의해 
             메모리가 해제 될떄까지 유지
             모든 Object타입(Integer, String, ArrayLIst, ...)은 Heap영역에 저장된다.
public class Main {
    public static void main(String[] args) {
        int port = 4000;
        String host = "localhost";
    }
}
[출처] https://yaboong.github.io/java/2018/05/26/java-memory-management/

int port = 4000;에 의해 기존처럼 Stack에 4000이라는 값이 port라는 변수명으로 할당되어
Stack의 상태는 하기와 같이 된다.

String은 Object를 상속받아 구현되었으므로 String은 Heap영역에 할당되고 Stack에 host라는 이름으로 생성된
변수는 Heap에 있는 "localhost"라는 스트링을 하기와 같이 레퍼런스 하게 된다.


Static

1. 흠..(준비중)

좋은 웹페이지 즐겨찾기