자바의 정석 Chapter5

채예찬·2023년 1월 14일
0

자바의정석

목록 보기
5/5
post-thumbnail

배열

1. 배열이란?

  • 배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것!!

조금 더 상세한 설명
-->변수는 저장하는 공간이 떨어져 있을 수 있지만 배열같은 경우에는 저장공간이 같이 붙어있다. 변수는 선언하는 순간 저장공간이 만들어지지만 배열은 선언하는 순간 저장공간이 만들어 진다기 보다는 배열을 다루기 위한 참조변수가 만들어지는 것이다.

  • 타입[] 변수이름; --> 배열 선언(배열을 다루기 위한 참조변수 선언)

  • 변수이름 = new 타입[길이]; --> 배열 생성(실제 저장공간을 생성)

  • 배열의 인덱스 - 각 요소에 자동으로 붙는 번호

  • Ex1
    int[] score;
    score = new int[5];
    int [] score = new int[5]
    => int tmp = arr.length; (배열의 길이는 int type이다! 즉 한번 생성하면 배열의 길이는 바꿀 수 없다)

-> 배열의 길이를 바꿀 수 없는 이유는 배열이 선언되고 크게하려고 할 경우 배열의 경우 연속적으로 주소값을 줘야 하는데 뒤에 있는 메모리주소에 이미 다른 값이 할당되어있을
경우가 있기 때문이다. 그래서 늘릴경우 기존배열을 복사하고 늘리려는 부분의 공간이 있는 곳을 찾아서 늘려주어야 한다.

  • Ex2
    int[] scroe = new int[5];
    for (int i=0; i< score.length; i++)
    --> 보통 배열을 돌릴 때 숫자로 쓰기 보다는 score.length라고 쓴다. 이유는 만약 배열의 길이를 변경했을 시 숫자로 입력 할 경우 실수 할 수 있기 때문이다.
    --> 인덱스 범위를 벗어날 수 있기 때문에!!

2. 배열의 초기화

  • 배열의 각 요소에 처음으로 값을 저장하는 것
  1. int [] score = new int[]{ 50, 60, 70, 80, 90 };
  2. int [] score = { 50, 60, 70, 80, 90 };
    -> 1번의 방식이 정석이지만 거의 2번방식으로 사용한다.

--> 하지만 선언과 초기화를 나눠야 할 경우에는 1번의 방식을 사용해야 한다.
int[] score;
score = new int[]{ 50, 60, 70, 80, 90 };

3. 배열의 출력

  • int[] iArr = { 100, 95, 80, 70, 60 };
    System.out.println(iArr); // [I@1234bb]와 같은 형식의 문자열이 출력된다.

--> 이유는 배열의 주소가 나오기 때문이다. 하지만 char type의 경우는 예외적으로 출력이 된다.
char[] chArr = { 'a', 'b', 'c', 'd' };
System.out.println(chArr); --> abcd가 출력된다.

  • 배열을 출력하는 2가지 방법
  1. for문 사용
    --> for(int i=0; i < iArr.length; i++) {
    System.out.println(iArr[i]);
    }

  2. Arrays.toString 사용
    --> System.out.println(Arrays.toString(iArr));

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));
	} 

* 로또 구하는 예제

	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]); 
	} 

5. 2차원배열

  • 테이블 형태의 데이터를 저장하기 위한 배열

int[][] score = new int[4][3]; --> 4행 3열의 2차원 배열을 생성한다. (기본적으로 0값이 대입된다)

  • 2차원 배열 초기화 방식
1. int[][] arr = new int[][] { {1,2,3}, {4,5,6} };
2. int[][] arr = { {1,2,3}, {4,5,6} };

3. int[][] arr = {
					{1,2,3},
					{4,5,6}
				 };

--> 3번이 직관적으로 보기가 좋으므로 3번의 방식으로 초기화하는 습관을 기르자 !!

* 과목 평균,총점구하기

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);
	}

6. String클래스

  • String클래스는 char[]와 메서드(기능)를 결합한 것
  • String클래스 = char[] + 메서드(기능)
  • String클래스는 내용을 변경할 수 없다.(문자열을 결합할 때 기존의 문자열이 바뀌는 게 아니라 새로운 문자열이 만들어 져서 새로운 주소에 저장이 되는 것이다)

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”이 출력

7. Arrays로 배열 다루기

  • 문자열의 비교와 출력 - equals(), toString()

int[] arr = {0,1,2,3,4};
int[][] arr2D = {{11,12}, {21,22}};

System.out.println(Arrays.toString(arr)); --> [0,1,2,3,4]
System.out.println(Arrays.deepToString(arr2D); --> [[11.12].[21.22]]

배열을 같은 지 비교하기 위해서는 각각의 요소들을 하나하나 전부 비교를 해봐야 한다.

* 단어 맞추기

	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]);
			}
		}
	}

8. 추가(args)

  • 매개변수로 받기


Chapter5 review

배열파트는 정말 중요해서 뭔가 말로 설명하기 부족했다. 강의에서 나오는 내용들은 정말 기초내용이라서 다시 한번 배열의 개념을 잡는데 도움이 되었다. 최근 List와 Array를 사용할 일이 정말 많은데 Array는 주소값들이 연속적으로 저장되기 떄문에 pointer의 개념으로 값들의 위치를 찾아가는 데 편리한 것 같았다. 또한 List, Array, Map이 내 생각에는 진짜 3대장인것 같아서 계속 이 3가지의 방식들이 코딩을 할 때 익숙해 질 수 있도록 연습해야 겠다.

profile
쿰척쿰척 개발기록

0개의 댓글