1. 데이터 타입 분류
- 기본 타입 변수
ex) int age = 5;
double price = 10.5;
- 참조 타입 변수
ex) String name = "홍길동";
Double price = 10.5;
2. 데이터 타입 분류
1. 메서드(정적, Static) 영역
- JVM이 시작할 때 생성되는 영역
- 로딩된 클래스의 바이트 코드 내용을 분석한 후 메서드 영역에 저장된다.
- 모든 스레드가 공유하는 영역
2. 힙 영역
- JVM이 시작할 때 생성되는 영역
- 객체 또는 배열이 저장된다.
- 사용되지 않는 객체는 Garbage Collector 가 자동으로 제거해준다.
3. 스택(Stack) 영역
- 스레드 별 생성되는 영역이다.
- 메서드를 호출할 때마다 Frame을 스택에 추가해준다. (push)
- 메서드가 종료되면 Frame 제거된다. (pop)
3. 참조 변수의 == 와 != 연산
- 참조 타입의 변수의 값은 힙 영역의 객체 주소이므로 결국 주소 값을 비교하는 것이 된다.
* 동일한 주소 값을 가지고 있다는 것은 동일한 객체를 참조한다는 의미!!
4. null 과 NullPointerException
- null (널)
- 변수가 참조하는 객체가 없는 경우 초기값으로 null이 사용된다.
- null로 초기화된 참조 변수는 스택 영역에 생성된다.
- 참조 타입 변수가 null 값을 가지고 있는지 없는지는 == 또는 != 연산으로 확인할 수 있다.
- NullPointerException 의 의미
- 예외 (Exception)
: 사용자의 잘못된 조작이나 잘못된 코딩으로 인해 발생하는 프로그램 오류
- NullPointerException
: 참조 타입 변수가 null 값을 가지고 있을 때, 객체의 필드나 메서드를 사용하려고 하면 발생한다.
5. String 타입
- 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어 있다.
- new 연산자를 사용하여 직접 String 객체를 생성할 경우, 서로 다른 String 객체를 참조하게 된다.
- 주소값의 비교는 == 또는 != 연산자로 비교할 수 있고 객체의 문자열만을 비교할 때는
String 객체의 equals( ) 메서드를 사용해야 한다.
- String 변수는 참조 타입이므로 null 값을 대입할 수 있다.
이때 참조를 잃은 String 객체 즉, 더이상 무언가를 참조하고 있지 않은 변수는
JVM의 쓰레기 수집기(Garbage Collector)에 의해 메모리에서 자동으로 제거된다.
public class StringEqualsExample {
public static void main(String[] args) {
String strVar1 = "신민철";
String strVar2 = "신민철";
System.out.println("strVar1="+System.identityHashCode(strVar1));
System.out.println("strVar2="+System.identityHashCode(strVar2));
if (strVar1 == strVar2) {
System.out.println("strVar1과 strVar2는 참조가 같음");
} else {
System.out.println("strVar1과 strVar2는 참조가 다름");
}
if (strVar1.equals(strVar2)) {
System.out.println("strVar1과 strVar2는 문자열이 같음");
}
String strVar3 = new String("신민철");
String strVar4 = new String("신민철");
System.out.println("strVar3="+System.identityHashCode(strVar3));
System.out.println("strVar4="+System.identityHashCode(strVar4));
if (strVar3 == strVar4) {
System.out.println("strVar3과 strVar4는 참조가 같음");
} else {
System.out.println("strVar3과 strVar4는 참조가 다름");
}
if (strVar3.equals(strVar4)) {
System.out.println("strVar3과 strVar4는 문자열이 같음");
}
}
}
6. 배열 타입
[1. 배열에 대하여]
- 정의
: 배열이란, 같은 타입의 데이터를 연속된 공간에 나열시키고, 각 데이터에 인덱스를 부여해 놓은 자료구조이다.
- 단점
: 배열은 처음에 배열의 크기를 정해야 배열이 만들어지므로 한번 생성된 배열은 길이를 늘리거나 줄일 수 없다.
- 장점
: 중복된 변수의 선언을 줄이기 위해 사용된다.
반복문을 이용해서 요소들을 쉽게 처리할 수 있다. (아래의 사진 참고)
[2. 배열 선언]
- 기본형
1) 타입 [ ] 변수; 또는 타입 변수 [ ];
2) 타입 변수 [ ] = null;
- 배열 변수는 배열이 생성되기 전에 null로 초기화가 가능하다.
배열 변수가 null 값을 가진 상태에서는 항목에 접근이 불가능 하다.
* 안그러면 NullPointerException 발생한다!!
3. 값 목록으로 배열 생성
- 다음과 같이 배열 변수 선언과 동시에 값의 목록을 대입할 수 있다.
4. new 연산자로 배열 생성
- 기본형
1) 배열 선언과 동시에 배열 길이 지정
: 타입 [ ] 변수 = new 타입 [ 배열의 길이 ] ;
ex) int [ ] arr = new int [10];
2) 배열 선언한 후에 배열 길이 지정
: 타입 [ ] 변수 = null ;
변수 = new 타입 [ 배열의 길이 ] ;
ex) int [ ] arr = null; // 배열 선언
arr = new int [10]; // 배열의 크기 지정
- 배열 생성시에는 값 목록을 가지고 있지 않다.
- 향후 값들을 저장할 배열을 미리 생성하고 싶은 경우
public class ArrayCreateByValueListExample1 {
public static void main(String[] args) {
// 1. 배열 선언과 동시에 값 초기화하는 경우
// 배열값 지정이 Array constants로 지정하는 경우, 초기값 설정으로만 가능
int[] scores = { 83, 90, 87 };
System.out.println("scores[0] : " + scores[0]);
System.out.println("scores[1] : " + scores[1]);
System.out.println("scores[2] : " + scores[2]);
int sum = 0;
for(int i=0; i<scores.length; i++) {
sum += scores[i];
}
/*
for(int i=0; i<3; i++) {
sum += scores[i];
}
*/
System.out.println("총합 : " + sum);
double avg = (double) sum / 3;
System.out.println("평균 : " + avg);
}
}
[ 배열 선언과 동시에 값 초기화 하는 경우 ]
public class ArrayCreateByValueListExample2 {
public static void main(String[] args) {
// 2. 배열 선언 후 값 지정(초기화)하는 경우
int[] scores; // 배열 선언
scores = new int[] { 83, 90, 87 };
// 배열 값 지정(초기화)
// new 데이터형[];
// scores = {83, 90, 87}; <-- 배열 선언 후 값을 초기화할 때 이렇게 지정할 수 없다.
int sum1 = 0;
for(int i=0; i<3; i++) {
sum1 += scores[i];
}
System.out.println("총합 : " + sum1);
int sum2 = add( new int[] { 83, 90, 87 } );
// int sum2 = add( { 83, 90, 87 } ); // 이렇게 배열 값 지정 못함
System.out.println("총합 : " + sum2);
System.out.println();
}
public static int add(int[] scores) {
int sum = 0;
for(int i=0; i<3; i++) {
sum += scores[i];
}
return sum;
}
}
[ 배열 선언 후 값 지정(초기화)하는 경우 ]
public class ArrayCreateByNewExample {
public static void main(String[] args) {
int[] arr1 = new int[3];
for(int i=0; i<3; i++) {
System.out.println("arr1[" + i + "] : " + arr1[i]);
}
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
for(int i=0; i<3; i++) {
System.out.println("arr1[" + i + "] : " + arr1[i]);
}
double[] arr2 = new double[3];
for(int i=0; i<3; i++) {
System.out.println("arr2[" + i + "] : " + arr2[i]);
}
arr2[0] = 0.1;
arr2[1] = 0.2;
arr2[2] = 0.3;
for(int i=0; i<3; i++) {
System.out.println("arr2[" + i + "] : " + arr2[i]);
}
String[] arr3 = new String[3];
for(int i=0; i<3; i++) {
System.out.println("arr3[" + i + "] : " + arr3[i]);
}
arr3[0] = "1월";
arr3[1] = "2월";
arr3[2] = "3월";
for(int i=0; i<3; i++) {
System.out.println("arr3[" + i + "] : " + arr3[i]);
}
}
}
[ new 연산자로 배열 생성 ]
5. 배열의 길이
- 기본형
: 배열변수.length;
( 배열변수.length(); <- (X) )
- length 필드는 읽기 전용 필드이기 때문에 값을 바꿀 수 없다.
- for문을 사용해서 배열 전체를 루핑할 때 (배열 전체를 돌 때) 매우 유용하게 사용할 수 있다.
public class ArrayLengthExample {
public static void main(String[] args) {
int[] scores = { 83, 90, 87 };
int sum = 0;
for(int i=0; i<scores.length; i++) {
sum += scores[i];
}
System.out.println("총합 : " + sum);
double avg = (double) sum / scores.length;
System.out.println("평균 : " + avg);
}
}
[ 배열의 길이 사용한 코드 예시 ]
6. 커맨드 라인 입력
- "c:\>java 클래스" 로 프로그램을 실행하면 JVM은 길이가 0인 String 배열을 먼저 생성하고
main() 메소드를 호출할 때 매개값으로 전달한다.
public class MainStringArrayArgument {
public static void main(String[] args) {
if (args.length != 2) {
System.out.println("프로그램의 사용법");
System.out.println("java MainStringArrayArgument num1 num2");
System.exit(0);
}
String strNum1 = args[0];
String strNum2 = args[1];
int num1 = Integer.parseInt(strNum1);
int num2 = Integer.parseInt(strNum2);
int result = num1 + num2;
System.out.println(num1 + " + " + num2 + " = " + result);
}
}
7. 다차원 배열
- 자바는 다차원 배열을 중첩 배열 방식으로 구현한다.
public class ArrayInArrayExample {
public static void main(String[] args) {
// 다차원 배열
int[][] mathScores = new int[2][3];
for (int i = 0; i < mathScores.length; i++) { // mathScores.length = 2
for (int k = 0; k < mathScores[i].length; k++) { // mathScores[i].length = 3
System.out.println("mathScores[" + i + "][" + k + "]=" + mathScores[i][k]);
}
}
System.out.println();
// 가변배열..?
int[][] englishScores = new int[2][];
englishScores[0] = new int[2];
englishScores[1] = new int[3];
for (int i = 0; i < englishScores.length; i++) { // englishScores.length = 2
for (int k = 0; k < englishScores[i].length; k++) { // englishScores[0].length = 2, englishScores[1].length = 3
System.out.println("englishScores[" + i + "][" + k + "]=" + englishScores[i][k]);
}
}
System.out.println();
int[][] javaScores = { { 95, 80 }, { 92, 96, 80 } };
for (int i = 0; i < javaScores.length; i++) { // javaScores.length = 2
for (int k = 0; k < javaScores[i].length; k++) { // javaScores[0].length = 2, javaScores[1].length = 3
System.out.println("javaScores[" + i + "][" + k + "]=" + javaScores[i][k]);
}
}
}
}
8. 객체를 참조하는 배열
- 기본 타입 배열은 각 항목에 직접 값을 가지고 있지만, 참조 타입의 배열은 각 항목에 객체의 주소값을 가지고 있다.
public class ArrayReferenceObjectExample {
public static void main(String[] args) {
String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "Java";
strArray[2] = new String("Java");
System.out.println(strArray[0] == strArray[1]); //true (같은 객체를 참조)
System.out.println(strArray[0] == strArray[2]); //false (다른 객체를 참조)
System.out.println(strArray[0].equals(strArray[2])); //true (문자열이 동일)
}
}
9. 배열 복사
- 배열은 한번 생성하면 크기를 변경할 수 없기 때문에 더 많은 저장 공간이 필요하면
보다 더 큰 배열을 새로 만들고 이전 배열로부터 항목 값들을 복사해야 한다.
- 배열 간의 항목 값들을 복사하려면 1) for문을 사용하거나 2) System.arraycopy( ) 메서드를 사용하면 된다.
- arraycopy( ) 함수 기본형
: System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) ;
public class ArrayCopyByForExample {
public static void main(String[] args) {
// for문을 이용한 배열 복사
int[] oldIntArray = {1,2,3};
// oldIntArray[3] = 4; // ArrayIndexOutOfBoundsException 발생
int[] newIntArray = new int[5];
for (int i = 0; i < oldIntArray.length; i++) {
newIntArray[i] = oldIntArray[i];
}
newIntArray[3] = 4;
for (int i = 0; i < newIntArray.length; i++) {
System.out.print(newIntArray[i] + " ");
}
}
}
[ for문을 이용한 배열 복사 ]
public class ArrayCopyExample {
public static void main(String[] args) {
String[] oldStrArray = { "java", "array", "copy" };
String[] newStrArray = new String[5];
// arraycopy() 사용하여 배열 복사
System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
for (int i = 0; i < newStrArray.length; i++) {
System.out.print(newStrArray[i] + ", ");
}
}
}
[ System.arraycopy( ) 메서드 사용한 배열 복사 ]
10. 향상된 for문
- 기본형
: for ( 타입 변수 : 배열 ) {
실행문;
}
public class AdvancedForExample {
public static void main(String[] args) {
int[] scores = { 95, 71, 84, 93, 87 };
int sum = 0;
for (int score : scores) {
sum = sum + score;
}
System.out.println("점수 총합 = " + sum);
double avg = (double) sum / scores.length;
System.out.println("점수 평균 = " + avg);
}
}
[ 향상된 for문 사용한 코드 예시 ]
[ 6 ] 열거 타입 (enumeration type)
- 열거타입 : 한정된 값만을 가지는 데이터 타입
ex)
- 요일 : 월, 화, 수, 목, 금, 토, 일 이라는 일곱 개의 값만 갖는다.
- 계절 : 봄, 여름, 가을 ,겨울 이라는 네 개의 값만 갖는다.
1. 열거 타입 선언
- 파일 이름과 동일한 이름으로 선언한다. ( 첫 글자는 대문자 )
- 한정된 값인 열거 상수를 정의해준다.
- 열거 상수의 이름은 관례적으로 모두 대문자로 작성한다.
- 다른 단어가 결합된 이름일 경우 관례적으로 밑줄 ( _ ) 로 연결한다.
- 기본형
: public enum 열거타입이름 { . . . }
public enum Week {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
2. 열거 타입 변수
- 열거 타입 변수 선언의 기본형
: 열거타입 변수 ;
- 열거 상수 값 저장하는 것의 기본형
: 열거타입 변수 = 열거타입.열거상수 ;
- 열거 타입 변수는 참조 타입이다. --> 참조 타입이므로 null 값 저장이 가능하다.
- 열거 타입 Week의 경우, MONDAY 부터 SUNDAY까지의 열거 상수는 총 7개의 Week 객체로 생성된다.
그리고 메서드 영역에 생성된 열거 상수가 해당 Week 객체를 각각 참조하게 된다.
3. 열거 객체의 메서드
- 메서드는 java.lang.Enum 클래스에 선언된 메서드인데, 열거 객체에서 사용할 수 있는 이유는
모든 열거 타입은 컴파일 시에 Enum 클래스를 상속하게 되어 있기 때문이다.
- 열거 객체는 java.lang.Enum 클래스의 메서드 사용이 가능하다.
import java.util.Calendar;
public class EnumWeekExample {
public static void main(String[] args) {
Week today = null;
Calendar cal = Calendar.getInstance();
int week = cal.get(Calendar.DAY_OF_WEEK);
switch(week) {
case 1:
today = Week.SUNDAY; break;
case 2:
today = Week.MONDAY; break;
case 3:
today = Week.TUESDAY; break;
case 4:
today = Week.WEDNESDAY; break;
case 5:
today = Week.THURSDAY; break;
case 6:
today = Week.FRIDAY; break;
case 7:
today = Week.SATURDAY; break;
}
System.out.println("오늘 요일: "+ today);
if(today == Week.SUNDAY) {
System.out.println("일요일에는 축구를 합니다.");
} else {
System.out.println("열심히 자바 공부합니다.");
}
}
}
public class EnumMethodExample {
public static void main(String[] args) {
//name() 메소드
Week today = Week.SUNDAY;
String name = today.name();
System.out.println(name);
//ordinal() 메소드
int ordinal = today.ordinal();
System.out.println(ordinal);
//compareTo() 메소드
Week day1 = Week.MONDAY;
Week day2 = Week.WEDNESDAY;
int result1 = day1.compareTo(day2);
int result2 = day2.compareTo(day1);
System.out.println(result1);
System.out.println(result2);
//valueOf() 메소드
/*Week weekDay = Week.valueOf("SUNDAY");
if(weekDay == Week.SATURDAY || weekDay == Week.SUNDAY) {
System.out.println("주말 이군요");
} else {
System.out.println("평일 이군요");
}*/
if(args.length == 1) {
String strDay = args[0];
Week weekDay = Week.valueOf(strDay);
if(weekDay == Week.SATURDAY || weekDay == Week.SUNDAY) {
System.out.println("주말 이군요");
} else {
System.out.println("평일 이군요");
}
}
//values() 메소드
Week[] days = Week.values();
for(Week day : days) {
System.out.println(day);
}
}
}
[ Enum 클래스의 메서드들 예시 코드 ]
'Java' 카테고리의 다른 글
[Log]로그 레벨 (0) | 2024.07.12 |
---|---|
[Log]로그 vs 로깅 (0) | 2024.07.05 |
[정보처리기사]21년도_3회차_연산자 (0) | 2023.07.21 |
[정보처리기사]20년도_4회차_오버라이딩 (0) | 2023.07.21 |
JDBC (1) | 2022.12.22 |