[230714] 배열/반복문 연습문제 (DAY 13) - 구디아카데미후기 IT국비지원 민경태 강사님

MJ·2023년 7월 14일

수업 TIL🐣💚

목록 보기
14/68

배열

깃헙링크

  1. 여러 변수를 하나의 이름으로 관리하는 자료구조
  2. 배열에 저장된 모든 변수는 이름은 같지만, 인덱스가 다름 (인덱스로 구분)
  3. 인덱스란 배열의 모든 변수를 구분하기 위한 위치 정보. 0부터 1씩 증가하는 값
  4. 기본 용어
    1) 배열명 : 모든 변수의 대표 이름
    2) 인덱스 : 첨자, 모든 변수를 구분하는 숫자
    3) 배열요소 : 배열에 속한 각 변수를 의미

선언 & 생성

  1. 배열 선언
    1) int[] 배열명 -- 추천
    2) int 배열명[] -- c계열에서 나온 것 자바에서도 함께 쓰임
  2. 배열 생성 (=변수의 갯수 결정하는 것)
    • 배열명 = new int[생성할 변수의 갯수]
		int a[] = new int[5];

배열요소

  1. 배열에 저장된 각 변수를 의미
  2. 일반 변수와 다르게 자동으로 초기화
    • 0(정수), 0.0(실수), false(boolean), null(참조) 값으로 초기화
  3. 배열 요소 호출방법
    • 배열명[인덱스]

배열의 초기화

  1. 배열은 생성하면 자동으로 초기화됨
    • 0(정수), 0.0(실수), false(boolean), null(참조) 값으로 타입에 맞게 초기화
  2. 중괄호{ }를 이용해서 초기화 하고자 하는 값을 지정할 수 있음
  3. 배열의 초기화는 배열을 선언할 때만 사용 가능
  4. 형식
    int[] a = {10, 20, 30};

배열의 길이

  • 배열명.length로 알아낼 수 있음

배열 구조

  1. 배열의 타입은 참조 타입(reference type)
  2. 배열의 모든 요소는 순서대로 메모리의 연속된 공간을 할당받음

배열 복사 (arraycopy)

  • 배열이 생성되면 배열의 길이 변경은 불가능
  • 길이를 변경(대부분 늘리는 것)하려면 새로 배열을 만들어서 기존 배열 데이터 가져오면 됨
    // 기존 배열
    int[] a = { 10, 20, 30 };

    // 신규 배열
    int[] b = new int[5];

    // 신규 배열 <- 기존 배열

    //    for (int i = 0; i < a.length; i++) {
    //      b[i] = a[i];
    //    }

    // 더 간단하게 처리하는 법
    System.arraycopy(a, 0, b, 0, a.length); 
    // (기존 배열, 기존배열 시작 인덱스, 목적지 배열, 목적지 배열의 시작 인덱스, 보낼 인덱스 갯수)
  • 팁) ctrl 키 + 함수(ex arraycopy) 누르면 system class 열리면서 어떤 식으로 만들어졌는지 볼 수 있음

  • 결과

	System.out.println("배열 a");
    System.out.println("참조값(주소값) = " + a);
    System.out.println(Arrays.toString(a));// 배열 a 확인
    System.out.println("배열 b");
    System.out.println("참조값(주소값) = " + b);
    System.out.println(Arrays.toString(b));// 배열 b 확인


@ = at, @ 뒤가 메모리 참조값(주소값)
Arrays.toString(배열명)- 배열 내용 조회

  • 여기까지는 구조적으로 변경 안됨. 기존 배열이 길어지는 게 아니라 걍 내용만 옮겨주는 거니까
  • 완전 해결법 = 기존 배열 a의 참조 값을 새로운 배열 b의 참조 값으로 변경하기
    a = b;

  • 이제 더 이상 배열 a가 참조하던 0x10000000 영역을 참조하는 변수가 없고 a라는 배열 자체가 변경됨
  • 0x10000000 영역(0x10000000, 0x10000004, 0x10000008) 참조하는 배열 사라짐 -> 메모리 누수 발생
  • 이런 영역을 c++같은 언어에서는 delete 명령으로 개발자가 직접 메모리를 해제해야 하지만 java는 스스로 메모리를 해제함, (garbage collector가 담당 : System.gc())

