[ java ] 반복 흐름( continue 문, break 문) & 배열 & 다차원 배열 & 비정방형 배열

Suji Kang·2023년 12월 20일
0

🐾 1. 반복 흐름 제어

continue 문, break 문

📌 continue

반복문을 빠져나가지 않으면서 즉시 다음 반복으로 넘어간다

for(초기;조건;변화) {continue;}

for문에서 continue를 만나면 즉시 변화식(반복후 작업)으로 이동
초기->조건->전->continue->변화->조건->....

while(조건) {continue;}

while문에서 continue를 만나면 즉시 조건식으로 이동
조건->전->continue->조건->...

do {continue;} while(조건);

while과 다르게 do-while문은 후를 skip하고 조건으로 이동
전->continue->조건->전->continue->조건->...

예시)

import java.util.Scanner;

public class ContinueExample {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		// 양수들의 합만 구함
		// 음수가 나오면 skip
		// 0이 나오면 종료
		int sum = 0;
		int n = -1;
		while(n != 0) {
			n = sc.nextInt();
			if(n <= 0)
				continue;
			else
				sum += n;
		}
		System.out.println(sum);
	}
}

📌 break

**가장 최근에 들어온 반복문** 을 벗어난다
그 외의 반복문은 그대로 유지가 됨

for() { // 1
  while() { // 2
    for() { // 3
      break; // 3번 반복문만 탈출
    }
    break; // 2번 반복문만 탈출
  }
}

2. 배열

자료형

  • 기본 타입
    : 논리(boolean), 문자(char)
    정수(byte, short, int, long), 실수(float, double)
  • 레퍼런스 타입
    : 배열(Array), class, interface

배치 + 나열 -> 배열 (array)

  • 인덱스를 통해서 인덱스에 대응되는 데이터들로 이루어진 연속적인 자료구조
  • 인덱스 (index) -> 나열하는 순서 (번호)
  • 자료형(data type) -> 데이터 하나하나의 형태
  • vs 자료구조 (data structure) -> 데이터들이 모여서 이룬 구조
int i0, i1, i2, i3, ..., i9; -> 자료형 10int i[10]; -> 자료구조 1(int짜리 10개를 가진)

자바에서 배열을 만들 때 2개의 과정을 거침

  1. 배열에 대한 레퍼런스 변수의 ""선언""
    -> 우리가 이 배열을 쓰겠다
  2. 배열을 ""생성""
    -> 배열에 대해서 저장 공간을 메모리에 할당

1. 선언과정

int intArray[];
타입 레퍼런스변수명 [];

2. 생성과정

intArray = new int[5];
레퍼런스변수명 = new 타입[개수];

선언과 생성을 동시에

int intArray[] = new int[5];
int[] intArray = new int[5];
[]의 순서는 상관 없음

배열의 초기화

"변수 초기화" 👉 int a = 1;
"배열 초기화" 👉 int intArray[] = {0,1,2,3,4};

👉 자동으로 intArray의 크기가 5로 정해짐
👉 앞에 []안에 개수를 쓰면 "절대" 안됨.
초기화를 안한 배열은 기본값으로 0이 들어있음

public class ArrayExample {
	public static void main(String[] args) {
		// 선언 생성 따로
		int a[];
		a = new int[5];
		
		// 선언 생성 동시
		int b[] = new int[5];
		int[] c = new int[5];
		int []d = new int[5];
		
		// 배열 초기화
		int e[] = {1, 2, 3, 4};
		
		int f[] = new int[5];
		f[3] = 2;
		for(int i=0 ; i<=4 ; i++) {
			System.out.println(i + " " + f[i]);
		}
		// System.out.println(f[-1]);  에러남
		// System.out.println(f[5]);   에러남
		
		int g[];
		// g[0] = 8;
	}
}

배열 원소 접근 (인덱싱)

인덱스 (=원소의 위치) (index)
인덱스의 번호는 0부터 시작한다
마지막 원소의 인덱스 번호는 배열의크기-1

int intArray[] = new int[5];
👉 인덱스 번호의 범위는 0 ~ 4
intArray[3] -> intArray 배열의 3번 인덱스(4번째) 값
intArray[2] = 3; -> intArray 배열의 2번 인덱스(3번째)3을 대입
intArray[-1] -> 안됨 (음수 인덱스 X)
intArray[5] -> 안됨 (범위를 벗어난 인덱스 X)

레퍼런스 치환

int a = 10;
b = a;
b = 20;
int array1[] = new int[5];
int array2[] = array1;
array1[1] = 2;
array2[1] = 3;
출력: array1[1] -> 3
public class ArrayShare {
	public static void main(String[] args) {
		int array1[] = new int[5];
		int array2[] = array1;
		// 레퍼런스 치환 = 배열 공유
		
		array1[1] = 2;
		array2[1] = 3;
		
		// array1 : 0 2 0 0 0
		// array2 : 0 3 0 0 0
		System.out.println(array1[1]);
		
		int a1[] = new int[5];
		int a2[] = new int[5];
		
		a1[1] = 2;
		for(int i=0 ; i<=4 ; i++) {
			a2[i] = a1[i];
		}
	}
}

