본문 바로가기

기록/자바_국비

[배운 내용 정리] 1111 자바 국비교육

728x90

2020년 11월 11일 9시 ~ 15시 30분 zoom으로 수업 진행


 

배열

 같은 자료형의 변수를 하나의 묶음으로 다루는 것

 배열은 저장된 값마다 인덱스 번호가 0부터 시작한다.

 

배열의 선언과 할당

 - 배열 선언

   자료형[] 배열명;                   자료형 배열명[];

   ex) String[] args;                   int num[];

 

 - 배열 할당

   자료형[] 배열명 = new 자료형[배열크기];

   자료형 배열명[] = new 자료형[배열크기];

   ex) int[] nums = new int[3];

 

배열의 저장 구조

 배열은 참조변수로 heap 영역에 할당되며, 배열 공간의 주소를 저장한다,

 배열 공간의 주소를 이용해 인덱스를 참조하는 방식으로 값을 처리한다

 int[] arr = new int[4];

 

배열의 초기화

 - 인덱스를 이용한 초기화

arr[0] = 1;
arr[1] = 2; 

 - for 문을 이용한 초기화

 for(int i=0; i< arr.length; ++i) {

   arr[i] = i;

 }

배열의 길이를 가져오려면 length를 이용하면 된다

 

 - 선언과 동시에 초기화

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

int[] arr = new int[] {1,2,3,4};

String[] fruit = {“사과”, “포도”};

 

 

package com.test01;

 

public class Main {

           public static void main(String[] args) {

                     ArrayTest01 arrTest = new ArrayTest01();

                     arrTest.test1();

                    

           }

 

}

package com.test01;

 

import java.util.Scanner;

 

public class ArrayTest01 {

 

           public void test1() {

                     /*

                     int num1 = 10;

                     int num2 = 10;

                     int num3 = 10;

                     int num4 = 10;

                     int num5 = 10;

                    

                     int sum = 0;

                    

                     sum += num1;

                     sum += num2;

                     sum += num3;

                     sum += num4;

                     sum += num5;

                     */

                    

                     //배열 생성

                     int[] arr = new int[5];

                    

                     /*

                     arr[0] = 10;

                     arr[1] = 20;

                     arr[3] = 30;

                     arr[4] = 40;

                     arr[5] = 50;

                     */

                    

                     for(int i=0; i<arr.length; ++i) {

                                arr[i] = i*10;

                                System.out.println(arr[i]);

                               

                     }

                    

           }

 

           public void test2() {

                     //배열의 선언

                     //자료형[] 변수명;

                     //자료형 변수명[];

//                  

//                   int[] arr;

//                   char carr[];

                    

                     //new 연산자는 heap 영역에 공간을 할당하고

                     //주소값을 반환하는 연산자

                    

                     //배열을 할당 할 때는 배열의 크기를 지정해주어야한다

                     /*

                     arr = new int[5];

                     carr = new char[10];

                     */

                    

                     //배열의 선언과 할당을 동시에!

                     int[] iarr = new int[5];

                     char carr[] = new char[10];

                    

                     System.out.println("iarr = " + iarr);

                     System.out.println("carr = " + carr);

                    

                     System.out.println("iarr의 hashcode : " + iarr.hashCode());

                     System.out.println("carr의 hashcode : " + carr.hashCode());

                    

                     System.out.println("iarr의 길이 : " + iarr.length);

                     System.out.println("carr의 길이 : " + carr.length);

                    

                     //스캐너를 통해 입력받은 정수로 배열 생성

                     Scanner sc = new Scanner(System.in);

                     System.out.print("정수 하나 입력 : ");

                     int size = sc.nextInt();

                     double dArr[] = new double[size];

                    

                     System.out.println("dArr의 hashcode : " + dArr.hashCode());

                     System.out.println("dArr의 길이 : " + dArr.length);

                    

                     //배열은 변경할 수 없다, 사이즈를 변경한게 아니라 새로 배열을 만들어 주소값을 덮어씌운것

                     dArr = new double[30];

                     System.out.println("수정 후 dArr의 hashcode : " + dArr.hashCode());

                     System.out.println("수정 후 dArr의 길이 : " + dArr.length);

                    

                     //배열을 비우고싶다면?

                     dArr = null;

                     //일정시간 지나면 알아서 사라진다. -> 힙 영역에서 old 영역으로 이동하고

                     //가비지 컬렉터(GC)가 old 영역에 존재하는 친구를 삭제시킨다

                     //System.out.println(dArr.length); -> NullPointerException 에러 뜬다

                     //dArr이 가리키는 주소가 없기떄문!

                    

                     //eden에서 생성되고 old 에서 삭제된다.

                    

           }

 

