본문 바로가기
Java/Java 기초문법

[JAVA 기초] 자바 배열(Array) - 3 foreach문, 예제

by dev수니 2021. 3. 5.
반응형

 

 1  foreach

 

자바에서는 배열을 순환할 때 기존의 반복문보다 편리한 작업을 할 수 있도록 foreach문을 제공한다.

for(배열의 타입 변수이름 : 배열이름){
     // 실행 부분
}

기존의 for문에서는 인덱스 번호를 통해서 배열에 대한 작업을 처리했다. foreach문은 배열의 이름과 새로운 변수만 하나 지정하면 루프를 돌 때마다 자동으로 배열의 요소를 하나씩 처리한다.

 

 

 

 

 

Ex. 다음은 foreach문을 이용하여 문장을 출력하는 프로그램이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package java_practice;
 
public class Array_Foreach {
 
    public static void main(String[] args) {
        String[] name = {"java""Hello""Hi"};
        int[] num = { 1,2,3,4};
        
        for (String i : name) {
            System.out.print(i+" ");
        }
        
        for (int i : num) {
            System.out.print(i+" ");
        }
    }
}
cs

 

출력결과
java Hello Hi 1 2 3 4 

 

 

 

 

 

 

 


 

 

1. 3개의 과목의 점수를 입력받고, 총점과 평균을 출력.

 

출력결과

점수를 입력해주세요.
과목1 : 98
과목2 : 97
과목3 : 95
총점 : 290점
평균 : 96.67점

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package java_practice;
 
import java.util.Scanner;
 
public class Array_Sum {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] arr = new int[3];
        int sum = 0;
        
        System.out.println("점수를 입력해주세요.");
 
        for(int i=0; i<arr.length; i++) {
            System.out.printf("과목%d : ",i+1);
            arr[i] = sc.nextInt();
            sum += arr[i];
        }
        float avg = (float)sum/arr.length;    // 평균을 소수점자리까지 구해주기 위해 형변환
        System.out.printf("총점 : %d점\n평균 : %.2f점", sum, avg);   // 소수점 둘째자리에서 반올림
        
        sc.close();
    }
}
 
cs

 

평균의 정확도 향상을 위해 int와 데이터 크기가 같은 float로 형변환 시켜준다.

 

평균값을 소수점 둘째자리까지만 나타내기위해 fomat형식으로 출력해준 후 서식문자를 사용하여 %.2f로 소수점 제한해준다.

해당 내용은 이전 포스팅에서 자세히 확인가능하다.

 

https://soonipy.tistory.com/18?category=1005894

 

[JAVA 기초] 자바의 특수문자와 printf 서식문자

자바에서 백슬러쉬와 따옴표는 출력되지 않는 특수문자이다. 또한 printf를 사용해야만 하는 서식 문자도 있는데 이의 종류는 다음과 같다.  1 문자(역슬래쉬) \\ : \ \' : 작은 따옴표 \" : 큰 따옴표

soonipy.tistory.com

 

 

 

 

 

 

 

 

 

 

 

2. 과목수를 입력받고 모든 과목의 총점과 평균을 출력.

과목 수 : 6
과목 1 : 79
과목 2 : 84
과목 3 : 86
과목 4 : 73
과목 5 : 98
과목 6 : 85
총점 : 505점
평균 : 84.17점

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package java_practice;
 
import java.util.Scanner;
 
public class Array_Avg {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.print("과목 수 : ");
        int num = sc.nextInt();        // 과목수 입력받음
        int[] score = new int[num];    // 입력받은 과목 수를 배열의 길이로 설정
        int sum = 0;
        
        for(int i=0; i<score.length; i++) {
            System.out.printf("과목 %d : ", i+1);
            score[i] = sc.nextInt();
            sum += score[i];
        }
        float avg = (float)sum/score.length;    // 평균을 소수점자리까지 구해주기 위해 형변환
        System.out.printf("총점 : %d점\n평균 : %.2f점", sum, avg);   // 소수점 둘째자리에서 반올림
        
        sc.close();
        }
}
cs

 

위의 예제와 똑같지만 배열을 길이를 입력받는 부분이 추가된 형태이다. 과목의 수가 곧 배열의 길이이므로 과목의 수로 입력받을 변수를 num으로 정해놓고 입력버퍼(sc.nextInt();)로 입력받는다.

 

그 후 입력받은 변수 num을 배열의 길이로 지정해준다.

 

 

 

 

 

 

 

 

 

3. 배열의 최대값과 최소값.

int[] arr = { 1, 5, 3, 2, 7 };

최대값 : 7

최소값 : 1

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package java_practice;
 
public class Arr_Min_Max {
 