배열의 크기

int intArray[] = new int[x];

배열의 크기를 숫자로 지정한 것이 아닌 변수로 지정한 경우 -> 크기가 얼만지 모름!
👉 length 필드 (필드 = 레퍼런스 변수에 속하는 변수)

int size = intArray.length;
for(int i=0 ; i<size ; i++)
    출력 intArray[i];

레퍼런스 타입을 위한 for문 -> for-each문

기존 for문을 변형

for(변수 : 레퍼런스변수) {
   
}
for(int i: intArray) {
    출력 i;
}
  • 일반 for문에서는 인덱스를 통한 접근 👉 원소 접근을 할 때 intArray[i];
  • for-each문에서는 바로 원소에 접근 👉 원소 접근을 할 때 i;
import java.util.Scanner;
public class ForEachExample {
	enum Week {,,,,,,};
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n[] = { 1, 2, 3, 4, 5 };
		
		for(int i=0 ; i<n.length ; i++) {
			System.out.print(n[i]+" ");
		}
		System.out.println();
		
		for(int i: n) {
			System.out.print(i + " ");
		}
		System.out.println();
		
//		String fruit[] = new String[5];
//		for(int i=0 ; i<fruit.length ; i++) {
//			fruit[i] = sc.nextLine();
//		}
//		for(String s: fruit) {
//			System.out.println(s);
//		}
		
		for(Week day: Week.values())
			System.out.print(day+" ");
	}
}

나열(enumerate -> enum) 타입

for-each문을 사용할 수 있는 특이한 타입

enum Week {,,,,,,};
for(Week day: Week.values())
    출력 day;

3. 다차원 배열

2차원 이상의 배열을 다차원 배열

int intArray[] = new int[5];
            ^ 1차원
int intArray[][] = new int[5][3]; // 5행 3열짜리 int형 2차원 배열
            ^ 2차원

ㅁㅁㅁ
ㅁㅁㅁ
ㅁㅁㅁ
ㅁㅁㅁ
ㅁㅁㅁ

intArray.length -> 5 (행의 개수)
intArray[0].length -> 3 (열의 개수)
intArray[1].length -> 3 (열의 개수)

2차원 배열의 초기화

int intArray[] = {1, 2, 3};
int intArray[][] = {{1, 2, 3}, {4, 5, 6}}; // 2행 3열

1 2 3
4 5 6

public class GradeAverage {
	public static void main(String[] args) {
		double score[][] = {{3.8, 3.9},
							{4.2, 4.5},
							{3.1, 2.6},
							{4.3, 4.4}};
		
		// 2중 for문과 length 필드를 이용해서
		// 총 8개 학기의 학점의 평균을 구하는 코드를 작성
		// 바깥쪽 for = 행, 안쪽 for = 열
		double sum = 0;
		for(int i=0 ; i<score.length ; i++) {
			for(int j=0 ; j<score[0].length ; j++) {
				sum += score[i][j];
			}
		}
		
		System.out.println("전체 평균은 " + (sum/(score.length * score[0].length)));
        //3.85
	}
}

배열의 크기가 직사각형으로 딱 떨어지는 경우 -> 정방형 배열
행별로 열의 크기가 모두 동일

int intArray[][] = new int[4][2];

ㅁㅁ
ㅁㅁ
ㅁㅁ
ㅁㅁ

비정방형 배열 (Skewed Array) -> 행별로 열의 크기가 모두 다른 배열

한 번에 선언과 생성을 할 수 없음

int intArray[][] = new int[4][];
intArray[0] = new int[3];
intArray[1] = new int[2];
intArray[2] = new int[3];
intArray[3] = new int[2];

ㅁㅁㅁ
ㅁㅁ
ㅁㅁㅁ
ㅁㅁ

import java.util.Scanner;
public class SkewedArray {
	public static void main(String[] args) {
		// n = 5
		// 10 11 12 13 14
		// 20 21 22 23
		// 30 31 32
		// 40 41
		// 50
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		
		int a[][] = new int[n][];
		for(int i=0 ; i<n ; i++) {
			a[i] = new int[n-i];
		}
		
		for(int i=0 ; i<n ; i++) {
			// i=0 -> n-0 ĭ
			// i=1 -> n-1 ĭ
			for(int j=0 ; j<n-i ; j++) {
				a[i][j] = (i+1)*10 + j;
			}
		}
		
		for(int i=0 ; i<a.length ; i++) {
			for(int j: a[i]) {
				System.out.print(j + " ");
			}
			System.out.println();
		}

		for(int[] i: a) {
			for(int j: i) {
				System.out.print(j + " ");
			}
			System.out.println();
		}
		
		for(int i=0 ; i<a.length ; i++) {
			for(int j=0 ; j<a[i].length ; j++) {
				System.out.print(a[i][j] + " ");
			}
			System.out.println();
		}
		
		for(int[] i: a) {
			for(int j=0 ; j<i.length ; j++) {
				System.out.print(i[j] + " ");
			}
			System.out.println();
		}
	}
}

결과값:

profile
나를위한 노트필기 📒🔎📝

0개의 댓글