JAVA 공부 (DAY 7) 배열

hmLee·2021년 11월 25일
0

자바 기초

목록 보기
6/6

배열 수업하는 날에 신나게 졸아서 수업 내용이 많이 날아갔다..
그래서 '이것이 자바다' 책을 참조하여 내용과 관련된 예제는 중간중간 넣으면서 포스팅을 하려한다.
책 내용 정리 같지만, 평소하던 포스팅보다 더 조리있는 것 같다.ㅎㅎ


배열이란?

  • 변수는 한개의 데이터를 저장할 수 있기 때문에 데이터가 많아지면 그 만큼 많은 변수가 필요하다.
  • 배열은 같은 타입의 데이터를 연속된 공간에 나열시키고, 각 데이터에 인덱스(index)를 부여해 놓은 자료구조 이다.
  • 배열의 각 인덱스는 각 항목의 데이터를 읽거나, 저장하는데 사용되며 배열이름 옆에 대괄호를 붙여 부른다
배열이름 [인덱스번호]

score[0];
socre[1];
  • 배열은 선언과 동시에 저장할 수 있는 데이터 타입이 결정되며 같은 타입의 데이터만 저장할 수 있다. (다른 타입을 저장하려하면 컴파일 오류 Type mismatch)
  • 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없다.

배열 선언

  • 배열을 사용하기 위해서는 []로 배열 변수를 선언해야 한다.
  • 배열 변수를 선언하는 방법은 2가지가 있다.
//배열 변수를 선언하는 방법1
//타입[] 변수;
int[] intArr;
double[] doubleArr;
String[] stringArr;

//배열 변수를 선언하는 방법2
//타입 변수[];
int intArr[];
double doubleArr[];
String stringArr[];
  • 배열 변수는 참조 변수이므로 stack영역에서 heap영역에 있는 배열 객체를 참조한다.
  • n 개의 문자열을 담을 수 있는 배열의 생성
String[] arr = new String[3]

값 목록으로 배열 생성

  • 배열 항목에 저장될 값의 목록이 있다면 간단하게 배열 객체를 만들 수 있다.
  • 대입연산자를 통해 값을 변경할 수 있다.
데이터타입[] 변수 = {0,1,2,3, ...};
String[] names = {"Kim", "Park", "Lee"};

names[1] = "Yu"; //names[1]인 "Park"를 "Yu"로 변경
  • 값 목록으로 배열 객체를 선언할 때는 배열 변수와 함께 선언하거나 new 연산자를 사용해야 한다.
//배열변수와 함께 선언하는 방법
int[] score = {87, 90, 45};

//new 연산자를 사용하는 방법
int[] score;
score = new int[] {87, 90, 45};

//배열변수를 이미 선언하고, 다른 실행문에서 중괄호를 사용하면 컴파일 에러
int[] score;
score = {87, 90, 45};

new 연산자로 배열 생성

  • 향후 값들을 저장할 배열을 미리 만들고 싶을 때 new 연산자를 사용해서 배열 객체를 생성한다.
//타입[] 변수 = new 타입[길이];
String[] stringArr = new String[5];
  • new 연산자로 배열을 생성할 경우 이미 배열 변수가 선언된 후에도 길이를 지정할 수 있다.
타입[] 변수 = null;
변수 = new 타입[길이];
  • 값을 초기화하지 않으면 초기값으로 초기화된다.
int[] scores = new int[30]; 
//scores[0] ~ scores[29] 까지 모두 기본값 0으로 초기화

String[] names = new String[30];
//names[0] ~ names[29] 까지 모두 기본값 null으로 초기화

public class Ex02_배열의_초기화 {

	public static void main(String[] args) {
		int[] score;
		//score = {50, 60, 70, 80 ,90}; //틀린 방법
		score = new int[] {50, 60, 70, 80 ,90}; //new int[] 생략 가능
		
		System.out.println(score); //[I@6504e3b2 (주소값)
		for (int i = 0; i < score.length ; i += 1) {
			System.out.print(score[i] + " ");
		} //50 60 70 80 90 
		System.out.println("");
		
		
		char[] chArr = new char[] {'a', 'b', 'c'};
		System.out.println(chArr); //abc
		for (int i = 0; i < chArr.length ; i += 1) {
			System.out.print(chArr[i] + " ");
		} //a b c 

	}

}

타입별 배열의 초기값

분류데이터 타입초기값
기본 타입(정수)byte[]
char[]
short[]
int[]
long[]
0
'\u0000'
0
0
0L
기본 타입(실수)float[]
double[]
0.0F
0.0
기본 타입(논리)boolean[]false
참조 타입클래스[]
인터페이스[]
null
null

배열 길이 (.length)

  • 배열의 길이란 배열에 저장할 수 있는 전체 항목 수를 말한다.
  • 배열의 길이를 얻으려면 배열객체의 length 필드(객체 내부의 데이터)를 읽으면 된다.
  • length필드는 읽기전용 필드이기 때문에 값을 바꿀 수 없다.
//배열변수.length;

int[] intArr = { 10, 20, 30 };

int num = intArr.length;
System.out.println(num); // 3
  • int, double, String 타입 배열 선언, 초기화하고 출력해보기
public class Ex01_배열기초 {

