내 맘대로 TIL

Dorothy·2022년 11월 11일
0

항해99

목록 보기
4/17

Java - 참조 타입

참조 타입과 참조 변수

기본 타입과 참조 타입

  • 참조 타입인 배열, 열거, 클래스, 인터페이스 변수는 메모리의 번지를 변수안에 저장한다.
  • 번지를 통해 객체를 참조한다는 뜻에서 참조 타입이라고 부른다.

메모리 사용 영역

JVM(Java Virtual Machine): 자바로 개발한 프로그램을 컴파일하여 만들어지는 바이트 코드를 실행시키기 위한 가상 머신(소프트웨어)

메소드 영역

  • JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역
  • 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 정적 필드와 상수, 메소드 코드, 생성자 코드 등을 분류해서 저장

힙 영역

  • 객체와 배열이 생성되는 영역
  • 여기서 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
  • 만일 참조하는 변수나 필드가 없다면 의미 없는 객체가 되므로 JVM이 쓰레기 수집기(Garbage Collector)를 실행시켜 자동으로 제거한다.

JVM 스택 영역

  • JVM 스택은 메소드를 호출할 때 마다 프레임을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다.

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

  • 참조 타입 변수들 간의 ==, != 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용된다.
  • 참조 타입 변수의 값은 힙 영역의 객체 주소이므로 결국 번지 값을 비교하는 것

null과 NullPointerException

  • 참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있다.
  • null 값도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다.
  • 예외(Exception): 자바에서 프로그램 실행 도중에 발생하는 오류
  • NullPointerException: 참조 타입 변수가 null 상태에서 존재하지 않는 객체의 데이터나 메소드 사용할 경우 발생. 해당 참조 변수가 객체를 참조하도록 수정하여 해결한다.

String 타입

  • String 변수에 문자열 리터럴을 대입할 경우, 문자열은 String 객체로 생성되고 변수는 String 객체를 참조한다.
  • 문자열 리터럴이 동일한 경우 같은 String 객체를 공유
  • new 연산자: 힙 영역에 새로운 객체를 만들 때 사용하며, 객체 생성 연산자라고 한다.

문자열 리터럴과 new 연산자로 생성된 객체 비교

String name1 = "이름";
String name2 = "이름";
String name3 = new String("이름");

name1 == name2 의 결과는 true,
name1 == name3 의 결과는 false

동일한 String 객체이건 다른 String 객체이건 상관없이 내부 문자열을 비교하고 싶다면 equals() 메소드를 사용한다.

boolean result = str1.equals(str2);

배열

배열이란?

  • 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스(index)를 부여해놓은 자료구조
  • 같은 타입의 데이터만 저장할 수 있으며, 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없다.

배열 선언

  • 배열을 사용하기 위해서는 우선 배열 변수를 선언해야 한다.

형식 1 : 타입[ ] 변수;
형식 2 : 타입 변수[ ];

//형식 1의 예
int[] intArray;
double[] doubleArray;
String[] strArray;

//형식2
int intArray[];
double dlubleArray[];
String[] strArray;

참조할 배열 객체가 없다면 배열 변수는 null 값으로 초기화

배열 생성

값 목록으로 배열 생성

  • 값의 목록을 가지고 있는 경우

타입[ ] 변수 = { 값0, 값1, 값2, 값3, ··· };

이미 생성된 배열에서 한 가지 값을 변경하고 싶은 경우에는 아래와 같이 수정한다.

String[] names = { "둘리", "마이콜", "또치"};

names[1] = "고길동";

new 연산자로 배열 생성

  • 값의 목록을 가지고 있지 않지만, 향후 값들을 저장할 배열을 미리 만들고 싶은 경우

타입[ ] 변수 = new 타입[길이];

슬슬 머리가 아파진다.
그래도 할 수 있다!

0개의 댓글