13. Array

sumin·2023년 7월 17일
0

아카데미

목록 보기
13/82
post-thumbnail

1-dimensional Array

public class mainWrapper {
  /*
   * 배열
   * 1. 여러 변수를 하나의 이름으로 관리하는 자료 구조이다. 
   * 2. 배열에 저장된 모든 변수가 이름은 같지만, 인덱스가 다르다.
   * 3. 인덱스란 배열의 모든 변수를 구분하기 위한 위치 정보이다. 0부터 1씩 증가하는 값을 가진다.
   * 4. 기본 용어 
   *   1) 배열명    : 모든 변수의 대표 이름
   *   2) 인덱스    : 첨자, 모든 변수를 구분하는 숫자 
   *   3) 배열 요소 : 배열에 속한 각 변수를 의미  
   */
   
   /*
    * 배열의 선언 & 생성
    * 1. 배열의 선언 
    *   1) int[] 배열명  --추천
    *   2) int 배열명[]  --C 언어 기반의 언어에서 자주쓰임
    *  2. 배열의 생성
    *    배열명 = new int [생성할 변수의 갯수]    
    */
   
   /*
    * 배열요소 
    * 1. 배열에 저장된 각 변수를 의미한다. 
    * 2. 일반 변수와 다르게 자동으로 초기화된다.
    *      0, 0.0, false, null(없다라는 뜻을 가진 것들) 값으로 초기화 된다. 
    * 3. 배열 요소 호출방법
    *    배열명[인덱스]
    */
   
   public static void ex01() {
     
     //배열의 선언
     int[] a;
     
     //배열의 생성
     a = new int[5];
     
     // 배열 요소 확인
     System.out.println(a[0]);
     System.out.println(a[1]);
     System.out.println(a[2]);
     System.out.println(a[3]);
     System.out.println(a[4]);
     //System.out.println(a[5]); // 인덱스의 범위를 벗어난 배열요소 : 예외발생
         
   }
   
   public static void ex02() {
     
     //배열에 저장할 변수의 갯수를 앞으로 "배열의 길이"라고 표현한다. 
    int length = 5;
     
     //배열의 선언 & 생성
     int[] a = new int[length];
     
     //배열 요소를 하나씩 순차적으로 for 문으로 접근해보기 
     
     for(int i = 0; i < length; i++) {
       System.out.println(a[i]); //a[0], a[1]..을 순차적으로 호출
     }  
   } 
   
   public static void ex03() {
     
     //배열의 선언 및 생성
     int[] a = new int[5];
     
     //배열의 순회 
     // 배열의 길이는 "배열명.length"로 알아낼 수 있다. 
     for(int i = 0; i < a.length; i++) {
       System.out.println(a[i]);
     }    
   }
   
   /*
    * 배열의 초기화 
    * 1. 배열을 생성하면 자동으로 초기화된다. (0, 0.0, false, null)
    * 2. 중괄호({})를 이용해서 초기화 하고자 하는 값을 지정할 수 있다.
    * 3. 배열의 초기화는 최초배열을 선언할 때만 사용가능
    * 4. 형식
    *     int[] a = {10, 20, 30, 40};  
    */
   
   public static void ex04() {
     
     //배열의 초기화 
     int[] a = {10, 20, 30};
     
     for(int i = 0; i < 3; i++) {
       System.out.println( a[i] );
        }
     
   }
   /*
    * 배열의 구조 
    * 1. 배열의 타입은 참조타입(reference type)이다.
    * 2. 배열의 모든 요소는 순서대로 메모리의 연속된 공간을 할당받는다. 
    * 
    */
   
   public static void ex05() {
     int day =14;
     int nDay = 10;
     day += nDay; //14일로부터 10일 후 
     
     String[] weeknames = {"금", "토", "일", "월", "화", "수" };
     System.out.println(day + "일은 " + weeknames[day % 7] + "요일입니다.");
   }
   public static void ex06() {
     
     //배열의 서언 및 생성
     int[] a = new int[5];  //new 메모리 공간 확보하라는 것 
     
     //배열명 확인
     System.out.println(a);  //배열의 참조 값(주소 값) 확인 
   }
   
   public static void ex07() {
    
     //배열의 초기화 
     
     int[] a = {10, 20, 30};
     
     //배열의 선언
     
     int[] b;
     // 배열의 a의 참조 값을 배열b 로 전달하면 배열 a와 b 는 동일한 메모리 공간을 참조할 수 있다. 
     b = a;
     
     //배열 순회 
     for(int i = 0; 0 < b.length; i++) {
       System.out.println(b[i]);
     }
     
  }
   public static void ex08() {
     
    //배열이 생성되면 배열의 길이 변경은 불가능하다.
    // 하지만, 배열의 길이를 변경(대부분 길이를 늘리는 것)하려면??
    //새로운 배열을 만들어서 기존 배열의 데이터를 모두 옮긴다. 
     
     // 기존의 배열
     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 ); //배열 a의 인덱스 0부터 시작, 배열b의 인덱스 0으로 보내기 시작,a.length 만큼 복사 
     
     // 기존 배열 a의 참조 값을 새로운 배열의 b의 참조 값으로 변경
      a = b;
     //이제 더 이상 배열 a가 참조하던 0x10000000 영역을 참조하는 변수가 없다.   0x10000000  -> 0x20000000 으로 곧장 가시오 같아 지면서 원래에 100~아래에 있던 곳에 메모리 누수가 된다. 
     // 이런 영역을 c++ 같은 언어에서는 delete 명령으로 개발자가 직접 메모리를 해제해야하지만 자바는 스스로 메모리를 해제한다. (garbage collector가 담당 : System.gc())
      
