티스토리 뷰

5.1 데이터 타입 분류

  • 기본 타입: 값 자체를 저장
  • 참조 타입: 객체가 생성된 메모리 번지를 저장 (배열, 열거, 클래스, 인터페이스)
  • Stack영역에 모든 변수들을 저장하는데 기본 타입은 값 자체가 저장되고 참조 타입은 Heap영역의 번지가 저장된다.

 

5.2 메모리 사용 영역

  • 메소드 영역
    • 클래스별로 상수, static 필드, 메소드, 생성자 코드 등
    • 바이트코드 파일 내용 저장

 

    • 객체 생성 영역
    • 메소드와 스택 영역의 상수와 변수에서 참조해 감
    • 가비지 컬렉션(Garbage Collection)이 수행

 

  • 스택
    • 메소드 호출할 때 생성되는 프레임이 저장되는 영역
    • 메소드 호출이 끝나면 자동 제거
    • 프레임 내부에 로컬 변수 스택이 있음

 

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

  • 변수의 값이 같은지 아닌지를 판단
  • 참조 타입의 변수의 값은 객체의 번지이므로 참조 타입의 경우 값이 아니라 번지가 같은지 아닌지를 판단
String str1 = "java";
String str2 = "java";
String str3 = new String("java");

System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false

// str1과 str2는 같은 번지를 참조하고 new 연산자를 사용해 새롭게 번지를 만든 str3은 같은 java라도 다르다고 나온다.

 

 

5.4 null과 NullPointerException

  • 참조 타입은 아직 번지를 저장하고 있지 않다는 뜻으로 null값을 가질 수 있음
  • null값도 초기값으로 사용할 수 있기 때문에 스택 영역에 생성
  • NullPointerException: null인 상태에서 객체를 사용하려고 할 때 발생하는 예외
  • 더 이상 객체를 참조하고 싶지 않을 때는 null을 대입하고 이 때, 어디에서도 객체를 참조하지 않을 경우에는 Garbage collector가 객체를 자동으로 삭제

 

5.5 문자열(String) 타입

  • 자바의 문자열은 String 객체로 생성

 

문자열 비교

  • 문자열 리터럴이 동일하면 String객체를 공유함 (String Pool)
  • new 연산자로 문자열 리터럴을 대입할 때는 새롭게 객체를 생성함
  • 즉, 문자열 리터럴로 생성하냐 new 연산자를 쓰냐에 따라 비교 결과가 달라짐
  • equals(): 객체의 번지와 상관 없이 문자열만을 비교할 경우 사용
  • 빈 문자열("")도 String 객체기 때문에 equals()를 사용
    String str1 = "java";
    String str2 = "java";
    String str3 = new String("java");

    System.out.println(str1.equals(str3)); // true

 

문자 추출

  • charAt(): 특정 위치의 문자를 얻고 싶을 때 사용

 

문자열 길이

  • length(): 문자열의 개수를 알고 싶을 때 사용 (공백 포함)

 

문자열 대체

  • replace(): 특정 문자열을 다른 문자열로 대체할 때 사용
  • 불변 객체: String 객체의 문자열은 변경이 불가하기 때문에 기존 문자열은 나두고 대체한 새로운 문자열을 리턴

 

문자열 잘라내기

  • substring(): 특정 위치의 문자열을 잘라낼 때 사용

 

문자열 찾기

  • indexOf(): 주어진 문자열이 시작되는 인덱스를 리턴
  • 포함되어 있지 않으면 -1 을 리턴
  • contains: 단순히 포함되어 있는지만 확인

 

문자열 분리

  • split: 구분자를 사용해 여러 개의 문자열로 구성되어 있을 경우, 구분자를 기준으로 문자열을 분리하는데 사용
  • 분리된 문자열은 배열로 리턴

 

5.6 배열(Array)

  • 연속된 공간에 값을 나열시키고
  • 각 값에 인덱스를 부여한 자료구조
  • 인덱스는 0부터 시작
  • 같은 타입의 값만 사용 가능
  • 길이는 임의로 늘리거나 줄일 수 없음
  • 참조 변수
  • null로 초기화

배열 변수 선언

int[] intArray;'
int intArray[];

 

값 목록으로 배열 생성

String[] season = {"봄", "여름", "가을", "겨울"};
  • 배열 선언한 후에 값 목록을 변수에 대입할 수 없음
  • new 연산자를 사용해서 목록 대입 가능
int[] scores;

// scores = {1, 2, 3, 4,}; 컴파일 에러

// 값 목록 대입 가능
scores = new int[] { 1, 2, 3}

 

new 연산자로 배열 생성

int[] intArray = new int[5];
// 길이가 5인 배열 생성
  • new 연산자로 배열을 처음 생성하면 타입별 기본값으로 초기화된다.

 

배열의 길이

  • 배열.length
  • 배열에 저장할 수 있는 항목 수
  • 읽기만 가능하고 수정 불가

 

5.7 다차원 배열

  • 배열 항목에 또 다른 배열을 대입한 배열

 

값 목록으로 다차원 배열 생성

int[][] scores = {
{1, 2, 3},
{11, 22, 33, 44};

scores[0][2] // -> 96

scores.length // -> 2
scoresp[0].length // -> 3

 

new 연산자로 다차원 배열 생성

int[][] scores = new int[2][3];
  • 2차원 배열의 길이는 모두 3이고 항목들은 0으로 초기화된다.

 

5.8 객체를 참조하는 배열

  • 참조 타입 배열은 각 항목에 객체의 번지를 저장

 

5.9 배열 복사

  • 배열은 한 번 생성하면 길이를 변경할 수 없다.
  • System.arraycopy() 메소드 호출로 복사 가능

 

5.10 배열 항목 반복을 위한 for문

for (타입 변수 : 배열) {
    실행문
}

 

5.11 main() 메소드의 String[] 매개변수 용도

 

5.12 열거(enum) 타입

  • 한정된 값을 갖는 타입
  • 참조 타입이므로 null 대입 가능
public enum Seasons {
// 관례적으로 모두 대문자로 작성 혹은 언더바(_) 사용
  SPRING,
  SUMMER,
  AUTUMN,
  WINTER
}
최근에 올라온 글