자바의정석5(배열)

min seung moon·2021년 3월 2일
0

자바의정석

목록 보기
5/8

배열

1. 배열이란?

  • 배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
  • 배열의 참조변수는 실제 값이 저장되는 것이 아닌 실제 값이 저장된 위치의 주소를 가진다
// 정수형 변수 score 1 ~ 5
int score1, score2, score3, score4, score5;

// 정수형 배열 참조변수 score
int[] score = new int[5];

2. 배열의 선언과 생성

  • 배열의 선언 : 배열을 다루기 위한 참조변수의 선언
선언방법			선언예
타입[] 변수이름;		int[] score;
타입 변수이름[];		int score[];
// 배열을 선언(배열을 다루기 위한 참조변수 선언)
타입[] 변수이름;
int[] score;
// 배열을 생성(실제 저장공간을 생성)
변수이름 = new 타입[길이]
score = new int[5];

3. 배열의 인덱스

  • 배열의 인덱스 : 각 요소에 자동으로 붙는 번호
  • 인덱스(index)의 범위는 0부터 배열길이-1까지
  • int[] score = new int[5];
    • score의 길이는 5이지만 인덱스는 0 ~ 4까지이다

4. 배열의 길이

  • 배열이름.length : 배열의 길이(int형 상수)
  • 배열은 한번 생성하면 그 길이를 바꿀 수 없다
    • 배열은 역속적인 값의 집합이기 때문에 각 배열의 크기는 정해져 있다
    • 배열 뒤에 메모리의 공간이 비어있는지 확신할 수 없기 때문에 크기 변동이 안된다
    • 만약에 더 큰 사이즈로 바꾸고 싶으면 새롭게 큰 공간에 기존 배열을 복사해주어야 한다
  • int[] arr = new int[5]; // 길이가 5인 int 배열
  • int tnp = arr.length; // arr.length의 값은 5이고 tmp에 5가 저장된다

5. 배열의 초기화

  • 배열의 각 요소에 처음으로 값을 저장하는 것
  • 자동초기화가 된다(int는 0으로 초기화 된다)
// 초기화 방법 1
int[] score = new int[5];
score[0] = 50;
score[1] = 60;
score[2] = 70;
score[3] = 80;
score[4] = 90;

// 초기화 방법 2
int[] score = { 50, 60, 70, 80, 90 };
// 방법 2는 나눠서 초기화할 수 없다
int[] score;
score = {50, 60, 70, 80, 90};
// 방법 2를 나눠서 초기화할 경우 방법3
int[] score;
score = new int[]{50, 60, 70, 80, 90};

6. 배열의 출력

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

// 배열을 가리키는 참조변수 iArr의 값을 출력한다
System.out.println(iArr); // [I@14318bb]와 같은 메모리의 주소가 출력된다
// 예외로 char 배열은 값이 출력이 된다
char[] chArr = { 'a', 'b', 'c', 'd' };
System.out.println(chArr); // abcd

// for문을 사용
for(int i = 0; i < iArr.length; i++) {
	System.out.println(iArr[i]);
}

// 배열 iArr의 모든 요소를 출력한다.[100, 95, 80, 70, 60]이 출력된다
System.out.println(Arrays.toString(iArr));// 문자열로서 출력 된다

7. 배열의 활용

// 1. 총합과 평균
int sum = 0;
float average = 0f;

int[] score = {100, 88, 100, 100, 90};

for(int i = 0; i < score.length; i++) {
	sum += score[i];
}
average = sum / (float)score.length;

System.out.println("총합 : " + sum);
System.out.println("평균 : " + average);
// 2. 최대값과 최소값
int[] score = {79, 88, 91, 32, 100, 55, 95};

int max = score[0], min = score[0];

for(int i = 1; i < score.length; i++) {
	if(score[i] > max){
    	max = score[i];
    } else if(score[i] < min){
    	min = score[i];
    }
}

System.out.println("최대값 : " + max);
System.out.println("최소값 : " + min);
// 3. 섞기(shuffle)
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++) {
	int n = (int)(Math.random() * 10); 
    int tmp = numArr[0];
    numArr[0] = numArr[n];
    numArr[n] = tmp;
}
System.out.println(Arrays.toString(numArr));

8. String배열의 선언과 생성

// 3개의 문자열을 담을 수 있는 배열을 생성
String[] name = new String[3];
name[0] = "Kim";
name[1] = "Moon";
name[2] = "Park";

9. 커맨드 라인을 통해 입력받기

