자바의 정석 <기초편> 📌chapter5. 배열

모깅·2023년 1월 30일
0

📖 01. 배열이란?

  • 배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
    -> 선언해야 할 변수가 많아지면 배열 사용하자.
    -> 배열의 요소는 연속적이다.

📖 02. 배열의 선언과 생성

  • 배열의 생성

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

    -> 배열을 선언한다고 해서 값을 저장할 공간이 생성되는 것이 아니라 배열을 다루는데 필요한 변수가 생성된다.


📖 03. 배열의 인덱스

  • 생성된 배열의 각 저장공간을 '배열의 요소(element)' 라고 하며, '배열이름[인덱스]'의 형식으로 요소에 접근
    -> 인덱스(index)는 배열의 요소마다 붙여진 일련번호

    "인덱스(index)의 범위는 0부터 '배열길이-1'까지."

📖 04. 배열의 길이(배열이름.length)

  • int[] arr = new int[5] // 길이가 5인 int배열
    int tmp = arr.length; // arr.length의 값은 5이고 tmp에 5가 저장된다.

  • 배열은 한번 생성하면 길이를 변경 할 수 없다. (프로그램 도중)

  1. 왜 ?
    -> 연속적인 메모리가 존재 하지 않을 수 있기 때문이다.
  2. 부족하다면?
    -> 더 큰 메모리를 가져와서 원래 존재 하던 데이터를 복사한 후 다음 인덱스부터 넣어준다.
  • ArrayIndexOutOfBoundsException : 배열의 index가 유효한 범위를 벗어났다는 에러.

📖 05. 배열의 초기화

  • 배열은 생성과 동시에 자동적으로 기본값(0)으로 초기화된다.
    원하는 값을 넣기 위해선
    int[] score = new int [5];
    score[0] = 50;
    score[1] = 60;
    score[2] = 70;
    score[3] = 80;
    score[4] = 90;
    -> 혹은 for문 사용
    for(int i = 0; i < score.length; i++)
    score[i] = i * 10 + 50;

  • 복잡해!!
    -> int[] score = new int[] { 50, 60, 70, 80, 90 };
    -> int[] score = { 50, 60, 70, 80, 90 }; // new int[] 생략 가능.

  • 선언과 생성을 따로 할 수는 없다!!
    int[] score;
    score = { 50, 60, 70, 80, 90 }; // 에러 new int[] 생략 불가
    score = new int[] { 50, 60, 70, 80, 90 }; // ok


📖 06. 배열의 출력 && 07. 배열의 출력 예제

  • 예제와 함께 배열의 출력을 설명해보자.

<예제 5-1 >

✍️ 입력

import java.util.Arrays;  // Arrays.toString()을 사용하기 위해 추가

class Ex5_1 {
	public static void main(String[] args) {
		int[] iArr1 = new int[10];
		int[] iArr2 = new int[10];
//		int[] iArr3 = new int[]{100, 95, 80, 70, 60};
		int[] iArr3 = {100, 95, 80, 70, 60};
		char[] chArr = {'a', 'b', 'c', 'd'};

		for (int i=0; i < iArr1.length ; i++ ) {
			iArr1[i] = i + 1; // 1~10의 숫자를 순서대로 배열에 넣는다.
		}

		for (int i=0; i < iArr2.length ; i++ ) {
			iArr2[i] = (int)(Math.random()*10) + 1; // 1~10의 값을 배열에 저장
		}

		// 배열에 저장된 값들을 출력한다.
		for(int i=0; i < iArr1.length;i++) {
			System.out.print(iArr1[i]+",");	
		}
		System.out.println();

		System.out.println(Arrays.toString(iArr2));
		System.out.println(Arrays.toString(iArr3));
		System.out.println(Arrays.toString(chArr));
		System.out.println(iArr3);
		System.out.println(chArr);
	}
}

