Pre-Onboarding 6일차

최재하·2022년 11월 12일
0

배열

배열은 같은 타입의 데이터를 연속된 공간에 나열하고 각 데이터에 인덱스(index)를 부여해놓은 자료구조.

  • 배열의 각 인덱스는 각 항목의 데이터를 읽거나 저장하는데 사용되고 0부터 시작한다.
  • 많은양의 데이터를 다룰 때 유용하다.
  • 생성된 배열은 길이를 늘리거나 줄일 수 없다.

배열 선언

배열을 선언하는 방법은 두 가지 있다.

1. 타입[] 변수;		2. 타입 변수[];

타입은 배열에 저장될 데이터의 타입(int, double, String)이다.

배열 생성

값 목록을 이용하거나 new연산자를 이용하는 방법이 있다. 배열안에 넣어줄 값이 이미 있으면

타입[] 변수 = {0, 1, 2, ...};

이렇게 생성이 가능하다. 주의할 점은 이미 배열변수를 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열생성이 불가능하다.

타입 [] 변수;
변수 = {0, 1, ,2, ...} //컴파일에러발생

변수를 미리 선언한 후 나중에 값을 넣어줘야할때는 new연산자를 사용해 값을 넣어주면된다.

변수 = new 타입[]{0, 1, 2, ...}; 

배열 길이

배열의 길이란 배열에 저장할 수 있는 값의 개수를 말한다
코드에서 배열의 길이를 얻으려면 length를 사용하면 된다.

int[] intArray = {1, 2, 3};
int num = intArray.length; // num은3

다차원 배열

값들이 행과 열로 구성된 배열을 2차원 배열이라고 한다. 2차원 배열은 수학의 행렬과 비슷하다 자바는 2차원 배열을 중첩배열 방식으로 구현한다 2x3 행렬을 만들기 위해 다음 코드를 사용한다.

int[][] scores = new int[2][3];

해당 배열의 길이를 같이 구해보면 다음과 같다.

scores.length;     //2(scores의 길이)
scores[0].length;  //3(scores[0]의 길이)
scores[1].length;  //3(scores[1]의 길이)
  • 예시

    int[][] scores = {{95, 80}, {92, 96}};
    scores배열의 길이는 2이다. scores[0]은 {95, 80}배열을 참조 scores[1]은 {92, 96}배열을 참조한다. 위 코드에서 생성된 scores배열의 항목 값은 다음과 같다.
    int score = scores[0][0]; //95
     int score = scores[0][1]; //80
     int score = scores[1][0]; //92
     int score = scores[1][1]; //96

객체를 참조하는 배열

기본타입 배열은 각 항목에 직접 값을 가지고 있지만 참조타입 배열은 각 항목에 객체의 번지를 가지고 있다 예를 들어 String은 클래스라서 String[]배열은 각 항목에 문자열이 아니라 String객체의 번지를 가지고 있다. 즉 String[]배열은 객체를 참조하게 된다.


따라서 String[]배열의 항목도 String변수랑 동일하게 취급된다.
String[]배열 항목 간에 문자열을 비교하기 위해서는 ==연산자 대신 equals()메소드를 사용한다. ==은 결국 객체의 번지를 비교하기 때문에 문자열 비교에는 사용할 수 없다.

String[] strArray = new String[3];
strArray[0] = "java";
strArray[1] = "java";
strArray[2] = new String("java");

strArray[0] == strArray[1]      //true(같은객체참조)
strArray[0] == strArray[2]      //false(다른객체참조)
strArray[0].equals(strArray[2]) //true(문자열이동일)

배열복사

배열은 한 번 생성하면 크기를 변경할 수 없다. 때문에 더 많은 공간이 필요하다면 더 큰배열을 생성하고 이전 배열로부터 항목 값들을 복사해야한다 배열값을 복사하는 방법은 2가지다.

    1. for문으로 배열복사

      int[] oldIntArray = {1, 2, 3};
       int[] newIntArray = new int[5];
      
       for(int i = 0; i < oldIntArray.length; i++){
           newIntArray[i] = oldIntArray[i];
       }
      
       for(int i = 0; i < newIntArray.length; i++){
           System.out.print(newIntArray[i] + ", ");
       }  //출력결과 : 1, 2, 3, 0, 0

      복사되지 않은 newIntArray[3],newIntArray[4]항목은 초기값인 0으로 유지된다.
      String의 경우에는 초기값인 null이 유지된다.
      참조타입이 복사되면 복사되는 값이 객체의 번지이므로 복사하기전과 참조하는 객체가 동일.

    1. System.arraycopy( )메소드를 이용하여 배열 복사
      System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
    • src : 원본배열

    • srcPos : 원본배열 시작 인덱스

    • dest : 새 배열

    • destPos : 새 배열 시작 인덱스

    • length : 복사할 개수

      String[] oldStrArray = {"java", "array", "copy"};
       String[] newStrArray = new String[5];
      
       System.arraycopy( oldStrArray, 0, newStrArray, 0, oldStrArray.length);
      
       for(int i = 0; i < newStrArray.length; i++){
           System.out.print(newStrArray[i] + ", ");
       }

향상된 for문

자바는 배열이나 컬렉션을 더 쉽게 처리하기 위해 향상된 for문을 제공한다.
향상된 for문은 루프 카운터 변수와 증감식을 사용하지 않는다.

for( 타입변수 : 배열 ){
	실행문;
}
    1. for문이 실행될때 배열에 가져올 값이 있으면 해당 값을 타입변수에 저장한다.
    1. 실행문을 실행하고 다시 루프를 돌아 배열에서 가져올 값이 있는지 확인.
    1. 만약 가져올 값이 있으면 가져올 값이 없어질때까지 반복.

따라서 for문의 반복 횟수는 배열의 항목 수가 됩니다.

열거타입

열거타입은 한정된 값인 열거상수중에서 하나의 상수를 저장하는 타입이다.
한정된 값의 예로는 월,화,수,목,금,토,일 이라는 7개의 값을 가지는 요일이 있다.

  • 열거타입 선언

    열거타입을 선언 하려면 이름을 정하고 소스파일(.java)을 생성해야한다.
    열거타입 이름은 관례적으로 첫 글자는 대문자 나머지는 소문자로 구성한다. 만약 여러단어로 구성된 이름이면 각 단어의 첫글자는 대문자로 정한다.
    Week.java
     MemberGrade.java
    선언은 public enum으로한다.
    public enum 열거타입이름 { ... }
  • 열거상수 선언

    열거상수는 열거타입의 값으로 사용된다 열거상수는 모두 대문자로 작성한다.
    public enum Week{MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};
    열거상수가 여러단어로 구성될 경우에는 언더바_로 연결해준다.

열거타입 변수

열거타입을 선언하는방법은 열거타입 변수;이다.

Week today;
Week reservationDay;

열거타입을 변수를 선언했으면 다음과 같이 열거상수를 저장할 수 있다.

Week today = Week.SUNDAY;

열거타입 변수도 참조타입이기 때문에 null값도 저장가능하다.

Week birthday = null;

0개의 댓글