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();
		}