CH5. 참조 타입 (1)

a.rubz·2022년 12월 25일
0

이것이 자바다

목록 보기
5/15
post-thumbnail
post-custom-banner

이것이 자바다 스터디를 하면서 중요하게 생각되는 부분, 알게 된 점, 스터디를 진행하며 얻은 정보를 기록한다.

📝 정리

참조 타입 (Reference Type)

객체(object)의 번지를 참조하는 타입

  • 변수들은 모두 스택(Stack)이라는 메모리 영역에 생성
  • 참조 타입으로 선언된 변수는 스택(Stack)에 객체가 생성된 메모리 번지를 저장
  • 참조 타입이 갖는 값은 힙(Heap)에 저장

✔ 참조 타입 종류

  • 배열 타입
  • 열거 타입
  • 클래스
  • 인터페이스


객체 (Object)

데이터와 메소드로 구성된 덩어리

객체 = 데이터 (필드) + 메소드



JAVA :: 자바의 메모리 구조 - 1. 메소드 영역(Method Area)

메모리 사용 영역

  • 메소드 영역
  • 힙 영역
  • 스택 영역

메소드 영역

  • 바이트코드 파일을 읽은 내용이 저장되는 영역
  • 클래스별로 상수, 정적 필드, 메소드 코드, 생성자 코드 등 저장

힙 영역

  • 객체가 생성되는 영역
  • 객체의 번지는 메소드, 스택 영역의 상수와 변수에서 참조

스택 영역

  • 메소드를 호출할 때마다 생성되는 프레임(Frame)이 저장되는 영역
  • 메소드 호출이 끝나면 프레임 자동 제거
  • 스택영역에서 기본 타입 변수와 참조 타입 변수가 생성되고 제거됨


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

  • ==, != 연산자는 변수의 값이 같은지, 아닌지 조사
  • 참조 타입 변수의 값은 객체의 번지 → ==, != 연산자는 번지를 비교하게 됨


null & NullPointerException

  • 참조 타입 변수는 아직 번지를 저장하고 있지 않다는 뜻으로 null값을 가질 수 있음
  • 참조 변수가 null인 상태에서 객체의 데이터나 메소드를 사용 ⇒ NullPointerException 발생

쓰레기 수집기 (Garbage Collector)

  • 참조 타입 변수에 null을 대입하면 번지를 잃게 되어 객체로 사용 불가
  • 자바는 이런 객체를 쓰레기로 취급
  • 자바는 코드를 이용해 객체를 직접 제거하는 방법 제공 X
  • 대신, 쓰레기 수집기를 실행시켜 자동으로 쓰레기 객체 제거


문자열(String) 타입

  • 자바의 문자열 ⇒ String 객체

✔ 문자열 비교

  • 문자열 리터럴이 동일하다면 String 객체를 공유 (==, ≠ 사용 가능)
  • But, new 연산자로 새로운 문자열 객체를 생성할 경우, ==, ≠의 결과값이 위의 경우와 달라짐
  • 내부 문자열만을 비교할 경우 → equals() 메소드 사용

new 연산자

  • 새로운 객체를 만드는 연산자
  • 객체 생성 연산자

charAt()

  • 문자열에서 특정 위치의 문자를 얻고 싶을 때
  • 매개값으로 주어진 인덱스의 문자 리턴
String subject = "안녕하세요";
char charValue = subject.charAt(3); // 세

length()

  • 문자열에서 문자의 개수를 얻고 싶을 때
String subject = "안녕하세요";
int length = subject.length(); // 5

replace()

  • 문자열에서 특정 문자열을 다른 문자열로 대체하고 싶을 때
  • 기존 문자열은 그대로 두고, 대체한 새로운 문자열 리턴
String oldStr = "안녕하세요";
String newStr = oldStr.replace("세", "신가");
// oldStr -> 안녕하세요
// newStr -> 안녕하신가요

substring()

  • 문자열에서 특정 위치의 문자열을 잘라내 가져오고 싶을 때
  • substring(int startIdx) : startIdx에서 끝까지
  • substring(int startIdx, int endIdx) : startIdx에서 endIdx 앞까지
String num = "123456";
String threeNum = num.substring(0, 3); // "123"
String endThreeNum = num.substring(3); // "456"

indexOf()

  • 문자열에서 특정 문자열의 위치를 찾고자 할 때
  • 포함되어 있지 않으면 -1 리턴
String subject = "안녕하세요";
int idx = subject.indexOf("하"); // 2
int noIdx = subject.indexOf("해"); // -1

contains()

  • 문자열에 특정 문자열이 포함되어 있는지 조사하고 싶을 때
  • 있으면 true, 없으면 false 리턴
String subject = "안녕하세요";
boolean result = subject.contains("안녕"); // true

split()

  • 문자열이 구분자 여러 개의 문자열로 구성되어 있을 경우, 분리하고 싶을 때
  • 배열로 리턴
String subject = "안,녕,하,세,요";
String[] arr = subject.split(","); // ["안", "녕", "하", "세", "요"]


배열 타입 (Array Type)

  • 연속된 공간에 값을 나열시키고, 각 값에 인덱스(index)를 부여해 놓은 자료구조
  • 인덱스는 대괄호 []를 통해 각 항목의 값을 읽거나 저장

✔ 배열 특징

  • 배열은 같은 타입의 값만 관리
  • 생성과 동시에 길이가 결정
  • 길이는 늘리거나 줄일 수 없음

✔ 배열 선언

// 배열 선언 방법
타입[] 변수; // 주로 이렇게 씀
타입 변수[];

// 배열에 값을 함께 넣어 선언 가능
타입[] 변수 = {0,1,2, ... };

// 미리 변수를 선언한 경우
타입[] 변수;
변수 = {0,1,2, ... }; // 컴파일 에러

타입[] 변수;
변수 = new 타입[] {0,1,2, ... }; // new 타입[]을 붙여주면 됨

// 메소드의 매개변수가 배열 타입일 경우
void printItem(int[] scores) { ... }
printItem({1, 2, 3}); // 컴파일 에러
printItem( new int[] {1, 2, 3}); //  굿

// new 연산자로 배열 생성
타입[] 변수 = new 타입[길이]; // 배열 안의 값은 타입별 배열의 초기값으로 설정됨

✔ 배열 길이

  • 배열의 길이란 배열에 저장할 수 있는 항목 수
  • 배열의 길이를 얻으려면 도트(.)연산자를 사용해 배열의 length 필드를 읽으면 됨
  • 배열의 인덱스를 초과해서 사용하면 ArrayIndexOutOfBoundsException 발생
배열변수.length; // 배열의 길이 리턴

// 배열의 length 필드는 읽기만 가능, 값 변경 불가
intArray.length = 10; // 컴파일 에러


💡 스터디

private void clear(Memo memo) {
	memo = null;
}

public boolean check(Memo memo) {
	this.clear(memo);
	System.out.println(memo);
}
// check에 있는 memo와 clear에 있는 memo가 다르다

[Java] Java는 Call by reference가 없다

profile
🔥 개발 공부 🔥
post-custom-banner

0개의 댓글