데이터 타입 분류
•
기본 타입 ( 원시 타입 ) : 변수에 실제 값(리터럴)을 저장하는 타입
•
참조 타입 : 변수에 객체의 메모리 주소를 저장하는 타입
◦
변수는 메모리의 스택 영역에 생성
◦
객체는 메모리의 힙 영역에 생성
메모리 사용 영역
•
JVM이 시작하면 운영체제로부터 할당받은 메모리 영역을 세부적으로 구분하여 사용
•
메소드 영역 : 코드에서 사용하는 클래스들을 클래스 로더로 읽어 클래스 별로 저장
◦
런타임 상수풀, 필드/메소드 데이터, 메소드 코드, 생성자 코드
◦
JVM이 시작할 때 생성
◦
모든 스레드가 공유하는 영역
•
힙 영역 : 객체가 생성되는 영역
◦
객체를 참조하는 변수나 필드가 없으면 JVM이 제거 ( 쓰레기 수집기 , Garbage Collector )
•
스택 영역 : 각 스레드마다 존재하며 스레드가 실행될 때 할당
◦
메소드를 호출할 때 마다 프레임을 추가 (push) ⇒ 메소드 종료시 프레임 제거 (pop)
◦
프레임 내부의 로컬 변수 스택 ⇒ 기본/참조 타입 변수 추가 및 제거
▪
변수가 초기화 될 때 생성
▪
블록을 벗어나면 스택에서 제거
참조 변수의 ==, != 연산
•
기본 타입 변수의 비교 연산은 저장된 값을 비교한다.
•
참조 타입 변수의 비교 연산은 저장된 객체의 번지를 비교한다.
◦
두 개의 참조 타입 변수의 비교 연산 결과
▪
True ⇒ 동일한 객체를 가리킨다.
▪
False ⇒ 서로 다른 객체를 가리킨다.
refVar1 == refVar2 // False
refVar2 == refVar3 // True
Java
복사
null과 NullPointerException
•
참조 타입 변수는 객체를 가리키고 있지 않을 때 null 값을 갖는다.
•
참조 타입 변수를 null로 초기화
refVar1 == null // False
refVar2 == null // True
refVar3 == null // True
Java
복사
•
NullPointerException
◦
null 값을 갖고 있는 참조 타입 변수를 사용하는 경우 발생
int[] intArray = null;
intArray[0] = 10; // NullPointerException 발생
String str = null;
System.out.println(str.length); // NullPointerException 발생
Java
복사
String 타입
•
문자열(String) 변수는 참조 타입 변수이다.
•
실제 문자열은 힙 영역의 객체로 생성된다.
String 변수 = "문자열";
Java
복사
•
동일한 문자열 리터럴을 저장한 변수는 동일한 객체를 가리킨다.
•
new 연산자를 사용하면 동일한 문자열 리터럴을 저장하더라도 다른 객체를 가리킨다.
◦
new : 객체 생성 연산자
•
오직 문자열만 비교하는 경우 ⇒ equals() 메소드 사용
String str1 = "최상일"; // 객체1 생성
String str2 = new String("최상일"); // 객체2 생성
String str3 = "최상일"; // 객체1 가리킴
str1 == str2; // False
str1.equlas(str2); // True
str1 == str3; // True
str3 = "윤준수"; // 객체3 생성
Java
복사
배열 타입
•
동일한 타입의 데이터를 연속된 공간에 나열하고 각 공간마다 인덱스를 부여한 자료구조
•
배열은 같은 타입의 데이터만 저장할 수 있다.
◦
다른 타입의 데이터를 저장하면 컴파일 시 Type mismatch 오류 발생
•
한번 생성된 배열의 크기는 늘리거나 줄일 수 없다.
배열 선언
타입[] 변수;
타입 변수[];
int[] intArray;
int intArray[];
int[] intArray = null;
Java
복사
값 목록으로 배열 생성
타입[] 변수 = { 값1, 값2, 값3, ... };
Java
복사
•
{} 안의 값들을 갖는 객체를 힙 영역에 생성.
•
스택 영역에 생성된 변수는 첫번 째 값의 메모리 주소를 갖는다.
•
배열을 선언한 후 다른 라인에서 {}로 값을 할당할 수 없다.
◦
new 연산자를 사용하여 생성한다.
int[] intArray = null;
intArray = {1,2,3}; // 컴파일 에러
intArray = new int[] {1,2,3};
Java
복사
new 연산자로 배열 생성
•
배열을 생성할 때 길이를 지정할 수 있다.
int[] intArray = new int[5];
Java
복사
•
new 연산자로 배열을 생성하는 경우, 배열은 자동적으로 기본값으로 초기화된다.
배열 길이
•
배열 객체의 length 필드 ⇒ 상수이므로 변경 불가능
int[] intArray = new int[5];
intArray.length // 5
Java
복사
•
for 문에서 배열을 사용하는 경우 유용하다.
커맨드 라인 입력
•
main() 메소드의 'String[] args'는 자바 실행 시 커맨드 라인에 입력한 값을 매개변수로 전달.
// command
$ java tutorial.class wirte once run everywhere
public static void main(String[] args) { // args[0] : write, args[1] : once, ...
...
}
Java
복사
다차원 배열
•
행과 열로 이루어진 2차원 배열 ⇒ 행렬
int[][] intMat = new int[2][3];
Java
복사
•
수학 행렬에서 사용하는 정사각형 구조와 달리 계단식 구조 생성 가능
int[][] intMat = new int[2][];
intMat[0] = new int[2]; // 0 1
intMat[1] = new int[3]; // 0 1 2
Java
복사
•
힙 영역에는 1차원 배열[행의 개수] 객체 + 1차원 배열[열의 개수] 객체 * 행의 개수
•
그룹화된 값 목록을 가진 배열은 중괄호 안에 중괄호로 표현한다.
int[][] intArray = { {1,2}, {3,4} }
int[0][0] // 1
int[1][1] // 4
Java
복사
객체를 참조하는 배열
•
배열의 각 원소가 객체의 메모리 주소를 참조하는 배열
String[] str1 = {"Choi", "sang", "il"};
str1[0] == str1[1] // False
String[] str2 = {"Choi", "Choi", "sangil"};
str2[0] == str2[1] // True
Java
복사
배열의 복사
•
배열의 값을 복사하는 경우 for문, System.arraycopy() 메소드를 사용
int[] oldArray = {1,2,3};
int[] newArray = new int[5];
for(int i=0; i<oldArray.length; i++){
newArray[i] = oldArray[i];
}
// oldArray => {1, 2, 3, 0, 0}
Java
복사
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
// src : 복사할 배열
// srcPos : 복사할 시작 인덱스
// dest : 붙여넣을 배열
// destPost : 붙여넣을 시작 인덱스
// length : 복사할 길이
Java
복사
향상된 for문
•
초기화식, 조건식, 증감식을 사용하지 않고 배열의 시작 → 끝까지 탐색하는 for문
for(초기화식; 조건식; 증감식) {
...
}
for(타입 변수 : 배열){
...
}
for( int item : intArray ){
...
}
Java
복사
•
실행 순서
1.
배열에서 가져올 값이 있는지 판단
a.
값이 있다면 해당 값을 item에 저장
i.
블록 실행
b.
값이 없다면 블록 탈출 ( 반복문 종료 )
2.
배열의 다음 요소에 가져올 값이 있는지 판단
3.
반복
열거 타입
•
한정된 값을 갖는 데이터 타입
◦
월, 화, 수, 목, 금, 토, 일
◦
봄, 여름, 가을, 겨울
•
포함하고 있는 열거 상수 중에서 하나의 상수를 저장하는 데이터 타입
열거 타입 선언
•
열거 타입의 이름을 정하고 해당 이름으로 된 소스 파일을 생성
◦
열거 타입 이름의 첫 문자는 대문자, 나머지는 소문자
◦
Week.java, Season.java
•
소스 파일의 내용은 public enum 키워드로 작성
◦
열거 타입의 이름 == 파일명
◦
열거 상수는 모두 대문자로 작성
◦
두 개의 단어로 이루어진 열거 상수는 밑줄 ( _ )로 연결
public enum Week {
MONDAY,
TUESDAY,
...
SUNDAY
}
Java
복사
열거 타입 변수
•
열거 타입을 사용하기 위하여 다른 변수와 같이 코드 내에서 선언한다.
Week today;
Week weekend;
Java
복사
•
선언한 열거 타입 변수에 열거 상수를 저장한다 ⇒ 열거타입.열거상수
•
열거 타입 변수도 참조 타입 변수이기 때문에 null을 저장할 수 있다.
Week today = Week.WEDNESDAY
Week weekend = null;
Java
복사
•
열거 타입에 해당하는 모든 열거 상수는 각자 힙 영역에 객체로 생성된다.
•
메소드 영역에 생성된 열거 상수가 해당 객체를 가리킨다.
•
스택 영역의 today 변수가 가리키는 객체 == 메소드 영역의 SUNDAY가 가리키는 객체
열거 객체의 메소드
•
열거 상수 객체는 열거 상수의 문자열을 내부 데이터로 갖고있다.
•
name()
◦
열거 객체가 갖고 있는 문자열을 반환 ⇒ 열거 상수 이름
Week today = Week.SUNDAY;
String name = today.name(); // SUNDAY
Java
복사
•
ordinal()
◦
전체 열거 객체 중 몇 번째인지 반환 ⇒ 열거 상수 순서
Week today = Week.SUNDAY;
int ordinal = today.ordinal(); // 6
Java
복사
•
compareTo()
◦
매개 변수로 주어진 열거 객체 기준으로 순서 차이를 반환
Week today = Week.SUNDAY;
Week tomorrow = Week.MONDAY;
int result = today.compareTo(tomorrow); // 6
Java
복사
•
valueOf()
◦
매개 변수로 주어진 문자열과 동일한 문자열을 포함한 열거 객체 반환
Week today = Week.valueOf("MONDAY"); // Week.MONDAY
Java
복사
•
values()
◦
모든 열거 객체를 배열로 만들어 반환
Week[] days = Week.values(); // {Week.MONDAY, Week.TUESDAY, ... , Week.SUNDAY}
Java
복사