Published 2022. 10. 24. 16:11
 

1. 배열 
    하나의 공간에 여러개의 값을 담을 수 있음
      단, "같은 자료형"의 값으로만 담을 수 있음.

 

1) 배열을 안썼을 경우

-변수 라는 것만 이용하게 되면 => 대량의 데이터들을 보관하고자 할 경우 각각의 변수를 만들어 따로 관리

 int num1 = 0;
 int num2 = 1;
 int num3 = 2;
 int num4 = 3;
 int num5 = 4;

 

-출력시에도 일일이 출력해야함(반복문 활용 불가)
for(int i=1; i<=5; i++)
System.out.println(num+i); (X)
       
 System.out.println(num1);
 System.out.println(num2);
 System.out.println(num3);
 System.out.println(num4);
 System.out.println(num5);

-총 합을 구할때도 일일이 더해줘야함 (반복문 활용 불가)

int sum = num1+num2+num3+num4+num5 ;
 

2)   배열을 사용할 경우 

  1. 배열 선언

 *   자료형 배열명[];
 *   자료형[] 배열명;
       

 2. 배열 할당 (몇개의 값을 보관할 것인지 크기 지정하는 과정 -> 그 갯수만큼의 방이 만들어짐)

  *    배열명 = new 자료형[배열크기];
      ex)  arr = new int[5];
  ** 배열 선언과 동시에 할당 **
       ex)   int[] arr = new int[5];
 

 3. 값 대입 (배열의 특정인덱스에 값을 대입)

   *    배열명[인덱스] = 값;
ex)   arr[0] = 0;
        arr[1] = 1;
        arr[2] = 2;
        arr[3] = 3;
        arr[4] = 4;

 

4 .배열의 장점 : 반복문을 활용할 수 있음

 for(int i=0; i<5;i++) {
              System.out.println(arr[i]);
          }

          System.out.println(arr); //실제 arr에는 "주소값"이라는게 담겨있음

 

5. 배열의 특징
- 배열은 참조변수이다

실제 리터럴 값을 곧바로 담을 수 있는 변수를 일반 변수라고하고
주소값을 담고 있는 변수는 참조 변수 (레퍼런스 변수)라고 표현

- 기본 자료형(boolean,char,byte,short,int,long,float,double)으로 선언된 변수는
     => 실제 리터럴값을 바로 담는 변수 => 일반변수 
- 그 외 자료형(int[], double[], char[], short[], .. String, Scanner, ..)으로 선언된 변수
       => 주소값을 담는 변수 => 참조변수 (레퍼런스 변수)

public void method4() {
         int result = 0;
         double d = 0.0;
         
         int[] arr = null;
         // 참조변수에 기본값은 null (아무것도 참조하고있지 않음)
         // 주소값을 담는 레퍼런스 변수의 기본값은 null
         System.out.println(arr);  // null이 출력
         
         //null인 상태로 메소드 호출하거나 어딘가에 접근하고자할 경우 오류발생
         //=> NullPointerException
         //System.out.println(arr.length);  // java.lang.NullPointerException 오류: null인상태에서 뭔가에 접근했을시 생기는 오류
         //System.out.println(arr[0]); //

6. 배열의 단점 

 한번 지정된 배열의 크기는 변경이 불가
// => 배열의 크기 변경하기 위해서는 새로운 크기의 배열을 다시 만들어야함
int[] arr = new int[5];
arr = new int[7];
System.out.println("arr의 해쉬코드값 : "+arr.hashCode()); // 주소값 변경됨

연결이 끊긴 기존의 배열은 그어디에도 참조되고 있지않은 필요없는 존재가됨(Heap영역에 둥둥떠다님)
  => 일정 시간이 지나면 "가비지컬렉터(GC)"가 알아서 지워줌 
  => 자바에서의 "자동메모리 관리" 특징!
      

배열을 강제로 삭제시키고자할 경우 
=> 연결고리를 끊어주면 됨
  arr = null;

7.  배열 사용예시 

1) 10 크기인 배열을 선언하고 1~10까지의 수를 담기   

