국비교육

국비지원 55일차 (JAVA - 배열)

재밌는개발러 2023. 10. 12. 18:53

※JAVA - 배열

1. 배열 (array) 
    1) 변수와 비슷하지만 같은 자료형 값 여러 개를 저장할 수 있다
    2) 자료형: Object
    3) 배열[] , 메서드(), 객체{}
    4) 방번호와 갯수는 다름.
    5) 길이: length

 

2. 배열 선언
  ->타입[] 변수명; ([] 중괄호는 타입에 붙던 변수명에 붙던 상관없음)
    1) 선언만 하고 빈방으로 만들기
        타입[] 변수명 = new 타입[방개수];
    2) 선언과 동시에 초기값도 저장하면서 만들기
        타입[] 변수명 = { 10, 20, 30 };

     * 중요: 변수는 값이 박스에 디렉트로 저장되지만
       배열은 어딘가에 있는 실제값의 주소값을 참조.
       sout으로 찍어보면 배열의 주소값이 나옴

 

3. for문

 1) 기존 for문
      for(초기식;조건식;증감식) {}

 2) 향상된 for문
      for문처럼 초기, 조건, 증감을 정의하지 않아도 callback 함수를 통해 기능을 수행할 수 있음.
      forEech 문은 배열(array)에서만 사용 가능.
      for(변수타입 변수명 : 배열이름) {}

 

 

※ 배열(빈방) 예제

int num_arr[] = new int[3];//방개수만 만들어놓은것
num_arr[0] = 10; //각인덱스 방에 값을 집어넣음.
num_arr[1] = 20;
num_arr[2] = 30;
System.out.println(num_arr); //이렇게 변수명을 적을시 주소값이 출력이되고 값은 각각 인덱스로출력해야됨.
System.out.println(Arrays.toString(num_arr)); // Arrays 클래스의 toString을 이용해서 한방에 찍을수는 있음.

// for문으로 한번에 배열 출력하기
for(int i=0; i<num_arr2.length; i++) {
    System.out.println(num_arr2[i]);
 } // 10 20 30 세로로 출력
 
for(int tmp : num_arr2) {
    System.out.println(tmp);
 } // 10 20 30 세로로 출력

 

※JAVA - 다차원배열

1. 배열 안의 각 방에 배열이 또 들어가 있는 것.

2. 배열 선언 방법
    1) 기본 배열

    타입[][] 변수명 = new 타입[방개수][방개수];
    ex) int [][] arr = new int [2][3];
    위에 처럼 하면 [방 1, 방 2, 방 3], [방 1, 방 2, 방 3]처럼 만들어진다.

    2) 가변 배열
    ex) int [][] arr = new int [2][];
    대신 이렇게 하면 작은방은 별도로 선언을 해야 된다.

 

 * 실제로 나중에배우게 되는 collection 파트에서 ArrayList를 많이 사용한다. 

 

※ 다차원배열 예제

// 가변배열 방식으로도 만들수 있다.// 대신 이렇게 하면 작은방은 별도로 선언 해야한다.
    int[][] arr = new int[2][]; //[[],[]] -> 작은방 선언안한거 (가변배열)
    arr[0] = new int[3]; //[[x,x,x], []]
    arr[1] = new int[2]; //[[x,x,x], [x,x]]

    System.out.println("arr: " + arr);
    System.out.println("arr: " + arr[0]); // 이것도 배열 덩어리라서 주소값으로 불러온다.
    System.out.println("arr: " + arr[1]);

    System.out.println(Arrays.toString(arr[0])); //[0,0,0]->값을넣은적이없으니 0으로나온다
    //이렇게 전체적으로 출력할수있다 
    //아래와같은 배열로 출력한거나 마찬가지다
    
//  System.out.println(arr[0][0]);
//  System.out.println(arr[0][1]);
//  System.out.println(arr[0][2]);

    System.out.println(Arrays.toString(arr[1])); //[0,0]->값을넣은적이없으니 0으로나온다

 // 각 방 길이
    System.out.println("길이: " + arr[0].length); // 길이:3
    System.out.println("길이: " + arr[1].length); // 길이:2
}

 

※JAVA - 배열복사

-> 배열의 복사는 '얕은 복사'와 '깊은 복사'가 있다.


1. 얕은 복사(Shallow Copy): 복사된 배열이나 원본 배열이 변경될 때 서로 간의 값이 같이 변경된다.
                                            (복사해도 값 바꾸면 다른 복사본도 바뀜)

 *얕은 복사는 그냥 배열을 참조해서 사용합니다.

 

※ 얕은복사 예제

int[] arr = {10,20,30};

int[] shallow_arr = arr; 

// 얕은복사시 arr 과 shallow_arr 를 출력해보면 주소값이 동일하게 나온다.
  System.out.println("arr: " + arr); //주소값 동일
  System.out.println("shallow_arr: " + shallow_arr); //주소값 동일
  System.out.println(Arrays.toString(arr)); //[10,20,30]
  System.out.println(Arrays.toString(shallow_arr)); //[10,20,30]
  System.out.println("[0]값 바꾸기 전: " + arr[0]); //10
  System.out.println("[0]값 바꾸기 전: " + shallow_arr[0]); //10

  arr[0] = 1000; //원본 arr에 10의값을 1000으로 바꿧다.
  System.out.println("[0]값 바꾼후: " + arr[0]); //1000
  System.out.println("[0]값 바꾼후: " + shallow_arr[0]); //1000


2. 깊은 복사(Deep Copy): 복사된 배열이나 원본 배열이 변경될 때 서로 간의 값이 같이 변경되지 않는다.
                                         (원본 값 바꿔도 상관없음)

 *깊은 복사는 new 인스턴스화 해서 사용한다.

 

 깊은복사 예제

