본문 바로가기
study/JAVA

Java 기초 배열 Array

by stilinski 2022. 3. 29.
728x90

배열

변수: 하나의 값을 저장하기 위한 메모리 공간
배열: 서로 관련이 있고 데이터 타입이 같은 데이터의 집합

JVM메모리구조

  • stack & heap

new 해서 생성하면 heap영역에 생성됨.
그냥 변수에 값 넣으면 스택메모리 저장

배열형식

배열생성 - 메모리 생성(확보)

  • new 키워드를 이용해서 배열을 생성
  • 참조 데이터 타입을 가지고 메모리를 확보할 때 new라는 키워드를 사용
  • 각 요소(element)마다 인덱스가 0부터 주어짐.

초기값을 할당하면서 배열을 생성
이렇게 할 때는 배열의 크기를 지정할 수 없다.




배열과 반복문

데이터 유형별 초기값






2차원배열

행열 바꿔서 출력해보기
헷갈림


연습문제

//[데이터]
//홍길동 90 85 40 
//이영희 100 35 75
//
//[출력결과]
//홍길동  90  85  40 215 71.7
//이영희 100  35  75 210 70.0

public class Java045_array {

	public static void main(String[] args) {
		String[] name = { "홍길동", "이영희" };

		int[][] jumsu = { { 90, 85, 40 }, { 100, 35, 75 } };

		// 점수합계,평균
		int hap = 0;
	

		for (int row = 0; row < 2; row++) {
			hap = 0;
			System.out.printf("%s", name[row]);
			for (int col = 0; col < 3; col++) {
				System.out.printf("%4d", jumsu[row][col]);
				hap += jumsu[row][col];
				
			}
			System.out.printf("%4d", hap);
			System.out.printf("%5.1f", hap/3.0);
			System.out.println();

		}
	}

}

복잡하구마잉 꼭 복습하자




2.

package java0328_array;

//1   2   3   4   5
//6   7   8   9  10
//11  12  13  14  15
//16  17  18  19  20

//[출력결과]
//		   1   2   3   4   5
//		   10   9   8   7   6
//		   11  12  13  14  15
//		   20  19  18  17  16

public class Java048_array {

	public static void main(String[] args) {
		int[][] num = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 }, { 16, 17, 18, 19, 20 } };

		for (int i = 0; i < num.length; i++) {
			if (i % 2 == 1) {
				for (int j = num.length; j >= 0; j--)
					System.out.printf("%4d", num[i][j]);
			} else {
				for (int j = 0; num[i].length > j; j++)
					System.out.printf("%4d", num[i][j]);

			}
			System.out.println();
		}
	}

}


답:

더 간단한 방법.
num의 요소 안의 요소를 불러내는 번호만 바꾸기.

4.

//*   a   b   c   d
//a   *   b   c   d
//a   b   *   c   d
//a   b   c   *   d
//a   b   c   d   *

public class Java049_array {

	public static void main(String[] args) {

		char[][] alpa = new char[][] { { 'a', 'b', 'c', 'd' }, { 'a', 'b', 'c', 'd' }, { 'a', 'b', 'c', 'd' },
				{ 'a', 'b', 'c', 'd' } };

		for (int i = 0; i < alpa.length; i++) {
			for (int j = 0; j < alpa[i].length; j++) {
				if(i==j) {
					System.out.printf("%4c",'*');
				}
				System.out.printf("%4c", alpa[i][j]);
				
			}
			System.out.println();
			if(i==alpa.length-1) {
				for(int k=0; k <alpa[i].length; k++) {
					System.out.printf("%4c", alpa[i][k]);
					
				}
				System.out.printf("%4c",'*');
				
			}
		}
							  

	} // main

}// class

반복문에서 2번째 거 조건에 j라고 안 하고 실수로 i라고 해놓고 발견 못해서 몇십 분 날림.
러버덕한테 설명하다가 찾음ㅋㅋㅋㅋㅋㅋㅋ 러버덕 진짜 도움되네


이클립스랑 한 컷☆





자료구조

배열
연결리스트

가변배열(2차원 배열부터 사용 가능)

