Array
Java에서 Array는 int[] 처럼 생긴 원시값들의 배열을 나타내는 애들을 말한다.
Arrays 클래스에서 method를 활용할 수 있다.
length를 처음에 정하면 바꿀 수 없다.
// - 배열 변수는 참조 변수임. 배열도 객체이므로 휩 영역에 생성되고,
// 배열 변수에는 휩 영역에 생성된 객체의 주소값이 저장됨.
int[] numbers = null; // null값 할당 가능
System.out.println(numbers); // null
// System.out.println(numbers[0]); // nullPointerException
// 주의. 중괄호 감싼 목록을 배열 변수에 대입할 떄, 배열 변수 미리 선언한 후에는 값 목록을 대입 불가
char[] charArray;
// charArray = {'A', 'B', 'C'}; // 컴파일 에러
// 배열 변수 선언 시점과, 값 목록 대입하는 시점이 다르다면 "new type[]을 줄괄호 앞에 붙여 대입
charArray = new char[]{'A', 'B', 'C'};
// : new 연산자로 배열 처음 생성하면 기본값으로 초기화 됨.
double[] doubleArr = new double[3];
doubleArr[0] = 3.57;
// 다차원 배열
// 배열 안에 또 다른 배열이 존재하는 배열
// 2 * 3 배열 생성 및 초기화
int [][] matrix = {{1,2,3},{4,5,6}};
System.out.println("matrix1: ");
for(int[] firstDimensionArr: matrix) {
for(int num: firstDimensionArr) {
System.out.print(num + " ");
}
System.out.println();
}
// Array method
// 배열 복사
// - 배열은 크기 고정
// -> 더 많은 저장 공간 필요하다면 더 큰 길이의 배열을 새로 만들어 기존 배열을 복사
// -> ver1. 반복문으로 요소 하나씩 복사
int[] originArray = {1,2,3};
int[] newArray = new int[5];
for (int i = 0; i < originArray.length; i++) {
newArray[i] = originArray[i];
}
System.out.println(Arrays.toString(newArray)); // [1,2,3,0,0]
// ver2. arrayCopy() 사용
// System.arrayCopy(Object src (원본 배열), int srcPosition (원본 배열의 복사 시작 인덱스), object dest (새 배열), int destPositon(새 배열의 붙여넣기 시작 인덱스), int length)
String[] originalFruits = {"apple", "banana", "grape"};
String[] anotherNewArray = new String[6];
System.arraycopy(originalFruits, 0, anotherNewArray, 1, originalFruits.length);
System.out.println(Arrays.toString(anotherNewArray));
// Arrays 메소드
// copyOf(arr, copyArrLength)
int[] originalArray = {1,2,3,4,5};
int[] copiedArray = Arrays.copyOf(originalArray, 3);
System.out.println(Arrays.toString(copiedArray)); // [1,2,3]
// copyOfRange(arr, sIdx, eIdx);
int[] rangeArray = Arrays.copyOfRange(originalArray, 0, originalArray.length);
System.out.println(Arrays.toString(rangeArray));
int[] unSortedArray = {3,4,873,1,2,456,423,87};
Arrays.sort(unSortedArray);
System.out.println(Arrays.toString(unSortedArray));
// equals
// equals 메소드는 new Integer같은 애들한테도 사용할 수 있다.
// wrapper객체도 객체 주소값이 다르므로 == 이용시 false
// 원소가 똑같으면 true, 참조값 안의 원시값을 비교, equals 메소드.
System.out.println("first: " + Arrays.equals(originalArray, copiedArray));
System.out.println("second with equals: " + Arrays.equals(originalArray, rangeArray)); // true
System.out.println("second: with ==: " + (originalArray == rangeArray)); // false
// deepEquals(arr1, arr2);
// 다차원일 때
int[][][] deepArray1 = {{{1,2},{3,4}},{{5,6}, {7,8}}};
int[][][] deepArray2 = {{{1,2},{3,4}},{{5,6}, {7,9}}};
int[][][] deepArray3 = {{{1,2},{3,4}},{{5,6}, {7,8}}};
System.out.println("deepEquals1 with 2: " + Arrays.deepEquals(deepArray1, deepArray2)); // false
System.out.println("deepEquals1 with 3: " + Arrays.deepEquals(deepArray1, deepArray3)); // true
System.out.println("using '==' 1 with 3: " + (deepArray1 == deepArray3)); // false
// binarySearch(arr, val) 메소드 (단, 배열이 정렬된 상태여야 함.) 미리 sort 해야함.
// 탐색
int[] sortedArray = {10,20,30,40,60};
System.out.println(Arrays.binarySearch(sortedArray, 40));
}
}
Collection
원시값만이 아닌 다양한 값의 배열을 저장할 수 있다. 참조값도 가능.
List (ArrayList, LinkedList 등)
Set (HashSet, LinkedSet, TreeSet)
Map(HashMap,HashTable, LinkedHashMap)
Linked가 들어간게 인덱스 조회는 느리지만 요소 추가, 삭제는 더 빠르다.
Tree가 들어가면 알아서 정렬시켜준다. (Hash해서 저장하기 때문)
수업에서는 ArrayList만 배웠다. 짧은 시간 안에 다 가르치려면 이래야 할 것 같긴 하다.
이래서 강의 따로 찾아들어야 하는건가보다.
Collections 클래스에서 메소드를 이용할 수 있다.
ArrayList<Integer> numbers = new ArrayList<>(List.of(3,4,8,6));
numbers.addAll(List.of(3,5,7,8,6,3,7));
// 요소 접근
System.out.println(numbers.get(3));
// 요소 수정
numbers.set(3, 27486);
System.out.println(numbers.get(3));
System.out.println(numbers);
// 중간에 요소 삽입
numbers.add(0, 348);
System.out.println(numbers);
// ArrayList끼리 연결
numbers.addAll(Arrays.asList(39,468765,123,48));
System.out.println(numbers);
// 요소 위치 찾기
System.out.println(numbers.indexOf(123));
System.out.println(numbers.indexOf(468765));
System.out.println(numbers.indexOf(99));
// 요소 삭제
numbers.remove(2);
// 리스트 크기
System.out.println(numbers.size());
// 모든 요소 순회
for (Integer n : numbers) {
System.out.print(n + " ");
}
System.out.println();
// 모든 요소 삭제
numbers.clear();
System.out.println("numbers is..." + numbers);
ArrayList<Student> students = new ArrayList<>(List.of(new Student("jihun", 26), new Student("Joey", 14)));
students.add(new Student("JYANET", 21));
for (Student student: students) {
System.out.println(student);
}
System.out.println(students.size());
System.out.println(students.get(1).getName());
}
}
Exception
다른 언어에서는 잘 모르겠는데 자바에서는 Throwable 클래스의 자식 요소로 Error와 Exeption이 있다.
Error는 개발자가 어떻게 못하는 거고,
Exeption은 개발자가 처리할 수 있는 오류? 라고 볼 수 있겠다.
그래서 try catch finally 등을 이용하여 처리를 해준다.
좀 자세하게 처리를 하고 싶다면, 예상되는 Exeption의 자식 요소를 throw 해준다.
// 예외
// - 일반 예외 (Exception) : 컴파일러가 예외 처리 코드 여부를 검사하는 예외
// - 실행 예외 (Runtime Exception) : 컴파일러가 예외 처리 코드 여부를 검사하지 않는 예외
// => Java는 예외가 발생하면 예외 클래스로부터 객체 생성하며, 해당 객체는 예외 처리시 사용됨
// 예외 발생 시 프로그램의 갑작스런 종료를 막고 정상 실행할 수 있도록 처리하는 코드를 예외 처리 코드라고 함
// try-catch-finally 블록으로 처리
// try블록에서 작성한 코드가 예외 없이 정상 실행 -> catch는 실행 안됨.
// finally는 무조건 실행.
// 만약 try, catch 블록에서 return을 해도 finally는 실행됨 (생략 가능)
public class ExceptionRunner {
public static String divide(int x, int y){
return "X / y = " + (x / y);
}
public static int getLength(String word) {
return word.length();
}
public static int getValueByIndex(int[] numbers, int idx) {
return numbers[idx];
}
public static void main(String[] args) {
// case 1. 예외 발생 코드
// System.out.println(divide(3, 0)); // java.lang.ArithmeticException
// case 2. 예외 처리 코드
try {
System.out.println("연산시작");
System.out.println(divide(3, 0));
} catch (ArithmeticException e) {
// 예외 출력 방법
// 방법 1: 예외 발생한 이유만 보여줌
System.out.println("나누기 중 에러 발생 >>" + e.getMessage());
// 방법 2: 예외 종류 리턴
System.out.println("나누기 중 에러 발생 >>" + e.toString());
// 방법 3: 예외가 어디서 발생했는지 추적한 내용 출력
// e.printStackTrace();
} finally {
System.out.println("연산 종료!");
}
/////////////////////////////////
//case 2. 예외 발생 코드
String word = null;
try {
System.out.println(getLength(word));
} catch(NullPointerException e) {
System.out.println("단어 길이 연산 중 에러 발생 >>" + e.toString());
}
//////////////////////////////////
// case 3. 예외 발생 코드
try {
int[] numbers = {1,3,5,7};
System.out.println(getValueByIndex(numbers, numbers.length));
} catch (IndexOutOfBoundsException e) {
System.out.println("배열 indexing 중 에러 발생 >>>" + e);
}
///////////////////////////////////
// case 4. 예외발생 코드
Scanner scanner = new Scanner(System.in);
try {
System.out.println("정수 입력");
int number = scanner.nextInt();
System.out.println("입력 정수 >>" + number);
} catch (InputMismatchException e) {
System.out.println("인풋 미스매치 익셉셥 >> " + e);
}
scanner.close();
}
}
실습하다가 하나를 알게 되었다.
Arithmetic Exception의 divide by zero 예외의 경우 분자와 분모가 모두 int이거나 long 일때 분모가 0이어야 (0.0 아님) 해당 예외가 발생한다.
정확하게 말하자면, Java에서 정수형 데이터 타입인 int나 long의 경우에만 분모가 정수 0일 때 ArithmeticException이 발생한다. 부동 소수점 타입인 double이나 float의 경우에는 0으로 나누더라도 ArithmeticException이 발생하지 않고, NaN이 반환된다. 아래 GPT 참고.
또한 수업을 듣다가 조금 궁금한 것이 있어서 찾아보았다.
Runtime Exeption이거나 그 자손, 즉 unchecked Exeption의 경우 메소드 시그니처에서 따로 throw를 안해줘도 알아서 호출 method까지 올라온다고 알고있는데
그것이 아닌 checked Exeption의 경우 메소드 시그니처에서 따로 throw를 하거나 try catch를 이용 하는 것으로 알고 있다.
그럼 throw랑 try catch를 같이 해야하는건가?
잘 와닿지 않는다.
그래서 gpt한테 물어봤다.
checked Excption의 경우에는, 즉 method 안에서 try catch를 하지 않고, 호출자가 처리하도록 하는 거라면 메소드 시그니처에 throw를 해줘야 한다.
그리고 그 호출자는 예외처리를 할건지 다시 throw를 할건지 선택할 수 있다.
main method에서도 예외처리를 하거나 throw 할건지 선택할 수 있는데 여기서도 throw를 해주면 JVM이 에러를 적절히 처리해준다.
다만 JVM이 처리해줬기 때문에 에러 line 이후에는 실행되지 않는다.
제대로 처리할거면 main에서 try catch를 이용하자.
결론:
- checked exception: 컴파일러가 예외를 검사합니다. 즉, 컴파일 시점에서 예외를 처리하거나 선언하지 않으면 컴파일 오류가 발생합니다. 컴파일러가 예외를 검사하므로 예외에 대한 적절한 처리를 강제합니다.
- unchecked exception: 컴파일러가 예외를 검사하지 않습니다. 즉, 컴파일러가 예외를 처리할 필요가 없으며, 프로그래머가 필요에 따라 예외를 처리하거나 무시할 수 있습니다. 컴파일러가 예외를 검사하지 않으므로 예외 처리가 필요한지 여부를 프로그래머가 결정합니다.
checked Exeption의 경우 unchecked Exeption과는 다르게 메소드 시그니처에서 Throws 절로 예외를 선언하거나 처리해 줘야 한다.
'포스코x코딩온' 카테고리의 다른 글
[포스코x코딩온] 풀스택 부트캠프 18주차 정리 Java(Wrapper, generic) (0) | 2024.02.19 |
---|---|
[포스코x코딩온] 풀스택 부트캠프 18주차 정리 Java(Class) (1) | 2024.02.19 |
[포스코x코딩온] 풀스택 부트캠프 17주차 정리 Java (1) | 2024.02.13 |
3차 프로젝트- 버그수정 디벨롭 (navigate(-1) 등) (0) | 2024.02.07 |
[포스코x코딩온] 풀스택 부트캠프 16주차 정리 3차 프로젝트 회고 完 (2) | 2024.02.06 |