      //배열 a 확인(단순 조회는 Java의 기능을 이용할 수 있다);
     System.out.println(Arrays.toString(a));     
   }

2-dimensional Array

public class MainWrapper {
  
  /*
   * 2차원 배열
   * 1. 1차원 배열이 2개 이상 모인 자료구조이다.
   * 2. 행과 열의 집합인 테이블 구조로 이해하면 쉽다. 
   * 3. 사용하는 인덱스가 2개이다.
   * 2차원 배열의 순회에는 2개의 for문이 필요하다. 
   */
  public static void ex01() {
    
   //2차원 배열의 선언
    int[][] a;
    
    // 2차원의 배열의 생성
    a = new int[3][2]; //테이블 구조로 이해 : 3행 2열
                       // 실제 구조로 이해 : 길이가 2인 1차원 배열이 3개
    
    // 테이블 형태로 2차원 배열 출력
    System.out.println(a[0][0] + " " + a[0][1]); //첫 번째 행( 첫 번째 1차원 배열 )
    System.out.println(a[1][0] + " " + a[1][1]); // 두 번째 행(두 번째 1차원 배열)
    System.out.println(a[2][0] + " " + a[2][1]); // 세 번째 행( 세 번째의 1차원 배열)
    
  }
  
  public static void ex02() {
    
   //2차원 배열의 선언 & 생성
    int[][] a = new int[3][2];
    
    // 각 요소를 4자리 고정 폭으로 출력
    System.out.print(String.format("%4d", a[0][0]));
    System.out.print(String.format("%4d", a[0][1]));
    System.out.println();
    System.out.print(String.format("%4d", a[1][0]));
    System.out.print(String.format("%4d", a[1][1]));
    System.out.println();
    System.out.print(String.format("%4d", a[2][0]));
    System.out.print(String.format("%4d", a[2][1]));
    System.out.println();
  }
  
  public static void ex03() {
    
    //2차원 배열 선언 & 생성
    int[][] a = new int[3][2];
    
    //인덱스 : 1
    // 1) i : 행 or 1차원 배열의 순서
    // 2) j : 열 or 각 1차원 배열의 길이 
    
    //2차원 배열과 2중 for 문
    for(int i = 0; i < 3; i++) {
      for(int j = 0; j < 2 ; j++) {
        System.out.print(String.format("%4d", a[i][j]));
      }
      System.out.println();
    }

  }
  
    /* 
     * 2차원 배열의 초기화 
     * 
     *  int[][] a = {
     *    {10, 20},
     *    {30, 40},
     *    {50, 60}
     *  };
     */
  public static void ex04() {
    int[][] a = {
        {10, 20},
        {30, 40},
        {50, 60}
    };
    
    //2중 for문
    for(int i = 0; i < 3 ; i++){
      for(int j = 0; j < 2; j++) {
        System.out.print(String.format("%4d" , a[i][j]));
      }
      System.out.println();
    }
    
  }
    
  /*
   * 2차원 배열의 구조 
   * 
   */public static void ex05() {
     
     // 2차원 배열의 초기화 
     
     int[][] a = {
         {10, 20},
         {30, 40},
         {50, 60}
     };
     
     // 2차원 배열의 2중 for문 최종 버전
     for(int i = 0; i < a.length; i++) {
       for(int j = 0; j < a[i].length; j++) {
         System.out.print(String.format("%4d", a[i][j]));
       }
       System.out.println();
     }
   }
  
   public static void ex06() {
     
     //모든 열의 갯수가 동일할 필요는 없다.
     
     //2차원 배열의 초기화 
     int [][] a = {
         {10},
         {20, 30},
         {40, 50, 60}
     };
     
     for(int i = 0; i < a.length; i++) {
       for(int j = 0; j < a[i].length; j++) {
         System.out.print(String.format("%4d", a[i][j]));
       }
       System.out.println();
     }  
   } 

advanced-for문

public class MainWapper {

  // 1차원 배열의 advanced- for 문
  
  public static void ex01() {
  
    //1차원 배열의 초기화 
    int[] a = {10, 20, 30};
    
    //advanced-for
    //for(배열요소를 저장 할 변수 : 배열 명)
    for(int number :a) { 
      System.out.println(number); //인덱스를 명시 안해도 된다. 
    }                             // 안되는 경우는 배열의 내용이 변할때이다. 

 }
    //advanced-for문을 사용하지 못하는 대표적인 경우 : 베열요소의 값이 변하는 경우 
  
  public static void ex02() {
    // 1차원 배열의 초기화 
    int[] a = {10, 20, 30};
    
    //모든 배열의 요소를 1씩 증가시키기 - 1 :advanced-for문 (불가능) 
    for(int number2 :a) {  //배열의 요소를 복사 해와서 사용하는 것이다. 배열의 주소값에 다시 넣어주어야 한다. 
      number2++;
    }
    
    // 모든 배열요소를 1씩 증가시키기 -2 : 일반 for 문 (가능)
    for (int i = 0; i < a.length; i++) {
      a[i]++;
    }
    // 배열 요소 확인
    System.out.println(Arrays.toString(a));
       
  }
  
  
  //2차원 배열의 advanced-for문
  public static void ex03() {
    int[][] a = {
        {10, 20},
        {30, 40},
        {50, 60}
    };
    
    // advanced-for문
    for(int[] b : a) {
      for(int number : b) {
        System.out.print(String.format("%4d", number));
      }
      System.out.println();
    }
  }
profile
백엔드 준비생의 막 블로그

0개의 댓글