3 분 소요

조건문, 반복문# 참조 타입

데이터 타입

  • 기본 타입 : 선언된 변수는 실제 값을 변수 안에 저장
    • 정수
    • 실수
    • 논리
  • 참조 타입 : 메모리의 번지를 값으로 갖는다.
    • 배열
    • 열거
    • 클래스
    • 인터페이스
    • string
  • 변수는 스택 영역, 객체는 힙 영역에 생성

메모리 사용 영역

  • 메소드 영역
    • 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 런타임 상수풀, 필드 데이터, 메소드 데이터, 메소드 코드, 생성자 코드 등을 분류해서 저장
    • JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역
  • 힙 영역
    • 객체와 배열이 생성되는 영역
    • JVM 스택 영역의 변수나 다른 객체의 필드에서 참조
    • 참조하는 변수나 필드가 없으면 가비지 콜렉터가 자동으로 제거
  • JVM 스택 영역
    • 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당
    • 자바 프로그램에서 추가적으로 스레드를 생성하지 않았다면 main 스레드만 존재하므로 JVM 스택도 하나
    • 메소드를 호출할 때마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작 수행
    • 예외 발생 시 printStackTrace() 메소드로 보여주는 Stack Trace의 각 라인은 하나의 프레임 표현
    • 프레임 내부에는 로컬 변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 추가 되거나 제거 됨
      • 최초로 변수에 값이 저장될 때 이 영역에 생성
      • 선언된 블록 안에서만 스택 존재하고 블록 벗어나면 스택에서 제거

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

  • 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용
  • 주소 값 비교

null, NullPointerException

  • 참조 타입 변수는 힙 영역의 개체를 참조하지 않는다는 뜻으로 null 값 가질 수 있음
  • null 값도 초기값으로 사용 ⇒ null로 초기화된 참조 변수 스택 영역에 생성
  • NullPointerException : 참조 타입 변수를 잘못 사용할 경우 발생
    • 참조 타입 변수가 null 인 경우
    • 참조할 객체가 없어서 사용할 수 없음

String 타입

  • 자바는 문자열을 String 변수에 저장
    • 문자열은 String 객체로 생성되고 변수는 String 객체 참조
    • 문자열 리터럴 / new 연산자로 String 객체 생성 해서 문자열 저장
  • 문자열만을 비교할 땐 equals() 메소드 사용

배열 타입

  • 같은 타입의 데이터를 연속된 공간에 나열시키고, 각 데이터에 인덱스를 부여해 놓은 자료 구조
  • 다른 타입의 데이터 저장하면 오류 ⇒ Type mismatch
  • 한 번 생성된 배열의 길이는 늘리거나 줄일 수 없음
    • 새로운 길이의 배열을 만들고 기존 배열 항목을 새 배열로 복사
  • 배열 선언
    • 타입[ ] 변수
    • 타입 변수 [ ]
    • null 값 초기화 가능
    • 배열 변수를 이미 선언한 후 다른 실행문에서 중괄호를 사용한 배열 생성 안됨
      • new 연산자를 사용해서 값 목록 지정
      • 변수 = new 타입[] { 값0, 값1, 값2… }
  • new 연산자로 배열 생성

    분류 데이터 타입 초기값
    기본 타입(정수) byte[ ] 0
      char[ ] ‘\u0000’
      short[ ] 0
      int[ ] 0
      long[ ] 0L
    기본 타입(실수) float[ ] 0.0F
      double[ ] 0.0
    기본 타입(논리) boolean[ ] false
    참조 타입 클래스[ ] null
      인터페이스[ ] null
  • 배열 길이
    • 배열에 저장할 수 있는 전체 항목 수
  • 객체 참조
    • String[ ] 배열의 항목 String 변수와 동일하게 취급
      • 문자열 비교하기 위해 equels() 메소드 사용
      • 객체 번지 비교 ==, !=
  • 배열 복사
    • for문
      • 복사할 배열에 기존 배열값 삽입
      • 복사되지 않은 항목은 초기값 유지됨
    • System.arraycopy(원본 배열, 원본 배열에서 복사할 항목의 시작 인덱스, 새 배열, 새 배열에서 붙여넣을 시작 인덱스, 복사할 개수)
      • System.arraycopy(arr1, 0, arr2, 0, arr1.length) ⇒ 원본 배열 arr1의 모든 항목을 새 배열 arr2에 복사
  • 향상된 for 문
    • 반복 실행을 하기 위해 카운터 변수와 증감식 사용하지 않음
    • 배열 및 컬렉션 항목의 개수만큼 반복하고 자동으로 for문 빠져나감

열거 타입

  • 몇 개의 열거 상수 중에서 하나의 상수를 저장하는 데이터 타입
  • 열거 상수 는 열거 객체로 생성
  • 선언 방법
    • 열거 타입 이름 정하고 열거 타입 이름으로 소스 파일(.java) 생성
    • 첫 문자를 대문자로 나머지는 소문자로 구성
    • public enum 열거타입 이름 { … }
  • 변수
    • 열거 타입도 하나의 데이터 타입이기 때문에 변수를 선언하고 사용
    • 선언 방법 ⇒ 열거타입 변수
    • 열거타입 변수 = 열거타입.열거상수
  • 메소드
    • name() : 열거 객체가 가지고 있는 문자열 리턴
    • ordinal() : 전체 열거 객체 중 몇 번째 열거 객체인지 리턴
    • compareTo() : 매개값으로 주어진 열거 객체를 기준으로 전후로 몇 번째 위치하는지 비교
      • 열거 객체가 매개값보다 순번이 빠르면 음수, 느리면 양수
    • valueOf() : 매개값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체 리턴
    • values() : 열거 타입의 모든 열거 객체들을 배열로 만들어 리턴