Back Ground

JAVA - 배열[] 본문

JAVA

JAVA - 배열[]

Back 2017. 2. 15. 21:10

배열이란 ?


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

                 

서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다.

[ 서로 다른 타입의 값들을 하나로 묶으려면 '클래스'를 정의하면 된다. ] 클래스장 가기







배열 선언과 생성

 선언방법

 선언 예


  타입[] 변수이름;

 

 int[] score;

 String[] name;


②  

  타입 변수이름[];

 

int score[];

String name[];


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


두 방법 중

- ①타입을 선호한다 

 : 대괄호가 변수 이름의 일부라기보다는 타입의 일부라고 보기 때문.






[배열의 생성]


배열을 선언한 다음에는 배열을 생성해야한다.

배열을 선언하는 것은 

단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고, 

배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다.


 타입[] 변수이름; 

 배열을 선언 (배열을 다루기 위한 참조변수 선언) 

 변수이름 = new 타입[길이];

 배열을 생성 (실제 저장공간을 생성) 


배열을 생성하기 위해서는 연산자 'new'와 함께 배열을 타입과 길이를 지정해 주어야 한다.


 int[] score; 

 int타입의 배열을 다루기 위한 참조변소 score선언 

 score - new int [5]

 int타입의 값 5개를 저장할 수 있는 배열 


[ 간략하게 한줄로 생성 ]

타입[] 변수이름 = new 타입 [길이];

 배열의 선언과 생성을 동시에.

 int[] score = new int[5] 

 길이가 5인 int배열 


즉,

int[] score; 

 : 배열 참조 변수 score를 선언하였고 공간은 없다.


score = new int[5];

 : 연산자 'new'에 의해서 메모리의 빈 공간 5개의 int형 데이터를 저장할 수 있는 공간이 마련되었다.







[ 배열의 길이와 인덱스 ]


생성된 배열의 각 저장공간을 

'배열의 요소(element) ' 라고 하며,

'배열이름[인덱스]'의 형식으로 배열의 요소에 접근한다.




인덱스(index)는 배열의 요소마다 붙여진 일련번호로 구별


 인덱스(index)의 범위는 0부터 '배열길이-1까지'

 

 




배열 for문으로 사용 방법


 score[0] = 0; 

 score[1] = 10;

 score[2] = 20;

 score[3] = 30;

 score[4] = 40;



   ▶

 for( int i=0; i<5 ; i++){

  score[i] = i * 10;

 }




우선순위 (수식)

int tmp = score[i+1]

수식이 먼저 계산된다.




배열의 초기화

int[] score = new int[]{50, 60, 70, 80, 90 };

배열의 생성과 초기화 동시에


괄호{}안에 저장할 값들을 쉼표로 구분해서 나열하면 되며 괄호[]안에 배열의 길이는 적지 않는다. 

괄호{}안에 적힌 값의 개수에 의해 배열의 길이가 자동적으로 결정되기 때문이다.






new타입[] 생성


 


1) int[] score = new int[] {50, 60, 70, 80, 90};

2) int[] score = {50, 60, 70, 80, 90};   //new int[]를 생략할 수 있음 



new 타입[] 을 생략하여 코드를 더 간단히 할 수도 있다. 


아무래도 생략된 형태의 코드가 더 간단하므로 자주 사용된다. 

( 괄호{}안에 적힌 값의 개수에 의해 배열의 길이가 자동적으로 결정되기 때문 )


- 주의

배열의 선언과 생성을 따로 하는 경우에는 생략할 수 없다.


② 


int[] score;

score = new int[] {50, 60, 70, 80, 90};  -- OK

score ={ 50, 60, 70, 80, 90};               -- 에러. new int[]를 생략할 수 없음

 




③ 메서드


    int add(int[] arr) { /* 내용 생략 */}        -- add메서드

    

    int result = add(new int[] {100, 90, 80, 70, 60});        -- OK

    int result = add({100, 90, 80, 70, 60 });                   -- 에러. new int[]를 생략할 수 없음 

 

매개변수로 int배열을 받는 add메서드가 정의되어 있고 

이 메서드를 호출해야할 경우 역시 'new 타입[]'을 생략할 수 없다




길이가 0인 배열


 int[] score = new int[0];                    -- 길이가 0인 배열

 int[] score = new int[]{};                    -- 길이가 0인 배열

 int[] score = {};                               -- 길이가 0인 배열, new int[]가 생략됨

 

- 괄호{}안에 아무것도 넣지 않은 경우


- 참조변수의 기본 값은 null이지만, 

  배열을 가리키는 참조변수는 null대신 길이가 0인 배열로 초기화하기도 한다.


즉, 모두 길이가 0인 배열을 생성한다.





배열의 출력

배열을 초기화할 때 for문을 사용하듯이,

배열에 저장된 값을 확인할 때도 다음과 같이 for문을 사용하면 된다.


 int[] iArr = {100, 95, 80, 70, 60};


 // 배열의 요소를 순서대로 하나씩 출력

 for(int i=0; i< iArr.length; i++){

    System.out.println(iArr[i]);

 } 

 



