본문 바로가기
개발자로 가는 길(국비지원과정)/1. Java

[210421수] 배열 Array

by 레아Leah 2021. 4. 21.
반응형

array (배열)

: int[] 변수명 = new int[N]; 

: 같은 자료형!의 변수가 메모리 안에 여러 개 선언되어 사용되는 것. → 연관된 정보, 데이터를 모아 관리하기 위해서 사용하는 데이터 타입이다. 변수가 하나의 데이터를 저장하기 위한 것이라면 배열은 여러 개의 데이터를 저장하기 위한 것이라고 할 수 있다. 

일반변수는 초기화를 반드시 해야함. 안하면 오류 

기본값 (0, 0.0, false) 중 배열의 경우 0으로 초기화되어있음. 

 

단점 : 동적으로 크기를 조절할 수 없다!  배열은 초기화할 때 그 크기가 정해지므로 정해진 크기 이상의 값을 넣을 수 없으며, 여러 종류의 데이터타입을 넣는 배열은 만들 수 없다. 이와 같은 문제를 해결할 방법은 collection이다. 

 

[] : 1차원 배열

[][] : 2차원 배열

 

더보기

int[] 변수명 = new int[N];

N은 배열의 개수를 뜻한다. 

 

ex) int[] arr = new int[5];

배열 arr은 총 5개의 정수이며, 주소는 0번방부터 4번방까지 있다. 

 

int[] ary = {10, 21, 46, 77, 90, 86}

ary의 개수를 알고 싶다면 length를 이용해 ary.length; 

배열 ary의 값을 알고 싶다면 ary[i];

ary[0]이 의미하는 것은 값 10이다. 

 

 

[배열의 역할]

1. 연관된 데이터를 저장하는 것

 

 

 

[향상된 for문]

배열의 내용을 탐색할 때  for문을 좀 더 간편하게 사용할 수 있는 방법이 있다. 

for(객체(데이터타입) 변수 : 배열명)

 

 

int value = 15; 

ary[0] = 15;의 출력값은 동일하다.

 

 

 

[데이터타입에 따른 배열 선언]

배열은 따로 초기화하지 않아도 배열의 기본값인 0이 출력되어 나온다. 

 

 

 

[배열과 for문] ★배열과 for문은 뗄수 없다.

 

i는 11, 15, 20, 30, 20과 같은 값이 아닌, 배열 ary의 개수가 아닌 0번방부터 4번방까지의 주소를 의미한다.

for문에서 i의 값이 증가함에 따라 0번부터 1, 2, 3, 4번방까지 총 5번 반복해 ary[i] 값을 출력한다. 

 

 

[헷갈려하는 부분] : 배열의 값을 출력하고 싶다면  i가 오는 것이 아니라 ary[i];가 와야한다.

내가 한거..도대체 이게 머선129... 

 

System.out.println("방의 개수 : " + ary.length); 이건 반복될 필요가 없기 때문에 for문에 들어갈 필요가 없다. 

 

 

★주의! 10, 19, 80... 과 같은 배열의 값을 출력하고 싶다면  i가 오는 것이 아니라 ary[i];가 와야한다.

 

 

 

범위를 넘어가면 Exception이 뜬다.

예를 들어, int[] ary = new int[5];로 ary의 개수는 5개이지만 for(int i = 0; i < 6; i++)라고 하면 주소가 5개인 배열에 ary[5]; 6번째 값을 묻는다면  ArrayIndexOutOfBounds 범위를 넘어갔다는 경고! 가 뜬다. 

 

 

 

 

[배열의 속성 : length]

배열을 업무에서 사용할 때 많은 양의 값을 하나하나 대입하는 것은 불가하다.

int[] ary = {1,2,3,4,5,....}하고 이 개수를 확인하기 위해 사용하는 것이 length이다. 

변수명.length;를 하면 개수를 알 수 있다. 

 

 

[데이터타입에 따른 for문과 .length를 이용한 출력]

 

여러 개의 문자를 가지고 있는 캐릭터형 배열 또한 변수명.length;를 통해 개수를 구할 수 있고, for문을 통해 반복할 수 있다.

 

 

 

 

 

[배열을 입력]

① 개수가 5개인 배열이 초기화되어있지 않은 상황. 스캐너를 이용해 배열 ary의 각 방에 데이터를 입력해 출력한다. 

 

주의할 것! int i에 대한 초기화가 되어있지 않기 때문에 for문 안에 들어가야 오류가 뜨지 않음. 

 

오류가 뜨지 않는 것을 확인할 수 있다.

 

스캐너로 배열을 값을 입력하는 걸 모르겠다. 

보통 변수라면 ary = scanner.nextInt(); 이렇게 되던데..? 

 

 

방법! 열어보세요.

더보기

for(int i=0; i < 5; ++i) {

System.out.println(i + "번 방 데이터 입력");

ary[i] = scanner.nextInt();

}

 

 

위에서 혼자할 때 출력이 안되었던 이유는 System.out.println(i+ "번 방 데이터 입력: "); ary[i] = scanner.nextInt(); 이 순서를 바꿔서;; 

 

 

 

 

<깔끔한 코드>

 

 

int[] 변수명 = new int[N];