💻 출력
1,2,3,4,5,6,7,8,9,10,
[2, 3, 8, 2, 4, 3, 4, 9, 8, 5]
[100, 95, 80, 70, 60]
[a, b, c, d]
[I@15db9742
abcd

  • Arrays.toString()
    -> [ 배열요소1, 배열요소2, ... ] 의 문자열로 반환한다.
    -> 배열의 요소 파악하기 좋음
  • 배열 변수 자체를 출력할 경우 ( [I@15db9742 )
    -> 배열 + int형 + 주소 형태
  • 문자형 배열은 제외
    ->System.out.println(chArr) => abcd 로 나옴

📖 08. 배열의 활용(1) - 총합과 평균

<예제 5-2 >

✍️ 입력

class Ex5_2 {
	public static void main(String[] args) {
		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 ; // 계산결과를 float로 얻기 위해서 형변환

		System.out.println("총점 : " + sum);
		System.out.println("평균 : " + average);
	}
}

💻 출력
총점 : 478
평균 : 95.6

정확한 평균을 위해 float형태로 형변환 해서 계산하자.


📖 09. 배열의 활용(2) - 최대값과 최소값

<예제 5-3 >

✍️ 입력

class Ex5_3 { 
	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]; 
			} else if(score[i] < min) { 
				min = score[i]; 
			} 
		} // end of for 

		System.out.println("최대값 :" + max);       
		System.out.println("최소값 :" + min);       
	} // end of main 
} // end of class

💻 출력
최대값 :100
최소값 :33


📖 10. 배열의 활용(3) - 섞기(shuffle)

<예제 5-4 >

✍️ 입력

import java.util.Arrays;

class Ex5_4 {
	public static void main(String[] args) {
		int[] numArr = {0,1,2,3,4,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);  // 0~9 중의 한 값을 임의로 얻는다.
			int tmp = numArr[0];
			numArr[0] = numArr[n];
			numArr[n] = tmp;
		}
		System.out.println(Arrays.toString(numArr));
	} // main의 끝
}

💻 출력
[0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9]
[8, 1, 4, 2, 5, 0, 4, 3, 7, 6, 9]


📖 11. 배열의 활용(4) - 로또 번호 만들기

<예제 5-5 >

✍️ 입력

class Ex5_5 { 
	public static void main(String[] args) { 
		int[] ball = new int[45];  // 45개의 정수값을 저장하기 위한 배열 생성.      

		// 배열의 각 요소에 1~45의 값을 저장한다. 
		for(int i=0; i < ball.length; i++)       
			ball[i] = i+1;    // ball[0]에 1이 저장된다.

		int tmp = 0;   // 두 값을 바꾸는데 사용할 임시변수 
		int j = 0;     // 임의의 값을 얻어서 저장할 변수 

		// 배열의 i번째 요소와 임의의 요소에 저장된 값을 서로 바꿔서 값을 섞는다. 
		// 0번째 부터 5번째 요소까지 모두 6개만 바꾼다.
		for(int i=0; i < 6; i++) {       
			j = (int)(Math.random() * 45); // 0~44범위의 임의의 값을 얻는다. 
			tmp     = ball[i]; 
			ball[i] = ball[j]; 
			ball[j] = tmp; 
		} 

		// 배열 ball의 앞에서 부터 6개의 요소를 출력한다.
		for(int i=0; i < 6; i++) 
			System.out.printf("ball[%d]=%d%n", i, ball[i]); 
	} 
}

💻 출력
ball[0]=25
ball[1]=4
ball[2]=29
ball[3]=34
ball[4]=6
ball[5]=1

-> 6개만 출력하면 되므로 앞에 6개의 인덱스만 바꾸면 된다.


📖 12. String배열의 선언과 생성

  • String[] name = new String[3]; 과 같이 문자열 배열 생성

  • String타입의 참조변수를 저장하기 위한 공간이 마련되고 참조형 변수의 기본값은 null이므로 각 요소의 값은 null로 초기화 된다.

    자료형기본값
    booleanfalse
    char'\u0000'
    byte, short, int0
    float0L
    double0.0f
    참조형null

📖 13. String배열의 초기화

<예제 5-6 >

✍️ 입력

class Ex5_6 {
	public static void main(String[] args) {
		String[] names = {"Kim", "Park", "Yi"};

		for(int i=0; i < names.length;i++)
			System.out.println("names["+i+"]:"+names[i]);

		String tmp = names[2]; // 배열 names의 세 번째요소를 tmp에 저장
		System.out.println("tmp:"+tmp);
		names[0] = "Yu"; // 배열 names의 첫 번째 요소를 "Yu"로 변경

		for(int i=0; i < names.length;i++)
			System.out.println(names[i]);
	} // main
}

