Variable - Java

choizz156·2022년 9월 7일
0

Java Basic

목록 보기
3/10

Variable(변수)

변수의 종류

  1. 인스턴스 변수(not static field)
    • static 키워드 없이 선언된 필드(변수)
    • 클래스의 인스턴스마다 변수 값이 다르다.
    • 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){...} //파라미터

변수의 선언과 초기화 방법

변수는 값이 변수 타입에 맞지 않으면 컴파일 되지 않는다.

변수의 선언

  • [변수 타입][변수명];
  • String a;

변수의 초기화

  • [변수 타입][변수명] = 값;
  • String a = "hello world";

참조형 변수

new 생성자를 사용해 인스턴스를 만들면 힙 메모리에 그 객체를 위한 공간이 할당된다. 참조 변수는 그 공간에 접근하기 위한 변수이다.

Foo foo = new Foo(); // 여기서  foo가 참조 변수가 된다.
  • new 키워드를 통해 객체를 생성하면 기본 생성자가 호출되고 객체의 참조 값을 리턴하고 이 값은 참조 변수에 저장된다.
  • 참조 변수의 값을 출력하면 변수의 타입과 해시코드(16진법)를 출력한다.
Foo foo = new Foo(); 
Foo@214c265e //이것이 객체의 참조 값이다.

즉, 참조 변수는 객체나 값을 가리키는데 사용된다.

  • 클래스, 인터페이스, 배열, 열거형, 애노테이션 등이 자바에서 참조 타입으로 사용된다.
  • 참조 변수는 null값을 저장할 수 있다. 기본적으로 참조 변수가 어떤 객체를 가리키고 있지 않다면 null값을 저장한다.
  • .와 참조 변수를 이용해서 객체 멤버(필드, 메서드 등)에 접근할 수 있다.
Foo foo = new Foo(); 
foo.bar; //필드에 접근할 수 있다.
foo.method(); // 메서드에 접근할 수 있다.

👉 기본형 타입은 그 값이 변수에 직접 저장되는 반면 참조 타입은 객체의 참조 값을 저장한다.
👉this : 현재 객체를 참조하는 참조 변수를 가리킨다.

Foo foo = new Foo(); 
class Foo{
int bar;
public Foo(int bar){
	this.bar = bar1;
    //this.bar는 이 객체의 필드를 가리킨다.Foo객체를 참조하는 참조 변수라고 보면 된다.
    // 우항에 있는 bar는 지역 변수이다.
}

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

  1. 멤버 변수(인스턴스 변수) : 클래스 레벨 스코프
    • 클래스 안, 메서드의 밖에서 선언된다.
    • 클래래스 내에서 어디서 든지 사용할 수 있다.
    • 접근 제어자에 따라 클래스 밖에서도 사용할 수 있다.
      👉 라이프 타임 : 인스턴스가 생성됐을 때 생성되어 객체가 메모리에 남아있을 때까지 존재한다.
public class Test{
 int a; // 멤버 변수
 String b;// 멤버 변수
 void method1(){};
 char mwthod2(){};
 char c;// 멤버 변수
}
  1. 지역 변수
    • 메서드 내에서 선언되고 메서드 안에서만 사용할 수 있다.
      👉 라이프 타임 : 메서드 수행이 끝나고 나면 스택에서 제거된다.
public class Test{
int a;
String b;
void method1(){int x=0;};
char mwthod2(){int y = 1;};
// x,y는 지역 변수 이다.
  1. 그 외
  • {}안에서 선언된 변수는 {}안에서만 사용할 수 있다.
    👉 라이프 타임 : {}이 끝나면 사라진다.

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

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


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
https://docs.oracle.com/javase/8/docs/
https://www.geeksforgeeks.org/reference-variable-in-java/?ref=gcse
https://www.geeksforgeeks.org/variable-scope-in-java/?ref=gcse

profile
조금씩 성장하는 개발자...!

0개의 댓글