나의 IT일지
배열 본문
배열에는 1개당 1개의 데이터만 저장할 수 있다. 그렇기 때문에 많은 데이터를 저장하기 위해서는 많은 변수가 필요하다. 하지만 변수를 많이 선언하게 되면, 코드의 길이가 길어지게 된다. 그래서 많은 변수를 한번에 만들 수 있는 방법이 필요하다.
배열
배열은 같은 자료형의 변수들을 묶어서 연속적으로 나열한 자료구조로, 많은 같은 변수를 사용하거나, 같은 타입을 가진 비슷한 정보를 한번에 묶어서 관리하기 위해 주로 사용된다.
배열 선언 | 배열 객체 선언 |
1. 데이터 타입[ ] 배열명; 2. 데이터 타입 배열명 [ ]; |
배열명 = new 데이터 타입 [요소개수]; |
배열을 사용하기 위해서는 어떤 타입의 배열을 만들지 선언을 한 뒤, 선언한 배열에 해당 타입의 공간을 생성한다고 선언을 해야한다. 그래서 배열 선언 부분과 배열 객체 선언부분이 나눠져 있는 것이다. 이러한 부분도 한번에 사용할 수 있는데, 구조는 다음과 같다.
타입[ ] 배열명 = new 타입[요소개수];
위의 구조는 배열 선언 부분과 배열 객체 부분을 합친 구조로, 해당 타입의 저장공간을 요소개수만큼 만든 뒤(배열 객체 선언), 배열명으로 묶는다(배열 선언)는 뜻을 가지고 있다. 예를 들어 배열에 생성된 요소의 개수가 i일때, 배열의 요소들을 표현해 보자.
배열의 각 요소들은 인덱스가 부여된다. 그래서 각 요소들은 "배열명[인덱스]"로 표현되며, 배열 내의 저장공간을 다룰 때에는 인덱스를 사용해서 표현한다. 이때 요소의 인덱스를 보면 마지막 호출번호가 "i-1"인것을 볼 수 있는데, 이는 첫번째 인덱스가 "0"부터 시작해서 나타나는 현상이다.
배열도 저장공간이기에 선언하자마자 각 요소에 값을 저장할 수 있다. 이를 초기화라고 하는데, 초기화란 선언한 후 바로 값을 대입하는 것으로, 여러개를 선언할 때에는 쉼표를 통해 배열의 초기값을 구분한다.
타입[ ] 배열명 = new 타입[ ] {값1,값2,값3...};
위의 구조는 배열의 초기화 구조로, 배열을 선언하고 해당 배열에 공간을 생성한 뒤에 해당 공간에 값을 부여하는 형식이다.
그리고 값만 이용해서 초기화를 할 수 있는데, 위의 형식에서 new연산자를 삭제한 형태로 배열을 초기화 할 수 있다.
타입[ ] 배열명 = {값1,값2,값3...};
추가적으로 배열 선언부와 배열 객체 선언부를 나눠서 할 수 있듯이, 초기화도 배열 선언부과 배열 객체 선언부로 나눠서 할 수 있으며, 배열 객체 선언할 때, 초기화할 값을 같이 선언하면 된다.
배열 선언 | 배열 객체 선언 |
1. 데이터 타입[ ] 배열명; 2. 데이터 타입 배열명 [ ]; |
배열명 = new 데이터 타입 [ ]{값1, 값2, 값3 ...}; |
package pack0327;
public class Code1 {
public static void main(String[] args) {
int a[] ;
a = new int[] {10,20,30,40,50};
int[] b = new int[] {1,2,3,4,5};
int[] c = {10,100,1000,10000,100000}; //int c[] = {10,100,1000,10000,100000}으로도 표현가능
System.out.println("배열 a");
for(int i = 0 ;i<5;i++) {
System.out.print(a[i]+" ");
}
System.out.println();
System.out.println("배열 b");
for(int i = 0 ;i<5;i++) {
System.out.print(b[i]+" ");
}
System.out.println();
System.out.println("배열 c");
for(int i = 0 ;i<5;i++) {
System.out.print(c[i]+" ");
}
}
}
위의 코드를 보면 배열을 반복문으로 호출하는 것을 확인할 수 있다. 이는 배열은 인덱스값으로 배열의 요소(저장공간)을 호출 할 수 있기에 반복문을 사용할 수 있다는 것을 알 수 있다.
package pack0328;
import java.util.*;
public class Code1 {
public static void main(String[] args) {
//필요기능 파악
Scanner sc = new Scanner(System.in);
Random rd = new Random();
int lotto[]=new int[6];
int userlotto[]=new int[6];
int bonus;
int count=0;
//사용자 로또 번호 입력
for(int j=0; j<6; j++) {
System.out.println("숫자 입력(1~45)");
userlotto[j] = sc.nextInt();
while(userlotto[j]>=45 && userlotto[j]<0) {
System.out.println("잘못 입력했습니다.");
userlotto[j] = sc.nextInt();
}
for(int i = 0; i<6 ;i++) {
while(i!=j && userlotto[j] == userlotto[i]) {
System.out.println("잘못 입력했습니다.");
userlotto[j] = sc.nextInt();
}
}
}
System.out.printf("사용자 로또번호 : %d %d %d %d %d %d\n",userlotto[0],userlotto[1],userlotto[2],userlotto[3],userlotto[4],userlotto[5]);
//로또 6개 선택
for(int i =0; i<6 ;i++) {
lotto[i] = rd.nextInt(45)+1;
for(int j=0; j<6;j++) {
while(i!=j && lotto[i]== lotto[j]) {
lotto[i] = rd.nextInt(45)+1;
}
}
}
bonus = rd.nextInt(45)+1;
for(int i=0; i<6;i++) {
while(lotto[i]==bonus) {
bonus = rd.nextInt(45)+1;
}
}
//로또번호 출력
System.out.printf("로또번호 : %d %d %d %d %d %d ... %d\n",lotto[0],lotto[1],lotto[2],lotto[3],lotto[4],lotto[5],bonus);
//로또와 사용자의 로또의 동일한 값 갯수 카운트
for(int j = 0;j<6;j++) {
for(int i1 = 0;i1<6;i1++) {
if(lotto[j]==userlotto[i1]) {
count++;
}
}
}
//로또 등수 출력
System.out.println("맞은 숫자:"+count);
switch(count) {
case 6:
System.out.println("1등");
break;
case 5:
for(int i1 = 0 ; i1<6; i1++){
if(userlotto[i1] == bonus) {
System.out.println("2등");
break;
}
}
System.out.println("3등");
break;
case 4:
System.out.println("4등");
break;
case 3:
System.out.println("5등");
break;
}
}
}
배열의 초기값
배열선언부분과 배열 객체 선언 부분을 합친 구조인 " 타입[ ] 배열명 = new 타입[요소개수];"형태로 배열을 생성 할 경우, 기본적으로 초기값을 지정하지 않아도 배열을 생성할 때에 초기값을 가지고 있다.
타입 | 초기값 | 예외 |
정수형 | 0 | long[ ]의 경우 초기값은 0L |
실수형 | 0.0 | |
문자형 | ' ' | float[ ]의 경우 초기값은 0.0F |
문자열 | null |
package pack0327;
public class Code2 {
public static void main(String[] args) {
int[] ari = new int[3];
double[] arb = new double[3];
char[] arc = new char[3];
String[] arS = new String[3];
for(int i=0;i<3;i++ ) {
System.out.print(ari[i]+",");
}
System.out.print("\n");
for(int i=0;i<3;i++ ) {
System.out.print(arb[i]+",");
}
System.out.print("\n");
for(int i=0;i<3;i++ ) {
System.out.print(arc[i]+",");
}
System.out.print("\n");
for(int i=0;i<3;i++ ) {
System.out.print(arS[i]+",");
}
}
}
이때, 생성된 배열의 요소에 값을 저장할 때에는 요소마다 하나씩 값을 저장해줘야 한다. 달리 말하면, 초기화가 된 배열을 생성된 상태에선 초기화에서 사용한 것처럼 한꺼번에 값을 요소에 저장할 수 없다.
length와 Arrays
- length는 배열의 길이를 구하는 필드로, 배열의 길이란 배열에 저장할 수 있는 요소의 개수를 말한다. length필드는 객체 내부 데이터이며, 읽기 위해서는 도트연산자를 붙여야 한다.
- Arrays는 배열 관련 클래스로 배열의 요소를 문자열로 만드는 필드인 toString() 같은 배열에 관련되어 있는 필드가 저장되어 있다.
package pack0327;
import java.util.Arrays;
public class Code3 {
public static void main(String[] args) {
int[] a = new int[] {10,20,30,40,50};
int [] b = {1,2,3,4,5,6,7};
int [] c = new int[10];
for(int i=0;i<c.length;i++) { //배열의 길이 구하기
c[i]=i;
System.out.print(c[i]);
}
System.out.println();
System.out.println(Arrays.toString(c)); //배열의 요소를 문자열로 출력
}
}
문자열
문자열이란 문자의 배열로, 문자형 타입 변수가 배열형태로 있는 타입이다. 이때, 문자열은 "char[ ]"로 사용해서 값을 배열형태로 저장할 수 있지만, "String"타입을 사용해서 값을 저장하는 방법이 존재한다.
- char[ ] a = {'문자 1', '문자 2', '문자 3', ... }
- String 변수 = "리터널 값"
package pack0327;
public class Code1 {
public static void main(String[] args) {
String st1 ="Java";
char[] st2 ={'J','a','v','a'};
System.out.println(st1);
System.out.println(st2);
}
}
'프로그래밍 언어 > Java' 카테고리의 다른 글
배열 지원 함수 (0) | 2023.03.31 |
---|---|
다차원 배열 (0) | 2023.03.30 |
break문과 continue문 (0) | 2023.03.25 |
반복문(while문) (0) | 2023.03.24 |
반복문(for문) (0) | 2023.03.23 |