Language/Java

[Java] 배열 / 예외처리

sssbin 2022. 2. 10. 17:48

 

배열

- 인덱스와 인덱스에 대응하는 일련의 데이터들로 이루어진 연속적인 자료 구조

- 같은 종류의 데이터들이 순차적으로 저장된다.

 

배열 선언 및 생성

1) 배열에 대한 레퍼런스 변수 선언

선언 시 배열의 크기를 지정해서 안 된다.

2) 배열 생성 - 배열 공간 할당

 

레퍼런스 치환과 배열 공유

- 자바에서는 배열 공간과 레퍼런스 변수가 분리되어 있기 때문에 생성된 배열에 대한 공유가 쉽게 이루어진다.

- 레퍼런스의 치환은 배열을 복사하여 새로운 배열을 만드는 것이 아니라 레퍼런스만 복사된다.

- myArray는 intArray 레퍼런스 값을 가지게 됨으로써 intArray 배열을 공유하게 된다.

int intArray[] = new int[5];
int myArray[] = intArray; // 레퍼런스 치환. myArray는 intArray와 동일한 배열 참조

 

for-each 문

- 배열이나 나열의 크기만큼 루프를 돌면서 각 원소를 순차적으로 접근하는데 유용

for-each 문의 구조

// for-each 문을 사용하여 정수 배열의 합을 구하는 코드

int [] n = {1, 2, 3, 4, 5};
int sum = 0;
for (int k : n) {	// n.length 만큼 반복
	// 반복될 때마다 k는 n[0], ..., n[4]로 번갈아 설정
	sum += k;
}

 


메소드의 배열 리턴

- 메소드가 배열을 리턴하는 경우, 배열 메모리 전체가 아니라 배열에 대한 레퍼런스만 리턴된다.

int[] (배열 레퍼런스)을 리턴하는 메소드의 원형 및 코드

// 일차원 정수 배열을 생성하는 리턴하는 makeArray(), 이 메소드로부터 배열을 전달받는 프로그램

public class ReturnArray {
	static int[] makeArray() { // 일차원 정수 배열 리턴
		int temp[] = new int[4]; // 배열 생성
		for (int i=0; i<temp.length; i++)
			temp[i] = i;
		return temp; // 배열 리턴. makeArray()가 종료해도 생성된 배열은 소멸되지 않음.
	}
	
	public static void main(String[] args) {
		int intArray[]; // 배열 레퍼런스 변수 선언
		intArray = makeArray(); // 메소드가 리턴한 배열 참조
		
		for (int i=0; i<intArray.length; i++)
			System.out.print(intArray[i] + " ");
	}
}

makeArray()로부터 배열을 리턴 받는 과정

 


자바의 예외 처리

예외 발생 사례

- 정수를 0으로 나누는 경우

- 배열의 크기보다 큰 인덱스로 배열의 원소를 접근하는 경우

- 정수를 읽는 코드가 실행되고 있을 때 사용자가 문자를 입력한 경우

 

try-catch-finally 문

try {
	예외가 발생할 가능성이 있는 실행문
}

catch (처리할 예외 타입 선언) {
	예외 처리문    
}

finally {	// 생략 가능
	예외 발생 여부와 상관없이 무조건 실행되는 문장    
}

예외가 발생한 경우와 발생하지 않은 경우의 실행 과정

 

예외 클래스

 

예외 타입 (예외 클래스) 예외 발생 경우 패키지
ArithmeticException 정수를 0으로 나눌 때 발생 java.lang
NullPointerException null 레퍼런스를 참조할 때 발생 java.lang
ClassCastException 변환할 수 없는 타입으로 객체를 변환할 때 발생 java.lang
OutOfMemoryError 메모리가 부족한 경우 발생 java.lang
ArrayIndexOutOfBoundsException 배열의 범위를 벗어난 접근 시 발생 java.lang
IllegalArgumentException 잘못된 인자 전달 시 발생 java.lang
IOException 입출력 동작 실패 또는 인터럽트 시 발생 java.io
NumberFormatException 문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환 시 발생 java.lang
InputMismatchException Scanner 클래스의 nextInt()를 호출하여 정수로 입력받고자 하였지만, 사용자가 'a' 등과 같이 문자를 입력한 경우 java.util
// 0으로 나누는 예외에 대처하는 try-catch 블록

import java.util.Scanner;

public class DevideByZeroHandling {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
				
		int dividend;
		int divisor;

		System.out.print("나뉨수를 입력하시오:");
		dividend = sc.nextInt();
		System.out.print("나눗수를 입력하시오:");
		divisor = sc.nextInt();
		
		try {
			System.out.println(dividend + "를 " + divisor + "로 나누면 몫은 " + dividend/divisor + "입니다.");
			// divisor가 0인 경우 ArithmeticExceptio 예외 발생 
		}
		catch(ArithmeticException e) {
			System.out.println("0으로 나눌 수 없습니다.");
		}
		finally {
			sc.close();
		}
	}
}