-
> 같은 자료형의 변수를 하나의 묶음으로 다루는 것.
> 배열은 저장된 값마다 인덱스 번호가 0부터 시작하여 설정됨.
> 변수 : "해당 자료형의 값 하나만" 을 담을 수 있는 개념.
> 배열 : "같은 자료형의 값 여러개" 을 담을 수 있는 개념.
int[ ] a = new int[ 3 ]; // int형의 값이 들어갈 수 있는 방을 3개 만들겠다는 뜻임.
방[0], [1], [2] 을 만든 것이다(인덱스)
인덱스는 항상 0부터 시작한다.
배열의크기 == 3, 마지막 인덱스==2
항상 배열이든 문자열이든 크기 ==n, 마지막인덱스 == n-1 이다.
int a[ ] = new int[ 3]; 도 똑같다. [ ] 의 위치는 자료형이나 배열명 뒤 어느곳에 있든 상관없다.
●그렇다면 배열을 왜 써야 할까??
> 만약 기록해야하는 변수의 갯수가 100개, 1000개로 늘어난다면??
> 변수를 사용한다면, 필요한 만큼 다 만들어야하고, 반복문도 활용이 불가하다.
> 그래서 배열을 쓴다.
● 배열 사용방법
1. 배열 선언
< = [ 표현법 ]
2. 배열 할당 (공간 확보)
> 이 배열의 몇개의 값들을 보관할건지 배열의 크기를 지정해주는 과정
> 할당 과정에서 지정한 갯수만큼 방이 만들어짐
[표현법]
> 배열명 = new 자료형[배열의 크기];
int[] arr = new int[4]; 배열을 할당하게 되면
>배열은 참조변수로 Heap 영역에 할당되며 배열 공간의 주소를 저장한다.
>배열 공간의 주소를 이용해 인덱스를 참조하는 방식으로 값을 처리한다.
※new 구문의 역할 : 메모리 heap 영역에 일정 공간을 확보해 두겠다 라는 뜻임.
3. 배열 초기화( 객체를 선언하고 값을 '최초'로 할당 )(값대입)
>인덱스를 이용한 초기화
>선언과 동시에 초기화
> for문을 이용한 초기화
※
i를 출력하면 10이 나온다.
iArr을 출력해도 10이 나올까??
아니다.
배열을 선언하면 힙 영역의 주소값이 할당된다.
그래서 호출하면 주소값이 나오게 된다.
iArr 변수에 주소값이 들어있는 것이다.
>0을 대입한 적도 없는데 0, 0.0이 나온다.
>각각의 인덱스에 값을 대입하지 않았음에도 불구하고
iArr 배열의 각 방에는 0, 0.0이 담겨있다.!!
--> 메모리의 heap 영역은 절대 "빈 공간" 으로 존재할 수 없다는 특징을 가지기 때문.
new 구문으로 메모리 heap영역에 공간을 할당하는 순간, 자동으로 JVM이 각 방에 " 기본값" 으로 초기화(int = 0, double = 0.0) 해준다.
>반복문을 이용해서 출력해보자
배열을 선언해주고, 5를 할당 해주었다.
for문을 돌릴때, 배열의 크기가 다르면 오류가난다.
그래서 배열명.length;로 배열의 크기로 범위를 지정해 주어야 한다!!!
만약 범위를 벗어난다면
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 5 at com.kh.array.A_Array.method3(A_Array.java:45) at com.kh.run.ArrayRun.main(ArrayRun.java:11)
이런 오류를 볼 수 있다. 범위를 벗어났다고 한다.
● 배열의 단점
> 배열의 할당 시 한번 지정한 배열의 크기는 변경 "불가"!!
> 배열의 크기를 변경하고자 한다면 어쩔수 없이 새로운 배열을 다시 만들어야 함.
--> 이런경우 할당만 다시 하는 거임.
stack영역부터 만드는 것이 아니라.
heap영역에서 할당만 다시 해주는 것임.
>메모리 공간은 항상 고유한 주소값을 갖고 있음
> 기존에 생성되었던 주소와 절대 겹치지 않는다.
기존에 참고하고 있던 연결이 끊기고 새로운 곳을 참조함.
연결이 끊어진 기존 배열은 heap영역에 남아있다가 일정시간이 지나면 가비지컬렉터(GC) 가 삭제시켜준다.
> 현재 연결되어있는 고리를 끊고자 한다면?
arr = null; 을 쓰면 된다.
> NullPointerException 오류 발생함 . =-> 찾아갈 주소가 없다고 하는거임.
>연습
배열에 들어있는 값의 누적합 구하기
public void method6() { // 배열에 들어있는 값의 누적합 구하기 int[] arr = new int[5]; // 아직 값이 없다. 00000 // 각 방마다 값을 넣어준다. arr[0] = 1; arr[1] = 2; arr[2] = 3; arr[3] = 4; arr[4] = 5; int sum = 0; for (int i = 0; i < arr.length; i++) { sum = sum + arr[i]; } System.out.println("배열 의 합은 : " + sum); } }
>연습2
배열에 각 랜덤한 수를 발생시켜서 대입하기.
public void method7() { // 배열에 각 랜덤한 수를 발생시켜서 대입해보기 int[] arr = new int[10]; for (int i = 0; i < arr.length; i++) { // 51~100사이의 정수 랜덤값 발생시킨 후 배열에 바로 대입 arr[i] = (int) ((Math.random() * 50) + 51); } // 출력용 for문 for (int i = 0; i < arr.length; i++) { System.out.printf("arr[%d] : %d \n", i, arr[i]); } }
>연습 3
arr[0]=2;
arr[1]=4;
arr[2]=6;
arr[3]=8;
arr[4]=10; 위 값을 반복문을 이용해서 대입해보기.public void method8() { /* * 위 값을 반복문을 이용해서 대입해보기 * arr[0]=2; * arr[1]=4; * arr[2]=6; * arr[3]=8; * arr[4]=10; */ int[] arr = new int[5]; for (int i = 0; i < arr.length; i++) { arr[i] = (i + 1) * 2; System.out.println("arr[" + i + "] :" + arr[i]); } }
>연습4
public void method9() { //3명의 사용자에게 매번 키의 정보를 입력받아 배열에 담아두고 // 3명의 키를 각각 출력 // 3명의 키의 총 합계, 평균을 출력하셈 Scanner sc = new Scanner(System.in); System.out.print("1번 키를 입력하세요 : "); double h1 = sc.nextDouble(); sc.nextLine(); System.out.print("2번 키를 입력하세요 : "); double h2 = sc.nextDouble(); sc.nextLine(); System.out.print("3번 키를 입력하세요 : "); double h3 = sc.nextDouble(); sc.nextLine(); double[] arrh = new double[3]; arrh[0]=h1; arrh[1]=h2; arrh[2]=h3; double sum=0.0; for(int i=0; i < arrh.length; i++) { System.out.println( (i+1) + "번째 사람 키 :" + arrh[i]); sum += arrh[i]; } System.out.println("3명 키의 총 합계 : " + sum); System.out.println("3명 키의 평균 : " + (sum/3) ); } }
>연습 5
사용자에게 문자열을 하나 입력받은 후
각각의 문자들을 다 쪼개서 char타입의 배열에 옮겨담기
public void method10() { // 사용자에게 문자열을 하나 입력받은 후 // 각각의 문자들을 다 쪼개서 char타입의 배열에 옮겨담기 Scanner sc = new Scanner(System.in); System.out.print("문자를 입력하세요 : "); String str = sc.nextLine(); //c배열 생성(입력받은 문자 길이만큼) char[] c = new char[str.length()]; for (int i = 0; i < str.length(); i++) { //입력받은 문자를 배열에 각각 넣기 c[i] = str.charAt(i); System.out.println((i + 1) + "번째 문자 :" + c[i]); } }
>연습 6
사용자로 부터 좋아하는 과일의 갯수를 입력받고
그 갯수만큼 반복을 돌려서 과일명을 입력받아 문자열 배열에 대입
public void method11() { //사용자로 부터 좋아하는 과일의 갯수를 입력받고 // 그 갯수만큼 반복을 돌려서 과일명을 입력받아 문자열 배열에 대입 Scanner sc = new Scanner(System.in); System.out.print("좋아하는 과일의 갯수 : "); int num = sc.nextInt(); sc.nextLine(); String[] fruit = new String[num]; for(int i=0; i<num; i++) { System.out.print("좋아하는 과일명" +(i+1) + " :" ); String str = sc.nextLine(); fruit[i] = str; } for(int i=0; i<num; i++) { System.out.println(fruit[i]); } }
'개발 > 자바JAVA' 카테고리의 다른 글
객체 지향 언어 (1) 2024.01.25 배열 복사 (0) 2024.01.24 반복문(while문), break문, continue문 (0) 2024.01.23 반복문(for문, while문) (0) 2024.01.22 제어문 > 조건문(if, switch문) (0) 2024.01.19