ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 배열
    개발/자바JAVA 2024. 1. 23. 18:20

      > 같은 자료형의 변수를 하나의 묶음으로 다루는 것.

      > 배열은 저장된 값마다 인덱스 번호가 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
Designed by Tistory.