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; |
- 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(); }
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(""); }
} |
'기록 > 자바_국비' 카테고리의 다른 글
[배운 내용 정리] 1113 자바 국비교육 (0) | 2020.11.14 |
---|---|
[배운 내용 정리] 1112 자바 국비교육 (0) | 2020.11.14 |
[배운 내용 정리] 1110 자바 국비교육 (0) | 2020.11.10 |
[배운 내용 정리] 1109 자바 국비교육 (0) | 2020.11.10 |
[배운 내용 정리] 1106 자바 국비교육 (0) | 2020.11.06 |