3장_반복문_배열, 예외처리

IkSun·2023년 4월 13일
post-thumbnail

반복문

⏹ for 문

for(초기작업 ; true ; 반복 후 작업){ //반복 조건이 true 이면 무한 반복
	...
}

for(초기작업 ; ; 반복 후 작업){ //반복조건이 비어있으면 true 로 간주, 무한반복
	...
}

//'초기 작업' 과 '반복 후 작업' 은 (,) 로 분리하여, 여러 문장 나열 가능
for(i=0; i<10; i++, System.out.println(i)){
	...
}

//for문 내에 변수 선언
for(int i=0; i<10; i++){ //변수 i 는 for 문 내에서만 사용 가능한 지역 변수
	...
}

⏹ while 문

int i = 0;
while(i<10) { //반복 조건이 true 이면 작업문 수행 후 다시 조건문 질의, false 면 반복 종료
	System.out.print(i);
    i++;
}

⏹ do-while 문

i = 0;
do { //무조건 최소 한번을 실행
	System.out.print(i);
    i++
} while(i<10); //반복 조건이 true 이면 반복, false 이면 반복 종료

⏹ continue 문

  • 반복문을 빠져 나가지 않으면서 반복문 실행 도중 다음 반복 실행
  • for 문의 증가식, whie 문의 조건식으로 이동

⏹ break 문

  • 반복문을 완전히 빠져 나갈 때 사용
  • break 문은 하나의 반복문만 벗어남

배열

  • 같은 타입의 데이터들이 순차적으로 저장
  • 배열의 인덱스는 0부터 시작
  • 배열은 Heap 메모리 영역에 할당됨 -> 참조 변수를 이용하여, 배열 메모리 공간을 관리한다.

⏹ 일차원 배열 만들기

//배열에 대한 레퍼런스 변수 선언 
int intArray[];  	// 배열의 타입 int
char charArray[];  	// 배열의 타입 char

//또는
int[] intArray;
char[] charArray;

//------------------//

//배열 생성
intArray = new int[10];		//int 타입의 배열 원소의 개수 10개
charArray = new char[20];

//배열 생성과 동시에 배열 메모리 생성
//10칸짜리 int 공간을 만들어 배열에 대한 참조 변수 intArray 로 관리하겠다
int intArray = new int[10]; 
char charArray = new char[20];

//------------------//

//배열이 생성되면서 원소의 값이 초기화됨
int intArray[] = {0,1,2,3,4,5,6}; //주의 : intArray 는 레퍼런스(참조)

//잘못된 배열 선언
int intArray[10]; //컴파일 오류, 배열의 크기를 지정하면 안됨.

⏹ 배열 인덱스와 원소 접근

  • 배열 변수명과 [] 사이에 원소의 인덱스를 적어 접근
  • 반드시 배열 생성 후 접근!!
//< 배열의 원소 접근 >//
int intArray[] = new int[5]; //원소가 5개인 배열 생성, 인덱스는 0~4 까지 가능
intArray[3] = 6; //원소 0 에 6 저장
int n = intArray[3]; //원소 3을 읽어 n 에 저장, n=6

//------------------------------------------//
//< 인덱스의 범위 >//
n = intArray[-2] //실행 오류

//------------------------------------------//
//< 반드시 배열 생성 후 접근 >//
int intArray []; //배열을 관리하는 '참조변수' 만 선언된 상태
intArray[1] = 8; //생성 되지 않은 배열 사용

⏹ 레퍼런스 치환과 배열 공유

  • 생성된 하나의 배열을 다수의 레퍼런스가 참조 가능
int intArray[] = new int[5];
int myArray[] = intArray;

// 두개의 참조변수로 원소의 동시에 접근 가능.
intArray[1] = 2;
myArray[1] = 6;

⏹ 배열의 크기

  • 배열의 크기는 참조 변수를 선언할 때 결정되지 않고 배열 생싱시에 결정되어 나중에 바꿀 수 없다.
  • 배열의 크기는 배열의 length 필드에 저장
import java.util.Scanner;
public class ArrayLength {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int intArray[] = new int[5]; //배열의 선언과 생성
        // intArray.length 의 크기는 5
		int sum = 0;
		
		Scanner scanner = new Scanner(System.in);
		System.out.print("Please enter " + intArray.length + " integers. >>");
		for(int i =0; i < intArray.length;i++)
			intArray[i] = scanner.nextInt(); //키보드에서 입력 받은 정수 저장
		
		for(int i =0; i < intArray.length;i++)
			sum += intArray[i]; //배열에 저장된 정수 값을 더하기
		
		System.out.print("The average is "+(double)sum/intArray.length); 
        //실수 연산을 위한 double 변환
		scanner.close();	
	}
}

⏹ for-each 문

  • 배열(array) 이나 나열(enumeration) 의 각 원소를 순차적으로 접근하는데 유용한 for 문
  • 열거형일 때 .values() 메소드를 사용해야 한다.
String names[] = {"사과", "배", "바나나", "체리", "딸기", "포도"}
for (String s : names) //반복할 때 마다 s는 names[0], names[1], ... , names[5] 로 설정
	System.out.print(s + " "); //반복되는 s 값 출력
    
enum Week {,,,,,,}
for(Week day : Week.values()) //반복될 때마다 day 는 월, 화, 수, 목, 금, 토, 일 로 설정
	System.out.print(day + "요일");

⏹ 2차원 배열

//2차원 배열 선언
int intArray[][];
char charArray[][];

//또는
int[][] intArray;
char[][] charArray;

