기본형 / 참조형 변수

joona95·2023년 11월 30일

Java 이론 공부

목록 보기
6/7
post-thumbnail

변수

  • 변수란 클래스의 특성을 결정짓는 '상태'를 의미한다.
  • 변수 이름 길이의 제한은 없다. 첫 문자는 유니코드 문자, 알파벳, $, _ 만 올 수 있으며 숫자는 올 수 없다.

변수의 종류

  • 지역 변수

    • 중괄호 내에서 선언된 변수
    • 지역 변수를 선언한 중괄호 내에서만 유효하다.
  • 매개 변수

    • 메소드나 생성자에 넘겨주는 변수
    • 메소드가 호출될 때 생성되고 소멸된다.
  • 인스턴스 변수

    • 클래스 안에서 메소드 밖에 선언된 변수
    • static이라는 예약어 없이 선언되어야 한다.
    • 객체가 생성될 때 생성되고 그 객체를 참조하고 있는 다른 객체가 없으면 소멸된다.
  • 클래스 변수

    • 클래스 안에서 메소드 밖에 선언된 변수 중 static 예약어 선언한 변수
    • 클래스가 로드될 때 생성되고 자바 프로그램이 끝날 때 소멸된다.

기본형 변수 (Primitive Data Type)

  • 기본형은 값 그 자체를 가지는 변수

  • 기본형은 스택 메모리나 스태틱 메모리에 값을 저장한다.

  • 정수형 : byte, short, int, long, char

  • 소수형 : float, double

  • 기타 : boolean

Pass by value

  • 매개 변수로 기본형이 들어왔을 때, 값만 복사하여 새로운 스택 메모리를 할당한다.

  • 따라서 매개변수에 들어온 기존 값이 변경되더라도 기존 변수 값이 변경되지 않는다.

참조형 변수 (Reference Data Type)

  • 참조형은 객체의 주소를 가지는 변수

  • 참조형은 실제 객체는 힙 메모리에 저장하고 스택 메모리나 스태틱 메모리에 해당 객체의 주소를 저장한다.

    • 객체를 더 이상 참조하지 않을 때는 GC가 자동으로 힙 메모리에서 객체를 해제한다.

Pass by reference

  • 매개 변수로 참조형이 들어왔을 때, 주소 값이 넘어오는 것이므로 해당 주소 값에 있는 값을 변경하게 되면 기존 객체에도 영향을 미친다.

  • 객체 내에 있는 값이 다른 메서드로 전달됐을 때 변경되는 걸 막기 위한 방법으로 불변 객체가 있다.

Java 에서의 Pass by value / Pass by reference

  • Java는 기본형이나 참조형이나 상관 없이 Pass by value 로 작동한다.
class A {
  int n;
  
  public A(int n) {
    this.n = n;
  }
  
  public void setNumber(int n) {
    this.n = n;
  }
}

public static void main(String[] args) {
  A a = new A(10);
  action(a);
}

public static void action(A a) {
  // 1. 주소 값을 통해 필드 값 변경은 가능
  a.setNumber(15);
  // 2. 객체 자체를 변경하는 것은 불가능
  a = new A(15);
}
  • 예시1 처럼 a객체의 주소값을 통해 해당 객체의 값을 변경할 수 있기 때문에 Pass by reference 처럼 보인다.
  • 하지만 예시2 처럼 실제로 해당 객제 자체를 변경할 수 있는 것은 아니므로 기존 객체에 영향을 줄 수 없다.

참조

0개의 댓글