public void method3() {
         int[] arr = new int[10];
         
         for(int i=0; i<arr.length;i++) {
             arr[i]=i+1 ;
         }
         for(int i =0; i<arr.length;i++) {
             System.out.println(arr[i]);
         }
         
         System.out.println("배열의 길이 : "+ arr.length);
         System.out.println(arr); //배열의 자료형@ 배열의 주소값의 16진수 형태
         System.out.println(arr.hashCode()); //주소값의 10진수 형태
     }

   2) 5크기인 배열에 1~10까지 숫자의 짝수만 담기 
   
   public void method5() {
         int[] arr = new int[5];
         
         for(int i=0;i<arr.length;i++) {
             arr[i]= 2 * (i+1);
         }
         for(int i=0;i<arr.length;i++) {
             System.out.println(arr[i]);
         }

>> 배열의 크기보다 더 큰 인덱스를 제시할 경우 ArrayIndexOutOfBoundsException  예외 발생 


3) 크기 10 배열 생성하고, 반복문을 활용해서 0~100사이에 발생되는 랜덤값을 arr[x] : xx 형식대로 출력하기

  public void method7() {
       
         int[] arr = new int[10];
        
         for(int i=0; i<arr.length; i++) {
             arr[i] = (int)(Math.random()*100 +1);
         }

         for(int i =0; i<arr.length;i++) {
             System.out.println("arr["+i+"] : "+ arr[i]);
        }  
     }

4) 사용자에게 배열의 크기 입력받고 해당 크기만큼의 문자열 배열 생성 후 사용자에게 과일명을 입력받아 그 값을 인덱스 자리에 대입하여 출력 

public void method8() {
         
        Scanner sc = new Scanner(System.in);
         
        System.out.print("배열의 길이 : ");
        int size = sc.nextInt();
        sc.nextLine();
       
        String[] arr = new String[size];
        
        for(int i =0; i<arr.length;i++) {
            System.out.print("좋아하는 과일명: ");
            arr[i] = sc.nextLine();        
        }
       
         for(int i=0;i<arr.length;i++) {
             System.out.println(arr[i]);
         }
     }

5) 사용자에게 문자열을 입력받은후 배열에 담은후  출력

  public void method9() {
         
         Scanner sc= new Scanner(System.in);
         //1. 문자열 입력받기
         System.out.print("문자열 입력: ");
         String str = sc.nextLine();
           
         //2. char배열 생성해두기(배열의 크기 == 문자열의 길이) //문자열의 길이 str.length()
         char[] arr = new char[str.length()];
         
         //3. 문자열에 각 인덱스별 문자를 char배열의 각 인덱스 자리에 대입
         for(int i =0; i<arr.length;i++) {
             arr[i] = str.charAt(i);
         }
         
         //4. 반복문을 활용해서 0~마지막 인덱스까지 값 출력
         for(int i=0;i<arr.length;i++) {
             System.out.println(arr[i]);
         }
       
     }

6)  크기 3 짜리 배열을 생성하고, 사용자에게 키값을 입력받아 출력, 평균키도 함께 출력하세요 

 public void method10() {
         double[] arr = new double[3];
         Scanner sc = new Scanner(System.in);

        for(int i=0; i<arr.length;i++) {
        System.out.print("키를 입력하세요: ");
        arr[i] = sc.nextDouble();
        }
        
        double sum = 0.0;
        for(int i=0; i<arr.length;i++) {
        System.out.printf("%d번 학생의 키 : %.1fcm\n",i+1,arr[i]);
        sum += arr[i];
        }
       
        System.out.printf("평균키 : %.2f ", sum / arr.length);
       
     }
   

7) 사용자에게 배열의 길이를 입력받아 해당 크기만큼의 배열을 생성하고 1부터 100사의 랜덤값을 발생시켜 해당 인덱스의 값이 홀수인 값들의 총합을 구하기 

 public void method11() {
      
         Scanner sc = new Scanner(System.in);
         System.out.print("배열의 길이 : ");
         
         int[] arr = new int[sc.nextInt()];
         
         // 0~마지막 인덱스까지 매번 1~100사이의 랜덤값 대입
         for(int i=0; i <arr.length;i++) {
          arr [i] = (int)(Math.random()*100+ 1);
         }
         //0번~마지막 인덱스 까지 담긴값 출력, 해당 인덱스의 값이 홀수인 값들의 총 합 구하기
           int sum = 0;
           for(int i=0; i<arr.length;i++) {
               System.out.println(arr[i]);  
               
           if(arr[i] % 2 ==1) {
             sum+=arr[i];
              }
           }
          System.out.println("홀수들의 총 합 : " +sum);
         }
     
}

'JAVA' 카테고리의 다른 글

6_1. 객체란  (0) 2022.10.26
5_2. 배열의 복사(ArrayCopy)  (0) 2022.10.25
4_5. 제어문_ 분기문 continue  (0) 2022.10.21
4_5. 제어문_ 분기문 break  (0) 2022.10.21
4_4. 제어문 _ 반복문 while, do-while  (0) 2022.10.21
복사했습니다!