    public static void main(String[] args) {
        int[] arr = { 15327 };
        int max = arr[0], min = arr[0];    // 최대값과 최소값을 임의로 1로 지정해줌.
        
        for(int i=0; i<arr.length; i++) {
            if(max >= arr[i]) {
                max = arr[i];    // arr의 값이 max와 보다 크거나 같을 경우 max에 저장
            }if(min <= arr[i]) {
                max = arr[i];    // arr의 값이 min와 보다 작거나 같을 경우 max에 저장
            }
        }
        System.out.printf("최대값 : %d\n최소값 : %d", max, min);
    }
}
cs

 

최대값과 최소값을 저장할 변수 max와 min을 선언해주고 임의로 arr[0]값을 초기화시켜준다.
 
이제 arr의 모든 값을 max, min과 비교하여 더 크고 작은 수 를 저장시켜 줘야 하기 때문에 for문으로 모든 값을 대입시켜주고, if문으로 각 값을 비교시켜주고 해당되는 수를 저장시켜준다.
 
 

 

 

 

 

 

4. 배열의 복제와 Arrays.equals()메서드

int[] arr = { 1, 5, 3, 2, 7 };
int[] arr2;

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package java_practice;
 
import java.util.Arrays;
 
public class Array_Copy {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arr = { 15327 };
        int[] arr2;
        
        arr2 = new int[arr.length];        // arr2를 새로 선언
        for(int i=0; i<arr2.length; i++) {
            arr2[i] = arr[i];        // arr의 요소를 복제
        }
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(arr2));
        
        System.out.println(arr == arr2);    // 둘의 주소값이 다르기 때문에 false
        System.out.println(Arrays.equals(arr,arr2));    // 둘의 요소의 값을 비교하는 메서드 true
    }
}
cs

출력결과

[1, 5, 3, 2, 7]
[1, 5, 3, 2, 7]
false
true

 

arr[] = arr2;  // 배열의 복제가 아니다.

배열을 복제하려면 arr2의 배열을 새로 선언해주고 모든 요소를 복사해주어야 한다.

따라서 arr2를 새로 선언해 주고 arr2의 요소를 arr과 똑같이 복제해주었다.

 

Array.toSring()으로 arr와 arr2를 출력해보면 [1, 5, 4, 2, 7]로 나온다.

 

하지만 이 둘은 주소값이 서로 다르다. 따라서 arr == arr2 는 false이다.

두 배열의 요소를 비교하는 메서드로는 Arrays.equals(arr, arr2)로 이는 배열이 같는 요소만을 비교하기 때문에 출력결과가 true인 것을 확인할 수 있다.

 

또한 이 메서드는 java.util 이라는 외부 패키지에 있으므로 Arrays를 import 시켜준 후 사용해야 한다.

 

 

 

 

 

 

 

 

 

 

 

 

5. 배열의 복제와 System.arraycopy() 메서드

System.arraycopy( src, srcPos, dest, destPos, length );
1.src 는 복사할 배열 srcPos 는 복사하기 시작할 인덱스
2.dest 는 덮어쓸 배열 destPos 는 덮어쓰기 시작할 인덱스
3.legth 는 복사할 길이

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package java_practice;
 
import java.util.Arrays;
 
public class Array_SysArraycopy {
    public static void main(String[] args) {
        int[] arr1 = {1,2,3,4,5,6};
        int[] arr2 = {0,0,0,0,0,0};
        
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        System.out.println();
        
        System.arraycopy(arr1, 2, arr2, 23);    // {0,0,3,4,5,0} 으로 복제
        
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
            }
}
cs
 
출력결과
[1, 2, 3, 4, 5, 6]
[0, 0, 0, 0, 0, 0]

[1, 2, 3, 4, 5, 6]
[0, 0, 3, 4, 5, 0]
 
 
 
 
 
 
 
 
 

6. 로또번호생성

1~45까지의 정수 중 6개를 임의로 골라서, 오름차순으로 출력. (단, 중복X)

 

 

 

 

 

 

 

 

 

 

 

tip Math.random()  : 0.0 이상 1.0 미만의 수를 출력한다.
random함수는 Math라는 클래스 안에 존재한다. 이 Math클래스는 최상위 클래스인 Object안에 들어있으므로
import 시켜주지 않아도 된다.

다만 소수점 아래로는 무한소수를 찍어내기 때문에 원하는 정수n을 곱해주고 (int)로 형변환시켜준다. 그러면 0부터 원하는 정수n-1까지 얻을수 있다. 1부터 원하는 정수n까지 구하려면 +1만 해주면 된다.

 

따라서 1부터 원하는 정수n을 구하는 식은 (int)(Math.random()*n) + 1 이다.

 
 

 

 

 

반응형

댓글