2 minute read

객체(object)의 번지를 참조하는 타입 참조타입 에 대해 알아보자.

0. 들어가며

참조타입 강좌는 아래와 같은 순서로 진행된다.

  • 기본 타입과 참조 타입
  • null과 nullPointException
  • String 타입

1. 참조타입이란?

저번시간 마지막에 링크를 남겼었다. 그 링크에는 기본타입변수와 참조변수에 대해 간단하게 설명하는 글이 있었다. 이번장에서는 그중에 참조타입 참조변수에 대해 조금더 깊게 알아보려고 한다.

기본타입(primitive data type) vs 참조타입(non-primitive data type)

https://www.scientecheasy.com/2020/06/memory-allocation-primitive-nonprimitive.html/

위의 그림을 보면 대충 어떤 내용인지는 파악이 될것이다. 하지만 위그림은 조금 헷갈릴수가 있는데, 참조변수 c, d, e, f, g가 어떤 값을 가지고 있는지 자세한 설명이 나와있지 않다,

모든 변수들은 스택영역에 생성이된다. 마치 map의 key와 value 와 같이 “변수네임”과 “변수값”을 가지고 있는것 같다. 하지만 여기서 참조변수는 “변수값”이아닌 Heap영역의 생성번지가 저장이 된다.

이들 변수는 생성번지를 참조해서 객체를 이용한다하여 __참조타입변수__라고 불리는것이다.

2. 참조변수의 == , !==연산

위의 참조변수를 조금 이해했다면 참조변수의 위 연산이 동일한 객체를 참조하는지, 다른 객체를 잠조하는지 알아볼때 사용하는 연산자라는걸 ,
자바를 처음 시작할때 많이 했던 실수가 String Type 변수를 비교할때 == , != 를 사용했던 것이다. 왜 자바가 equal()이라는 기능을 사용하는지 조금은 이해가 될것이다.
아 물론 문자열 리터럴이 동일한 경우 같은 String객체를 공유 한다

String a = "hello";
String b = "hello";

System.out.println(a==b) ; //true

하지만 우리는 대부분 프로젝트에선 값을 동적으로 가져온다.

String c = new String("hello");
System.out.println(a==c) //false; 

위와 같은 경우에는 false를 리턴한다. new를 사용하면 힙 영역에 새로운 객체를 생성하기 때문이다. 이럴때 비교를 하고 싶다면

System.out.print(a.equal(c)); //true

같이 사용하면 된다.

3. null 과 NullPointerException

위 값들은 참조타입과 큰 관계가 있다.
참조 타입 변수는 객체를 참조하지 않는다는 의미로 null값을 사용할수 있다.

즉 NullPointerException은 참조 타입 변수가 null 상태에서 존재하지 않는 객체의 데이터나 메소드를 사용할 경우 발생하는 에러인것을 알수 있다.

int[] intArray = null;
intArray[0] = 10; // NullPointerException
String str = null;
System.out.println(str.length()); //NullPointerException

위의 String 객체에 null값을 대입하면 어떤일이 일어날까? null은 참조하는 객체가 없음을 의미한다고 말했다.

String c = null;

를 선언하면 c의 이전값 “hello”는 참조를 잃은 String 객체는 Garbage Collector 통해 메모리에서 자동으로 제거된다.

4. 배열타입 (Array Type)

Java 배열또한 String과 마찬가지로 참조(Reference)를 통하여 접근한다.
즉 배열의 값은 Heap영역에 만들어 진다는 뜻이다.

커맨드 라인 입력
main()메소드의 매개값인 String[] args 는 무엇일까?
여기서 args는 인수,매개변수,파라미터(Arguments) 이다.

main 메소드는 이 매개변수를 통해 커맨드 라인에서 입력된 데이터의 수와 입력된 데이터를 확인한다.
프로그램을 실행할때 매개값을 주고 실행하는 방법
Run -> Run configuration대화상장의 Main에서 Project와 Main Class를 확인 ->Arguments -> Program Arguments 를 통해 명령프롬프트에서 실행한다.

5. 객체 참조 배열

참조타입 (class, interface) 배열은 각 항목에 객체의 번지를 가진다.
예로 String은 클래스 타입이므로 String[] 배열은 강 항목에 문자열이 아닌 각 String 객체의 주소를 참조하게 된다.

그렇기 때문에 String []배열안의 항목간의 문자열 비교를 하기 위해선 위에서 배운것 처럼 equals()메소드를 통해 비교한다. ==는 객체 번지 비교입니다.

Categories:

Updated: