본문 바로가기

BackEnd/Java

[java] 이것이 자바다 ch05 배열 타입

728x90
반응형

1. 배열(Array) 타입

   ▷ 배열

      ▶ 연속된 공간에 값을 나열시키고, 각 값에 인덱스를 부여해 놓은 자료구조입니다.

      ▶ 인덱스는 대괄호 []와 함께 사용하여 각 항목의 값을 읽거나 저장하는데 사용합니다.

 

   ▷ 배열 변수 선언

      ▶ 두 가지 형태로 작성. 첫 번때가 관례적인 표기합니다.

      ▶ 배열은 힙 영역에 생성되고 배열 변수는 힙 영역의 배열 주소를 저장합니다.

      ▶ 참조할 배열이 없다면 배열 변수도 null로 초기화할 수 있습니다.

 

   ▷ 값 목록으로 배열 생성

      ▶ 배열에 저장될 값의 목록이 있다면, 다음과 같이 간단하게 배열을 생성할 수 있습니다.

      ▶ 배열 변수를 선언한 시점과 값 목록이 대입되는 시점이 다르다면 new 타입[]을 중괄호 앞에 붙여줍니다.

      ▶ 타입은 배열 변수를 선언할 때 사용한 타입과 동일하게 지정합니다.

 

 

◎ array 사용 예제

public class ArrayExample {

	public static void main(String[] args) {
		
		String[] season = {"Spring", "Summer", "Fall", "Winter"};
		
		System.out.println("season[0]: " + season[0]);
		System.out.println("season[1]: " + season[1]);
		System.out.println("season[2]: " + season[2]);
		System.out.println("season[3]: " + season[3]);
		
		season[1] = "여름";
		System.out.println("season[1]: " + season[1]);
		System.out.println();
		
		int[] scores = { 83, 90, 87 };
		
		int sum = 0;
		for(int i=0; i<scores.length; i++) {
			sum += scores[i];
		}
		System.out.println("총합 : " + sum);
		double avg = (double)sum / 3;
		System.out.println("평균 : " + avg);
	}
}

// 출력 : 
// season[0]: Spring
// season[1]: Summer
// season[2]: Fall
// season[3]: Winter
// season[1]: 여름
//
// 총합 : 270
// 평균 : 86.66666666666667



public class ArrayExample2 {

	public static void main(String[] args) {
		
		int[] scores;                      // 변수 선언시 null로 지정해도 됩니다.
		scores = new int[] { 83, 90, 87 };
		
		int sum1 = 0;
		for(int i=0; i<3; i++) {
			sum1 += scores[i];
		}
		System.out.println("총합 : " + sum1);
		
		//배열을 매개값으로 주고, 메소드를 호출할 수 있습니다.
		printItem(new int[] {83, 90, 97});
	}
	
	public static void printItem( int[] scores ) {
		for(int i=0; i<3; i++) {
			System.out.println("scores[" + i + "]: " + scores[i]);
		}
	}
}

// 출력 : 
// 총합 : 260
// scores[0]: 83
// scores[1]: 90
// scores[2]: 97

 

 

   ▷ new 연산자로 배열 생성

      ▶ new 연산자로 값의 목록은 없지만 향후 값들을 저장할 목적으로 배열을 미리 생성합니다.

          └ 즉, 배열에 있는 방의 개수를 지정합니다.

      ▶ new 연산자로 배열을 처음 생성하면 배열 항목은 기본값으로 초기화됩니다.

 

NO 데이터 타입 초기값
1 기본 타입 byte[ ] 0
2 char[ ] '\u0000'
3 short[ ] 0
4 int[ ] 0
5 long[ ] 0L
6 float[ ] 0.0F
7 double[ ] 0.0
8 boolean[ ] false
9 참조 타입 클래스[ ] null
10 인터페이스[ ] null

 

 

◎ 초기값 예제

 

public class ArrayExample3 {

