2차원 배열
int var = 5;
int[][] arrs = new int [3][4];
/* 참조타입(주소값이 저장) : 클래스, 배열
* -> ||||||||||||||||
* 배열의 이름은 그 배열의 시작조소값이다.
arrs[0]--->| | | |
arrs[1]--->| | | |
arrs[2]--->| | | |
{arrs[0], arrs[1], arrs[2] }
*/
배열 속의 배열
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 + ", ");
}
}
'👨💻 2. 웹개발_Back end > 2-1 Java' 카테고리의 다른 글
[JAVA] 06-1 객체 지향 프로그래밍 (0) | 2021.07.30 |
---|---|
[JAVA] 05-3 열거 타입 (0) | 2021.07.30 |
[JAVA] 05-2 배열 (0) | 2021.07.29 |
[이클립스] 한글 깨짐 현상 해결 (0) | 2021.07.29 |
[JAVA] 05-1 참조타입과 참조변수 (0) | 2021.07.28 |
댓글