[Java] 배열

2021. 1. 19. 17:51Dev.Program/Java & Spring

728x90

======== 저번시간 이어서 Ex5.java 만들기

EXIT_FOR_I: // LABEL(레이블) - i에 대한 반복문(for문)에 적용되는 레이블
for(int i = 1; i < 10; i++) {
//  if(i == 5) {
//// 	break; // i가 5일 때 바깥쪽 for문을 빠져나감
// 		continue; // i가 5일 때 아래쪽 문장을 생략, 다음 반복 i++로 이동
//  }
	System.out.println("i = " + i);

    EXIT_FOR_J: // LABEL(레이블)- j에 대한 반복문(for문)에 적용되는 레이블
    for(int j = 1; j < 10; j++) {
//      if(i == 5) {
//             break; // i가 5일 때 안쪽 for문을 빠져나감
//             continue; // i=5일때 아래쪽 문장생략, 다음반복 j++로 이동
//             // 바로 위 break와 결과는 같지만
//             // break는 빠져나가는거고 continue는 계속 실행하는거
//      }
        if(j == 5) {
//          break; // j가 5일 때 안쪽 for문을 빠져나감
//             		 (j가 1 ~ 4 일 때만 실행)
//          continue; // j가 5일 때 출력을 생략함
//          			(j가 1 ~ 4, 6 ~ 9 일 때 실행)

            // 레이블을 적용한 break 와 continue
//          break EXIT_FOR_I;
            // 레이블이 적용된 바깥쪽 for문을 빠져나감
            continue EXIT_FOR_I;
            // 레이블이 적용된 바깥쪽 for문 다음 반복 실행
        }
        System.out.println("------- j = " + j);
    }
    System.out.println("안쪽 for문 종료!");
}
System.out.println("바깥쪽 for문 종료!");
  • 레이블! 띄어쓰기 하고 ctrl + space
  • 레이블을 이용하면 반복문이 많을 때 특정 반복문으로 돌아갈 수 있다.
  • if문 속 continue → 레이블을 따라서 바깥쪽으로 나감(i++로)

 

======== Ex6.java

문제 ) 다음과 같이 출력

12345

1234

123

12

1

for(int i = 5; i >= 1; i--) {
    for(int j = 1; j <= i; j++) {
    	System.out.print(j + " ");
    }
    
    System.out.println();
}

 

54321

5432

543

54

5

for(int i = 1; i <= 5 ; i++) {
    for(int j = 5; j >= i; j--) {
    	System.out.print(j + " ");
    }

    System.out.println();
}

 

*****

****

***

**

*

for(int i = 5; i >= 1; i--) {
    for(int j = 1; j <= i; j++) {
    	System.out.print("*");
    }

    System.out.println();
}
  • 위의 문장에서 * 로 바꾸기만 하면 됨.
  • 이렇게 모를 땐 숫자 먼저 찍어보고 * 찍기



======== Ex.java 만들기

p.141

< 배열(Array) >

  • 같은 타입의 여러 데이터를 하나의 묶음으로 다루는 것
    • = 동일한 데이터타입 변수들의 집합
  • 배열은 메모리 상의 연속된 공간에 생성됨
    • ⇒ 따라서, 한 번 생성한 배열의 크기를 변경할 수 없다!
  • 기본 데이터타입과 참조 데이터타입 모두를 배열로 생성 가능
  • 저장된 데이터들은 배열명(변수명)을 사용하여 관리
  • 배열의 크기는 배열명.length 속성을 사용하여 알아낼 수 있다
  • 배열 생성 시 각 데이터 저장공간에는 인덱스(첨자)라는 번호가 붙는다
    • ⇒ 인덱스 번호는 0부터 시작함!
    •     (따라서, 배열의 인덱스 범위는 0 ~ 배열크기-1 까지 자동 부여됨)
  • 배열을 사용하려면 배열 선언 → 생성 → 초기화 단계를 거쳐야한다!
    • (단, 배열을 생성하면 기본값으로 자동 초기화 일어남)
    • ⇒ 기본값 : byte & short & int = 0, long = 0L, float = 0.0f, double = 0.0
    •                   boolean = false, char = '\u0000' 또는 0
    •                   참조형(String 등)은 기본값은 무조건 null

< 배열 선언 기본 문법 >