💻 출력
names[0]:Kim
names[1]:Park
names[2]:Yi
tmp:Yi
Yu
Park
Yi


📖 14. String클래스

  • String클래스는 char배열에 기능(메서드)을 추가한 것이다.
  • 객체지향 이전에는 기능과 데이터를 따로 나눴다.
    그러나 객체지향 언어는 데이터와 그에 관련된 기능을 하나의 클래스에 묶어서 다룰 수 있게 한다. 즉, 서로 관련된 것들끼리 데이터와 기능을 구분하지 않고 함께 묶는 것이다.
  • char배열과 String클래스의 중요한 차이!
    -> String객체(문자열)는 읽을 수만 있을 뿐 내용을 변경할 수 없다.
        String str = "Java";
        str = str +  "8";
        System.out.println(str);
    -> str이 변경되는 것 같지만, 문자열은 변경할 수 없으므로 새로운 내용의 문자열이 생성된다.

📖 15. String클래스의 주요 메서드

메서드설명
char charAt(int index)문자열에서 해당 위치(index)에 있는 문자를 반환한다.
int length()문자열의 길이를 반환한다.
String substring(int from, int to)문자열에서 해당 범위(from~to)의 문자열을 반환한다.(to는 포함 X)
boolean equals(Object obj)문자열의 내용이 같은지 확인한다. 같으면 결과는 true, 다르면 false
char[] toCharArray()문자열을 문자배열(char[])로 변환해서 반환한다.
  • String str = "ABCDE";
    char ch = str.charAt(3); // 문자열 str의 4번째 문자 'D'를 ch에 저장.

  • String str = "012345"
    String tmp = str.substring(1,4); // str에서 index범위 1~4의 문자들을 반환
    System.out.println(tmp); // "123"이 출력된다.

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

  1. 이클립스 알고싶은 경로 화면에서 alt + Enter
  2. 경로로 가서 이전 경로(bin폴더가 존재하는 곳)로 간다.
  3. bin폴더로 들어가서 경로 복사한다.
  4. cmd에서 cd + spaceBar + 복사한 경로 + dir(현재 파일 보이기)
  5. java + 실행파일(Ex5_7) + 매개변수

추가 ) src로 가서 type + java 파일 이름치면 해당 프로그램 내용나옴!
-> 공백마다 하나의 매개변수로 적용되기 때문에 공백을 포함하고 싶다면 ""을 사용하자.

<예제 5-7 >

✍️ 입력

class Ex5_7 {
	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] + "\"");
		}
	}
}

💻 출력
(생략)


📖 17. 이클립스에서 커맨드라인 매개변수 입력하기

  1. 이클립스 메뉴 Run > Run Configurations... 클릭
  2. 이 화면에서 Arguments탭을 클릭하고, 'Program arguments:'에 아래와 같이 입력한다.
  3. 'Run'버튼을 눌러서 예제5-7을 실행한다.

📖 18. 2차원 배열의 선언

선언 방법선언 예
타입[][] 변수이름;int[][] score;
타입 변수이름[][];int score[][];
타입[] 변수이름[];int[] score[];
  • int[][] score = new int[4][3]; // 4행 3열의 2차원 배열을 생성한다.

📖 19. 2차원 배열의 인덱스 && 20. 2차원 배열의 초기화

  • 초기화
  • 메모리 형태

    -> score의 배열의 개수는 5개
    -> score[i] 배열의 개수는 각 각 3개씩
    -> 2차원 배열은 1차원 배열을 요소로 하는 1차원 배열이다.

📖 21. 2차원 배열의 초기화 예제 1

<예제 5-8 >

✍️ 입력

class Ex5_8 {
	public static void main(String[] args) {
		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[i].length; j++) {
				System.out.printf("score[%d][%d]=%d%n", i, j, score[i][j]);

				sum += score[i][j];
			}
		}

		System.out.println("sum=" + sum);
	}
}