	public static void main(String[] args) {
		int[] arr = new int[10];
		double[] darr = new double[10];
		
		System.out.println(arr.length + ", " + darr.length);
     		// 10, 10
		
		//arr 을 전부 0으로 초기화
		for(int i = 0 ; i < arr.length ; i += 1) {
			arr[i] = 0;
            		darr[i] = 0;
			System.out.println(arr[i] + ", " + darr[i]);
		}
        	//0, 0.0 (10개 출력)
		
		String[] strs = {"Paris", "Seoul", "Tokyo", "Washington"};
		for (int i = 0; i < strs.length ; i += 1) {
			System.out.println("index " + i + " = " + strs[i]);
		}
                /*
                index 0 = Paris
                index 1 = Seoul
                index 2 = Tokyo
                index 3 = Washington
                */
	}

}
  • length필드와 toString 메소드를 이용하여 배열을 출력해보기
import java.util.Arrays;

public class Ex03_배열의_출력 {

	public static void main(String[] args) {
		int[] iArr1 = new int[10];
		int[] iArr2 = new int[10];
		//int[] iArr3 = new int[] {1, 2, 3, 4, 5, 6}; //초기화
		int[] iArr3 = {100, 95, 90, 85, 80};
		char[] chArr = {'a', 'b', 'c', 'd'};
		
		for (int i = 0 ; i < iArr1.length ; i += 1) {
			iArr1[i] = i + 1;
			System.out.print(iArr1[i] + " "); //1 2 3 4 5 6 7 8 9 10 
		}
		System.out.println("");
		
		for (int i = 0; i < iArr2.length ; i += 1) {
			iArr2[i] = (int)(Math.random()*10+1);
			System.out.print(iArr2[i] + " "); //10 2 5 4 8 5 7 3 10 4
		}
		//Arrays.toString(arrname); 객체를 문자열로 리턴하는 메소드
		System.out.println(Arrays.toString(iArr2)); //[1, 1, 9, 4, 5, 3, 3, 7, 1, 7]
		System.out.println(Arrays.toString(iArr3)); //[100, 95, 90, 85, 80]
		System.out.println(Arrays.toString(chArr)); //[a, b, c, d]
	}

}

배열 활용 예제

총합평균


public class Ex04_배열의활용_총합평균 {

	public static void main(String[] args) {
		int sum = 0;
		float average = 0f;
		int[] score = {100, 88, 100, 99 ,90};//초기화
		
		for (int i = 0; i < score.length ; i += 1) {
			sum += score[i];
			System.out.print(sum + " "); //100 188 288 387 477 
			average = (float)(sum/score.length);
		}
		System.out.println("sum = " + sum + ", average = " + average);
		//sum = 477, average = 95.0
	}

}

최댓값과 최솟값


public class Ex05_배열의활용_최댓값최솟값 {

	public static void main(String[] args) {
		int[] score = {79, 88, 91, 33, 100, 55, 95};
		
		int max, min;
		max = min = score[0];
		//System.out.println("max: " + max + ", min: " + min);
		//max: 79, min: 79
		
		for (int i = 0 ; i < score.length ; i += 1) {
			System.out.println(score[i]);
			if (score[i] > max) {
				//앞 배열과 비교 후 더 크면 max에 저장
				max = score[i];
			} else if (score[i] < min) {
				//앞 배열과 비교 후 더 작으면 min에 저장
				min = score[i];
			}
			System.out.println("max: " + max + ", min: " + min);
		}
		System.out.println("최종 max: " + max + ", min: " + min);
		//max: 100, min: 33

	}

}

섞기

import java.util.Arrays;

public class Ex06_배열의활용_섞기 {

	public static void main(String[] args) {
		int[] numArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
		System.out.println(Arrays.toString(numArr));
		
		for(int i = 0; i < 100 ; i += 1) {
			int n = (int)(Math.random()*10); //0~9까지의 랜덤 정수 생성
			System.out.println("n: " +n);
			int tmp = numArr[0];//백업
			System.out.println("tmp = numArr[0]: " + tmp);
			numArr[0] = numArr[n];
			System.out.println("numArr[0] = numArr[" + n + "]: " +numArr[0] );
			numArr[n] = tmp;
			System.out.println("numArr[" + n + "]  = tmp : " +numArr[n]);
			System.out.println("");
		}
		System.out.println(Arrays.toString(numArr));
	}

}

로또번호 생성


public class Ex07_배열의활용_로또번호생성 {

	public static void main(String[] args) {
		int[] ball = new int[45];
		for (int i = 0; i < ball.length ; i += 1) {
			ball[i] = i+1;
		}
		
		//0~5까지의 볼의 순서만 교체 (6개)
		for(int i = 0; i < 6 ; i += 1) {
			int j = (int)(Math.random()*45);
			int tmp = ball[i];
			ball[i] = ball[j];
			ball[j] = tmp;
		}
		
		for (int i = 0; i < 6 ; i += 1) {
			System.out.printf("ball[%d] = %d%n", i, ball[i]);
			//\n : os가 줄바꿈
			//%n : JVM이 줄바꿈
		}
	}

}

최댓값과 최솟값 예제는 처음엔 이해가 안 됐다.
새로운 값이 들어가면서 앞의 min과 max를 계속 갱신하니까
실제로 max인 100과 min인 33도 뒤로 오는 값들로 갱신되어
최종 max와 min값이 배열 마지막 쯤에 있는 숫자들로 남을 것이라 생각 되었다.
근데 아니더라!! 그래서 과정을 다 찍어봤는데,
앞의 값보다 크거나 작지 않은 중간 숫자들은 그냥 버려지는 거였다.
이제 조금 공부했다고 다 찍어볼 수도 있게 됐다.. 예전엔 어떻게 변수를 선언해야 프린트해서 볼 수 있는지도 몰랐으니까 성장했다고 볼 수 있겠지?

profile
정말 개발자가 될 수 있을까?

0개의 댓글