프로젝트명 : F4_Array

패키지명 : Array

클래스명 : B1_Array

 

이제 배열을 한번 배워보겠습니다!

 

 

저희는 지금까지 이러한 방식으로 변수를 생성했습니다.

 

메모리 상의 Stack이라는 공간에 

a1이라는 변수에 10

a2라는 변수에 20

이런 식으로 값을 저장합니다.

 

 

배열은 자원을 편하기 관리하기 위해 사용됩니다.

선언은 간단합니다.

 

int a;

a = 10;

 

int[] a;

a = new int[4];

 

기본자료형과의 차이는 [] 대괄호와

new로 명시적인 생성을 필요로 합니다.

 

대괄호[] 내부에는 방의 개수를 입력합니다.

여기서 방이란?

 

간단하게 말씀드리면 변수를 몇 개 만들 것인가를 의미합니다.

위에서 a4까지 생성했으니 방 개수를 4로 만들어봅시다.

 

추가로 대괄호[]의 위치는

int[] arr

int arr[]

변수의 앞뒤, 상관없이 작동합니다.

 

 

int기본자료형과 같이 축약형으로

int[] arr = new int[4]로 만들겠습니다.

 

a1~a4는 stack에 값을 저장하지만.

 

arr의 경우

stack에 변수와 저장공간을 만들고

heap에 값을 저장합니다.

 

값을 가지고 있는 무리들의 주소를

arr이 가지고 있다고 생각하시면 됩니다.

 

 

한번 arr을 출력해볼까요?

arr의 출력 값