	public static void main(String[] args) {
		
		int[] arr1 = new int[3];
		for(int i=0; i<3; i++) {
			System.out.print("arr1["+i+"] : " + arr1[i] + ", ");
		}
		System.out.println();
		
		arr1[0] = 10;
		arr1[1] = 20;
		arr1[2] = 30;
		
		for(int i=0; i<3; i++) {
			System.out.print("arr1["+i+"] : " + arr1[i] + ", ");
		}
		System.out.println("\n");
		
		double[] arr2 = new double[3];
		for(int i=0; i<3; i++) {
			System.out.print("arr2["+i+"] : " + arr2[i] + ", ");
		}
		System.out.println();

		arr2[0] = 0.1;
		arr2[1] = 0.2;
		arr2[2] = 0.3;
		
		for(int i=0; i<3; i++) {
			System.out.print("arr2["+i+"] : " + arr2[i] + ", ");
		}
		System.out.println("\n");
		
		String[] arr3 = new String[3];
		for(int i=0; i<3; i++) {
			System.out.print("arr3["+i+"] : " + arr3[i] + ", ");
		}
		System.out.println();
		
		arr3[0] = "1월";
		arr3[1] = "2월";
		arr3[2] = "3월";
		
		for(int i=0; i<3; i++) {
			System.out.print("arr3["+i+"] : " + arr3[i] + ", ");
		}
	}
}

//  출력 :
//	arr1[0] : 0, arr1[1] : 0, arr1[2] : 0, 
//	arr1[0] : 10, arr1[1] : 20, arr1[2] : 30, 
//
//	arr2[0] : 0.0, arr2[1] : 0.0, arr2[2] : 0.0, 
//	arr2[0] : 0.1, arr2[1] : 0.2, arr2[2] : 0.3, 
//
//	arr3[0] : null, arr3[1] : null, arr3[2] : null, 
//	arr3[0] : 1월, arr3[1] : 2월, arr3[2] : 3월,

 

   ▷ 배열 길이

      ▶ 배열의 길이란 배열에 저장할 수 있는 항목 수

      ▶ 코드에서 배열의 길이를 얻으려면 도트(.) 연산자를 사용해서 참조하는 배열의 length 필드를 읽습니다.

      ▶ 배열의 length 필드는 읽기만 가능하므로 값을 변경할 수는 없습니다.

      ▶ 배열 길이는 for문을 사용해서 전체 배열 항목을 반복할 때 많이 사용합니다.

 

 

2. 다차원 배열

   ▷ 배열 항목에는 또 다른 배열이 대입된 배열입니다.

   ▷ 값 목록으로 다차원 배열 생성시 배열 변수 선언시 타입 뒤에 대괄호 []를 차원의 수만큼 붙이고, 값 목록도 마찬가지로 차원의 수만큼 중괄호를 중첩합니다.

 

public class MultiArrayExample4 {

	public static void main(String[] args) {
		
		int[][] scores = {    // 2차원 배열 scores [2]행[3]열 = 6 데이터를 입력
				{80, 90, 96},
				{76, 88}
		};
		
		System.out.println("1차원 배열 길이(반의 수): " + scores.length);
		System.out.println("2차원 배열 길이(첫 번째 반의 학생 수): " + scores[0].length);
		System.out.println("2차원 배열 길이(두 번째 반의 학생 수): " + scores[1].length);
		
		// 첫 번째 반의 세 번째 학생의 점수 읽기		
		System.out.println("scores[0][2]: " + scores[0][2]);
		
		// 두 번째 반의 두 번째 학생의 점수 읽기
		System.out.println("scores[1][1]: " + scores[1][1]);
		
		// 첫 번째 반의 평균 점수 구하기
		int class1Sum = 0;
		for(int i=0; i<scores[0].length; i++) {
			class1Sum += scores[0][i];
		}
		double class1Avg = (double) class1Sum / scores[0].length;
		System.out.println("첫 번째 반의 점수 합계: " + class1Sum);
		System.out.println("첫 번째 반의 평균 점수: " + class1Avg);

		// 두 번째 반의 평균 점수 구하기
		int class2Sum = 0;
		for(int i=0; i<scores[1].length; i++) {
			class2Sum += scores[1][i];
		}
		double class2Avg = (double) class2Sum / scores[1].length;
		System.out.println("두 번째 반의 점수 합계: " + class2Sum);
		System.out.println("두 번째 반의 평균 점수: " + class2Avg);
		
		// 전체 학생의 평균 점수 구하기
		int totalStudent = 0;
		int totalSum = 0;
		for(int i=0; i<scores.length; i++) {
			totalStudent += scores[i].length;
			for(int k=0; k < scores[i].length; k++) {
				totalSum += scores[i][k];
			}
		}
		double totalAvg = (double) totalSum/totalStudent;
		System.out.println("전체 학생의 평균 점수: " + totalAvg);
	}
}

