yeny_lab

[혼자 공부하는 자바] 7/04 05-2 배열2

2020. 7. 4. 14:36·JAVA
728x90

 


 

 

5챕터 남은 내용 : 다차원 배열, 객체를 참조하는 배열, 배열 복사, 향상된 for문


지금까지 공부한 배열은 1차원 배열입니다.

2차원 배열은 뭘까요?

수학의 행렬을 떠올리면 된다고 합니다.

가로 인덱스와 세로 인덱스를 사용합니다. 행과 열이요~!

 

int[][] scores = new int[2][3];

요로코롬 쓴다.

 

 

출처: 혼공자 책 190p 그림

 

우와.. 

변수 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문 작성해보기>

 

이렇게 쓰는구나..  변수에 배열 항목을 저장하고 그 변수를 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.

학생 수, 각 학생들 점수 입력받아서 최고 점수 및 평균 점수 구하는 프로그램..

실행결과 보고 작성하기

 

아니.. 옌아....! 24줄에 3이 아니고 studentNum이라고 해야지... 고정이냐 ㅡㅅㅡ?

 

실행결과

 

 

 

에효

for문을 배웠으면 좀 써먹어라...!

 

 

여기 이부분 for로 돌려야 좋지... 학생수가 3명이 아니면 어쩔거야!!!

 

아 그리고 답지에서: 최댓값 구할 때 if문을 사용하지 않고 삼항 연산자를 사용했다.

하긴 조건문 있고 둘중 하나 선택하는 거니까 삼항 연산자를 떠올리는게 엄청 괜찮겠다.

 

코드를 알아보기가 훨씬 편하다

 

진짜 훨씬 낫네 깔끔하고 읽기도 쉽고..


오늘 이렇게 05-2 학습해따.

혼자 해보면 부족한 부분이 많이 보인다.

728x90

'JAVA' 카테고리의 다른 글

[혼자 공부하는 자바] 7/06 06-2 [필드]  (1) 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
'JAVA' 카테고리의 다른 글
  • [혼자 공부하는 자바] 7/06 06-2 [필드]
  • [혼자 공부하는 자바] 7/06 06-1 [클래스 선언] [클래스 구성] [new 연산자] [필드] [생성자] [메소드]
  • [혼자 공부하는 자바] 7/03 05-2 배열
  • [혼자 공부하는 자바] 7/02 05-1 참조타입
히어로맛쿠키
히어로맛쿠키
  • 히어로맛쿠키
    yeny_lab
    히어로맛쿠키
  • 전체
    오늘
    어제
    • 분류 전체보기 (387)
      • 미분류글 (30)
        • ㅇ (2)
      • JAVA (84)
        • Effective Java (1)
        • Application (21)
      • 컴퓨터구조 & OS (28)
      • 자료구조 + 알고리즘 (43)
      • Database (12)
      • 컴파일러 (10)
      • 수학 (33)
        • 미분방정식 (12)
      • 데이터분석과 머신러닝 (38)
      • 기타 (59)
      • yyeeennyy (25)
  • 공지사항

    • ^o^/♡
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
히어로맛쿠키
[혼자 공부하는 자바] 7/04 05-2 배열2
상단으로

티스토리툴바