티스토리 뷰

Java

Java 변수의 종류

choizz 2024. 7. 10. 15:41

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

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함