           public void test3() {

                     //heap영역에는 빈 공간이 존재할 수 없어서 기본적으로 초기화 할때 JVM이

                     //각 타입별로 지정된 값으로 배열을 초기화 시켜버린다

                    

                     int[] iarr = new int[5];

                    

                     for(int i=0; i<iarr.length; ++i) {

                                System.out.println("iarr[" + i + "]의 값 : " + iarr[i]);

                     }

                    

                     int[] iarr2 = new int[] {11, 22, 33, 44, 55};

                     int[] iarr3 = {11, 22, 33, 44, 55, 0};

                    

                     for(int i=0; i<iarr2.length; ++i) {

                                System.out.println("iarr2[" + i + "]의 값 : " + iarr2[i]);

                     }

                    

                     for(int i=0; i<iarr3.length; ++i) {

                                System.out.println("iarr3[" + i + "]의 값 : " + iarr3[i]);

                     }

                     System.out.println("iarr3.length : " + iarr3.length);

                    

           }

}

 

HashCode()

 해당 주소와 연결 되어있는 키 값을 반환하는 함수

 자바에서는 배열의 정확한 주소를 알 수 없지만 주소와 연결된 키는 알 수 있다.

 이 키를 통해 데이터에 연결된 주소 값을 찾아가므로 주소 값이라고 생각하면 편하다

 

length 와 length()

 length는 배열의 길이를 알고자 할 때 사용된다.

 length()는 문자열의 길이를 알고자 할 때 사용된다.

 

package com.test01;

 

public class ArrayTest02 {

 

           public static void main(String[] args) {

                     ///////////

                     String[] sArr = {"apple", "banana", "orange"};

                    

                     for(int i=0; i<sArr.length; ++i) {

                                System.out.println(sArr[i]);

                     }

                     //////////

                    

                     //배열에 데이터 입력

                     char[] ch = new char[26];

                     for(int i=0; i<ch.length; ++i) {

                                ch[i] = (char)('a' + i);

                     }

                    

                     for(int i=0; i<ch.length; ++i) {

                                System.out.print(ch[i] + " ");

                     }

                     System.out.println("----");

                     System.out.println("----");

                     //1. a~z 일차원 배열 출력

                     prn(ch);

                     System.out.println("----");

                     //2. ch를 거꾸로 출력

                     reverse(ch);

                     System.out.println("----");

                     //3. ch를 대문자로 바꾸어서 출력

                     upper(ch);

                     System.out.println("----");

           }

          

           public static void prn(char[] ch) {

                     //a b c d e f

                     //g h i j k l

                     //m n o p q r

                     //s t u v w x

                     //y z

                    

                     for(int i=0; i<ch.length; ++i) {

                                System.out.print(ch[i] + " ");

                                if(i%6 == 5) {

                                           System.out.println("");

                                }

                     }

                     System.out.println("");

           }

          

