배열 (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

 


1.  배열 Array

배열명["값1", "값2", ...]
배열명[] // 빈 배열 선언

 

✏️  여러 자료를 하나로 묶어서 사용할 수 있는 특수한 자료형
✏️  배열은 대괄호[...]를 사용해 생성하고 내부의 값을 쉼표(,)로 구분해 입력
✏️  배열 내부에 들어있는 값을 요소 element 라고 함

        📁  하나의 배열에 여러가지 타입의 자료형이 요소가 될 수 있음
        📁  컴파일 계통의 언어(C, C++, JAVA)등은 하나의 배열이 동일한 타입의 자료형만 요소가 될 수 있음

✏️  자바의 배열 보다는 파이썬의 리스트에 가까움

 

    1. 자바 배열의 특징
    동일한 데이터 타입을 미리 지정된 개수 만큼 저장. 중괄호 사용.
    2. 파이썬 리스트의 특징
    다른 데이터 타입을 동적으로 추가 삭제 가능. 대괄호 사용.

 

  📌  요소에 접근하고 싶은 경우에는 인덱스를 사용
  📌  순서대로 0부터 시작해서 1씩 증가하는 정수를 라벨링

  📌  [ 배열이름.length ] 자바 스크립트에서 기본으로 제공하는 기능으로, 배열의 개수를 자동으로 반환

<script>
    let scores = [90, 80, 70, 60, 50];
    console.log(scores[1]); // 80

    /* 문자열도 문자의 배열 */
    const str = '안녕하세요';

    console.log(str[2]); // 하
    console.log(str.length); // 5
    console.log(str[str.length - 1]); // 요

    // 숫자 자료형, 문자열 자료형, 불린 자료형, 함수, 객체, 배열
    const array = [273, 'String', true, function () {}, {}, [273, 103]];
    console.log(array);
    // 0: 273 1: "String" 2: true 3: ƒ () 4: {} 5: (2) [273, 103]

</script>

 


2. 배열 요소 추가

배열 뒷 부분에 요소 추가 ; push() 메소드 사용
배열.push(요소)
<script>
    const todos = ['우유구매', '업무 메일 확인하기', '필라테스 수업'];
    console.log(todos); // (3) ['우유구매', '업무 메일 확인하기', '필라테스 수업']

    todos.push('저녁 식사 준비하기');
    todos.push('피아노 연습하기');

    // 배열의 뒷부분에 요소 2개가 추가됨
    console.log(todos); // (5) ['우유구매', '업무 메일 확인하기', '필라테스 수업', '저녁 식사 준비하기', '피아노 연습하기']

    // 배열은 참조변수라서 const 라도 값 변경이 가능.
    const fruitsA = ['사과', '배', '바나나'];
    fruitsA.push('망고');
    console.log(fruitsA); // (4) ['사과', '배', '바나나', '망고']

    // 재할당은 불가
    // fruitsA = ['우유구매', '업무 메일 확인하기', '필라테스 수업'];
    // Uncaught TypeError: Assignment to constant variable;
</script>

 


배열 뒷 부분에 요소 추가 ; 인덱스 사용

 

  📌  배열의 길이는 고정이 아니기 때문에 인덱스 번호를 사용해서 강제로 요소를 추가할 수 있음

<script>
    const fruitsA = ['사과', '배', '바나나'];
    fruitsA[10] = '귤'; // 배열의 길이는 3개, 마지막 요소의 인덱스는 2번인데 10번 인덱스를 강제로 입력.

    // 4 ~ 10 번째 요소는 아무것도 없음
    console.log(fruitsA); // (11) ['사과', '배', '바나나', 비어 있음 x 7, '귤']

    const fruitsB = ['사과', '배', '바나나'];

    // length 속성 사용
    fruitsB[fruitsB.length] = '귤';

    console.log(fruitsB); // ['사과', '배', '바나나', '귤']
</script>

 


배열의 특정 위치에 요소 추가 ; splice() 메소드 사용 
배열.splice(인덱스, 제거할 요소의 수, 요소);

 

  📌  1번째 매개변수인 인덱스는 필수이고 제거할 요소의 수와 삽입할 요소는 생략 가능

  📌  2번째 매개변수인 제거할 요소의 수: 배열 안의 인덱스 요소부터 삭제 ▶️ 생략시 끝까지 삭제

         ⚡️ 2번째 매개변수에 0을 입력하면 splice() 메소드가 요소를 삭제하지는 않고, 3번째 매개변수에 있는 요소를 추가함

  📌  3번째 매개변수인 요소는 추가할 값을 입력

<script>
    const items = ['사과', '귤', '바나나', '오렌지'];
    console.log(items); // (4) ['사과', '귤', '바나나', '오렌지']

    items.splice(1, 0, '양파'); // 1번 인덱스에 요소를 추가.
    console.log(items); // (5) ['사과', '양파', '귤', '바나나', '오렌지']

    // 요소를 변경하고 싶은 경우
    items[1] = '키위';
    console.log(items); // (5) ['사과', '키위', '귤', '바나나', '오렌지']
</script>

 


3.  배열 요소 제거

 인덱스 기반으로 제거


    📌  배열의 특정 인덱스에 있은 요소를 제거할 때는 splice() 메소드를 사용

배열.splice(인덱스, 제거할 요소의 개수)
<script>
    const fruitsA = ['사과', '배', '바나나'];
    console.log(fruitsA); // (3) ['사과', '배', '바나나']

    fruitsA.splice(2, 1); // 배열의 2번째 인덱스로 부터 1개 요소를 제거
    console.log(fruitsA); // (2) ['사과', '배']
</script>

 


 값으로 요소 제거


    📌  배열 내부에서 특정 값의 위치를 찾는 indexOf() 메소드를 사용해서 값의 위치를 추출한 후,
          splice() 메소드를 사용해서 제거

    📌  indexOf() 매개변수에 배열에 없는 요소를 넣은 경우 -1을 반환

const 인덱스 = 배열.indexOf(요소);
배열.splice(인덱스, 1);
<script>
    const fruits = ['사과', '배', '바나나'];

    const index = fruits.indexOf('바나나'); // 바나나를 값으로 가지는 인덱스 구함.
    console.log(index); // 2

    fruits.splice(index, 1);
    console.log(fruits); // (2) ['사과', '배']

    console.log(fruits.indexOf('바나나')); // 배열에 없는 경우 -1을 출력
    if (fruits.indexOf('바나나') >= 0) {
        fruits.splice()
    }
</script>

 

 

 

 

[ 내용 참고 : IT 학원 강의 및 책 'Do it HTML+CSS+자바스크립트 웹 표준의 정석' ]

+ Recent posts