배열 (Array)

💡 같은 타입여러 변수를 하나의 묶음으로 다루는 것

💡 String[] classGroup = { "김철수", "김영희", "한소희",...}

       ➡️  classGroup이라는 변수에 문자열로 된 배열이 담긴다.

 

1)  배열의 선언과 생성

선언방법 선언 예
타입[] 변수이름; int[] score;
String[] name;
타입 변수이름[]; int score[];
String name[];

 

a.  배열의 생성

타입[] 변수이름;                         //  배열을 선언 (배열을 다루기 위한 참조변수 선언)
변수이름 = new 타입[길이];    //  배열을 생성 (실제 저장공간을 생성)

 

  📍  각 배열요소는 자동적으로 int의 기본값(default)인 0으로 초기화

 


 2)  배열의 길이와 인덱스

 

  🚀  생성된 배열의 각 저장공간을 '배열의 요소(element)'라고 하며, '배열이름[인덱스]'의 형식으로 배열의 요소에 접근한다.

  🚀  인덱스(index)는 배열의 요소마다 붙여진 일련번호

         ➡️  인덱스의 범위는 0부터 '배열길이 -1'까지

         ➡️  인덱스로 상수 대신 변수나 수식도 사용할 수 있다

​score[0] = 0 ;
score[1] = 10;
score[2] = 20;
score[3] = 30;
score[4] = 40;

​* [0],[1],[2],[3],..  : '인덱스'(위치를 알려주는 원리)
for (int i = 0; i < 5; i++) {
    score[i] = i * 10;
}

 

a.  배열의 길이

    · 배열의 길이는 양의 정수(0도 포함) 이어야 하며 최대값은 int 타입의 최대값, 약 20억이다

 

b.  배열이름.length

    ·  배열은 한번 생성하면 길이를 변경할 수 없기 때문에, 이미 생성된 배열의 길이는 변하지 않는다.

    ·  '배열이름.length'는 상수다.

    ·  for문의 조건식에 배열의 길이를 직접 적어주는 것보다. '배열이름.length'를 사용하는 것이 좋다.

 

c.  배열의 길이 변경하기

 

  1) 더 큰 배열을 새로 생성

  2) 기존 배열의 내용을 새로운 배열에 복사

 

 

3)  배열의 초기화

  🚀  배열은 생성과 동시에 자동적으로 기본값으로 초기화 됨

         ➡️  원하는 값을 저장하려면 각 요소마다 값을 지정해줘야 함

         ➡️  배열의 길이가 큰 경우에는 요소 하나하나에 값을 지정하기 보다는 for문을 사용

int score = new int [] { a , b, c, d, e };    //  배열의 생성과 초기화를 동시에
int score = { a , b, c, d, e };                        //  new int[] 를 생략할 수 있음
 (단, 배열의 선언과 생성을 따로하는 경우에는 생략 불가)
 
int[] score = new int[0];     // 길이가 0인 배열
int[] score = new int[]{};    // 길이가 0인 배열
int[] score = {};             // 길이가 0인 배열, new int [ ] 가 생략됨

 


4)  배열의 출력

  🚀  for문 사용 또는 Arrays.toString(배열이름) 메서드 사용

          → 배열의 모든 요소를 '[첫번째 요소, 두번째 요소, ...]' 와 같은 형식의 문자열로 만들어서 반환

  🚀  아래 변수 iArr 값을 바로 출력하면 '타입 @ 주소' 형식으로 출력된다.

        참조변수는 heap 영역에, 지역변수&매개변수는 stack 영역에 저장 됨.

-> 그렇기 때문에 참조 변수는 주소로 출력됨.

int[] iArr = {100, 95, 80, 70, 60}; 

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

System.out.println();  
System.out.prinln(iArr); // [I@7344699f
System.out.prinln(Arrays.toString(iArr)); // [100, 95, 80, 70, 60]

 


  ✓  메모리 구조

 

☕ 그림으로 보는 자바 코드의 메모리 영역(스택 & 힙)

자바의 메모리 영역 이번 포스팅에선 자바(JAVA)를 사용하는 입장에서 알아야 할 메모리 구조 및 특징에 대해서 알아보려고 한다. 자바 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모

inpa.tistory.com

 


 

public class Exam01 {

	public static void main(String[] args) {
		
		int[] student; // 힙공간의 배열의 주소가 저장될 변수 생성.
		student = new int[3]; // 힙공간의 길이가 3인 배열 생성(연속된 주소를 가짐)하고 주소를 반환.

		// 정수 배열이 생성이 되고, 초기화를 하지 않으면 자동으로 0으로 초기화.
		System.out.println("현재 자동으로 초기화된 값: " + student[0]); // 0

		// 인덱스를 이용하여 개별 요소의 값을 변경.
		student[0] = 30; // 배열의 첫 번째 요소에 30을 저장
		student[1] = 20; // 배열의 두 번째 요소에 20을 저장
	    student[2] = 10; // 배열의 세 번째 요소에 10을 저장
	    
	    System.out.println("현재 첫 번째 요소의 값: " + student[0]); // 30
	}
}

배열 출력 3가지 방법

 

  📍  for문 출력  |  foreach문 출력  |  Array.toString() 출력 

public class Exam02 {

