5챕터 남은 내용 : 다차원 배열, 객체를 참조하는 배열, 배열 복사, 향상된 for문
지금까지 공부한 배열은 1차원 배열입니다.
2차원 배열은 뭘까요?
수학의 행렬을 떠올리면 된다고 합니다.
가로 인덱스와 세로 인덱스를 사용합니다. 행과 열이요~!
int[][] scores = new int[2][3];
요로코롬 쓴다.
우와..
변수 scores가 배열A(행,길이2)를 참조하여 scores[0]과 scores[1]이 있다.
그런데 여기서 조곰 충격!! scores[0]이랑 scores[1]은 그냥 1차원배열에서의 항목 정도가 아니라
또 다른 배열을 참고할 수 있다!! 뜨든
배열A의 scores[0]과 scores[1]은 또 다른 배열B와 배열C를 각각 참조한다..! (열,길이3)
그래서
scores.length <------2
scores[0].length <------3
scores[1].length <------3
++++하지만 행렬과는 조금 다른게..
다차원 배열은 계단식 구조를 가질 수 있다.
int[][] scores = new int[2][]; //<-여기서 '행'만 생성
scores[0] = new int[2]; //<-0열에는 2개의 열 생성
scores[1] = new int[3]; //<-1열에는 3개의 열 생성
(//우와 이렇게 배열의 항목에 또 다른 배열을 넣을 수 있구나 진짜 신기하다)
ㅁㅁ
ㅁㅁㅁ
이런꼴의 다차원 배열을 만든 것이다.
배열A 길이2인 거 만들고
배열A의 인덱스0는 또 다른 배열B를 참조
배열A의 인덱스1는 또 다른 배열C를 참조
그럼 이때는
scores.length <--2
scores[0].length <--2
scores[1].length <--3
다차원 배열에서 주의할 점: 길이파악을 잘 하고 인덱스를 사용해야 한다.
위의 scores 다차원 배열을 예를 들면
scores[0][2]는 ArrayIndexOutOfBoundsException을 발생시킨다.
scores[0]이 참조하고 있는 배열B는 길이가 2로, 인덱스가 0,1만 있기 때문이다.
(없는 인덱스 값을 가져온다는게 당연히 말도 안되게 느껴지긴 한다)
++배열을 선언할 때 중괄호로 그룹을 묶음을 통해서도 다차원 배열을 만들 수 있다.
1. 배열 선언시 그룹 만들기
int[][] scores = { {95, 80}, {92, 96} };
scores[0]은 배열{95, 80}을 참조
scores[1]은 배열{92, 96}을 참조
2. 다음과 같이 읽기 가능
int socore = scroes[0][0]; //<--95
int socores = scores[1][1]; //<--96
다차원 배열 익히기
객체를 참조하는 배열
기본타입과는 다르게 참조 타입 배열은 각 항목에 객체의 번지를 가지고 있다..
>>예: String[]배열은 String객체를 참조하게 된다.
(스택영역의 배열변수는 힙 영역의 배열객체를참고!)
예를 들면
String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "C++";
strArray[2] = "C#";
(그러므로 String[]배열 항목들도 String변수와 동일한 취급을 한다. 문자열 비교에 .equals() 메소드를 사용한다든지)
배열 복사
배열 크기는 수정할 수 없어서, 중간에 더 큰 배열을 새로 만들어서 이전 배열 항목 값을 복사해야 한다.
ㅇfor문을 사용하여 복사
ㅇSystem.arraycopy() 메소드 사용
<for사용한 배열복사>
<메소드 사용한 복사>
<System.arraycopy()>
System.arraycopy()를 호출하는 방법은
System.arraycopy(원본 배열, 원본배열의 복사시작인덱스, 새 배열, 붙여넣기 시작할 인덱스, 복사할 개수)
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
예) System.arraycopy(arr1, 0, arr2, 0, arr1.length);
(++String[]배열의 초기값은 null)
!!++복사 대상인 객체 번지를 사용한다. 새로운 객체 번지를 만들지 않는다.
이전 배열의 항목이 참조하는 객체와 새 배열로 복사한 항목이 참조하는 객체는 동일하다.
향상된 for문
헉 향상된 for문은 루프카운터랑 증감식을 사용 안한대..!!
향상된 for문: 배열이나 컬렉션을 조금 더 쉽게 처리하기 위함.
여기서 for문의 괄호에는 (배열에서 꺼낸 거 저장할 변수 선언 : 배열) 처럼 쓴다.
배열이나 컬렉션의 항목 개수만큼 반복하고 자동으로 for을 빠져나간다.
for (타입 변수: 배열){
실행문
}
흐름: 배열에서 가져올 값이 존재하는지 평가하고, 있으면 그 값을 변수에 저장한다. 그리고 중괄호 실행한다. 다 실행하면 루프 돌아 다시.. 배열에거 가져올 다음 값이 있는지 평가한다. 계속 루프 하다가, 배열에서 가져올 값이 더이상 없으면 for문을 종료한다.
<향상된 for문 작성해보기>
확인 문제 학습
1.
변수만 먼저 선언했을 때 나중에 배열 객체를 생성하려고 하면 new연산자를 사용해야 한다.
int[] array; array = new int[] {1, 2, 3};
2.
boolean타입 배열 항목의 초기값은 false다.
3.
array.length //3
array[2].length //5
4.
for문을 이용해 주어진 배열의 항목에서 최대값 구하는 코드 작성해보기
일단 이렇게 했다.
헐..>!! 최댓값 찾는거 저렇게 복잡하게 안 해도 됐었다.
ㅠ,ㅠ 암튼 나는 6번도 저렇게 했는데..! 조금 충격!!
아래와 같이 해도 된다.
더 간단하고 깔끔하다.
6번도 이렇게 다시 해봐야 겠다.
5.
중첩for문을 이용해 주어진 배열의 전체 항목의 합과 평균값 구하기
이러케 해바따.
countForAvg += array[i].length; 설정이 조곰 새로운 느낌이었다.
다차원 배열의 전체 항목 수를 세는 코드를 저렇게 해봤다!
++++저기... countForAvg도 더 간단한 방법으로 셀 수 있다.
이중 for 내에서 count++하면 다 카운트되는거지...!
6.
학생 수, 각 학생들 점수 입력받아서 최고 점수 및 평균 점수 구하는 프로그램..
실행결과 보고 작성하기
실행결과
에효
for문을 배웠으면 좀 써먹어라...!
여기 이부분 for로 돌려야 좋지... 학생수가 3명이 아니면 어쩔거야!!!
아 그리고 답지에서: 최댓값 구할 때 if문을 사용하지 않고 삼항 연산자를 사용했다.
하긴 조건문 있고 둘중 하나 선택하는 거니까 삼항 연산자를 떠올리는게 엄청 괜찮겠다.
진짜 훨씬 낫네 깔끔하고 읽기도 쉽고..
오늘 이렇게 05-2 학습해따.
혼자 해보면 부족한 부분이 많이 보인다.
'JAVA' 카테고리의 다른 글
[혼자 공부하는 자바] 7/06 06-2 [필드] (0) | 2020.07.06 |
---|---|
[혼자 공부하는 자바] 7/06 06-1 [클래스 선언] [클래스 구성] [new 연산자] [필드] [생성자] [메소드] (0) | 2020.07.06 |
[혼자 공부하는 자바] 7/03 05-2 배열 (0) | 2020.07.03 |
[혼자 공부하는 자바] 7/02 05-1 참조타입 (0) | 2020.07.02 |
[혼자 공부하는 자바] 7/02 04 조건문과 반복문 (0) | 2020.06.30 |