int[] arr = {10,20,30};
int[] deep_arr = new int[arr.length];//깊은복사는 new해서 사용해야된다->방갯수만 선언함

// 별도의 배열로 만들었기 떄문에 arr과 deep_arr 의 주소는 다르다 (남남이다)
  System.out.println("arr: " + arr); //주소다름
  System.out.println("deep_arr: " + deep_arr); //주소다름

// 깊은복사임
//  deep_arr[0] = arr[0];
//  deep_arr[1] = arr[1];
//  deep_arr[2] = arr[2];

for (int i = 0; i<arr.length;i++){ // for문을 통해 deep_arr배열안에 arr배열값들을 대입해줌.
    deep_arr[i] = arr[i];
}
   System.out.println("arr[0]값 바꾸기 전: " + arr[0]); // 1000
   System.out.println("deep_arr[0]값 바꾸기 전: " + deep_arr[0]);//위에 for문으로 대입해줬기때문에1000

   arr[0]= 10;
   System.out.println("arr[0]값 바꾼후: " + arr[0]); // 10
   System.out.println("deep_arr[0]값 바꾼후: " + deep_arr[0]); //1000 -> new한인스턴스주소가 다르기때문에값이 같이 안바뀐다.

 

※JAVA - 배열메서드

-> 배열 사용 시 주로 사용하는 메서드 정리


        1. tostring() - 출력 전용 메서드(배열전용 아님) -> 주소값대신에 여기에 써놓은 값 나오는 것
            모든 자바 Object에 포함되어 있는 메서드(그래서 Arrary 여기도 있음)
            배열 자체를 System.out.println()으로 출력하면 데이터가 출력되지 않고 주소값(Object ID) 이 출력됨
            Arrays.tostring()를 이용해서 안에 들어있는 데이터를 모두 출력할 수 있다.

        2. sort() - 정렬
            배열원소(배열값)를 정렬한다. 원본 배열 자체가 원소들의 정렬된 순서로 변경됨

        3. copyOf(배열, 길이) - 깊은 복사
            배열을 복사해서 새로운 배열로 반환
            copyOfRange(배열, 시작방번호, 끝방-1)
            특정 범위만 반환

        4. asList()
            배열을 ArrayList로 반환해서 자바 컬렉션 API를 사용할 수 있다.
            반환되는 ArrayList는 크기가 고정된 타입으로 새롭게 값을 추가할 수 없다.

 

※ 배열메서드 예제(sort)

String[] car = {"santaFe", "Benz","audi","bmw"};

Arrays.sort(car); //sort - 원본 배열 자체가 원소들의 정렬된 순서로 변경됨 ,(내림차순,asc)
  System.out.println("변경후1 : "+Arrays.toString(car)); //-[audi, benz, bmw, santaFe]

Arrays.sort(car, Collections.reverseOrder()); // 역순으로 정렬 (한마디로:desc)
  System.out.println("변경후2 : "+Arrays.toString(car)); //-[santaFe, bmw, benz, audi]

//0 번째 부터 2번째까지만 정렬
String[] car2 = {"santaFe", "Benz","audi","bmw"};

Arrays.sort(car2, 0,3); // 0번째부터 2번방까지 정렬 - bmw안건드리고 앞에꺼만 정렬
  System.out.println("변경후3 : "+Arrays.toString(car2));//대문자 우선정렬
  //변경후3 : [Benz, audi, santaFe, bmw]

 

※ 배열메서드 예제(copyOf)

String[] car_copied = Arrays.copyOf(car2,car2.length); //깊은복사한거 주소값다름
  System.out.println("car_copied: " + Arrays.toString(car_copied));//[Benz, audi, santaFe, bmw]
car_copied[0]= "benz";
  System.out.println("car_copied: " + Arrays.toString(car_copied));//[benz, audi, santaFe, bmw]
  System.out.println("car2: " + Arrays.toString(car2));//[Benz, audi, santaFe, bmw]

 

※ 배열메서드 예제( copyOfRange)

//원하는 구간만 복사
String[] car_copied2 = Arrays.copyOfRange(car2, 0,2); //car2에 배열 0번쨰부터 2번째미만-> 0~1까지 배열출력

System.out.println("car_copied2: " + Arrays.toString(car_copied2) + " , " + car_copied2.length);
//car_copied2: [Benz, audi] , 2

//복사하면서 새롭게 방 추가 가능
String[] car_copied3 = Arrays.copyOfRange(car2,1,10);
//car2에 배열 1번쨰부터 10번째미만-> 1~9까지 배열출력,값이비어있으면 null로 출력됨

System.out.println("car_copied3: " + Arrays.toString(car_copied3) + " , " + car_copied3.length);
//car_copied3: [audi, santaFe, bmw, null, null, null, null, null, null] , 9

 

※ 배열메서드 예제(asList - ArrayList처럼 반환)

List<String> car_list = Arrays.asList(car_copied);
  System.out.println("car_List: " + car_list); car_List: [benz, audi, santaFe, bmw]
//기본적으로 list 에는 tostring메서드가 포함되있어서 위에처럼 출력해도 값이 출력된다.

// 여기부터는 Collection의 List 영역임, 나중에 할거임
List<String> list = new ArrayList<>(Arrays.asList(car_copied));

// 배열에 추가,삭제,싹다 삭제
list.add("kia"); //추가
  System.out.println("List: " + list); //List: [benz, audi, santaFe, bmw, kia]

list.remove(1);
  System.out.println("List: " + list); //List: [benz, santaFe, bmw, kia]

list.clear();
  System.out.println("List: " + list); //List: []