Language/Java
[JAVA] Stack_heap, 배열 복사, 2차원 배열_01
생각하는 감쟈🥔
2024. 3. 15. 09:42
배열 변수 선언
-참조할 배열 객체 없는 경우 변수는 null 값으로 초기화
타입[ ] 변수 = null;
배열 생성
- 값 목록으로 배열 생성
타입 [] 변수 = {값0, 값1, 값2, 값3, ...};
-new 연산자를 이용해서 배열 생성
int[] num = new int[값0];
public void method1() {
int a = 10;
int b = 20;
//1.
{
String c = "자바";
//2.
if (a==10) {
String f = new String("자바");
//3
}
}
String d = "자바";
//4.
int e = 8;
//5.
}
stack | heap |
1. int a = 10; int b = 20; 2. String c = 주소값 100 3. String f = 주소값 200 //String d 시작전에 블럭에서 나와서 stack영역에 String c,f 는 없어짐 heap에서는 존재함 4. String d = 주소값 100 5. int e = 8 |
2. 주소값 100 [ 자바] 3. 주소값 200 [ 자바] |
public void method2() {
int a = 5;
//1
if(a==3) {
int b = 10;
//2
}else {
int[] c = new int[10];
//3
c[1] = 10;
//4
}
String[] d = { "a","b","c"};
//5
if(a==5) {
int e = 100;
String f = d[0];
//6
}
String g = d[2];
}
stack | heap |
1. int a = 5; 3.int[ ] c = 4. int[ ] c = 주소값 100 5. String [ ] d = 주소값 200 6. int e = 100 String [ ] f = 주소값 300 7. String [ ] g = 주소값 500 |
3.수소값 100 [ ] int 10개 저장공간 (40byte) [0,0,0,0,...] 4. [0,10,0,0,0,0,] 5. 수소값 200 String 3개 저장공간 [ 주소값 300 , 주소값 400 , 주소값 500 ] //5 .string 이여서 각자 또 객체가 생김 5-1. 주소값 300 a 주소값 400 b 주소값 500 c |
2. 번은 조건이 맞지 않아서 stack에 들어가지 않음
public void method1() {
// 각 타입별 초기화 값.
// boolean : false
// char : ' ', '\u0000'
// byte, short. int, long = 0
// float : 0.0f
// double : 0.0
// 참조 타입 (reference type) : null
char c = '\u0000';
System.out.println(c);
}
배열 복사
1. 깊은 복사
2. 얕은 복사
public void method2() {
// 배열 복사
// 깊은 복사. 얇은 복사
// 얕은 복사(shallow copy)
// 복사된 배열이나 원본 배열이 변경될때 서로 간의 값이 길이 변경됨.
int[] source = {1,2,3,4,5};
int[] target = source;
// target source의 주소값은 같기 때문에 target에서 값을 바꾸면 같이 바뀜
//얕은 복사 (주소값을 복사)
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();
// 깊은 복사은 heap영역에 같은 배열은 하나 더 만든다
// 1. 반목문 사용
// 2. system.arratcopy()
// 3. clone
int [ ] des1 = new int [source.length];
for (int i=0; i<source.length; i++) {
des1[i] = source[i];
}
System.out.println("변경전");
for (int s : source) System.out.print(s+"\t");
System.out.println();
for (int t : des1) 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 : des1) System.out.print(t+"\t");
System.out.println();
int[] des2 = new int[source.length];
System.arraycopy(source, 0, des2, 0, source.length);
//원하는 만큼 배열 가능
System.out.println("변경전");
for (int s : source) System.out.print(s+"\t");
System.out.println();
for (int t : des2) 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 : des2) System.out.print(t+"\t");
System.out.println();
int[] des3 = source.clone();
//원하는 만큼 배열 가능
System.out.println("변경전");
for (int s : source) System.out.print(s+"\t");
System.out.println();
for (int t : des2) 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 : des2) System.out.print(t+"\t");
System.out.println();
2차원 배열
public void method3() {
//2차원 배열
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;
// 1차원 배열이 몇개인지
for(int i=0; i<arr.length; i++) {
// 1차원 안에 길이가 얼마나 있는지
for (int j=0; j<arr[i].length; j++) {
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
public void method4() {
// 3명의 국영수 정수를 저장
// 각 학생의 이름은 a b c
int[][] scores = { {72,90,85},
{75,88,92},
{87,98,76} };
// a 학생의 극어 점수를 출력하시오
int a_kor = scores[0][0];
System.out.println(a_kor);
// c 학생의 수학 점수를 출력하시오
int c_math = scores[2][2];
System.out.println(c_math);
// 3 학생의 국어 평균
double kor_avg = 0;
for(int i=0; i<scores.length; i++) {
kor_avg = scores[i][0];
}
kor_avg/=3;
System.out.println(kor_avg);
// b 학생의 평균 점수
double b_avg = 0;
for(int i=0; i<scores[1].length; i++) {
b_avg = scores[1][i];
}
b_avg/=3;
System.out.println(b_avg);
// 전체 출력
for(int i=0; i<scores.length; i++) {
for(int j=0; j<scores[i].length; j++) {
System.out.println(scores[i][j]+"\t");
}
System.out.println();
}