:가변배열을 생성할 때는 제일 마지막의 배열 크기는 지정하지 않다.
가변 배열을 제공하는 이유는 메모리 손실을 최소화하기 위해서 임.

가변배열에서 array.length의 진면모(?)를 볼 수 있다.





숙제

다른 건 다 풀었는데
이 문제

어렵네

/*
 * 4행 4열 data배열에 가로 세로 합계를 구하는 프로그램을 구현하시오.
 * [출력결과]
 *  1   2   3   6
 *  4   5   6  15
 *  7   8   9  24
 * 12  15  18  45
 */

public class Prob_02 {

	public static void main(String[] args) {
		int[][] data = new int[4][4];
		int cnt = 1;

		// 여기를 구현하시오.
		int hap = 0;
		int hap2 = 0;
		
		for (int i = 0; i < data.length; i++) {
			hap = 0;
			hap2 = 0;
			for (int j = 0; j < data[i].length; j++) {
				if (i != 3 && j != 3) {
					data[i][j] = cnt;
					hap += cnt;
					cnt++;
				} else if (j == 3) {
					data[i][j] = hap;

				} else if (i == 3) {
					hap2 += cnt;
					data[i][j] = hap2;
				}

				System.out.printf("%4d", data[i][j]);
			}
			System.out.println();

		}

	}// end main()

}// end class

풀다가 밥 먹으러 감.


package java0328_array.prob;
/*
 * 4행 4열 data배열에 가로 세로 합계를 구하는 프로그램을 구현하시오.
 * [출력결과]
 *  1   2   3   6
 *  4   5   6  15
 *  7   8   9  24
 * 12  15  18  45
 */

public class Prob_02 {

	public static void main(String[] args) {
		int[][] data = new int[4][4];
		int cnt = 1;

		// 여기를 구현하시오.
		
		//3x3값 넣어주기
		
		for(int i = 0;i < 3;i++) {
			for(int j = 0;j<3;j++) {
				data[i][j] = cnt++;
			}
		}
		
		//끝부분 계산값 넣어주기
		
		for(int i =0; i < data.length-1;i++) {
			for(int j=0;j<data[i].length-1;j++) {
				data[i][3]+=data[i][j];
				data[3][j]+=data[i][j];	
			}
			data[3][3]+=data[i][3];
		}
		
		
		//출력하기
		
		for(int i = 0;i < data.length;i++) {
			for(int j =0;j < data[i].length;j++) {
				System.out.printf("%4d",data[i][j]);
			}
			System.out.println();
		}

	}// end main()

}// end class

겁나 어렵네

아니 저렇게 할 생각을 누군가 해낸다고..?
이해하는데 한 시간 넘게 걸림.

		for(int i =0; i < data.length-1;i++) {
			for(int j=0;j<data[i].length-1;j++) {
				data[i][3]+=data[i][j];
				data[3][j]+=data[i][j];	
			}
			data[3][3]+=data[i][3];
		}

이 부분이 이해가 안 됐음.
근데 이제 알게 됨.
data[i][j]는 같은데 어떻게 data[i][3]이랑 data[3][j]다 더한 거의 결과는 값이 다르게 나오지?
했는데 자리가 달라서 쌓이는 숫자가 다름.

예를 들어 i = 0 ,j =0일때 같은 0행0열의 데이터인 1을 더하지만 data[i][3]은 0행3열에 저장하고 data[3][j] 3행0열에 저장함. 두번째로 i=0,j=1일때 값2를 data[i][3]은 똑같이 0행3열에 값을 더해서 1+2=3이되지만 data[3][j]은 새로운 메모리인 3행 1열에 저장함. 그러므로 그대로 2.

이런 식으로

그렇게 다르게 쌓이면서 값이 달라짐.
원하는 값을 얻을 수 있음.
이해는 됐지만 뭔가 찝찝.
알긴 알겠는데 다음에 이런 유형의 문제를 만났을 때 스스로 생각해내서 써먹을 수 있을지 모르겠다.

익숙해질 때까지 매일 써봐야겠다. ㅎㅎ 의지의 한국인

728x90

댓글