           public static void reverse(char[] ch) {

                     //2. ch를 거꾸로 출력

                     for(int i=ch.length-1; i>=0; --i) {

                                System.out.print(ch[i] + " ");

                     }

                     System.out.println("\n");

                     for(int i=ch.length-1; i>=0; --i) {

                                System.out.print(ch[i] + " ");

                                if(  i%6 == 0) {

                                           System.out.println("");

                                }

                     }

                     System.out.println("\n");

                     int cnt=1;

                     for(int i=ch.length-1; i>=0; --i, cnt++) {

                                System.out.print(ch[i] + " ");

                                if(cnt % 6 == 0) {

                                           System.out.println("");

                                }

                     }

                     System.out.println("");

                    

                     //배열을 하나 더 생성해서 역순으로 데이터 넘겨주기

                     int tmp=0;

                    

                     char re[] = new char[26];

                     for(int i=ch.length-1; i>=0; --i, tmp++) {

                                re[tmp] = ch[i];

                     }

                    

           }

          

           public static void upper(char[] ch) {

                     for(int i=0; i<ch.length; ++i) {

                                System.out.print(Character.toUpperCase(ch[i]) + " ");

                     }

                     System.out.println("\n");

                    

                     for(int i=0; i<ch.length; ++i) {

                                System.out.print(Character.toUpperCase(ch[i]) + " ");

                                if(i!=0 && (i+1)%6 == 0) {

                                           System.out.println("");

                                }

                     }

                     System.out.println("\n");

                     int cnt=1;

                     for(int i=0; i<ch.length; ++i, cnt++) {

                                System.out.print(Character.toUpperCase(ch[i]) + " ");

                                if(cnt % 6 == 0) {

                                           System.out.println("");

                                }         

                     }

                     System.out.println("");

                    

                     for(int i=0; i<ch.length; ++i) {

                                ch[i] = (char)((int)ch[i]-32);

                     }

                    

                     for(int i=0; i<ch.length; ++i) {

                                System.out.println(ch[i] + " " );

                     }

           }

}

 

 

 

package com.test01;

 

public class ArrayTest03 {

 

           public static void main(String[] args) {

                  //test1();  
                  test2();

           }

          

           public static void test1() {

                     int num1 = 4, num2 = 5;

                    

                     System.out.println("num1 = " + num1 + " num2 = " + num2);

                    

                     num1 = num2;

                     num2 = num1;

                    

                     System.out.println("num1 = " + num1 + " num2 = " + num2);

 

                     int tmp = 0, arr[] = new int[2];

                    

                     arr[0] = 1;

                     arr[1] = 2;

                    

                     tmp = arr[0];

                     arr[0] = arr[1];

                     arr[1] = tmp;

                    

           }

          

           public static void test2() {

                     //정렬

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

                     for(int k = 0; k<arr.length; ++k) {

                                System.out.print(arr[k] + " ");

                     }

                     System.out.println("\n정렬해요!~");

                     for(int i=0; i<arr.length; ++i) {

                                //i인덱스가 증가 할 때마다 처음부터 해당하는 인덱스까지 비교하는 방법

                                for(int j=0; j<i; ++j) {

                                           if(arr[i] < arr[j]) {

                                                     System.out.println("교환발생");

                                                     int tmp;

                                                     tmp = arr[i];

                                                     arr[i] = arr[j];

                                                     arr[j] = tmp;

                                           }

                                          

                                }

                     }

                     System.out.println("정렬 완료!~");

                     for(int k = 0; k<arr.length; ++k) {

                                System.out.print(arr[k] + " ");

                     }

                    

           }

}

 

 

package com.test01;

 

public class ArrayTest04 {

 

           public static void main(String[] args) {

                     ArrayTest04 arrTest = new ArrayTest04();

                     System.out.println("얕은 복사");

                     arrTest.shallowCopy();

                     System.out.println("------------------");

                     System.out.println("깊은 복사");

                     arrTest.deppCopy1();

                     System.out.println("------------------");

                     System.out.println("arraycopy 복사");

                     arrTest.deppCopy2();

                     System.out.println("------------------");

                     System.out.println("clone 복사");

                     arrTest.deppCopy3();

           }

          