데이터타입[] 변수명;
  • 단, 배열 선언만 했을 경우 데이터 저장 불가! (배열 생성 전이므로)
  • 배열이 생성된 주소값을 저장하는 변수 선언

< 배열 생성 기본 문법 >

변수명 = new 데이터타입[배열크기];
  • 메모리(Heap)에 실제 데이터 저장이 가능하도록 공간을 할당받음

 < 배열 초기화 기본 문법 >

변수명[인덱스] = 데이터;

< 배열 선언 및 생성을 동시에 수행하는 문법 >

데이터타입[] 변수명 = new 데이터타입[배열크기];

< 배열 선언 및 생성, 초기화를 동시에 수행하는 문법 >

데이터타입[] 변수명 = {데이터1, 데이터2, ..., 데이터n};
  • 배열 크기를 지정하지 않아도 데이터 개수 만큼의 배열이 자동으로 생성됨
    • (단, 배열 내의 데이터가 모두 준비된 경우에만 가능한 문법)

배열 선언 및 생성

  • int[] score = new int[5]; 이렇게 붙일 수도 있음.

인덱스 필수!

 

초기화를 별도로 수행 안한 것은 int형 기본값인 0으로 자동 초기화
이렇게 반복이 가능하게됨. syso 5번 일일이 안찍어도 됨!

 

for(int i = 0; i < score.length; i++) {
    // 0 ~ 배열크기-1(4) 까지 반복 ⇒ 유동적
    System.out.println(i + "번 배열 : " + score[i]);
}
  • ⇒ 배열의 첫번째 인덱스(0번)부터 마지막 인덱스(배열크기-1)까지 반복
  • 가급적 배열명.length 를 사용하여 코드 변경에 대처가 가능하도록 하자!

 

======== Test.java 만들기

문제 )

정수 10개를 저장하는 배열 arr 생성하고

1 ~ 10 까지 초기화 한 후 출력

int[] arr = new int[10];
arr[0] = 1; arr[1] = 2; arr[2] = 3; arr[3] = 4; arr[4] = 5;
arr[5] = 6; arr[6] = 7; arr[7] = 8; arr[8] = 9; arr[9] = 10;

for(int i = 0; i < arr.length; i++) {
	System.out.println(arr[i]);
}

 

문제 ) 배열 10개에 저장된 정수의 합을 계산하여 출력

int sum = 0;
for(int i = 0; i < arr.length; i++) {
    // 모든 정수의 합을 누적
    sum += arr[i]; // i번 배열 데이터를 꺼내서 변수 sum 에 누적
}

System.out.println("합 : " + sum);

 

문제 )

학생 5명의 점수를 배열(score)에 저장하고

총점(total)과 평균(avg)을 계산하여 점수와 함께 출력

5개의 공간 배열이 자동으로 생성됨.
이렇게 배열 선언 후 한번에 초기화하는 문장 별도로는 사용불가!
이렇게 적어줘야 함.
크기는 자동으로 부여되기때문에 이렇게 쓸 경우엔 넣어주면 오류!!
최종! (double) 형 변환 해주기!
String 타입으로 만들면 이렇게 학생 이름도 출력 가능!

 

< Ex.java >

- C언어 쓰던 사람은 아래 줄 처럼 뒤에 []를 붙이는 습관이 있음

- 저렇게 쓸 경우 문제 되는 점!

- 다른 언어였다면 Heap 에 남아있는 4,5,6 값을 직접 지워야 되는데 자바는 Garbage Collector = GC가 자동으로 지운다.

- 참조하는 값이 하나라도 있으면 제거대상이 아님.

> 추가

실행하면 이런 창이 뜸

System.out.println(score[10]);

⇒ 0 ~ 4 까지 범위를 벗어나는 인덱스 지정

  • 배열 인덱스를 잘못 지정했을 경우(존재하지 않는 인덱스를 참조하는 경우)
  • 프로그램이 정상적으로 실행되지 못하고 중간에 종료됨
    • 단, 코드 상에서 즉시 오류 확인이 불가능(컴파일 오류가 발생하지 않음)
    • ⇒ 프로그램 실행 시점에서 오류가 발견되므로 인덱스 사용 시 주의!
    • Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10 at Ex.main(Ex.java:84)
      • ⇒ 배열 범위를 벗어난 인덱스를 사용했을 때 오류 발생(10번 때문에 오류)
      • ⇒ 오류가 발생한 코드의 위치는 Ex.java 클래스의 84번 라인

 

728x90