1. 배열
배열이라는 것은 동일한 자료형으로 선언된 변수들을 묶는 것이라 할 수 있습니다. 이는 변수를 하나씩 생성하는 것에 비해 관리가 매우 수월합니다. 만약 성적을 입력받는 프로그램을 만들고자 한다면 int형의 변수를 여러개를 생성하여 변수의 개수만큼 입력문을 받아야 할 것입니다. 하지만 배열을 사용한다면 하나의 반복문만으로도 모든 변수에 값을 저장할 수 있을 것입니다. 아래의 예시를 보도록 하겠습니다.
- int kor=0;
int eng=0;
int mat=0;
System.out.print("국어 : ");
kor=sc.nextInt();
System.out.print("영어 : ");
eng=sc.nextInt();
System.out.print("수학 : ");
mat=sc.nextInt();
이처럼 같은 구조를 반복해야 하는 메모리의 비효율성과 번거로움을 갖게 됩니다. 하지만 이를 배열로 해결한다면 아래와 같이 해결할 수 있습니다.
- int[] sub=new int[3];
String[] subject={"국어", "영어", "수학"};
for(int i=0; i<subject.length; i++){
System.out.println(subject[i]+" : ");
sub[i]=sc.nextInt();
}
배열을 사용하면 훨씬 간단하고 효율적으로 코드를 작성할 수 있습니다.
2. 일차원 배열
배열에는 일차원 배열을 포함한 다차원 배열이 있습니다. 그 중 일차원 배열에 대해 알아보도록 하겠습니다. 다차원 배열이라고 해서 일차원 배열과 크게 다른 것이 없습니다. 단순히 []하나만 더 붙으면 차수가 올라갑니다. 우선 일차원 배열의 선언 방법부터 알아보도록 하겠습니다.
- 자료형[] 배열명;
자료형 배열명[];
위의 방식처럼 2가지의 방법으로 나타낼 수 있습니다. 이때 배열의 자료형으로는 기본 자료형을 비롯하여 String과 System같은 클래스 자료형도 가능합니다. 이후에 오는 배열명은 4byte의 레퍼런스형으로서 어딘가의 주소를 저장할 수 있는 자료형입니다. 그렇다면 배열의 초기화 방법에 대해 알아보도록 하겠습니다.
- 자료형[] 배열명 = {값1, 값2, 값3 ,,, 값n }; // 선언과 동시에 이루어져야 함
배열명 = new 자료형[개수]; // 선언과 별개로 초기화 가능
배열명 = new 자료형[]{값1, 값2, 값3 ,,, 값n }; // 선언과 별개로 초기화 가능
초기화하는 방법에 대해 알아보았으므로 이제 사용하는 방법에 대해 알아보겠습니다. 우선 배열의 구조는 '배열명[인덱스]'와 같습니다. 이 인덱스는 숫자로 이루어져있으며 0부터 시작합니다. 예를 들어 int A[10];이라고 배열을 선언했다면 A배열은 0~9까지의 인덱스를 갖게 됩니다. 아래의 예시를 보도록 하겠습니다.
- char[] ch = {'A', 'B', 'C'};
System.out.println(ch[0]);
System.out.println(ch[1]);
System.out.println(ch[2]);
위의 예시를 보면 선언과 동시에 초기화가 이루어진 것으로 실행해보면 각 글자가 한 줄 단위로 띄어져서 출력되는 것을 알 수 있습니다.
매번 코드를 작성할때 기본 양식에 main함수 부분을 보면 'public static void main(String[] args)'이라는 문구가 있는 것을 볼 수 있습니다. 이때 'String[] args'라는 부분은 각 프로그램마다 필요로 하는 것들을 매개변수를 통해 전달해주는 역할을 합니다. 이를 응용하여 아래의 코드를 살펴보도록 하겠습니다.
public class Round08_Ex01 {
public static void main(String[] args) {
System.out.println("ar[0] = "+args[0]);
System.out.println("ar[1] = "+args[1]);
System.out.println("ar[2] = "+args[2]);
}
}
만약 이러한 코드가 있다고 가정할 때 컴파일 시에는 아무런 문제가 발생하지 않지만 실행해보면 문제가 발생하는 것을 확인할 수 있습니다. 이유는 실행 시에 기본 매개변수에 아무런 값도 넣어주지 않았기 떄문에 에러가 생기는 것입니다. 이를 해석해보면 선언만 하고 아무런 초기화 과정도 거치지 않았기 때문에 에러가 발생하는 것입니다. 그렇다면 프로그램을 실행하면서 매개변수로 임의의 글자를 넣어보도록 하겠습니다.
이렇게 코드 내에서 초기화를 하지 않아도 매개변수를 통해 원하고자 하는 값을 출력이 가능하다는 것을 알 수 있습니다. 그렇다면 이클립스 프로그램에서 코드를 실행할 때에는 어떻게 매개변수를 전달하는지에 대해 알아보도록 하겠습니다. 우선 Run탭의 'Run Configurations' 항목을 들어가줍니다. 이후 중간부분의 'Arguments' 탭을 눌러줍니다.
그런 후에 'Program arguments'부분에 전하고자 하는 값을 넣어준 후 'Run'을 눌러주면 아까와 같은 결과값이 나오는 것을 확인할 수 있습니다.
그렇다면 이제 지금까지 배운 모든 것을 통합해서 성적을 출력하는 프로그램을 작성해보도록 하겠습니다.
import java.util.Scanner;
public class Round08_Ex04_2 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String[] subname= {"국어", "영어", "수학"};
int[] sub=new int[subname.length+1]; // 기존의 3개 과목에 총점도 추가해야하므로 +1
float ave=0.0f;
for(int i=0; i<sub.length-1; i++) { // i는 0으로 초기화하고 sub변수의 길이까지 반복
do {
System.out.println(subname[i]+" : ");
sub[i]=Integer.parseInt(sc.nextLine());
} while(sub[i]<0||sub[i]>100); // 입력 값이 0보다 작고 100보다 크면 다시 입력
sub[sub.length-1]+=sub[i]; // sub배열의 마지막 인덱스에 총합 저장
}
ave=sub[sub.length-1]/(float)(sub.length-1); // 총합 나누기 과목 수
System.out.println();
System.out.println("총점 : "+sub[sub.length-1]);
System.out.println("평균 : "+ave);
}
}
위의 코드에서 sub.length와 같이 붙어있는 .length라는 것은 해당 배열이나 멤버의 크기(길이)를 나타냅니다. 이렇게 배열을 이용하면 복잡하고 번거로운 작업을 쉽고 효율적으로 처리할 수 있습니다.
3. 다차원 배열
다차원 배열의 개념은 쉽게 말해 일차원 배열이 2개가 묶여있는 것이라고 보면 됩니다. 예를 들어 일차원 배열이 일직선의 길이라고 표현한다면 2차원 배열은 직선 2개가 모인 넓이, 3차원 배열은 넓이에 직선이 추가된 공간과 같은 개념으로 볼 수 있습니다. 다차원 배열도 일차원 배열과 선언, 사용하는 방법에 있어 같기 때문에 어려울 것은 없습니다.
- 자료형[][] 배열명;
자료형[] 배열명[];
자료형 배열명[][];
일차원 배열에 비해서 대괄호( [] ) 하나가 더 생겨난 것입니다. 그렇다면 초기화 하는 방법에 대해 알아보도록 하겠습니다.
- 자료형[][] 배열명={{값1, 값2, 값3 ,,, 값n}, {값a, 값b, 값c ,,, 값n}};
배열명 = new 자료형[][]{{값1, 값2, 값3 ,,, 값n}, {값a, 값b, 값c ,,, 값n}};
배열명 = new 자료형[개수][개수];
배열명 = new 자료형[개수][];
일차원 배열과 다른 점이라면 초기화를 할 때 중괄호( {} )를 2개 사용한다는 것입니다. 이러한 다차원 배열의 값을 나타내는 방식 또한 일차원 배열과 같이 '배열명[인덱스][인덱스]'를 통해 나타냅니다. 그렇다면 다차원 배열의 예시로 아래의 코드를 살펴보도록 하겠습니다. 이 코드는 세 학생의 점수를 입력받아 각 총점과 평균을 나타내는 코드입니다.
import java.util.Scanner;
public class Round08_Ex06 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String[] subject= {"국어", "영어", "수학"}; // 입력받을 과목 3개
int[][] sub = new int[3][subject.length+1]; // 과목3개 + 총합
float[] ave = new float[3];
for(int k=0; k<sub.length; k++) { // 과목+총합 배열의 수만큼 반복
for(int i=0; i<sub[k].length-1; i++) { // 각 학생의 과목 배열 수만큼 반복
do {
System.out.print(subject[i]+" : ");
sub[k][i]=sc.nextInt();
} while(sub[k][i]<0||sub[k][i]>100); // 입력값이 0보다 작거나 100보다 크면 다시
sub[k][sub[k].length-1]+=sub[k][i]; // 총점은 각 과목의 합
}
ave[k]=sub[k][sub[k].length-1]/(float)(sub[k].length-1);
}
for(int k=0; k<sub.length; k++) {
System.out.println();
System.out.println("총점 : "+sub[k][sub[k].length-1]);
System.out.println("평균 : "+ave[k]);
}
}
}
위 코드의 실행화면은 아래와 같습니다.
이상으로 배열에 대해 알아보았습니다.
'프로그래밍 > JAVA' 카테고리의 다른 글
Class - Field (0) | 2021.03.16 |
---|---|
객체 지향 프로그래밍 (0) | 2021.03.16 |
자바 메서드 - 문제 (0) | 2019.04.22 |
자바 메서드 ( method ) (0) | 2019.04.21 |
자바 제어문 - 문제 (0) | 2019.04.19 |