자바의 데이터 타입
1. 기본 타입
// 기본 타입 변수
int age = 25;
int price = 100.5;
// 참조 타입 변수
String name = "홍길동";
String hobby = "수영";
기본 타입인 age와 price는 직접 값을 저장하고,
참조 타입인 String클래스의 name과 hobby는 힙 영역에 String 객체 번지 값을 저장
1. 메서드 영역
JVM이 시작할 때 생성, 모든 스레드가 공유하는 영역
정적 필드(static filed)와 상수(constant), 메서드 코드, 생성자(constructor)코드 등을 분류해서 저장
2. 힙 영역
객체와 배열이 생성되는 영역
생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조
참조하는 변수나 필드가 없다면 가비지 콜렉터(Garbage Collector)를 실행시켜 자동으로 제거
3. JVM 스택 영역
메서드를 호출할 때 마다 프레임을 추가(push)하고 메서드가 종료되면 해당 프레임을 제거(pop)
변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거
참조 타입 변수는 힙영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있음
=> null 값도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성
=> 참조되지 않은 객체는 Gabage Collector를 구동시켜 메모리에서 자동 제거
예외(Exction) : 프로그램 실행 도중 발생하는 오류 / Error : 하드웨어, OS에서 발생
=> NullPointerException : 참조 타입 변수를 잘못 사용하면 발생
// 방법1
String 변수;
변수 = "문자열";
// 방법2
String 변수 = "문자열";
// new 연산자
// name1과 name2는 동일한 객체를 참조
String name1 = "홍길동";
String name2 = "홍길동";
// name3는 name1,name2와는 다른 갹채를 참조
String name3 = new String("홍길동");
// 문자열 비교
String strVar1 = "홍길동";
String strVar2 = "홍길동";
if(strVar1 == strVar2) {
System.out.println("strVar1과 strVar2는 참조가 같음");
} else {
System.out.println("strVar1과 strVar2는 참조가 다름");
}
if (strVar1.equals(strVar2)) {
System.out.println("strVar1과 strVar2는 문자열이 같음");
}
// new 연산자 비교
String strVar3 = new String("홍길동");
String strVar4 = new String("홍길동");
if(strVar3 == strVar4) {
System.out.println("strVar3과 strVar4는 참조가 같음");
} else {
System.out.println("strVar3과 strVar4는 참조가 다름");
}
if (strVar3.equals(strVar4)) {
System.out.println("strVar3과 strVar4는 문자열이 같음");
}
같은 데이터를 연속된 공간에 나열하고 각 데이터에 인덱스를 부여한 자료구조
한 번 생성된 배열은 길이를 늘리거나 줄일 수 없다.
배열도 참조 변수이므로 null값을 가질 수 있다.
=> null 값을 가진 상태에서 변수[인덱스]로 값을 읽거나 저장하면 NullPointerExction을 가진다.
// 배열 선언 형식1
int[] 변수;
double[] 변수;
// 배열 선언 형식2
int 변수[]
double 변수[]
// 배열도 참조 변수이므로 null값으로 초기화 가능;
int[] 변수 = null;
1. 값 목록으로 배열 생성
String name = {"홍길동", "강감찬", "이순신"};
name[1] = "세종대왕";
2. new 연산자로 배열 생성
타입[] 변수 = new 타입[길이];
int[] array = new int[5];
타입별 배열의 초기값
배열 변수.length;
int[] array = {10, 20, 30};
int num = array.length; // 3
int[][] scores1 = new int[2][3];
int[][] scores2 = {{95, 80}, {92, 96}};
int scores2 = scores2[0][0]; // 95
int scores2 = scores[1][1]; // 96
public static void main(String[] args) {
String[] strArry = new String[3];
strArry[0] = "Java";
strArry[1] = "Java";
strArry[2] = new String("Java");
System.out.println(strArry[0] == strArry[1]); // true
System.out.println(strArry[0] == strArry[2]); // false
System.out.println(strArry[0].equals(strArry[2])); // true
}
System.arraycopy(원본배열, 인덱스, 대상배열, 인덱스, 복사할 개수);
// forans 사용
int[] oldIntArray = {1, 2, 3};
int[] newIntArray = new int[5];
for(int i = 0; i < oldIntArray.length; i++) {
newIntArray[i] = oldIntArray[i];
}
for(int i = 0; i < newIntArray.length; i++) {
System.out.print(newIntArray[i] + ", ");
}
// System.arraycopy()메서드를 사용
String[] oldStrArray = {"java", "array", "copy"};
String[] newStrArray = new String[5];
System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
for(int i = 0; i < newStrArray.length; i++) {
System.out.print(newStrArray[i] + ",");
}
for(타입 변수 : 배열) {
실행문;
}
int[] scores = {95, 71, 84, 93, 87};
int sum = 0;
for (int score : scores) { // 향상된 for문 사용
sum += score;
}
열거 타입의 이름을 정하고 해당 이름으로 소스파일(.java)을 생성
=> 열거 타입 이름은 첫글자는 대문자, 나머지는 소문자로 구성 / 여러 단어로 구성된 이름이라면 각 단어의 첫 글자는 대문자로
열거 상수는 모두 대문자로 작성
=> 열거 상수가 여러 단어로 구성될 경우 단어 사이를 밑줄(_)로 연결
// 열거 타입 선언하기 위한 키워드
public enum 열거타입이름 {...}
// 열거 타입 선언과 열거 상수 선언
public enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
열거타입 변수;
Week today;
열거타입 변수 = 열거타입.열거상수;
Week today = Week.SUNDAY;