💻 출력
score[0][0]=100
score[0][1]=100
score[0][2]=100
score[1][0]=20
score[1][1]=20
score[1][2]=20
score[2][0]=30
score[2][1]=30
score[2][2]=30
score[3][0]=40
score[3][1]=40
score[3][2]=40
sum=570

  • 2차원 배열의 for문으로 모두 돌리는 법 기억하자!
    -> score.length : 행의 길이
    -> score[i].length : 열의 길이

📖 22. 2차원 배열의 초기화 예제 2

<예제 5-9 >

✍️ 입력

class Ex5_9 {
	public static void main(String[] args) {
		 int[][] score = {
							  { 100, 100, 100}
							, { 20, 20, 20}
							, { 30, 30, 30}
							, { 40, 40, 40}
							, { 50, 50, 50}
						};
		// 과목별 총점
		int korTotal = 0, engTotal = 0, mathTotal = 0;

	    System.out.println("번호  국어  영어  수학  총점  평균 ");
	    System.out.println(".=============================");

		for(int i=0;i < score.length;i++) {
			int  sum = 0;      // 개인별 총점
			float avg = 0.0f;  // 개인별 평균

			korTotal  += score[i][0];
			engTotal  += score[i][1];
			mathTotal += score[i][2];
			System.out.printf("%3d", i+1);

			for(int j=0;j < score[i].length;j++) {
				sum += score[i][j]; 
				System.out.printf("%5d", score[i][j]);
			}

			avg = sum/(float)score[i].length;  // 평균계산
			System.out.printf("%5d %5.1f%n", sum, avg);
		}

		System.out.println(".=============================");
     	System.out.printf("총점:%3d %4d %4d%n", korTotal, engTotal, mathTotal);
	}
}

💻 출력
번호 국어 영어 수학 총점 평균
.=============================
1 100 100 100 300 100.0
2 20 20 20 60 20.0
3 30 30 30 90 30.0
4 40 40 40 120 40.0
5 50 50 50 150 50.0
.=============================
총점:240 240 240


📖 23. 2차원 배열의 초기화 예제 3

<예제 5-10 >

✍️ 입력

import java.util.Scanner;

class Ex5_10{
	public static void main(String[] args) {
		String[][] words = {
			{"chair","의자"},      	// words[0][0], words[0][1]
			{"computer","컴퓨터"}, 	// words[1][0], words[1][1]
			{"integer","정수"}     	// words[2][0], words[2][1]
		};

		Scanner scanner = new Scanner(System.in);

		for(int i=0;i<words.length;i++) {
			System.out.printf("Q%d. %s의 뜻은?", i+1, words[i][0]);

			String tmp = scanner.nextLine();

			if(tmp.equals(words[i][1])) {
				System.out.printf("정답입니다.%n%n");
			} else {
			   System.out.printf("틀렸습니다. 정답은 %s입니다.%n%n",words[i][1]);
			}
		} // for
	} // main의 끝
}

💻 출력
Q1. chair의 뜻은?의자
정답입니다.

Q2. computer의 뜻은?ㅇㄹㅇ
틀렸습니다. 정답은 컴퓨터입니다.

Q3. integer의 뜻은?정수
정답입니다.


📖 24. Arrays로 배열 다루기

  • 배열의 비교와 출력 - equals(), toString()
  1. toString() : 배열의 요소를 문자열로 반환
  2. deepToString() : 2차원 배열 이상부터 사용.
  3. equals() : 두 배열에 저장된 모든 요소를 비교해서 같으면 true.
  4. deepEquals() : 2차원 배열 이상부터 사용.
  • 배열의 복사 - copyOf(), copyOfRange()
  1. copyOf(배열 , int b) : 원하는 배열의 개수만큼 복사해서 반환.
  2. copyOfRange(배열, from, to) : 배열의 원하는 인덱스 번호부터 번호 전까지 복사해서 반환.
  • 배열의 정렬 - sort()
  1. sort() : 내림차순으로 정렬

-> Arrays 클래스에 들어있는 메서드 이므로 사용 할 때 Arrays. 붙히기
ex) Arrays.sort();





[출처] 자바의 정석 <기초편> (남궁 성 지음)

profile
멈추지 않기

0개의 댓글