본문 바로가기
👨‍💻 2. 웹개발_Back end/2-1 Java

[JAVA] 05-2 다차원 배열

by 달님🌙 2021. 7. 30.
반응형
2차원 배열

 

int var = 5;
int[][] arrs = new int [3][4];
/* 참조타입(주소값이 저장) : 클래스, 배열
 * -> ||||||||||||||||
 * 배열의 이름은 그 배열의 시작조소값이다.
   arrs[0]--->|		|	|	|
   arrs[1]--->|		|	|	|
   arrs[2]--->|		|	|	|	

  {arrs[0], arrs[1], arrs[2] }
 */

 

출처 : 쿨프로그래밍 (daum.net)

 

쿨프로그래밍 (daum.net)

 

10. 2차원 배열

  출처 http://coolprogramming.springnote.com   저작자 NetGong  배열은 같은 자료형의 연속메모리라고 했습니다. 기억하시죠?! 그리고 앞에서 배운 배열은 모두 1차원 배열이라고 합니다. []연산자 하나

blog.daum.net

 

 

배열 속의 배열

 

public static void main(String[] args) {
	int[][] mathScores = new int[2][3];
	for(int i=0;i< mathScores.length; i++) { //행의 개수
		for(int k=0; k< mathScores[i].length; k++) { //열의 개수
			System.out.printf("mathScores[%d][%d] = %d\n", i,k,mathScores[i][k]);
		}
	}
	System.out.println();
		
	int[][] englishScores = new int[2][];
	englishScores[0] = new int[2];
	englishScores[1] = new int[3];
	for(int i=0;i< englishScores.length; i++) { //행의 개수
		for(int k=0; k< englishScores[i].length; k++) { //열의 개수
			System.out.printf("englishScores[%d][%d] = %d\n", i,k,englishScores[i][k]);
		}
	}
	System.out.println();
		
	int[][] javaScores = { {95,80}, {92,96,80} };
	for(int i=0;i< javaScores.length; i++) { //행의 개수
		for(int k=0; k< javaScores[i].length; k++) { //열의 개수
			System.out.printf("javaScores[%d][%d] = %d\n", i,k,javaScores[i][k]);
		}
	}

 

mathScores[0][0] = 0
mathScores[0][1] = 0
mathScores[0][2] = 0
mathScores[1][0] = 0
mathScores[1][1] = 0
mathScores[1][2] = 0

englishScores[0][0] = 0
englishScores[0][1] = 0
englishScores[1][0] = 0
englishScores[1][1] = 0
englishScores[1][2] = 0

javaScores[0][0] = 95
javaScores[0][1] = 80
javaScores[1][0] = 92
javaScores[1][1] = 96
javaScores[1][2] = 80

 

객체를 참조하는 배열

 

String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "Java";
strArray[2] = new String("Java");

System.out.println( strArray[0]  == strArray[1]); //true
System.out.println( strArray[0]  == strArray[2]); //false
System.out.println( strArray[0].contentEquals(strArray[2])); //true

 

배열 복사

 

** 배열복사가 필요한 이유
  - 원소를 하나 더 추가하고싶을 때 이미 만들어진 방 개수를 변경하는 것은 불가능하므로
  - 새로운 배열 (방을 더 많이 만듬)에 복사를 해준다.
  - arraycopy ( ) 를 하면 원래 배열의 시작 주소 값을 새로운 배열에 넣어준다.

  - 배열을 복사하여 사이즈업 했을때 가비지컬렉터가 나머지를 메모리에서 삭제해줌



** For문으로 배열 복사

int[] oldIntArray = {1,2,3};
int[] newIntArray = new int[5];

for(int i=0; i<oldIntArray.length;i++) {
	newIntArray[i] = oldIntArray[i];
}

oldIntArray = newIntArray;
oldIntArray[3] = 4;
oldIntArray[4] = 5;

for(int i=0; i<oldIntArray.length; i++) {
	System.out.print(oldIntArray[i] + " "); // 1 2 3 4 5
} System.out.println();

System.out.println("배열크기: " + oldIntArray.length);	// 배열크기: 5
}

 

** arraycopy()로 배열 복사

String[] oldStrArray = {"java", "array", "copy"};
String[] newStrArray = new String[5];

System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);

for(int i=0; i<newStrArray.length; i++) {
	System.out.print(newStrArray[i] + ", "); // java, array, copy, null, null, 
}

 

향상된 for문

 

- for문의 독특한 형태

- 단점 : 읽기만 가능하고 활용하는건 잘 못함

int[] scores = {97, 71, 84, 93, 87};
int sum = 0;

for(int score : scores) {
	sum = sum + score;
} System.out.println("점수 총합 = " + sum); // 점수 총합 = 432