더 간단한 방법


 int[] iArr = {100, 95, 80, 70, 60};

 //배열 iArr의 모든 요소를 출력한다. [100, 95, 80, 70, 60] 이 출력된다.

 System.out.println(Arrays.toString(iArr));

 

[ Arrays.toString()을 사용하려면, ' import java.util.*; '를 추가해줘야 한다. ]


'Arrays.toString(배열이름)' 메서드를 사용하는 것이다.


이 메서드는 배열의 모든 요소를 '[첫번째 요소, 두번째 요소, ...]' 와 같은 형식의 문자열로 만들어서 반환한다.

( 이 메서드와 관련된 내용들이 더 있지만 나중에 알아보기로 한다. Array메서드 )





만일 iArr의 값을 바로 출력하면 어떻게 될까?


iArr은 참조변수니까 변수에 저장된 값, 

즉 '배열의 주소'가 출력될 것으로 생각했다면 지금까지 잘 이해하고 있는 것이다.


그러나 이러한 예상과는 달리 '타입@주소'의 형식으로 출력된다.


'[I'는 1차원 int배열이라는 의미이고, 

'@'뒤에 나오는 16진수는 배열의 주소인데 실제 주소가 아닌 내부 주소이다 




 //배열을 가리키는 참조변수 iArr의 값을 출력한다.

  System.out.println(iArr);    --  [I@15db9742

 


public static void main(String[] args) {

int[] iArr = {100,95,80,70,60}; 

String[] iArr2 = {"1","2"};

String iArr3 = "a";

System.out.println(Arrays.toString(iArr));

System.out.println(iArr);

System.out.println(iArr2);

System.out.println(iArr3);


[100, 95, 80, 70, 60]

[I@15db9742

[Ljava.lang.String;@6d06d69c






다차원배열 



2차원배열, 즉 다차원(多[많을 다 ] 次[버금 차] 元[으뜸 원], multi-dimensional)배열도 선언해서 사용할 수 있다.

메모리의 용량이 허용하는 한, 차원의 제한은 없지만, 주로 1,2 차원 배열이 사용되고 3차원 이상의 배열은 잘 사용되지 않는다.


2차원 배열 선언 방법


선언 방법 

 선언 예

 타입[][] 변수이름;

int[][] score; 

 타입 변수이름[][];

int score[][];

 타입[] 변수이름[];

int[] score[]; 

(3차원이상의 고차원 배열의 선언은 대괄호[]의 개수를 차원의 수 만큼 추가해 주기만 하면된다.)


 int[][] score = new int[4][3];

 4행 3열의 2차원 배열을 생성한다.




 

 「 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

 3열 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 

 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ㄱ 

 「

int 

int 

int 

 |

int 

int 

int 

 4행

int 

int 

int 

 ㄴ

int 

int 

int 









그림출처 : http://sessionk.tistory.com/182





[ 예제 ]



1
2
3
4
5
6
7
8
9
10
11
12
13
14
//2차원 배열 선언 과 동시에 데이터 저장(초기화)
int array1[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};
int array2[4][3]={1,2,3,4,5};
//2차원 배열 array1의 데이터 출력
 system.out.println("%d'%d'%dn",array1[0][0],array1[0][1],array1[0][2]); //0행 출력
 system.out.println("%d'%d'%dn",array1[1][0],array1[1][1],array1[1][2]); //1행 출력
 system.out.println("%d'%d'%dn",array1[2][0],array1[2][1],array1[2][2]); //2행 출력
 system.out.println("%d'%d'%dn",array1[3][0],array1[3][1],array1[3][2]); //3행 출력
 
//2차원 배열 array2의 데이터 출력
 system.out.println("%d'%d'%dn",array2[0][0],array2[0][1],array2[0][2]); //0행 출력
 system.out.println("%d'%d'%dn",array2[1][0],array2[1][1],array2[1][2]); //1행 출력
 system.out.println("%d'%d'%dn",array2[2][0],array2[2][1],array2[2][2]); //2행 출력
 system.out.println("%d'%d'%dn",array2[3][0],array2[3][1],array2[3][2]); //3행 출력 
cs


 




[행 단위로 2차원 배열의 선언과 동시 초기화]












[예제]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 //    2차원 배열의 선언    
   int    array[2][2];                
   int i,j; 
 //    2차원 배열에 데이터 입력
  Scanner scan = new Scanner(System.in);
   for(i=0;i<2;i++
   { 
      for(j=0; j<2; j++
      { 
         system.out.println("정수를 입력하세요: "); 
         scan.nextInt("%d",    &array[i][j]);    
      } 
   }
 
//2차원 배열에 데이터 출력
   for(i=0;i<2;i++
   { 
      for(j=0; j<2; j++)    
      { 
      system.out.println("%3d",array[i][j]);    
      } 
      system.out.println("\n"); 
   } 
   return 0
}
cs


출처 : http://ropas.snu.ac.kr/~gslee/lecture-slides/c2011-01/20110513-01.pdf


'JAVA' 카테고리의 다른 글

ModelAndView  (0) 2017.06.01
JVM 메모리 구조  (1) 2017.03.09
GSON - java 객체(object)를 JSON 표현식으로 변환하는 API  (0) 2016.12.20
오버라이딩/오버로딩  (1) 2016.07.10
toString이란?  (1) 2016.07.10
Comments