블록
public void method1() {
int a = 10;
int b = 20;
// 1. stack a와 b저장
{
String c = "자바";
// 2. c stack저장후 값은 힙에 주소100에 저장 (블록이 끝난 후 stack c삭제)
if(a==10) {
String f = new String("자바");
//3. stack저장후 값은 힙에 주소200에 저장 (블록이 끝난 후 stack f삭제)
}
}
//블럭을 벗어나서 2번과 3번값 스택에서 사라짐 대신 힙영역의 문자는 사라지지않음
String d = "자바";
// 4. stack저장후 값은 힙에 주소100에 참조
int e = 8;
// 5. stack에 저장
}
public void method2() {
int a = 5;
// 1. stack에 저장
if(a==3) {
int b = 10;
// 2. false이므로 저장 X
} else {
int[] c = new int[10];
// 3. stack에 저장되며 배열은 힙에 저장 주소값100 (if문이 끝나면 c가stack에서 사라짐)
// [0,0,0,0,0,0,0,0,0,0]
c[1] = 10;
// 4. 힙 메모리에 있던 값 c[1]에 저장
// [0,1,0,0,0,0,0,0,0,0]
}
String[] d = {"a","b","c"};
// 5. stack에 저장되며 배열값은 힙메모리에 저장
// 주소값 200 [주소값300,주소값400,주소값500] | 주소값300 a | 주소값400 b | 주소값500 c
if(a==5) {
int e = 100;
String f = d[0];
// 6. e f stack에 저장 f값은 주소값300을 참조 (if문이 끝나면 e와 f가 stack에서 사라짐)
}
String g = d[2];
// 7. stack에 저장하며 주소값 500을 참조
}
초기화
각 타입별 초기화 값
boolean | false |
char | ' ', '\u0000' |
byte, short, int, long | 0 |
float | 0.0f |
double | 0.0 |
참조타입(reference type) | null |
배열복사
얕은복사 (shallow copy)
복사된 배열이나 원본 배열이 변경될 때 서로간의 값의 길이 변경됨
public void method2() {
int[] source = {1,2,3,4,5};
int[] target = source;
System.out.println("변경 전");
for(int s : source) System.out.print(s+"\t");
System.out.println();
for(int t : target) System.out.print(t+"\t");
System.out.println();
target[2] = 10;
System.out.println("변경 후");
for(int s : source) System.out.print(s+"\t");
System.out.println();
for(int t : target) System.out.print(t+"\t");
System.out.println();
}
변경 전
1 2 3 4 5
1 2 3 4 5
변경 후
1 2 10 4 5
1 2 10 4 5
같은 주소값을 참조하고 있기 때문에 같이 값이 변경됨
깊은 복사
배열공간을 별도로 확보
1. 반복문
public void method2() {
int[] source = {1,2,3,4,5};
int[] des1 = new int[source.length];
for(int i=0; i<source.length; i++) {
des1[i] = source[i];
}
}
2.System.arraycopy()
System.arraycopy(복사할배열, 시작할 인덱스, 붙일 배열, 시작할 인덱스, 길이)
public void method2() {
int[] source = {1,2,3,4,5};
int[] des2 = new int[source.length];
System.arraycopy(source, 0, des2, 0, source.length);
}
3. clone
복사할배열.clone()
public void method2() {
int[] source = {1,2,3,4,5};
int[] des3 = source.clone();
}
같게 대입하면 결과는 모두 이와같이 나온다.
변경 전
1 2 3 4 5
1 2 3 4 5
변경 후
1 2 3 4 5
1 2 10 4 5
다른 주소값을 참조하므로 원본 값은 바뀌지 않는다
다차원배열
public void method3() {
int[][] arr = new int[3][3];
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;
arr[2][0] = 7;
arr[2][1] = 8;
arr[2][2] = 9;
//int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
for(int i=0; i<arr.length;i++) {
for(int j=0; j<arr[i].length; j++) {
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
1 2 3
4 5 6
7 8 9
public void method4() {
// 3명의 국영수 점수를 저장
// 각 학생의 이름을 a b c
int[][] scores = {{94,87,93},{78,85,99},{87,88,67}};
String a = "a";
String b = "b";
String c = "c";
String[] arr = {a,b,c};
String[] sub = {"국어", "영어", "수학"};
// a학생의 국어 점수를 출력하시오
System.out.println(a+"학생의 국어점수 : "+scores[0][0]);
System.out.println("=====================");
// c학생의 수학 점수를 출력하시오
System.out.println(c+"학생의 수학점수 : "+scores[2][2]);
System.out.println("=====================");
// 3명의 학생의 국어 평균
int sum = 0;
for(int i=0; i<scores[0].length; i++) {
sum+=scores[i][0];
}
System.out.println("국어 평균 : "+(double)sum/scores.length);
System.out.println("=====================");
// b학생의 평균 점수
sum = 0;
for(int i=0; i<scores.length; i++) {
sum+=scores[1][i];
}
System.out.println(b+"학생의 평균 점수 : "+(double)sum/3);
System.out.println("=====================");
// 전체 출력
int sum1 = 0;
int sum2 = 0;
int sum3 = 0;
for(int i=0; i<scores.length; i++) {
sum=0;
System.out.println(arr[i]+"학생의 성적");
for(int j=0; j<scores[i].length;j++) {
System.out.println(sub[j]+" : "+scores[i][j]);
sum+=scores[i][j];
}
sum1+=scores[i][0];
sum2+=scores[i][1];
sum3+=scores[i][2];
System.out.println("전과목 평균 : "+(double)sum/3);
System.out.println("---------------------");
}
System.out.println(sub[0]+" 평균 : "+(double)sum1/scores.length);
System.out.println(sub[1]+" 평균 : "+(double)sum2/scores.length);
System.out.println(sub[2]+" 평균 : "+(double)sum3/scores.length);
}
배열마다 크기가 다르게 넣을 수도 있다.
public void method6() {
//1차원 배열 건너 뛰기
int[][] arr = new int[3][];
int[] stu1 = new int[4];
int[] stu2 = new int[5];
int[] stu3 = new int[4];
arr[0] = stu1;
arr[1] = stu2;
arr[2] = stu3;
System.out.println(Arrays.deepToString(arr));
}
[[0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0]]
실습
문제 1)
public void method7() {
int[][] arr1 = new int[5][5];
// 1,2,3,4,5
// 6,7,8,9,10
// 11,12,13,14,15
// 16,17,18,19,20
// 21,22,23,24,25
int a=1;
for(int i=0; i<arr1.length; i++) {
for(int j=0; j<arr1[i].length; j++) {
arr1[i][j]=a;
//arr1[i][j]= i*5 +j+1;
a++;
}
}
for(int i=0; i<arr1.length; i++) {
for(int j=0; j<arr1[i].length; j++) {
System.out.print(arr1[i][j]+"\t");
}
System.out.println();
}
}
문제 2)
public void method8() {
int[][] arr2 = new int[5][5];
// 1,6,11,16,21
// 2,7,12,17,22
// 3,8,13,18,23
// 4,9,14,19,24
// 5,10,15,20,25
int a=1;
for(int i=0; i<arr2.length; i++) {
for(int j=0; j<arr2[i].length; j++) {
arr2[j][i]=a;
a++;
}
}
for(int i=0; i<arr2.length; i++) {
for(int j=0; j<arr2[i].length; j++) {
System.out.print(arr2[i][j]+"\t");
}
System.out.println();
}
}
문제 3)
public void method9() {
int[][] arr3 = new int[5][5];
// 1,2,3,4,5
// 10,9,8,7,6
// 11,12,13,14,15
// 20,19,18,17,16
// 21,22,23,24,25
for(int i=0; i<arr3.length; i++) {
for(int j=0; j<arr3[i].length; j++) {
if(i%2==0) {
arr3[i][j]=i*5+1+j;
} else {
arr3[i][j]=5*i+5-j;
//arr3[i][4-j]=5*i+j+1;
}
}
}
for(int i=0; i<arr3.length; i++) {
for(int j=0; j<arr3[i].length; j++) {
System.out.print(arr3[i][j]+"\t");
}
System.out.println();
}
}
문제 4)
public void method10() {
int[][] arr3 = new int[5][5];
// 1,10,11,20,21
// 2,9,12,19,22
// 3,8,13,18,23
// 4,7,14,17,24
// 5,6,15,16,25
for(int i=0; i<arr3.length; i++) {
for(int j=0; j<arr3[i].length; j++) {
if(i%2==0) {
arr3[j][i]=i*5+1+j;
} else {
arr3[j][i]=5*i+5-j;
}
}
}
// for(int i=0; i<arr3.length; i++) {
// for(int j=0; j<arr3[i].length; j++) {
// if(j%2==0) {
// arr3[i][j]=j*5+1+i;
// } else {
// arr3[i][j]=5*(j+1)-i;
// }
// }
// }
for(int i=0; i<arr3.length; i++) {
for(int j=0; j<arr3[i].length; j++) {
System.out.print(arr3[i][j]+"\t");
}
System.out.println();
}
}
'JAVA > JAVA BASIC' 카테고리의 다른 글
3/20 Homework 카드게임 (0) | 2024.03.20 |
---|---|
[JAVA] 클래스, 함수 (0) | 2024.03.18 |
[JAVA] 참조타입 - 배열 (0) | 2024.03.13 |
[JAVA] 반복문 while 등 (0) | 2024.03.12 |
[JAVA] 반복문 - for문 (0) | 2024.03.11 |