Java 4일차
조건문, 반복문# 참조 타입
데이터 타입
- 기본 타입 : 선언된 변수는 실제 값을 변수 안에 저장
- 정수
- 실수
- 논리
- 참조 타입 : 메모리의 번지를 값으로 갖는다.
- 배열
- 열거
- 클래스
- 인터페이스
- 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() 메소드 사용
- 객체 번지 비교 ==, !=
- String[ ] 배열의 항목 String 변수와 동일하게 취급
- 배열 복사
- for문
- 복사할 배열에 기존 배열값 삽입
- 복사되지 않은 항목은 초기값 유지됨
- System.arraycopy(원본 배열, 원본 배열에서 복사할 항목의 시작 인덱스, 새 배열, 새 배열에서 붙여넣을 시작 인덱스, 복사할 개수)
- System.arraycopy(arr1, 0, arr2, 0, arr1.length) ⇒ 원본 배열 arr1의 모든 항목을 새 배열 arr2에 복사
- for문
- 향상된 for 문
- 반복 실행을 하기 위해 카운터 변수와 증감식 사용하지 않음
- 배열 및 컬렉션 항목의 개수만큼 반복하고 자동으로 for문 빠져나감
열거 타입
- 몇 개의 열거 상수 중에서 하나의 상수를 저장하는 데이터 타입
- 열거 상수 는 열거 객체로 생성
- 선언 방법
- 열거 타입 이름 정하고 열거 타입 이름으로 소스 파일(.java) 생성
- 첫 문자를 대문자로 나머지는 소문자로 구성
- public enum 열거타입 이름 { … }
- 변수
- 열거 타입도 하나의 데이터 타입이기 때문에 변수를 선언하고 사용
- 선언 방법 ⇒ 열거타입 변수
열거타입 변수 = 열거타입.열거상수
- 메소드
- name() : 열거 객체가 가지고 있는 문자열 리턴
- ordinal() : 전체 열거 객체 중 몇 번째 열거 객체인지 리턴
- compareTo() : 매개값으로 주어진 열거 객체를 기준으로 전후로 몇 번째 위치하는지 비교
- 열거 객체가 매개값보다 순번이 빠르면 음수, 느리면 양수
- valueOf() : 매개값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체 리턴
- values() : 열거 타입의 모든 열거 객체들을 배열로 만들어 리턴