자바 도전기-11

김치전사·2022년 1월 5일
0

자바도전기

목록 보기
11/17

자주 사용할 수 밖에 없는 배열을 공부한다

같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 '배열(array)'이라고 한다

배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

같은 타입이어야 한다는 것이며, 서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다

배열의 선언과 생성

원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호[]를 붙이면 된다

선언방법선언 예
타입[ ] 변수이름;int[ ] score;
타입 변수이름[ ]int score[ ]

배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고, 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다.
배열을 생성하기 위해서는 연산자 'new'와 함께 배열의 타입과 길이를 지정해 주어야 한다

타입[] 변수이름; // 배열을 선언
변수이름 new 타입[길이];//배열을 생성

배열의 길이와 인덱스

인덱스는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다
인덱스는 1이 아닌 0부터 시작한다
인덱스의 범위는 0부터 '배열길이-1'까지
배열의 길이는 int범위의 양의 정수(0도 포함)이어야 한다

배열이름.length

'배열이름.length'를 통해서 배열의 길이에 대한 정보를 얻을 수 있다

배열의 길이를 변경하는 방법:
1. 더 큰 배열을 새로 생성한다
2. 기존 배열의 내용을 새로운 배열에 복사한다

배열의 출력

for문을 통해 출력하는 방법이 있다
'Arrays.toString(배열이름)'메서드를 사용해서 출력하는 방법이 있다

System.arraycopy()를 이용한 배열의 복사

배열의 복사는 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배열

배열의 타입이 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배열에 기능(메서드)를 추가한 것이다

String클래스의 주요 메서드

메서드설명
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는 상대방의 배의 위치를 저장한다

profile
개인공부 블로그입니다. 상업적 용도 X

0개의 댓글