자바 참조

한상우·2022년 9월 26일
0

java

목록 보기
2/16

String s1 = new String("Hello");
위에서 s1을 '참조(참조 변수)' 라고 부른다.

참조 == 포인터?

아니다. 둘은 다르게 생각해야 한다.
참조는 별명 이라 생각하면 된다.
포인터는 주소를 가지고 있을 공간이 필요하지만, 참조는 별명일 뿐이지, 주소를 가지고 있을 공간이 필요하지 않다.

  • 참조하다는 객체 지향에서 나온것. 포인터와는 다른 개념이다. (참조하다는 이름을 짓다. 포인터는 가리키다)

String 객체를 생성하는 방법

  1. "" 큰 따음표 사용
  2. new 연산자 사용

1번 리터럴 방법으로 생성할 경우, 내용이 같다면 동일한 메모리 주소를 가리키고 있다.
2번 new 연산자로 생성한 객체는 내용이 같더라도 개별적인 객체다.

String x = "name";
String y = "name";
String z = new String("name");

System.out.println(x==y); // true
System.out.println(x==z); // false

Java String Pool

더 자세히 확인해보자
리터럴로 생성하면 String 값은 Heap 영역내 String Constatnt Pool 에 저장이 되고 재사용된다. 하지만 new 연산자로 생성하면 new를 만나는 동시에 Heap영역을 차지하며, 같은 내용이여도 각각 다른 부분을 차지한다.

이때 생성된 String 객체(s1, s2, s3) 는 Stack 영역에 저장된다

위와 같은 내용을 공부하다 보니 JVM 메모리 영역이 궁금해 공부해봤다

JVM 메모리 영역

Runtime Data Area

  1. Method Area
  2. Heap Area
  3. Stack Area
  4. PC register
  5. Native Method Stack

1) Method Area

  • 모든 쓰레드가 공유하는 메모리 영역.
  • 클래스, 인터페이스, 메소드, 필드, static 변수 등의 바이트 코드를 보관

2) Heap Area

  • 모든 쓰레드가 공유
  • new 키워드로 생성된 객체, 배열이 생성되는 영역
  • 메소드 영역에 로드된 클래스만 생성 가능 GC가 참조되지 않는 메모리를 확인하고 제거

3) Stack Area

  • 메서드 호출 시마다 각각의 스택 프레임이 생성 (메서드만을 위한 공간)
  • 이때 Heap 공간에 객체 데이터를 올리고 그 객체 데이터에 대한 참조값이 할당된다. (원시타입 변수는 Stack 영역에 값 자체가 할당)

정의, 선언

클래스는 절차가 진행되는 곳이 아니다. 때문에, 정의한다라고 표현하는게 맞다
함수는 절차가 진행되는 것이므로 선언한다가 맞는 표현이다.
ex) Member라는 클래스의 필드를 정의한다.

꼭 정리해봐야 할 예제

static void main(String args[]) {
	int total = 0;
	Exam exam = new Exam();

	total = inputExam(exam);
}

static void inputExam(Exam exam) {
	exam.kor = 3;
}

class Exam {
		int kor;
		int math;
		int eng;
}

main함수 영역이 스택에 올라가게 되고, 스택 영역에 args, total, exam이 올라가게 된다.
이때 args, exam은 이름(별명)이 되고, total은 공간이 된다.
total = 0 을 하게 되면, stack에 있는 total 공간에 0이 들어가게 되고,
new Exam() 연산을 하게 되면, heap에 공간이 생기게 된다. 이 공간에는 Exam 클래스에 있는 필드인, kor, math, eng라는 공간이 생기게 된다.
inputExam 함수가 호출되면, inputExam 함수 영역이 스택에 올라가게 되고, exam.kor = 3을 하게 되면 heap에 있는 공간에 값이 저장된다.
이후 inputExam 함수는 역할을 다 하게 되어, 스택에 inputExam함수 영역이 사라지게 되고,
힙에는 아직 값이 남아 있게 되는 것이다.

정리

변수의 생명주기를 이해하면, 참조와 공간에 대한 의미를 확실히 알 수 있다.
https://tv.kakao.com/v/426964287 <- 30초 동영상
중괄호 별로 스택에 참조할 이름이 세팅 (정적)
실행하는 도중에 heap에 데이터가 쌓임 (동적)

heap에 쌓이는 애들은 결국 최상위 객체인 Object를 상속받는 애들!!

profile
안녕하세요 ^^

0개의 댓글