배열이 아닌 변수는 i라면 배열에서는 변수명[i]라는 것 잊지 말기!  

 

 

 

입력받은 정수를 모두 합한 값을 구하여라! 

 

<깔끔한 코드>

 

위의 for문에 total += ary[i]; 넣어도

 

아래 for문에 total += ary[i]; 넣어도 합계를 구할 수 있다. 

★대신 주의할 것! total+=i가 아니라 total += ary[i]; 이렇게 타입해야 한다. 

 

 

 

아직 배열이 익숙하지 않아서 i가 아니라 변수명[i]를 써야한다는 것을 자꾸 까먹음. 

ary[i]에서 i는 0~N번방까지의 주소 색인(첨자)를 나타낼 뿐!이라는 것을 주의하기. 

 

 

 

③ 입력받은 값이 3의 배수가 아니면 다시 입력을 받아라. 

<Hint : "입력받은 값이 3의 배수가 아니라면"을 '!='를 이용해 (if(ary[i]%3 !=0)  >

 

입력받은 값이 3의 배수가 아니라면 다시 for문으로 돌아가야하는데 return;을 사용하면 <i + "번방 데이터 입력 :">라는 기회가 오지 않는다. 

그래서 조건에 해당하면 건너뛰는 continue;를 사용해보려했는데 3의 배수가 아닌 31를 입력한 2번방의 값에 틀린 채(3의 배수가 아닌 값)로 3번 방으로 넘어간다.  

 

 그렇다면 continue와 함께 --i;를 사용해서 해보시길! 

[--i;와 continue;]는 해당 자리의 값을 다시 받고 싶을 때 사용한다.  

 return을 사용하면 메인 메소드로 돌아가 종료해버리지만 조건에 맞지 않는 값을 건너뛰고 다시 제자리의 값을 구하려고 할 때 사용한다. 

밑으로 내려가면 추가 설명이 있다. 

아무리 3의 배수가 아닌 값을 입력해도 다음 회차의 N번방을 입력하라고 하지 않는다. 

 

 

<깔끔한 코드>

★int i = 0; 0이었던 i가 --i;를 만나 -1이 되고 continue;를 지나 해당 값을 출력하지 않은채 건너뛰고 다시 for문의 ++1으로 감!

 

continue;의 개념! 

-continue는 조건에 해당하는 특정문장을 거른 후 (건너뛰고) 계속 진행. 

질문) for(int i =0; i < 5; ++i)에서 for(int i =0; i < 5;는 한 번만 사용한다고 했는데? 이거 정확히 알고 싶다... 

 

 

④ 입력받은 데이터, 데이터가 반전되도록 자리바꾸기 

(스캐너를 통해 입력 받은 값) 12 55 64 74 99 => 99 74 64 55 12

 

 

 

 

-좌우의 값을 바꾸고 싶다고 한다면 가운데값을 기준으로, 오른쪽 ary[i]에서 주소를 나타내는 i의 값이 증가하지만 값을 교환할 대상인 왼쪽은 i만큼 주소가 줄어든다.(-i) 그렇기때문에 ary[i]와 교환할 주소는 예를 들어, ary[0]일 때 ary[4], ary[1]일 때 ary[3]이므로(오른쪽 i의 주소가 증가할수록  왼쪽의 주소가 감소하는 것을 알 수 있음)  ary[i]와 ary[ary.length - 1 -i]를 서로 교환해주면 된다. 

 

-int[] ary = new int[5];는 개수가 총 5개이므로, 5/2의 값, 2번만 반복해주면 된다. for(int i =0; i < ary.length/2; ++i) 

 

 

변수 x, y의 값을 서로 대입해 교환하고 싶다 하여 

x = y;

y =  x; 이렇게 대입해줘도 결과는 

 

x = y; 

y = y; 라는 값이 나온다. 

 

그렇기때문에 x의 값을 피신시킬 변수 temp를 이용하는데.. temp에 x의 값을 피신시킨 뒤 x=y;  y의 값을 x에 대입, y=temp; temp(x)의 값을 y에 옮기는 방식을 사용한다.  

 

 

<내가 한 거>

오류가 뜨는 이유는  ary[ary.length-1-i], ary[] 문자열의 값이라는 것을 적어주지 않았기 때문이다. 

 

 

 

ary.length는 배열인 ary의 개수 5개를 의미하는데.. for문을 통해 좌변이 i씩 증가(++i)하는만큼 우변은 i씩 감소(--i)한다.

ary[i] = ary[ary.length-1-i];에서 ary.length-1을 하는 이유는 ary[i] = ary[ary.length-i]에서 ary[0]일 경우 ary[0]=ary[5-0]; ary[0] =ary[5]가 되어 범위를 넘어가기 때문.

 

 

 

 

 

오전에 3시간 수업 들은 내용인데 복습도 3시간 이상 걸리네.. 3시간 더 걸린 것 같기도..

어찌하겠나.. 더 열심히 하는 수밖에..ㅠㅠ 

 

근데 아직도 ary[ary.length-1-i]부분은 이해가 안간다.. (복습중! 이해했음 넘어가도 ok!)

 

 

♡복습♠

-4월25일 일요일:  토요일에 거쳐 3시간 이상 걸리듯. 

반응형