반복문 연습문제

public static void ex03() {
    // 전체 구구단 출력하기 - 1
    // 2 x 1 = 2
    // ...
    // 9 x 9 = 81

    for (int i = 2; i <= 9; i++) {
      for (int j = 1; j <= 9; j++) {
        System.out.println(i + " x " + j + " = " + i * j);
      }
    }
    
    // 고정 값을 바깥 LOOP에 배치 
    // ex 단을 2로 고정시키고 1~9 순회, 단을 3으로 고정시키고 1~9 조회
  }

  public static void ex04() {
    // 전체 구구단 출력하기 - 2
    // 2x1=2 3x1=3 4x1=4 ... 9x1=9
    // ...
    // 2x9=18 3x9=27 4x9=36 ... 9x9=81

    for (int i = 1; i <= 9; i++) {
      for (int j = 2; j <= 9; j++) {
        System.out.print(j + " x " + i + " = " + i * j + "\t");
      }
      System.out.println(" ");
    }
    
    // DAN * N 일 때, N 값이 고정값 => N이 바깥쪽 LOOP
  }
  • \t : 탭 간격에 맞춰서 띄어줌
  1. " "
  2. "\t"
  • String.format("%-4d", j * i)
  1. String.format("%4d", j * i)
  2. String.format("%-4d", j * i)
    • %d 자리수 없는 정수
    • %2d 두 자리 정수
    • %4d 네 자리 정수, 숫자를 뒤에 공백을 앞에
    • %-4d: 숫자를 앞에 공백을 뒤에
      (String.format은 자바api 배울때 자세히, string.format으로 형식을 string화)

  public static void ex06() {
    // 삼각별 출력하기 - 2 (2중 loop)
    //       star=12345
    // row=1      *****
    // row=2      ****
    // row=3      ***
    // row=4      **
    // row=5      *
    //
    // row=1, star=1~5
    // row=2, star=1~4
    // row=3, star=1~3
    // row=4, star=1~2
    // row=5, star=1~1
    for(int row=1; row <= 5; row++) {
      for(int star=1; star <= 6-row; star++) {
        System.out.print("*");
      } //6-row = star갯수와 row의 합이 항상 6인 것에서 찾아낸 관계
        //star갯수와 row의 합에서 row빼주면 해당 row의 star 갯수만 남음
      System.out.println();
    }
  }

역순출력은 매번 -- 이용해서 풀었었는데

    for (int i = 5; i > 0; i--) {
      for (int j = i; j > 0; j--) {
        System.out.print("*");
      }
      System.out.println();
    }

이렇게 풀지 말고 관계 파악해서 ++로 풀어야 좋음.


  public static void ex07() {
    // 삼각별 출력하기 - 3 (2중 loop)
    //       space/star=123456789
    // row=1                *
    // row=2               ***
    // row=3              *****
    // row=4             *******
    // row=5            *********
    //
    // row=1, space=1~4, star=5~5
    // row=2, space=1~3, star=4~6
    // row=3, space=1~2, star=3~7
    // row=4, space=1~1, star=2~8
    // row=5, space=1~0, star=1~9
    for(int row=1; row <= 5; row++) {
      for(int space=1; space <= 5-row; space++) {
        System.out.print(" ");
      } // 5-row : row+space갯수=5, space갯수=5-row
      for(int star=6-row; star <= row+4; star++) {
        System.out.print("*");
      } // 6-row : row+star 시작위치=6, star 시작 위치=6-row
        // 4+row : star 종료위치 - row=4, star 종료 위치=4+row 
      System.out.println();
    }
  }


🟢 구디아카데미후기 IT국비지원 민경태 강사님 수업 13일차! 🟢
오늘 수업 완전 유익했다!!!
int[] b = new int[5];
new를 통해서 메모리 영역을 할당받는다는 사실도 처음 알았다. (그냥 썼었는데,,)
수업 넘 좋다 ㅋㅋㅋ

0개의 댓글