// 출력 : 
// 1차원 배열 길이(반의 수): 2
// 2차원 배열 길이(첫 번째 반의 학생 수): 3
// 2차원 배열 길이(두 번째 반의 학생 수): 2
// scores[0][2]: 96
// scores[1][1]: 88
// 첫 번째 반의 점수 합계: 266
// 첫 번째 반의 평균 점수: 88.66666666666667
// 두 번째 반의 점수 합계: 164
// 두 번째 반의 평균 점수: 82.0
// 전체 학생의 평균 점수: 86.0

 

   ▷ new 연산자로 다차원 배열을 생성하려면 배열 변수 선언 시 타입 뒤에 대괄호 [ ]를 차원의 수만큼 붙이고, new 타입 뒤에도 차원의 수만큼 대괄호 [ ]를 작성합니다.

 

public class MultiArrayExample5 {

	public static void main(String[] args) {
		
		int[][] mathScores = new int[2][3];
		
		for(int i=0; i<mathScores.length; i++) {
			for(int k=0; k<mathScores[i].length; k++) {
				System.out.println("mathScores[" + i + "][" + k + "]:"
                				+ mathScores[i][k]);
			}
		}
		System.out.println();
		
		mathScores[0][0] = 80;
		mathScores[0][1] = 83;
		mathScores[0][2] = 85;
		mathScores[1][0] = 86;
		mathScores[1][1] = 90;
		mathScores[1][2] = 92;
		
		int totalStudent = 0;
		int totalMathSum = 0;
		
		for(int i=0; i<mathScores.length; i++) {
			totalStudent += mathScores[i].length;
			for(int k=0; k<mathScores[i].length; k++) {
				totalMathSum += mathScores[i][k];
			}
		}
		double totalMathAvg = (double) totalMathSum / totalStudent;
		System.out.println("전체 학생의 수학 전체 점수: " + totalMathSum);
		System.out.println("전체 학생의 수학 평균 점수: " + totalMathAvg);
		System.out.println();
	}
}

 

 

3. 객체를 참조하는 배열

   ▷ 기본 타입(byte, char, short, int, long, float, double, boolean) 배열은 각 항목에 값을 직접 저장합니다.

   ▷ 참조 타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 저장합니다.

 

public class ArrayEx01 {

	public static void main(String[] args) {
		
		String[] languages = new String[3];
		languages[0] = "Java";
		languages[1] = "Java";
		languages[2] = new String("Java");
		
		System.out.println(languages[0] == languages[1]);
		System.out.println(languages[0] == languages[2]);
		System.out.println(languages[0].equals(languages[2]));
	}
}

// 출력 : 
// true : 같은 객체를 참조
// false : 다른 객체를 참조
// true : 문자열이 동일

 

 

4. 배열 복사

   ▷ 배열은 한 번 생성하면 길이를 변경할 수 없습니다.

       더 많은 저장 공간이 필요하다면 더 큰 길이의 배열을 새로 만들고 이전 배열로부터 항목들을 복사해야 합니다.

 

public class ArrayEx03 {

	public static void main(String[] args) {
		
		String[] oldArr = { "java", "array", "copy" };
		
		String[] newArr = new String[5];
		String[] newArr1 = new String[5];
		String[] newArr2 = new String[5];		
		
		System.arraycopy(oldArr, 0, newArr, 0, oldArr.length);
		System.arraycopy(oldArr, 1, newArr1, 1, oldArr.length-1);
		System.arraycopy(oldArr, 0, newArr2, 2, oldArr.length-1);
		
		for(int i=0; i<newArr.length; i++) {
			System.out.print(newArr[i] + " ");
		}
		System.out.println();
		
		for(int i=0; i<newArr.length; i++) {
			System.out.print(newArr1[i] + " ");
		}
		System.out.println();
		
		for(int i=0; i<newArr.length; i++) {
			System.out.print(newArr2[i] + " ");
		}
		System.out.println();
		
		for(String a: newArr) {
			System.out.print(a + " ");
		}
	}
}

