프로그래밍/JAVA

[JAVA] 참조 타입

daykim 2022. 11. 8. 19:53
이것이 자바다(개정판) 기반 정리

데이터 타입 분류


1. 기본 타입 : https://wldwlddl59.tistory.com/113

2. 참조타입

객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입이 있다.

기본타입으로 선언된 변수는 값 자체를 저장하지만, 참조 타입으로 선언된 변수는 객체가 생성된 메모리 번지를 저장한다.

ex)

// 기본 타입 변수
int age = 25;
double price = 100.5;

// 참조 타입 변수
String name = "day";
String hobby = "독서";

스택 영역

  • 참조 타입 변수는 스택영역에 저장되며, 힙 메모리의 주소를 저장한다.
  • 실제 참조 타입 변수가 가리키는 내용은 힙메모리에 저장된다.

 

메모리 사용 영역


java 명령어로 JVM이 가동되면, JVM은 운영체제에서 할당 받은 메모리 영역(Runtime Data Area)을 다음과 같이 구분해 사용한다.

메소드 영역

바이트 코드 파일을 읽은 내용이 저장되는 영역

  • 클래스 별로 상수, 정적 필드, 메소드 코드, 생성자 코드 등이 저장됨

힙 영역

객체가 생성되는 영역

  • 객체의 번지는 메소드 영역과 스택 영역의 상수와 변수에서 참조한다.

스택 영역

메소드를 호출할 때마다 생성되는 프레임이 저장되는 영역

  • 메소드 호출이 끝나면 프레임은 자동 제거됨
  • 프레임 내부에는 로컬 변수 스택이 있다.
  • 여기에서 기본 타입 변수와 참조타입 변수가 생성, 제거됨

 

참조 타입 변수의 -- ,!= 연산


==, != 연산자는 변수의 값이 같은지 아닌지를 조사한다.

참조 타입 변수의 값은 객체의 번지다. 따라서 참조 타입 변수의 번지를 비교하게 된다.

  • 번지가 동일하다면 -> return true
  • 번지가 다르다면 -> return false

 

null과 NullPointerException


참조 타입 변수는 null값을 가질 수 있다.
null도 초기값으로 사용할 수 있기 때문에 스택 영역에 생성된다.

예외는 자바 프로그램 실행 도중 발생하는 오류다.

NullPointerException

변수가 null 상태에서 객체의 데이터나 메소드를 사용하려 할 때 발생한다.

  • 참조 변수를 사용하면서 가장 많이 발생하는 예외 중 하나

ex)

int[] intArray = null;
intArray[0] = 10 // NullPointerException
  • intArray가 참조하는 배열 객체가 없어 10을 저장할 수 없기 때문에 발생
String str = null;
System.out.println(str.length());
  • str변수가 참조하는 String 객체가 없기 때문에 발생

변수에 null을 대입하면, 번지를 잃게 되어 더 이상 객체를 사용할 수 없다.
객체가 힙 메모리에는 있지만, 위치 정보를 알 수 없게 되기 때문에 사용할 수 없다.
자바는 이러한 객체를 쓰레기 취급하고, Garbage Collector를 실행시켜 자동으로 제거한다.
자바는 코드를 이용해 객체를 직접 제거하는 방법을 제공하지 않는다.

 

문자열 타입


String은 참조 타입 변수다..
변수에 문자열 리터럴이 대입되면, 문자열은 String 객체로 생성되고, 객체의 번지가 대입된다.

문자열 비교

  • 자바는 문자열 리터럴이 동일하면, 같은 주소를 참조한다.
  • 단, new String()을 사용하는 경우엔, 새로운 객체를 만들어 다른 주소를 참조한다.

ex)

// 같은 주소 참조
String blog = "jjing";
String vlog = "jjing";

// 다른 주소 참조
String blog = new String("jjing");
String vlog = new String("jjing");
  • 문자열 리터럴로 생성하느냐, new 연산자로 생성하느냐에 따라 비교 연산자의 결과가 달라질 수 있다.
  • 따라서 String 객체의 내부 문자열만 비교할 땐 equals() 사용
boolean result = str1.equals(str2);

그 외 함수

 

String blog = "jjinglog";

// 문자 추출
char c = blog.charAt(3); // 결과 : n

// 문자열 길이
int len = blog.length(); // 결과 : 8

// 문자열 대체
String new = blog.replace("jjing", "징징"); // 결과 : 징징log

// 문자열 잘라내기
String oneChar = blog.subString(3); // 결과 : nglog
String twoChar = blog.subString(0, 3) // 결과 : jji

// 문자열 찾기
int index = blog.indexOf("ing"); // 결과 : 2

// 문자열 분리
String[] arr = 문자열.split(구분자);

 

 

 

배열 타입


  • 연속된 공간에 값을 나열시키고, 각 값에 인덱스를 부여해 놓은 자료구조
  • 배열은 같은 타입의 값만 관리한다.
  • 배열의 길이는 늘리거나 줄일 수 없다.

배열 선언

타입[] 변수명; // 관례적으로 주로 사용
타입 변수[];
  • 참조할 배열이 없다면 null로 초기화할 수 있다.

배열 생성

// 1.
타입[] 변수 = {val1, val2, val3, ... };

// 2. 배열 변수 먼저 선언 한 경우
타입[] 변수;
변수 = new 타입[] {val1, val2, val3, ...};

// 3. new 연산자로 배열 생성
타입[] 변수 = new 타입[길이]; // 기본값으로 초기화된다. 보통 0, null

메소드 호출

void Blog(int[] userCnt) { ... }

Blog(new int[] {1, 30, 24});

// 컴파일 에러
Blog({1, 30, 24});

배열 길이

arr.length;

 

다차원 배열


배열 항복에 또 다른 배열이 대입되는 것이다. ex) 2차원, 3차원 배열

다차원 배열 생성

// 1
타입[][] 변수명 = {{val1, val2, ...}, {val3, val4, ...}, ...};

// 2
타입[][] 변수 = new 타입[1차원 수][2차원 수];

// 다음과 같이 생성시, 2차원 배열의 길이는 모두 3이다.
// new String[2][3]과 같다는 것
String[][] name = new String[2][];
name[0] = new String[2]; // 과 같이 배열 길이를 다르게 줄 수도 있다.
  • 배열도 참조타입으로 각 항목에 객체의 주소를 저장한다.

관련 함수

// 배열 비교
array[0].equals(array[1]);

// 배열 복사
System.arraycopy(원본 배열, 원본 배열 복사 인덱스, 새 배열, 새 배열 붙여넣을 인덱스, 복사 항목 수);

 

열거(Enum) 타입


한정된 값을 갖는 타입

  • 열거 타입은 첫 문자를 대문자로 하고 캐멀 스타일로 지어주는 것이 관례다.
  • 열거 상수가 여러 단어인 경우 _ 로 연결하는 것이 관례다.
public enum Season{
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER
};

Season now = Season.WINTER;
  • Season : 열거 타입 이름
  • { } 안 : 열거 상수 목록 (한정된 값 목록)
  • 열거 타입 변수에 열거 상수 대입
  • null도 대입 가능

 

'프로그래밍 > JAVA' 카테고리의 다른 글

[Java] Static  (0) 2023.06.30
[JAVA] 클래스  (0) 2023.01.14
[JAVA] 조건문과 반복문  (0) 2022.10.12
[JAVA] 연산자  (1) 2022.10.11
[JAVA] 변수와 타입  (0) 2022.10.10