자바 변수에 대하여...

Choizz·2023년 3월 12일
0

Java

목록 보기
1/11

Variable

오늘은 자바의 변수에 대해 포스팅하려 합니다. 포트폴리오를 작성하다 보면 변수의 스코프와 라이프 타임은 상당히 중요하다고 생각합니다. 그래서 이번 기회에 정리해보려고 합니다!


변수의 종류

자바의 변수 종류부터 알아보겠습니다.

1. 인스턴스 변수(not static field)

  • static 키워드 없이 클래스 안에 선언된 필드(변수).
  • 클래스의 인스턴스마다 변수의 값이 다름.
  • stack에 저장된다.(객체는 heap에 저장, 참조 변수는 stack)

2. 클래스 변수(static field)

  • static 키워드가 붙은 필드.
  • 모든 클래스에서 공용으로 사용가능하다.
  • JVM의 메모리 영역에 저장된다.

3. 로컬 변수

  • 메서드에서 임시로 상태를 저장하는 변수.
  • {}안에서만 사용가능하다.
  • stack에 저장된다.

4. 파라미터 변수

  • 메서드의 인자로 사용되는 변수.
  • stack에 저장된다.
int a; // 인스턴스 변수

static int b; // 클래스 변수

public void method(){
	int c = 0; // 로컬 변수
	...
}

public void method(int a){...} //파라미터

참조형 변수

  • new 생성자를 사용해 인스턴스를 만들면 heap 메모리에 그 객체를 위한 공간이 할당됩니다.
  • 참조 변수는 그 공간에 접근하기 위한 변수이고 stack에 저장됩니다.
Foo foo = new Foo(); // 여기서  foo가 참조 변수가 된다.
  • new 키워드를 통해 객체를 생성하면,
    1)기본 생성자가 호출되고
    2)객체의 참조 값을 리턴하고
    3)이 값을 참조 변수(foo)가 가리키게 됩니다.
  • 참조 변수의 값을 출력하면 변수의 타입과 해시코드(16진법)를 출력합니다.
Foo foo = new Foo(); 
Foo(타입)@214c265e(해시코드)
  • 클래스, 인터페이스, 배열, 열거형, 애노테이션 등이 자바에서 참조 타입으로 사용됩니다.
  • 참조 변수는 null값을 저장할 수 있습니다. 기본적으로 참조 변수가 어떤 객체를 가리키고 있지 않다면 null값을 저장합니다.

👉 기본형 타입은 그 값이 변수에 직접 저장되는 반면, 참조 타입은 변수에 객체의 참조 값을 저장합니다.

  • 참조 값은 heap에 저장이 되고 그것을 가리키는 참조 변수는 stack에 저장됩니다.

변수의 스코프와 라이프 타임

  • 변수가 적용되는 범위와 소멸 시점을 알아보겠습니다.

1. 멤버 변수(인스턴스 변수) : 클래스 레벨 스코프

  • 클래스 안, 메서드의 밖에서 선언.
  • 클래래스 내에서 어디서 든지 사용할 수 있다.
  • 접근 제어자에 따라 클래스 밖에서도 사용할 수 있다.

    👉 라이프 타임 : 인스턴스가 생성됐을 때 생성되어 객체가 메모리에 남아있을 때까지 존재한다.

public class Test{
 	int a; // 멤버 변수
 	String b;// 멤버 변수
 	
    void method1(){};
 	char method2(){};
 	
    char c;// 멤버 변수
}

2. 지역 변수

  • 메서드 내에서 선언되고 메서드 안에서만 사용할 수 있다.

    👉 라이프 타임 : 메서드 수행이 끝나고 나면 스택에서 제거된다.

public class Test{
	int a;
	String b;
	
    void method1(){int x = 0;};
	char mwthod2(){int y = 1;};
	// x,y는 지역 변수 이다.

3. 그 외

  • {}안에서 선언된 변수는 {}안에서만 사용할 수 있다.

    👉 라이프 타임 : {}이 끝나면 사라진다.

  • 변수 선언 시 루프 밖의 변수와 루프 안의 변수의 이름이 달라야 한다.

    • 만약 루프 내의 변수가 끝나고 나면, 변수가 없어지기 때문에 루프 밖에서 같은 이름을 사용할 수 있다.

👉 라이프 타임 : 루프가 끝나면 사라진다.


class Test
{
    public static void main(String args[])
    {
        {
            int x = 5; // 블럭 밖에서 선언 후
            {
                int x = 10; // 같은 이름으로 다시 선언 할 수없다.
                System.out.println(x);
            }
        }
    }
}

public static void main(String args[])
    {
        int a = 5;
        for (int a = 0; a < 5; a++) // 오류가 남.
        {
            System.out.println(a);
        }
    }
    
    
class Test {
    public static void main(String args[])
    {
        for (int i = 1; i <= 10; i++) {
            System.out.println(i);
        }
        int i = 20; // 루프가 끝났기 때문에 같은 변수 이름을 사용가능함.
        System.out.println(i);
    }
}

Reference

profile
집중

0개의 댓글