//---------------------------------------//

//2차원 배열 생성
intArray = new int[2][5];
charArray = new char[5][5];

//또는
int intArray[][] = new int[2][5];
char charArray[][] = new char[5][5];

//---------------------------------------//

//2차원 배열 선언, 생성, 초기화
int intArray[][] = {{0,1,2}, {3,4,5}, {6,7,8}};
char charArray[][] = {{'a', 'b', 'c'}, {'d', 'e', 'f'}};

⏹ 정방형 배열

//정방형 배열 : 각 행의 열의 개수가 같은 배열
int i[][] = new int[4][4]; //각 행의 열의 개수 모두 4개

i.length : 2차원 배열의 행의 개수로서 4
i[n].length : n 번째 행의 열의 개수

  • i[0].length : 0 번째 행의 열의 개수 4개
  • i[1].length : 1 번쨰 행의 열의 개수 4개
  • i[2].length : 2 번쨰 행의 열의 개수 4개
  • i[3].length : 3 번쨰 행의 열의 개수 4개

⏹ 비정방형 배열

//비정방형 배열 : 각 행의 열의 개수가 다른 배열
int i[][] = new int[4][];

i[0] = new int[1]; //0번쨰 행의 열의 개수는 1개
i[1] = new int[2]; //1번쨰 행의 열의 개수는 2개
i[2] = new int[3]; //2번쨰 행의 열의 개수는 3개
i[3] = new int[4]; //3번쨰 행의 열의 개수는 4개

i.length : 2차원 배열의 행의 개수로서 4
i[n].length : n 번째 행의 열의 개수

  • i[0].length : 0 번째 행의 열의 개수 1개
  • i[1].length : 1 번쨰 행의 열의 개수 2개
  • i[2].length : 2 번쨰 행의 열의 개수 3개
  • i[3].length : 3 번쨰 행의 열의 개수 4개

⏹ 메소드에서 배열 리턴

  • 배열의 참조 변수 리턴: 따라서 리턴 타입에 [] 표시가 추가됨
  • 메소드의 리턴 타입
    • 메소드의 리턴 타입과 리턴 받는 배열 타입과 일치
    • 리턴 타입에 배열의 크기를 지정하지 않음
public class ReturnArray {
	static int[] makeArray() { //int[] (정수형 배열): 리턴 타입 , makeArray : 메소드 이름
		int temp[] = new int[4]; //배열 생성
    	for(int i=0; i<temp.length; i++)
    		temp[i] = i; //배열의 원소를 0,1,2,3 할당
    	return temp; //배열 참조 temp 의 해시값 리턴 
	}
	public static void main(String[] args) {
		int[] intArray; // 배열 참조 변수만 선언
		intArray = makeArray(); //메소드로 부터 배열을 전달 받음, intArray = temp;
        for(int i=0; i<intArray.length; i++)
        	System.out.print(intArray[i] + " ") //배열의 모든 원소 출력
	}
}

자바의 예외 처리

⏹ 컴파일 오류

  • 문법에 맞지 않게 작성된 코드 -> 컴파일할 때 발견

⏹ 예외

  • 실행 중 발생한 오류

    • 정수를 0으로 나눈 경우
    • 배열보다 큰 인덱스로 배열의 원소를 접근하는 경우
    • 존재하지 않는 파일을 읽으려는 경우
    • 정수 입력을 기다리는 코드가 실행되고 있을 떄, 문자가 입력된 경우
  • 자바에서 예외 처리 가능

    • 예외 발생 -> 자바 플랫폼 인지 -> 응용프로그램에서 전달
    • 응용프로그램이 예외를 처리하지 않으면, 응용프로그램은 강제 종료

⏹ try-catch-finally 문

  • 예외처리를 위해 try-catch-finally(생략가능) 문 사용
try {
	에외가 발생할 가능성이 있는 실행문(try 블록)
}
catch (처리할 예외 타입 선언) {
	예외 처리문 (catch 블록)
}
fianlly { //fianlly 는 생략 가능
	에외 발생 여부와 상관없이 무조건 실행되는 문장(fianlly 블록)
    예외가 발생하지 않은 정상적인 경우는 바로 try 블록으로 넘어옴
}
  • 자주 발생하는 예외
import java.util.Scanner;
public class DivideByZeroHandling {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		
		while(true) {
			System.out.print("Enter the dividend: ");
			int dividend = scanner.nextInt(); // 나뉨수 입력 
			System.out.print("Enter the divisor: ");
			int divisor = scanner.nextInt(); // 나눗수 입력 
			try {
			System.out.println("When " + dividend + 
            " is divided by " + divisor + ", the quotient is " + dividend/divisor + ".");
			break; // 정상적인 나누기 완료 후 while 벗어나기 
			}
			catch(ArithmeticException e) { // ArithmeticException 예외 처리 코드 
				System.out.println("Not divisible by zero! Please enter again.");
			}
		}
		scanner.close();
	
	}

}

참조 vs 참조 변수

AA ref = new AA();
  • 참조값은 VM 에서 자동 생성
  • 연산자 new 로 객체가 있는 메모리를 생성한 경우, AA 클래스의 새로운 객체에 대한 참조값(new AA();)을 리턴한다.
  • 참조 변수로 그 객체의 메모리의 주소 즉 참조값을 할당받는다
  • 참조 : 참조 변수(ref)가 아닌 참조값(해시코드)
  • 예로 클래스의 참조변수에 참조를 할당할 수 있다.
profile
공부한 것 기록용

0개의 댓글