같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 '배열(array)'이라고 한다
같은 타입이어야 한다는 것이며, 서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다
원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호[]를 붙이면 된다
선언방법 | 선언 예 |
---|---|
타입[ ] 변수이름; | int[ ] score; |
타입 변수이름[ ] | int score[ ] |
배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고, 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다.
배열을 생성하기 위해서는 연산자 'new'와 함께 배열의 타입과 길이를 지정해 주어야 한다
타입[] 변수이름; // 배열을 선언
변수이름 new 타입[길이];//배열을 생성
인덱스는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다
인덱스는 1이 아닌 0부터 시작한다
인덱스의 범위는 0부터 '배열길이-1'까지
배열의 길이는 int범위의 양의 정수(0도 포함)이어야 한다
'배열이름.length'를 통해서 배열의 길이에 대한 정보를 얻을 수 있다
배열의 길이를 변경하는 방법:
1. 더 큰 배열을 새로 생성한다
2. 기존 배열의 내용을 새로운 배열에 복사한다
for문을 통해 출력하는 방법이 있다
'Arrays.toString(배열이름)'메서드를 사용해서 출력하는 방법이 있다
배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 효율적이다
for(int i=0;i<num.length;i++){newNum[i]=num[i];}
System.arraycopy(num,0,newNum,0,num.length);
num[0]에서 newNum[0]으로 num.length개의 데이터를 복사
public class ArrayEx5 {
public static void main(String[] args){
int sum=0;
float average=0f;
int[] score={100,88,100,100,90};
for(int i=0;i<score.length;i++){
sum+=score[i];
}
average=sum/(float)score.length;
System.out.println("총점 : "+sum);
System.out.println("평균 : "+average);
}
}
배열에 저장된 값을 모두 더한 결과를 배열의 개수로 나누어서 평균을 구하는 예제
public class ArrayEx6 {
public static void main(String[] args){
int[] score={79,88,91,33,100,55,95};
int max=score[0];
int min=score[0];
for(int i=1;i<score.length;i++){
if(score[i]>max){
max=score[i];
}else if(score[i]<min){
min=score[i];
}
}
System.out.println("최대값 :"+max);
System.out.println("최소값 :"+min);
}
}
배열의 타입이 String인 경우에도 int배열의 선언과 생성방법은 다르지 않다
String[] name=new String[3];
String[] name= new String[]{"kim","Park","Yi"};
String[] name= {"Kim","Park","Yi"};
기본형 배열이 아닌 경우, 즉, 참조형 배열의 경우 배열에 저장되는 것은 객체의 주소이다
public class ArrayEx12 {
public static void main(String[] args){
String[] names={"Kim","Park","Yi"};
for(int n=0;n<names.length;n++){
System.out.println("names["+n+"]:"+names[n]);
}
String tmp= names[2];
System.out.println("tmp:"+tmp);
names[0]= "Yu";
for(String str : names){
System.out.println(str);
}
}
}
String클래스는 char배열에 기능(메서드)를 추가한 것이다
메서드 | 설명 |
---|---|
char charAt(int index) | 문자열에서 해당 위치(index)에 있는 문자를 반환한다 |
int length( ) | 문자열의 길이를 반환한다 |
String substring(int from, int to) | 문자열에서 해당 범위(from~to)에 있는 문자열을 반환한다.(to는 범위에 포함되지 않음) |
boolean equals(Object obj) | 문자열의 내용이 obj와 같은지 확인한다. 같으면 결과는 true, 다르면 false가 된다 |
char[ ] toCharArray( ) | 문자열을 문자배열 (char[ ])로 변환해서 반환한다 |
public class ArrayEx15 {
public static void main(String[] args){
String source = "SOSHELP";
String[] morse={".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
String result="";
for(int i=0;i<source.length();i++){
result+=morse[source.charAt(i)-'A'];
}
System.out.println("source:"+source);
System.out.println("morse:"+result);
}
}
문자열(String)을 모르스부호로 변환하는 예제이다
Scanner클래스의 nextLine()외에도 화면을 통해 사용자로부터 값을 입력받을 수 있는 간단한 방법이 있다. 바로 커맨드라인을 이용한 방법인데, 프로그램을 실행할 때 클래스 이름 뒤에 공백문자로 구분하여 여러 개의 문자열을 프로그램에 전달 할 수 있다.
public class ArrayEx16 {
public static void main(String[] args){
System.out.println("매개변수의 개수:"+args.length);
for(int i=0;i<args.length;i++){
System.out.println("args["+i+"] = \""+args[i]+"\"");
}
}
}
커맨드라인에 입력된 매개변수는 공백문자로 구분하기 때문에 입력될 값에 공백이 있는 경우 큰따옴표(")로 감싸주어야 한다.
2차원 배열을 선언하는 방법은 1차원 배열과 같다. 다만 괄호[ ]가 하나 더 들어갈 뿐이다
선언 방법 | 선언 예 |
---|---|
타입[ ][ ] 변수이름; | int [ ][ ] score; |
타입 변수이름[ ][ ]; | int score[ ][ ]; |
타입[ ] 변수이름[ ]; | int[ ] score[ ]; |
int[][] score = new int[4][3];//4행 3열의 2차원 배열을 생성한다
배열이름[행index][열index]
2차원 이상의 다차원 배열을 생성할 때 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고, 추후에 각기 다른 길이의 배열을 생성함으로써 고정된 형태가 아닌 보다 유동적인 가변 배열을 구성할 수 있다
import java.util.*;
public class MultiArrEx1 {
public static void main(String[] args){
final int SIZE=10;
int x=0,y=0;
char[][] board= new char[SIZE][SIZE];
byte[][] shipBoard={
{0,0,0,0,0,0,1,0,0},
{1,1,1,1,0,0,1,0,0},
{0,0,0,0,0,0,1,0,0},
{0,0,0,0,0,0,1,0,0},
{0,0,0,0,0,0,0,0,0},
{1,1,0,1,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0},
{0,0,0,0,0,1,1,1,0}
};
for(int i=1;i<SIZE;i++){
board[0][i]=board[i][0]=(char)(i+'0');
}
Scanner scanner = new Scanner(System.in);
while(true){
System.out.printf("좌표를 입려가세요.(종료는 00)>");
String input=scanner.nextLine();
if(input.length()==2){
x=input.charAt(0)-'0';
y=input.charAt(1)-'0';
if(x==0&y==0){
break;
}
}
if(input.length()!=2||x<=0||x>=SIZE||y<=0||y>=SIZE){
System.out.println("잘못된 입력입니다. 다시 입력해주세요");
continue;
}
board[x][y]=shipBoard[x-1][y-1]==1?'O':'X';
for(int i=0;i<SIZE;i++){
System.out.println(board[i]);
}
System.out.println();
}
}
}
2차원 char배열 board는 입력한 좌표를 표시하기 위한 것이고 2차원 byte배열 shipBoard는 상대방의 배의 위치를 저장한다