	public static void main(String[] args) {
    
		// for문으로 배열 초기화
		int[] c = new int[10];
		for(int i = 0; i < c.length; i++) {
			c[i] = i;
		}
		
		// 배열의 요소를 출력하는 방법 3가지.
		// for문을 이용한 출력
		System.out.println(c.length);
		for (int i = 0; i < c.length; i++) {
			System.out.println(c[i]);
		}
		
		// foreach 문을 이용한 출력
		System.out.println();
		for(int d: c) { // (배열의 요소 : 배열).
			// 반복시에 변수 d에 순서대로 요소가 들어감. 자바스크립트의 for of문과 유사.
			System.out.println(d);
		}
		
		// Arrays.toString 메서드 사용. 문자열로 출력.
	    System.out.println();
	    System.out.println(Arrays.toString(c));

	}
}

 

 
 
 
배열 사용 X  VS. 배열 사용 O

  ✔️  학생 5명의 성적 총점과 평균

public class MyArray_01 {

	public static void main(String[] args) {
	
		// 1. 배열을 사용하지 않는 경우
	    int score_001 = 95;
	    int score_002 = 76;
	    int score_003 = 67;
	    int score_004 = 56;
	    int score_005 = 87;
	    
	    int total = score_001 + score_002 + score_003 + score_004 + score_005;
	    double avg = (double)total / 5;
	    System.out.println("총점은 " + total + "점이고, 평균은 " + avg + "입니다.");
	    
	    // 2. 배열을 사용하는 경우
	    // 총점은 for문을 이용해서 구할 수 있고, 배열의 갯수가 늘어난다 해도
	    // 총점을 구하는 for문과 평균을 구하는 코드를 수정할 필요가 없음
	    total = 0;
	    int[] scores = {95, 76, 67, 56, 87}; // 배열 생성
	    for (int i = 0; i < scores.length; i++) {// scores.length -> 배열의 갯수
	    	total += scores[i];
	    	
	    }
	    avg = (double)total / scores.length;
	    System.out.println("총점은 " + total + "점이고, 평균은 " + avg + "입니다.");
	}
}

 

최대값 최소값 구하기
public class MyArray_03 {

	public static void main(String[] args) {
		/* 최대값, 최소값 구하기 */
		int[] score = { 79, 88, 91, 33, 100, 55, 95 };
		
		int max = score[0]; // 배열의 첫 번째 값으로 최대값을 초기화 한다.
		int min = score[0]; // 배열의 첫 번째 값으로 최소값을 초기화 한다.
		
		for(int i = 1; i < score.length; i++) {
			if(score[i] > max) {
				max = score[i];
			    System.out.println("max: " + max); // 값이 변경되는 것이 안 보이기 때문에 이해가 안될 때 써보기.
			}
			if(score[i] < min) {
				min = score[i];
			}
		} // end of for
		
		System.out.println("최대값 : " + max);
	    System.out.println("최소값 : " + min);

	}
}
 
 

 

​응용 문제
  📍 학생 수와 각 학생들의 점수를 입력받아서, 최고 점수 및 평균 점수를 구하는 프로그램
public class Ex_01_Array_03 {

	public static void main(String[] args) {
		
        Scanner scanner = new Scanner(System.in);
		
        boolean run = true;  // 반복문의 조건으로 사용 -> 값이 false가 된다면 반복문이 종료
        int studentNum = 0;  // 학생수
        int[] scores = null; // 점수를 입력 받을 빈 배열 생성. 사용자에게 입력받은 학생수를 기준으로 배열 생성.
        
        
        while (run) {
        
            System.out.println("-----------------------------------------------------");
            System.out.println("1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료");
            System.out.println("-----------------------------------------------------");
            System.out.print("선택> ");
           
            int selectNo = scanner.nextInt();
          
            if (selectNo == 1) { // 학생수를 입력 받아서 배열 생성 
     
                System.out.print("학생수> ");
                studentNum = scanner.nextInt();
                scores = new int[studentNum];
                
                System.out.println(Arrays.toString(scores));
                
            } else if (selectNo == 2) { // 생성된 배열의 갯수 만큼 점수 입력
            	
                for(int i = 0; i < scores.length; i++) {
                	System.out.print("scores["+i+"] : ");
                	scores[i] = scanner.nextInt();
                }
            	
            } else if (selectNo == 3) { // 입력받은 배열의 값을 출력

            	for(int i = 0; i < scores.length; i++) {
                    System.out.println("score["+i+"] : " + scores[i]);
            	}
            	
            } else if (selectNo == 4) { // 최고 점수, 평균 점수 출력
                
            	int max = 0;
            	int sum = 0;
            	double avg = 0;
            	
            	for(int i = 0; i < scores.length; i++) {
            		max = (max < scores[i]) ? scores[i] : max;
            		sum += scores[i];
        		}
                
        		avg = (double) sum / studentNum; // 평균
        		System.out.println("최고 점수: " + max);
            	System.out.println("평균 점수: " + avg);
            	
            } else if (selectNo == 5) { // run 값 변경
                run = false;
            }
        }
        System.out.println("프로그램 종료");
        scanner.close();
    }
}
 
 실행 예)
        -----------------------------------------------------
        1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료
        -----------------------------------------------------
        선택> 1
        학생수> 3
        [0, 0, 0]
        -----------------------------------------------------
        1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료
        -----------------------------------------------------
        선택> 2
        scores[0]> 90
        scores[1]> 80
        scores[2]> 70
        -----------------------------------------------------
        1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료
        -----------------------------------------------------
        선택> 3
        scores[0]: 90
        scores[1]: 80
        scores[2]: 70
        -----------------------------------------------------
        1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료
        -----------------------------------------------------
        선택> 4
        최고 점수: 90
        평균 점수: 80.0
        -----------------------------------------------------
        1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료
        -----------------------------------------------------
        선택> 5
        프로그램 종료

 

 
 
 

 

* 내용 참고 : 학원강의 및 자바의 정석 3rd

 

+ Recent posts