Java #4 - 배열 객체 Array, for each문 (국비16일차)

 

오늘 배울 것은 배열 객체이다.

c언어 때부터 많이 사용해 온 배열이나

java의 특징때문에 꼭 참조변수를 이용해야 한다.

 

 

 

배열 객체 Array

 

etc-image-0

 

그럼 java에서 배열을 만드는 방식부터 알아보자.

etc-image-1

정확하게 말하면 c언어와는 약간 다르다.

Java는 참조변수를 사용하기 때문에

c언어에서 Heap 메모리를 사용해 포인터 변수를 사용한 문법을 써줘야 한다.

 

또한 int aaa[] 처럼 사용도 가능하지만

java에선 int[] aaa처럼 많이 사용한다고 한다.

 

etc-image-2

우선 기본적으로 나머지는 c언어에서 사용방법이 같다.

배열을 사용할 때, 하나씩 출력하거나 하나씩 입력해야 한다.

 

etc-image-3

대신

배열 객체에 배열 요소의 개수를 확인할 수 있는

멤버변수가 있다.

어제 String객체에서 한 length처럼 말이다.

 

배열이름 aaa를 적고

.(마침표)를 하고 length;를 써주면 int 값으로 리턴해준다.

 

 

그럼 c언어처럼 배열 객체를 생성하면서 배열요소값들을 초기화할 수 있을까?

그렇다.!!

etc-image-4
배열 객체 요소 초기화

우리가 아까 배운 문법에다가

c언어에서 값을 넣듯 { }를 이용해 값을 초기화해 주면 된다.

그러나 위에 사진을 보면 에러가 난다.

그 이유는 3이라는 숫자를 입력했기 때문이다.

어차피 값을 넣었으니 안 적어도 된다는 뜻..?!

 

etc-image-5

즉 이렇게 적어줘야 한다.!!

(초기화할 때 배열 개수를 명시하면 안 된다!)

 

그러나 String도 그렇고

축약표현이 있었다. (그만큼 많이 사용하니까..)

배열도 그렇다.

 

etc-image-6
자바 생성 초기화 축약표현

뒤에 new int[]를 안써줘도 된다.

마치 c언어같이 초기화할 수 있다.
(자동으로 new int[]를 해주는 것이다.)

 

etc-image-7

그래서 이렇게 사용할 수 있고

이게 많이 사용하는 방법이다.

 

etc-image-8
배열 생성시 개수를 변수로 지정

또 우리가 c에서 배웠던 것처럼

변수를 사용해 배열의 개수를 컨트롤할 수 있다.

 

↓ class import 안 외워도 되는 방법

더보기
etc-image-9
어떤 것을 import해야할지 모를때

 

java엔 class가 엄청 많다.

이를 하나하나 다 외우긴 어렵다.

그럴 때 내가 쓰려는 객체 이름을 쓰고 빨간색 밑줄이 뜨면

거기로 마우스를 가져간다.

그러면 import라고 뜨는데

이를 누르면 자동으로 맨 위에 import 문이 작성이 된다!!!

그럼 우리가 변수 n을 입력받아 배열의 개수를 

원하는 만큼 생성할 수 있다.

 

etc-image-10

이전에 배운 Scanner를 통해 입력을 받고 그 값을 n에 대입해 주면 된다.

 

etc-image-11
변수로 배열객체 값 지정해서 초기화

이렇게 배열에 넣을 값을 

변수를 사용해서 넣을 수도 있다!

 

etc-image-12

그리고 배열요소의 개수가 0인 배열도 만들 수 있다.

etc-image-13

 

 

 

etc-image-14

ggg와 hhh는

배열의 주소를 가진 참조변수이다.

따라서 하나의 주소를 두 참조변수가 가지고 있는 것이다.

etc-image-15

따라서 hhh index 1번의 값을 변경하면 ggg[1]의 값 역시 바뀐 값으로 나오게 된다.(값을 공유)

 

그럼 영향이 없게 하고 싶다면 어떻게 해야 할까?  (값을 카피)

etc-image-16
배열 값 카피

바로 우리가 배운 반복문을 통해

값을 새로운 배열에 넣어주는 것이다.

 

 

etc-image-17
String 배열

그럼 String도 배열로 쓸 수 있지 않을까?

그렇다.

위에서 배운 문법을 이용해 주면 된다.

String[] sss= new String[3];

이렇게 말이다.

 

그럼 저렇게 하나하나 넣는 방법 말고

한 번에 초기화할 수는 없을까?

etc-image-18
String 배열 값 초기화

있다. 

기존 문법과 같지만 

원래 문법대로라면 위의 사진처럼 하나의 문자열마다

각각 new String을 사용해줘야 한다.

하지만 알다시피 우린 축약형을 알고 있다.

etc-image-19

여기서 더 나아가서 아예 값을 초기화할 땐

etc-image-20

이런 식으로 작성할 수 있다.

 

 

당연히 우리가 만든 class를 배열로 사용가능하다.

더보기
etc-image-21

그리고 나중에도 할 테지만 java에선 프로토타입을 할 필요가 없다.!

 

여기서 이제 발생하는 문제가

배열을 다루기 위해선 반복문을 써야 하는데

이게 코드가 길어지는 등의 상황이 발생하면

에러가 날 확률이 높아진다.

그래서 개량한 for 문이 있다.

 

etc-image-22
기존의 for 문

기존의 for 문은 이런 형식으로 되어있어서 하나 잘못 입력해도

빨간 줄이 안뜰 가능성이 있다.

etc-image-23

그러나 확장된 for문에서는

이런 여지를 없애는 방법이다.

 

etc-image-24
확장된 for 문 / for each문

for(int t : 참조 배열 이름) 만 쓰면 되니 엄청 편하다.

 

etc-image-25

다른 자료형도 이렇게 사용이 가능하다.

 

 

2차원 배열 - 1차원 배열 참조변수를 여러 개 가진 배열 객체

 

etc-image-26

 

 

java의 2차원배열은 사실 1차원배열 참조변수를 여러개 가진 배열객체이다.

etc-image-27

c언어랑은 다르게 순서는 바뀌지만 기존 우리가 아는 방법은 맞다.

다만 c로 생각하자면 주소값을 찾아 들어가면 한번 더 주소값이 있는 형태가 되는 것이다.

etc-image-28

확장된 for 문법을 사용해서도 사용이 가능하다.

 

etc-image-29

그리고 2차원 배열의 초기화도 간단한 방법으로 가능하다.

그리고 축약표현문법은 우리가 아는

c언어의 다차원배열과 닮아있다.

 

etc-image-30

3차원배열은 2차원배열 참조변수를 여러개 가진 배열객체일 뿐이다.

 

그림을 그려보면 쉽다. 2차원배열 처음 사진을 보면 조금 더 이해가 쉽다.