           public void shallowCopy() {

                     //얕은 복사는 주소만 복사

                     int[] originArr = {1, 2, 3, 4, 5};

                     int[] copyArr = originArr;

                    

                     //원본 배열 출력

                     for(int i=0; i<originArr.length; ++i) {

                                System.out.print(originArr[i]+" ");

                     }

                     System.out.println("");

                     //복사한 배열 출력

                     for(int i=0; i<copyArr.length; ++i) {

                                System.out.print(copyArr[i]+" ");

                     }         

                    

                     System.out.println("");

                    

                     //원본배열 값 변경

                     originArr[0] = 99;

                     //복사 배열 값 변경

                     copyArr[2] = 22;

                    

                     //원본 배열 출력

                     for(int i=0; i<originArr.length; ++i) {

                                System.out.print(originArr[i]+" ");

                     }

                     System.out.println("");

                     //복사한 배열 출력

                     for(int i=0; i<copyArr.length; ++i) {

                                System.out.print(copyArr[i]+" ");

                     }                              

                     System.out.println("");

 

                     //주소 값 확인 -> 둘이 같은 주소가 나온당

                     System.out.println("originArr의 hashCode : "+ originArr.hashCode());

                     System.out.println("copyArr의 hashCode : "+ copyArr.hashCode());               

           }

          

           public void deppCopy1() {

                     //깊은 복사

                     int[] originArr = {1, 2, 3, 4, 5};

                     int[] copyArr = new int[5];

                    

                     //for문을 이용해 값 복사

                     for(int i=0; i<originArr.length; ++i) {

                                copyArr[i] = originArr[i];

                     }

                    

                     //원본 배열 출력

                     for(int i=0; i<originArr.length; ++i) {

                                System.out.print(originArr[i]+" ");

                     }

                     System.out.println("");

                     //복사한 배열 출력

                     for(int i=0; i<copyArr.length; ++i) {

                                System.out.print(copyArr[i]+" ");

                     }                              

                     System.out.println("");

                    

                     //원본배열 값 변경

                     originArr[0] = 99;

                     //복사 배열 값 변경

                     copyArr[2] = 22;

                    

                     //원본 배열 출력

                     for(int i=0; i<originArr.length; ++i) {

                                System.out.print(originArr[i]+" ");

                     }

                     System.out.println("");

                     //복사한 배열 출력

                     for(int i=0; i<copyArr.length; ++i) {

                                System.out.print(copyArr[i]+" ");

                     }                              

                     System.out.println("");

 

                     //주소 값 확인 -> 둘이 같은 주소가 나온당

                     System.out.println("originArr의 hashCode : "+ originArr.hashCode());

                     System.out.println("copyArr의 hashCode : "+ copyArr.hashCode());                                    

           }

          

           public void deppCopy2() {

                     //arraycopy()

                     int[] originArr = {1, 2, 3, 4, 5};

                     int[] copyArr = new int[10];

                    

                     //arraycopy(Object src, int srcPos, Object dest, int destPos, length)

                     //src : 원본 배열, srcPos : 복사 시작 위치

                     //dest : 복사 배열, destPos : 붙여넣기 시작 위치

                     //length : 복사될 길이

                    

                     System.arraycopy(originArr, 0, copyArr, 0, originArr.length);

                    

                     //원본 배열 출력

                     for(int i=0; i<originArr.length; ++i) {

                                System.out.print(originArr[i]+" ");

                     }

                     System.out.println("");

                     //복사한 배열 출력

                     for(int i=0; i<copyArr.length; ++i) {

                                System.out.print(copyArr[i]+" ");

                     }                              

                     System.out.println("");

           }

          

           public void deppCopy3() {

                     //clone()

                     int[] originArr = {1, 2, 3, 4, 5};

                     int[] copyArr = new int[10];

                    

                     copyArr = originArr.clone();

                    

                     //원본 배열 출력

                     for(int i=0; i<originArr.length; ++i) {

                                System.out.print(originArr[i]+" ");

                     }

                     System.out.println("");

                     //복사한 배열 출력

                     for(int i=0; i<copyArr.length; ++i) {

                                System.out.print(copyArr[i]+" ");

                     }                              

                     System.out.println("");

           }

          

 

}