티스토리에 저장했던 글을 옮겼습니다.
https://mrcocoball.tistory.com/63
https://mrcocoball.tistory.com/64
https://mrcocoball.tistory.com/65
기본 타입 (primitive type)
과 참조 타입 (reference type)
으로 분류됨char v1 = 'A'; // ①
if (v1 == 'A') { // ②
int v2 = 100;
double v3 = 3.14;
}
boolean v4 = true; // ③
// ① 시점 : v1 생성, 존재
// ② 시점 : v2, v3 생성, v1 존재
// ③ 시점 : v3 생성, v1 존재, v2, v3 소멸
int[] scores = {10, 20, 30};
// [스택 영역] [힙 영역]
// scores 5번지 → 참조 → 5번지 10, 20, 30
// refVar1는 객체 1을 참조, refVar2, refVar3은 객체2를 참조할 경우
refVar1 == refVar2 는 false
refVar2 == refVar3 은 true
NullPointerException
: null 상태에서 있지도 않은 객체의 데이터(필드)나 메소드를 사용하는 코드 실행 시 발생int[] intArray = null;
intArray[0] = 10; // <- NullPointerException 발생
String str = null;
System.out.println("총 문자수: " + str.length()); // <- NullPointerException 발생
String name;
name = "리코";
String hobby = "벽쿵';
// 에서 문자열 리터럴인 "리코"와 "벽쿵"은 힙 영역에 String 객체로 생성됨
// name은 String 객체의 "리코" 를 참조, hobby는 String 객체의 "벽쿵"을 참조 (= 번지 값이 저장, 참조)
String name1 = "요시코";
String name2 = "요시코";
// 일 경우 name1과 name2는 동일한 String 객체를 참조하게 되며, name1 == name2 는 true를 반환
String name1= new String("요시코");
String name2 = new STtring("요시코");
// 이 경우 name1과 name2는 서로 다른 객체를 참조하게 되며, name1 == name2는 false를 반환
원본 문자열.equals(비교 문자열)
String hobby = "벽쿵"; // hobby 변수가 String 객체를 참조하였으나
hobby = null; // null을 대입함으로써 더 이상 String 객체를 참조하지 않도록 함
// > 이 경우 가비지 컬렉터를 구동, 메모리에서 자동으로 제거됨
타입[] 변수;
int[] intArray;
double[] doubleArray;
String[] strArray;
타입 변수[];
int intArray[];
double doubleArray[];
String strArray[];
타입[] 변수 = null;
String[] names = { "치카", "리코", "요우" };
names[0] > "치카"
names[1] > "리코"
names[0] = "요시코";
String[] names;
names = { 값0, 값1, 값2... }; // << 컴파일 에러
String[] names;
names = new String[] { "치카", "리코", "요우" };
int add(int[] scores) {...};
int result = add(new int[] {95, 85, 90} );
String[] names = new String[5]; // 길이가 5인 String[] 배열 생성
변수[인덱스] = 값;
names[0] = "하나마루";
String[] names = {"하나마루", "요시코", "루비"}'
int num = names.length;
public static void main(String[] args) { ... }
int[][] scores = new int[2][3];
→행 / ↓열 | 0 | 1 | 2 |
---|---|---|---|
0 | (0,0) | (0,1) | (0,2) |
1 | (1,0) | (1,1) | (1,2) |
scores.length // > 2 (배열 A, 배열 B와 C가 있음)
scores[0].length // > 3 (배열 B, 내부에 항목 3개가 있음)
scores[1].length // > 3 (배열 C, 내부에 항목 3개가 있음)
int[][] scores = new int[2][]; // > 2 (배열 A, 배열 B와 C가 있으나 아직 항목 미정)
scores[0] = new int[2]; // (배열 내부에 길이 2짜리 배열 B 생성)
scores[1] = new int[3]; // (배열 내부에 길이 3짜리 배열 C 생성)
scores.length // > 2
scores[0].length // > 2
scores[1].length // > 3
int[][] scores = { {95, 90, 95}, {98, 87, 92} }
int score = scores[0][1]; // > 90
int score = scores[1][2]; // > 92
String[][] idols = { {"리코", "요시코", "마리"}, {"치카", "요우", "루비"}, {"하나마루", "카난", "다이아"} };
String idol = idols[0][0]; // > "리코"
String idol = idols[2][1]; // > "카난"
// ※ Python 리스트 내부 리스트의 요소 접근과 동일
기본 타입은 배열의 각 항목에 직접 값을 갖고 있으나 참조 타입 (클래스, 인터페이스) 배열은
각 항목에 객체의 번지를 가지고 있음
String[] 배열의 경우 각 항목에 문자열이 아닌, String 객체의 번지를 가지고 있으며 String 객체를 참조하게 됨
따라서 String[] 배열의 항목도 결국 String 변수와 동일하게 취급되어야 함
예시
String[] idols = new String[3];
idols[0] = "요시코";
idols[1] = "요시코";
idols[2] = new String("요시코");
System.out.println(idols[0] == idols[1]); // true (같은 객체 참조)
System.out.println(idols[0] == idols[2]); // false (다른 객체 참조)
System.out.println(idols[0].equals(idols[2])); // true (문자열 동일)
int[] oldIntArray = {1,2,3};
int[] newIntArray = new int[5];
for(int i=0; i<oldIntArray.length; i++) {
newIntArray[i] = oldIntArray[i];
}
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
// src 매개값은 원본 배열
// srcPos는 원본 배열에서 복사할 항목의 시작 인덱스
// dest 매개값은 새 배열
// destPos는 새 배열에서 붙여넣을 시작 인덱스
// length 는 복사할 개수
System.arraycopy(old_array, 0, new_array, 0, old_array.length);
String[] oldStrArray = {"치카", "리코", "요우"};
String[] newStrArray = new String[5];
System.arraycopay(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
for (타입 변수 : 배열) {
실행문;
}
// 배열 : for문이 처음 실행될 때 배열에서 가져올 첫 번째 값이 존재하는지 평가, 값이 없을 경우 for문 종료
// 가져올 항목이 있을 경우 해당 값을 타입 변수에 저장
// 실행문 : 타입 변수에 저장한 후 실행문을 실행, 실행문 실행 후 다시 루프를 돌아 배열 1로 돌아감
// 배열 -> 타입 변수 -> 실행문 ... 반복
// for문의 반복 횟수 = 배열의 항목 수
public enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
// Week : 열거 타입 이름
// MONDAY, TUESDAY, ... : 열거 상수
public enum Week { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }
LOGIN_SUCCESS, LOGIN_FAILED
열거타입 변수;
Week today;
Week happyBirthday;
열거 타입 변수 = 열거 타입.열거 상수;
Week today = Week.SUNDAY;
Week happyBirthday = Week.SATURDAY;
Week today = Week.SUNDAY;
// 열거 타입 변수 today는 스택 영역에 생성, today에 저장된 값은 Week.SUNDAY 열거 상수가 참조하는 객체의 번지
// 따라서 열거 상수 Week.SUNDAY와 today 변수는 서로 같은 Week 객체를 참조
// today == Week.SUNDAY; // ture가 됨
// 이를 응용하게 되면
Week week1 = Week.SATURDAY;
Week week2 = Week.SATURDAY;
System.out.println(week1 == week2); // true