double avg = (double) sum / scores.length;
System.out.println("점수 평균 = " + avg); // 점수 평균 = 86.4

 

 

 

배열에 대한 심화 공부

 

 

배열의 중요성 

 

- "프로그래밍" 이란 ?  일, 절차를 구현하는것, 코딩을 하고 서버에 전달 및 데이터 관리 등등을 말함

- 결국 모든건 데이터로 이루어져있음. 데이터를 읽고 쓰는 것이 편해야함

 

1. 데이터 저장

변수를 통해 데이터를 저장한다.

 -> 변수는 한 가지에 하나만 대입이 가능하다는 한계가 있음 

 

2. 배열

- 여기서부터 참조변수의 개념이 나온다

- 주소를 받으면 거기에 도달하기 위해 " . " 을 찍고 골라서 찾아가면 된다.  (클래스도 마찬가지)

- 변수이름. 쓰면 필드나 메서드 등에 접근할 수 있다 (get도 가능 Set도 가능)

- 배열부터는 그 안에 데이터가 한 개가 아니다. 하나 이상의 데이터가 모여있는 것임

 

3. 구조체

- 예를 들어 '주민'을 표현할 때 주민번호만으로 표현이 가능할까? 

- 국적, 나이, 성별, 키, 몸무게 등 다양한 속성들의 데이터가 있다

- 이를 한번에 묶어서 정의하는 구조체가 필요하다.

 

4. 클래스

- 구조체가 개체라면 클래스는 객체이다.

- 구조체에 메소드를 추가하는 것임. 데이터와 기능을 묶어줌(캡슐화)

 

** 캡슐화의 장점

- 에러가 났을 때 그 부분만 수정해주면 그 클래스를 불러와서 쓰는 코드들은 고치지 않아도 되는 큰 장점이 있음

- 설계 관점에서 고려. 유지 보수, 확장 등을 용이하게 하기 위해 객체 지향 언어를 쓴다.

 

 

다차원 배열의 구조

 

- 2차원 배열은 1차원 배열들의 배열이다

- 첫 주소보고 찾아 들어간다.

- 각 1차원들의 주소 값을 배열의 원소로 가지는 배열이 바로 2차원 배열이다

 

// 6차원 배열
String[][][][][][] 대한민국;
String[][][][][][] 대한민국 = {서울, 부산, 대구, 인천, ...};		
                                |
                                V
                              {강남구, 김포구, 강북구, 성북구, ...}
                                |
                                V
                              {신사동, 역삼동, ...}
                                |
                                V
                              {현대, 삼성, 대우, ...}
                                |
                                V
                              {101동, 102동, 103동, ...}
                                |
                                V
                              {101호, 102호, 103호, ...}	

//	 대한민국 [0][0][0][0][0][0] = 서울 강남구 신사동 현대아파트 101동 101호	

// 1차원 배열의 주소값을 또 배열로 만들어서
// 1차원 배열을 참조하고 있는 참조변수의 1차원 배열이다!
		
int i =33;
System.out.println(i); //33
String[] strs = {"korea","fighting"};
System.out.println(strs);
System.out.println(strs[0]);

// int[3][2] arrs = {  O   O   O  };
//	     	    ㅁㅁ  ㅁㅁ  ㅁㅁ  (2차원배열을 3개 만든다!)

 

다차원 배열의 값 변경

 

int iv = 10;
double dv = 10.0;

System.out.println(iv);
System.out.println(dv);

// int형 1차원 배열 생성
int[] arr0 = new int[2];
int[] arr1 = new int[3];
arr1[2] = 3;

int[] arr2 = new int[2];
System.out.println(arr0); // 주소 값이 들어있음
System.out.println(arr1);
System.out.println(arr2);

// int형 1차원 배열을 갖는 배열 3개 짜리 2차원배열 생성
int[][] arrs = new int[3][];

// int[][] arrs = {arr0, arr1, arr2}; // 이렇게 만들고 싶음
arrs[0] = arr0;
arrs[1] = arr1;
arrs[2] = arr2;
// arrs[1][2] = 3; // 이건 당연히 되고 우리가 궁금한건 아래꺼

// arr1[2] = 3; 이렇게 아까 선언한 작은 배열을 변경해도 큰 배열에 반영이 되는지 확인

for(int i=0; i<arrs.length; i++) {
  for(int j=0; j<arrs[i].length;j++) {
  	System.out.print(arrs[i][j] + ", ");
  }
} System.out.println();

// 향상된 for문
for(int[] elements : arrs) {
  for(int e : elements) {
  	System.out.print(e + ", ");
  }
}

 

반응형

댓글