// 이클립스에서 실행하게 되면 통상 방법으로는 args배열에 전달할 수 없다
public static void main(String[] args) {
	System.out.println("매개변수의 개수:"+args.length);
    for(int i = 0; i < args.length; i++) {
    	System.out.println("args["+i+"] = \""+args[i]+"\"");
    }
}
  • 이클립스에서 args에 값 전달 방법1

  • 이클립스에서 args에 값 전달 방법2

  • 예제 풀이


10. 2차원 배열

  • 테이블 형태의 데이터를 저장하기 위한 배열
// 4행 3열의 2차원 배열을 생성
int[][] score = new int[4][3];

- score[column index][row index]
score[0][0]	score[0][1]	score[0][2]
score[1][0]	score[1][1]	score[1][2]
score[2][0]	score[2][1]	score[2][2]
score[3][0]	score[3][1]	score[3][2]

11. 2차원 배열의 초기화

// 초기 초기화
int[][] arr = new int[][]{{1, 2, 3}, {4, 5, 6}};
// 간소화된 초기화
int[][] arr = {{1, 2, 3}, {4, 5, 6}};
// 주로사용되는 초기화, 간소화된 초기화랑 같으나 그저 가독성을 높여준 작성법
int[][] arr = {
		{1, 2, 3},
                {4, 5, 6}
              };

12. 2차원 배열 예제

// 1. 배열에 있는 모든 값의 합 구하기
int[][] score = {
	{ 100, 100, 100 },
    { 20, 20, 20 },
    { 30, 30, 30 },
    { 40, 40, 40 }
};
int sum = 0;

for(int i = 0; i < score.length; i++) {
	for(int j = 0; j < score[0].length; j++){
    	sum += score[i][j];
    }
}

System.out.println("sum = " + sum); // 570

13. String 클래스

  • String 클래스는 char[]와 메서드(기능)를 결합한 것
    • String클래스 = char[] + 메서드(기능)
  • String 클래스는 내용을 변경할 수 없다(read only)
    • String a = "a";
    • String b = "b";
    • a = a + b; // "a"가 "ab"가 되는 것이 아닌 "ab"라는 완전히 새로운 값이 만들어져 a 참조변수에 참조된다
메서드					설명
char charAt(int index)			문자열에서 해당 위치(index)에 있는 문자를 반환
int length()				문자열의 길이를 반환
String substring(int from, int to)	문자열에서 해당 범위(from ~ to)의 문자열을 반환(to는 포함 안됨)
boolean equals(Ojbect obj)		문자열의 내용이 같은지 확인한다,
					같으면 결과는 true, 다르면 false
char[] toCharArray()			문자열을 문자배열(char[])로 변환해서 반환

14. Arrays로 배열 다루니

  • 배열의 비교와 출력 : equals(), deepEquals(), toString(), deepToString()
int[] arr = {0, 1, 2, 3, 4};
int[][] arr2D = {{11,12}, {21,22}};

System,out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4]
// deepToString()은 2차원이상 다차원 배열일 때 사용
System,out.println(Arrays.deepToString(arr2D)); // [[11, 12],[21,22]]
String[][] str2D = new String[][]{{"aaa","bbb"},{"AAA","BBB"}};
String[][] str2D2 = new String[][]{{"aaa","bbb"},{"AAA","BBB"}};
System.out.println(Arrays.equals(str2D, str2D2); // false
// 다차원 배열은 deep을 붙여준다
System.out.println(Arrays.deepEquals(str2D, str2D2); // true
  • 배열의 복사 : copyOf(), copuOfRange()
int[] arr = {0, 1, 2, 3, 4};
int[] arr2 = Arrays.copyOf(arr, arr.length); // arr2 = [0, 1, 2, 3, 4]
int[] arr3 = Arrays.copyOf(arr, 3); // arr3 = [0, 1, 2]
int[] arr4 = Arrays.copyOf(arr, 7); // arr4 = [0, 1, 2, 3, 4, 0, 0]
int[] arr5 = Arrays.copyOfRange(arr, 2, 4); // arr5 = [2,3] <- 4는 불포함
int[] arr6 = Arrays.copyOfRange(arr, 0, 7); // arr6 = [0,1,2,3, 4, 0, 0]
  • 배열의 정렬 : sort()
int[] arr = { 3, 2, 0, 1, 4};
Arrays.sort(arr); // [0, 1, 2, 3, 4]
profile
아직까지는 코린이!

0개의 댓글