// 출력 : 
// java array copy null null 
// null array copy null null 
// null null java array null 
// java array copy null null

 

 

5. 배열 항목 반복을 위한 for문

   ▷ 카운터 변수와 증감식을 사용하지 않고, 항목의 개수만큼 반복한 후 자동으로 for문을 빠져나갑니다.

   ▷ for문이 실행되면 배열에서 가져올 항목이 있을 경우 변수에 항목을 저장하고 실행문을 실행합니다.

   ▷ 다시 반복해서 배열에서 가져올 다음 항목이 존재하면 변수 → 실행문 → 배열로 진행합니다.

   ▷ 가져올 다음 항목이 없으면 for문을 종료합니다.

 

public class ArrayEx04 {

	public static void main(String[] args) {
		
		int[] scores = { 95, 71, 84, 93, 87 };
		int sum = 0;
		
//		for(int i=0; i<scores.length; i++) {
//			sum += scores[i];
//		}
		
		for(int score : scores) {
			sum += score;
		}
		
		System.out.println("점수 총합 = " + sum);
		double avg = (double)sum / scores.length;
		System.out.println("점수 평균 = " + avg);
	}
}

 

 

6. main() 메소드의 String[] args 매개변수의 용도(필요성)

   ▷ 자바 프로그램을 실행하기 위해 main() 메소드를 작성하면서 문자열 배열 형태인 String[] args 매개변수가 필요합니다.

   ▷ 프로그램 실행 시 입력 값이 부족하면 길이가 0인 String 배열 참조합니다.

 

public class MainStringEx {

	public static void main(String[] args) {
		
		if(args.length != 2) {
			System.out.println("프로그램 입력 값이 부족");
			System.exit(0);
		}
		
		String strNum1 = args[0];
		String strNum2 = args[1];
		
		int num1 = Integer.parseInt(strNum1);		
		int num2 = Integer.parseInt(strNum2);
		
		int result = num1 + num2;
		System.out.println(num1 + " + " + num2 + " = " + result);
	}
}

// 출력 :
// 프로그램 입력 값이 부족

 

여기서 Run Configurations로 들어가 지정한 class 이름을 찾습니다.

그 후 Arguments에 Program arguments에 값을 넣으면 출력 값이 바뀌게 됩니다. (10 + 20 = 30)

 

입력 예시

 

 

7. 열거(Enum) 타입

   ▷ 요일, 계절처럼 한정된 값을 갖는 타입입니다.

   ▷ 먼저 열거 타입 이름으로 소스 파일(.java)을 생성하고 한정된 값을 코드로 정의합니다.

   ▷ 열거 타입 이름은 첫 문자를 대문자로 하고 캐멀 스타일로 지어주는 것이 관례입니다.

 

public enum Week {
	MONDAY,
	TUESDAY,
	WEDNESDAY,
	THURSDAY,
	FRIDAY,
	SATURDAY,
	SUNDAY
}

 

import java.util.Calendar;

public class WeekExample {
	public static void main(String[] args) {
		
		Week today = null;
		
		Calendar cal = Calendar.getInstance();
		
		int week = cal.get(Calendar.DAY_OF_WEEK);
		
		switch(week) {
			case 1: today = Week.SUNDAY; break; 
			case 2: today = Week.MONDAY; break; 
			case 3: today = Week.TUESDAY; break; 
			case 4: today = Week.WEDNESDAY; break; 
			case 5: today = Week.THURSDAY; break; 
			case 6: today = Week.FRIDAY; break; 
			case 7: today = Week.SATURDAY; break; 
		}
		
		if(today == Week.SUNDAY) {
			System.out.println("일요일에는 축구를 합니다.");
		} else {
			System.out.println("열심히 자바를 공부합니다.");
		}
	}
}

// 출력 : 
// 열심히 자바를 공부합니다.

 

이렇게 배열에 대해 다시 공부해보았습니다.

 

한 번 더 하니까 좀 더 익숙해지는 것 같아요!!

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

 

728x90
반응형