2021-06-09 강의록_참조타입, 메모리

MIN.DI·2021년 6월 9일
0

강의록

목록 보기
1/54

참조타입 개요

  • 참조타입 : 배열, 열거, 클래스, 인터페이스

  • 기본타입에는 '주소값'이라는 개념이 없다. 기본타입의 값은 모두 리터럴.

  • 기본타입에서의 ==, != 연산은 '값'을 비교하지만,
    참조타입에서는 '동일한 객체를 참조하는지' 를 비교. (같은 '주소'를 가지고 있는지)


레퍼런스 주소 체계

  • 객체의 레퍼런스(=주소) 체계
    FQCN@<객체의 논리적인 주소>

    FQCN : Fully Qualified Class Name : 풀 패키지명
    객체의 논리적인 주소 : 객체의 식별자(해시코드)를 16진수로 표현한 값 (힙 영역에 저장된 주소)

    ex)
    패키지 : a.b.c, 생성한 클래스 명 : Yoseph
    -->> FQCN : a.b.c.Yoseph
    패키지 : d.e.f, 생성한 클래스 명 : Yoseph
    -->> FQCN : d.e.f.Yoseph

String strVar1 = "신민철";
String strVar2 = "신민철";
		
		///////////////////
		// 1. 각 객체의 식별자(Object identifier)를 반환해주는 메소드
		//    Object.hashCode();
		int strVar1OID = strVar1.hashCode();			//10진수
		int strVar2OID = strVar2.hashCode();
		
		String strVar1OIDHEx = Integer.toHexString(strVar1OID);	//10진수 -> 16진수로 변경해주는 메소드
		String strVar2OIDHEx = Integer.toHexString(strVar2OID);
		
		///////////////////////
		// 2. 각 객체의 타입명FQCN 확인하기
		String strVar1FQCN = strVar1.getClass().getName();
		String strVar2FQCN = strVar2.getClass().getName();
		
		log.info(" - strVar1FQCN : " + strVar1FQCN);
		log.info(" - strVar2FQCN : " + strVar2FQCN);
		
		////////////////////////
		// 3. 두 String타입의 참조변수 안에 들어있는 문자열 리터럴 객체의 레퍼런스를 만들어서 출력
		// 		String strVar1OIDRef = FQCN + "@" + "<객체의 논리적인 주소>"
		String strVar1OIDRef = strVar1FQCN + "@" + strVar1OIDHEx;
		String strVar2OIDRef = strVar2FQCN + "@" + strVar2OIDHEx;
		
		log.info(" - strVar1OIDRef : " + strVar1OIDRef);
		log.info(" - strVar2OIDRef : " + strVar2OIDRef);

메모리 영역

  • JVM이 사용하는 메모리 영역 : OS에서 할당받은 RDA (Runtime Data Area).
    (메모리관리는 OS의 역할. 따라서 OS가 메모리를 할당해준다.)

  • 메소드 영역= Class Area
    클래스 정보, static변수, 변수정보, 상수 pool, 메소드 정보
    JVM 시작할 때 생성
    로딩된 클래스 바이트 코드 내용을 분석 후 저장
    모든 스레드가 공유

  • 힙Heap Area
    new 연산자로 생성된 객체를 저장 (변수는 Stack에 저장!)
    특히 문자열의 경우 리터럴로 값을 입력하면 같은 문자열에 대해서는 하나의 객체만 생성되지만
    new 연산자를 사용하면 같은 문자열이라도 "무조건" 새로운 객체로 생성.

    배열도 힙에 저장. (배열도 객체이니까)
    힙 영역 메모리가 부족하면 Out of Memory 예외 발생.
    힙 안의 모든 객체는 주소값을 가지고 있다.

    각 객체는 다른 객체와 구분되는 '식별자'를 가지게 됨. (OID. Object IDentifier)

  • JVM 스택Stack
    스레드 별 생성
    메소드 호출할 때마다 Frame을 스택에 추가(push)
    메소드 종료하면 Frame제거(pop)


NULL / NullPointerException

-null
변수가 참조하는 객체가 없을 경우 초기값으로 사용 가능
참조타입에만 적용 가능. 기본타입은 리터럴이니까!!
비교연산 가능 (==, !=)


assert keyword

assert 조건식; : 조건식이란 참 / 거짓을 산출.
assert keyword는 조건식이 참이면 무사통과, 거짓이면 AssertionError 발생
assert 를 사용하려면

--enableAssertions
-ea

둘 중 하나를
RunConfigurations > Arguments > VM arguments 에 입력해야 함. (하이픈까지 포함)

테스트코드 작성시 많이 사용한다.
( 내가 만든 코드가 내가 생각한 결과를 출력하는지 확인할 때 )


stack trace

자바언어에서 예외 발생시
어떤 이유로, 어떤 소스에서, 몇 행에서 오류가 발생했는지 알려주기 위해 출력하는 일련의 문장들.


traverse

배열을 포함한 자료구조의 모든 요소의 값을 차례차례 사용하는 행위 >> "traverse(순회)"


배열 _ Enhanced for

카운트변수가 필요하면 Classical For
카운트변수가 필요 없으면 Enhanced For 사용

profile
내가 보려고 쓰는 블로그

0개의 댓글