[I@15db9742라고 나오죠?

 

arr[0] = 25;

arr[1] = 37;

arr[2] = 12;

arr[3] = 88;

 

숫자를 무작위로 대입해주면

위의 그림과 같은 결과가 나옵니다.

 

arr[0]~arr[3]까지의 값을 가지고 있는

주소가 [I@15db9742입니다.

 

이 주소를 arr이 참조하여 값을 가지고 오는 형태입니다.

 

 

arr의 방을 index라고 합니다.

 

arr의 전체 출력을 위해서는

for문이 필요합니다.

 

arr.lenght = arr의 방의 개수

 

현재 방의 개수는 4입니다.

i < 4로 0~3까지 회전하는 for문입니다.

 

내부에는 arr[i]를 넣어주면 출력이 되는데요

저는 위처럼 보기 좋게 만들어줬습니다.

 

 

클래스명 : B2_Array

 

배열의 축약형을 보겠습니다.

 

간단히 사용할 수 있는 방법인데요.

 

 

new int [5]를 사용하는 게 아닌

중괄호{}와 쉼표, 를 이용하여  

int arr[] = {10, 30, 25, 7, 16};

 

기존과 같은 모양으로 stack와 heap에 저장이 됩니다.

 

 

10+33+25+7+16을 해주시면 되겠습니다.

 

간단한 문제이니 문제 풀이하시고 내려주시면 될 거 같아요.

 

 

 

합을 저장하기 위해 변수 하나 생성해주겠습니다

int타입으로 sum 생성해주겠습니다.

 

for문을 이용하여

arr[i] 0~arr.lenght까지 반복하며

내용물을 더해주면 되겠죠?

 

91이라는 값이 나왔습니다.

 

 

향상된 for문을 보겠습니다.

배열에 사용되는 for문입니다.

 

배열 전체를 출력할 때 출력되는 내용입니다.

 

for(int s : arr){

내용

}

 

int s에 arr[0]~arr[arr.lenght]까지 값을 대입합니다.

sum += s를 통해 sum에 값을 저장할 수 있습니다.

 

단점은 인덱스 출력이 불가능합니다!

전체 출력 시에만 사용한다고 생각하시면 됩니다.

 

인덱스 수정, 삭제가 불가능하니 전체 출력에만 이용합니다.

합이 103으로 달라진 이유는

arr의 값을 변경해서입니다..

arr[1]을 33에서 45로 변경했습니다.

 

 

클래스명 : B3_Array

 

오늘은 양이 좀 많네요

 

1~45까지의 숫자를 랜덤으로 출력하여

6개의 로또번호를 만들어보겠습니다.

 

로또번호이니 숫자가 중복되면 안 되겠죠?

중복체크 한번 알아보겠습니다.

 

 

Random을 생성해주시고

6개의 index를 가진 배열을 만들어 보겠습니다.

 

for문을 이용하여 1~6까지만 넣어주겠습니다.

1~6을 넣는 이유는 중복 숫자를 확인하기 위해서인데요

 

완성 후 중복이 되지 않는 것이 확인이 된다면 (45)+1로 바꿔주시면 되겠습니다.

 

i++의 증감식은 사용하지 않았습니다.

 

 

for(int j = 0; j < i ; j++)을 통해

 

if(lotto[i]==lotto[j])를 통해

continue로 아래 i++을 사용하지 않고 맨 위로 이동하겠습니다.

 

중복된 결과가 있다면 중복되지 않게

다시 랜덤 숫자를 넣어!라는 거죠

 

j < i의 이유를 봅시다

 

i==0일때 내부 for문은 작동하지 않습니다

0<0 이니깐요!

그러면 lotto[0]에는 값이 대입되겠죠?

 

i==1일때 내부 for문은 

0 < 1이니

lotto[1]과 lotto[0]을 비교합니다.

값이 다르다면 lotto[i]를 출력하고 i++로 증가하겠죠?

값이 같다면 continue를 통해 맨 위의

for문으로 이동하여 값을 다시 대입합니다.

 

이렇게 계속 반복하게 되겠죠??

값이 모두 다를 때까지!

 

완성이 되면 출력을 통해

1~6까지의 숫자가 중복되지 않는 것을 확인하고

(45)+1로 바꿔주시면 됩니다.

 

이해하기 가장 쉬운 방법은 i와 j에 숫자를 하나하나 넣어가며 비교하는 겁니다

0~5까지 넣어봐야겠죠??

 

 

클래스명 : B4_Array

 

변수 money에 10~5000 사이의 랜덤 값을 대입합니다.

일의 자리 숫자는 무조건 0이 되어야 합니다.

 

이유는 동전을 계산할 건데 1원을 잘 쓰지는 않죠?

 

랜덤 값의 동전을 출력할 건데!

500원 100원 50원 10원 단위로 출력하시면 됩니다.

 

동전은 큰 순서대로 주며 (최대한 적은 수의 동전으로 지급)

동전이 0개인 경우는 출력하지 않습니다.

 

예를 들어 랜덤 숫자가

3850원이 나왔다면?!

 

500원 = 7개

100원 = 3개

50원 = 1개

 

이런 식으로 출력되면 됩니다.

 

한번 3분 정도 생각해보시고 구성이 예상이 간다 면

풀어보시고 예상이 전혀 안되시면 최대한 해보시고

아래 내용 함께 보겠습니다.

 

 

 

int coin[] = {500, 100, 50, 10};

을 통해 동전의 종류를 구분해주겠습니다.

 

int money = ran.nextInt(500)+1;

로 1~500의 숫자를 만들어 주시고!

 

*10을 통해 일의 자리 없이 10~5000을 만들어줬습니다.

 

뭐 시작수 끝수 계산하기 어렵잖아요 ㅜㅜ

 

 

일단 랜덤으로 만들어진 money를 출력해주시고

 

for문을 통해 핵심코드를 만들어보겠습니다.

 

for문의 i는 coin.lenght까지 돌려주겠습니다.

 

res라는 변수를 생성하여

money / coin[i]를 해주었습니다.

 

예를 들어 money가 1760원이라고 가정하면

coin[0] = 500원

 

1760 / 500 = 3

res는 3의 값을 얻게 됩니다.

 

coin[i]와 res를 출력하여

동전의 종류와 개수를 출력해주겠습니다.

 

money %= coin[i]

1760 % 500 = 260으로

나머지 값을 가지고 for문 위로 이동합니다.

 

계속 반복하면 개수를 잘 출력하겠죠?

 

 

최대한 정리해보자면

 

res = 동전 단위의 개수를 저장하는 변수

 

if(res > 0)을 통해 동전의 개수가 0 개인 경우는 출력하지 않습니다.

0개보다 많다면 출력하게 됩니다.

 

money%=coin[i]를 통해 동전 단위를 제외한 나머지 금액을 가지 고위로 올라갑니다.

 

이해가 가실까요..?

 

 

이제 다차원 배열을 보겠습니다

 

패키지명 : Multi_Array

클래스명 : B1_Multi_Array

 

 

 

2차원 배열은 간단합니다 [][] 대괄호를 두 개 쓰면 되죠!

 

int [][] test = new int [2][3]

배열의 개수는 2개, 각 배열의 인덱스 수는 3개라고 보시면 됩니다.

 

위의 모양이

int arr1[] = new int[3];

int arr2[] = new int[3];

이거와 같다고 보시면 됩니다.

 

배열이 2개가 있는데!

그 배열들은 각각 3개의 방을 가지고 있다!

 

test[0] = test[0][0], test[0][1], test[0][2]

test[1] = test[1][0], test[1][1], test[1][2]

 

이렇게 이해하시면 좋을 거 같아요.

 

 

 

2차원 배열을

이중 for문을 이용하여 출력할 수 있습니다.

 

test.lenght = [a][b] 중에서 a인 배열의 크기.

test[i].lenght = [a][b] 중에서 a의 배열이 가지고 있는 인덱스 b의 크기.

 

이렇게 보시면 됩니다.

 

그냥 length는 왼쪽의 대괄호의 숫자[2]이고

test[i].lenght = 우측 대괄호의 숫자[3]입니다.

 

 

클래스명 : B2_Test

 

바로 문제 풀이해봅시다!

 

학생들의 성적을 등록하는 프로그램입니다.

프로그램을 시작하면 학생수를 입력하고

 

과목의 점수를 입력하는 프로그램입니다.

 

추후에 과목이 늘어나면 유지, 보수를 생각하여

과목만 추가하면 건드릴 게 없는 그런 코드를 작성해주시면 됩니다.

 

 

우선 스캐너를 이용하여 학생수를 입력받겠습니다

 

String타입의 배열을 통해 이름, 수학, 영어 등의 과목을 저장받겠습니다.

 

String타입의 이차원 배열을 생성하여

학생 수와 sub.lenght를 통해 이름, 과목의 수만큼 저장하겠습니다.

 

자세한 설명은 아래쪽에서 쭉쭉하겠습니다.

 

 

이중 for문을 생성하여

 

sub[n]은 위에 보듯이 이름, 수학, 영어를 반복해서 출력하겠죠?

str[i][n]을 통해 입력해주시는데!

설명이 필요하겠네요

 

최초에

sub[0] (이름) : str[0][0] (스캐너 입력)

이름을 입력받습니다.

 

sub[1] (수학) : str[0][1] (스캐너 입력)

수학 점수를 입력받습니다.

 

sub[2] (영어) : str[0][2] (스캐너 입력)

영어 점수를 입력받습니다.

 

str[i][n]에서  i의 값은 sel로 해두었죠?

 

학생수를 2로 해두었다면 

두 명의 정보 저장이 가능하고,

 

3으로 해두었다면

세명의 정보 저장이 가능하겠네요!

 

 

 

str[i][n]에서 n은 sub.lenght로 해두었습니다.

 

예를 들어 sub에서 국어를 추가하게 된다면

자동으로 str[i][n]에서 n의 값이 증가하여

 

유지보수에서 효율적으로 운영이 가능합니다.

 

자바의 기능을 최대한 이용하는 게 좋겠죠?

 

프로그램이 끝나고 이중 for문을 사용하여

이름, 점수를 출력하고 끝내겠습니다.