이안의 평일코딩

JAVA의 정석 12일차 - 배열 본문

Back-end/Java

JAVA의 정석 12일차 - 배열

이안92 2020. 6. 30. 12:52
반응형

2020.06.30(화)

 

1. 배열 : 

   1) 같은 타입의 여러개의 변수를 묶어서 관리하는 프로그램

      ======

      double[] a{100, 10.5, ....} //큰 데이터형에는 작은 데이터형 들어가도 됨. double <- int 100

      숫자 (정수, 실수, 문자), 문자열

   2) 한개의 변수명을 이용해서 -> 여러개의 변수를 제어

      ============= 구분자 : 번호로 구분을 한다

                                            ======= 인덱스번호

                                            인덱스번호 => 0번부터 시작

       예) int[] arr = {10, 20, 30, 40, 50} => 크게 늘릴 수 있다

 

           메모리 주소이용해 접근하는 변수 => 참조변수(배열, 클래스)

                      ** 인덱스번호는 중간에 없는 번호는 없다 (순차적) => for

                              arr[0]  arr[1]  arr[2]  arr[3]  arr[4]

           ==arr==       ===========================

              100             10     20     30      40      50

           ======      |====|====|====|====|==========

                           100    104    108    112    116

                           100+0

                                 100+1  100+2  100+3  100+4

 

     ==> 배열 선언 방식

           ===========

            데이터형[] 배열명;

                          ===== 변수의 명칭법

            데이터형 배열명[];

 

            예)

                메모리 공간(기억공간) 미리 만든 다음에 나중에 값을 채우는 방법

                영화제목을 10개 모아서 관리

                String[] title = new String[10]; => null

                10명의 학생의 학점을 관리

                char[] hakjum = new char[10]; => '\0'

                10명의 학생의 총점을 관리

                int[] total = new int[10];

                => new를 사용하면 메모리 공간이 생성 => 0값으로 초기화 된다

                

                 double => 0.0

                 float => 0.0f

                 long => 0L

 

            예) 직접 값을 주입하는 방법

                 int[] arr={10, 20, 30, 40, 50}

 

                 int a;

                 a=10

                 int a=10;

 

           => 주의점

                1) 배열의 크기를 초과하면 error : ArrayIndexOutOfBoundsException

                    =============

                    n개 ==> 0~n-1 ==> 만약에 갯수를 모르는 경우 : length

                2) 제어문을 이용시에는 -> 주로 for문을 이용해서 처리

                    ===========> for에서 사용하는 초기값 => 0

// 5명에 대한 점수 => 저장, 총점, 평균

int a = 80;
int b = 90;
int c = 75;
int d = 90;
int e = 85;

int total = a+b+c+d+e;
double avg = total/5.0;

System.out.println("총점:"+total);
System.out.println("평균:"+avg);

//배열
int[] score={80, 90, 75, 90, 85};
// 80 => score[0]
// 90 => score[1]
int total2 = 0;
double avg2 = 0.0;
for (int i = 0; i<score.length; i++) {
	total2+=score[i];
    }
    avg2=total2/5.0;
    
    System.out.println("총점:"+total2);
	System.out.println("평균:"+avg2);

 

2. 배열 선언

   데이터형[] 배열명;

=> 배열 초기화 (메모리안에 값을 주입)

    예) int[] arr={10, 20, 30, 40, 50}; // 선언과 동시에 초기값

        int[] arr=new int[5]; // 메모리 공간만 제작 => 나중에 값을 채운다

        int[] arr; // 선언

        arr[0] = 10;

        arr[1] = 20;

        ....

     =======================

     활용 => 제어문 (for, while)

 

     for -> 제어

     for-each -> 출력 담당

 

// for문

// 출력
String[] names = {"홍길동", "박문수", "이순신", "춘향이", "심청이"};

// length => 배열에 저장된 갯수
for(int i=0; i<names.length; i++) {
	// names[1]="";
    // 데이터값을 변경이 가능
    System.out.println(names[i]); // names[0]~names[4]
    }
    
    
// for-each
// 데이터 자체를 가지고 오므로 변경이 불가능 -> 화면에 출력만 담당

for(String name:names) {
	System.out.println(name);
    }

 

3. 배열의 값 주입

 ========

 1) 직접 주입

 2) 사용자가 입력한 값 -> Scanner

 3) 난수이용

 ==============

 4) File읽기

 5) Web에서 읽어서 주입

 6) 오라클 

 ==============

 배열 ==> 0번부터 입력

       ==> 맨뒤부터 입력하는 방식

 

import java.util.Arrays;
public class 배열의값주입 {
	public static void main(String[] args) {
int[] arr={30, 20, 50, 10, 40}; // => 10 20 30 40 50
Arrays.sort(arr); //올림차순만 가능. (최신 내림차순)
for(int a:arr){
	System.out.print(a+" ");
    }
  }
 }

 

// 3명의 학생 => 성적관리 => 국어, 영어, 수학 => 1.총점, 2.평균, 3.학점, 4.등수

import java.util.*;
public class 배열의값주입 {
	public static void main(String[] args) {
    int[] kor = new int[3]; //kor1, kor2, kor3
    int[] eng = new int[3];
    int[] math = new int[3];
    
    int[] total = new int[3];
    double[] avg = new double[3];
    char[] hakjum = new char[3];
    int[] rank = new int[3];
    
    // Scanner가 for문안에 있으면 계속 안에서 메모리 누적됨
    // new => 새로운 공간이 생성 => 
    Scanner scan = new Scanner(System.in);
    
    for(int i=0; i<3; i++) {
    	System.out.printf("%d번째 국어점수 입력:",i+1);
        kor[i]=scan.nextInt();
        
        System.out.printf("%d번째 영어점수 입력:",i+1);
        eng[i]=scan.nextInt();
        
        System.out.printf("%d번째 수학점수 입력:",i+1);
        math[i]=scan.nextInt();
        
        total[i] = kor[i] + eng[i] + math[i]; //math[0] -> 일반변수
        avg[i] = total[i]/3.0;
    	}
        
   // 학점 계산
    for(int i=0; i<3; i++) {
    	char c = 'A';
        switch(total[i]/30) {
        case 10:
        case 9:
				c = 'A';
                break;
        case 8:
                c = 'B';
                break;
        case 7:
                c = 'C';
                break;
        case 6:
                c = 'D';
                break;
        default:
                c = 'F';
                break;
    	}
        hakjum[i]=c;
    }
        /*
        * %-5d
        * 80000 -> 왼쪽
        * %5d
        * 00080 -> 오른쪽
        * %7d
        * 0000240
        *
        * 한글 => 1글자 (2byte)
        * 000000
        * ==
        * 국
        */
        
   // 등수 계산
   	/*
    * 240 230 250 rank=1
    * 	rank=1+1+1 => 3
    * rank=1+1 => 2
    *
    * 240 230 250
    *
    */
    
    for(int i=0; i<3; i++) {
    		rank[i]=1;
            for(int j=0; j<3; j++) {
            	if(total[i]<total[j]) {
                	rank[i]++;
                 }
            }
    }
        
        // 등록된 점수를 출력
    System.out.printf("%-5s%-5s%-5s%-6s%-6s%-5s%-5s\n",
   				"국어","영어","수학","총점","평균","학점","등수");
    for(int i=0; i<3; i++) {
    	System.out.printf("%-5d%-5d%-5d%-7d%-7.2f%-5c%-5d\n",
        				kor[i],eng[i],math[i],total[i],avg[i],hakjum[i],rank[i]);
        }
    }
}

4. 연습문제

 1)최대최소값

  임의의 정수 -> 5개를 저장한후에

  최대값, 최소값 구하는 프로그램

public class 최대최소값 {
	public static void main(String[] args) {
	// 정수 5개를 저장하는 공간을 만든다 -> 배열
	int[] arr = new int[5]; // 0 0 0 0 0
	// 5개의 값을 변경
	for(int i=0; i<5; i++) {
	// 시작 = 0 .... <
		arr[i] = (int)(Math.random()*100)+1;
		 //         2        1             3
		 //      0.0~99.0 -> 정수변환 => 0~99 => 1~100
	}
		    
	// 출력
	// int i => index가 아니라 => 실제 저장된 값을 대입
		    
	for(int i:arr) {
		System.out.print(i+" ");
	}
		    
	System.out.println("\n===== 결과 =====");
	// 최소값 저장 공간. 가장 큰 값으로 초기화. 0부터 시작하면 더 작은 값 x
	// int min=100;
	// 최대값을 저장 공간. 가장 작은 값으로 초기화. 100부터 시작하면 더 큰 값 x
	// int max=0;
		    
	int min = arr[0];
	int max = arr[0];
		    
	// 최소값 & 최대값
	for (int i=0; i<5; i++) {
		 if(min>arr[i]) {
		     min=arr[i];
		 }
		 else if(max<arr[i]) {
		     max=arr[i];
		 }
	}
	System.out.println("최소값:"+min);
	System.out.println("최대값:"+max);    
 }
}

 

 2) 난수발생 (로또)

Math.random() => 임의로 컴퓨터 추출 (난수)

                         ===============

                            0.0 ~ 0.99

                           => 로또 1~45 => (int)(Math.random*45)+1;

 

// 로또 번호 저장하는 공간 ==> 6
int [] lotto = new int[6];
for (int i=0; i<6; i++) {
	lotto[i] = (int)(Math.random()*45)+1;
    }

//출력
for(int i:lotto) { // i는 index가 아닌 lotto 배열에서 값을 하나 씩 가져옴
	System.out.print(i+" ");
    }

 

 3) 정렬하기

// DESC(내림차순) 50 40 30 20 10

// ASC(올림차순)   10 20 30 40 50

  (1) 선택정렬 ==> 왼쪽 고정 ==> 맨마지막까지 검색

     20 10 40 50 30

    ==

         ==

     10 20

     ==    ==

     10     40

     ==        ==

     10         50

     ==             ==

     10              30

     ============= 1 round  4바퀴

     10 20 40 50 30

        == ==

         20 40

        ==     ==

         20     50

        ==         ==

         20         30

    ============== 2 round  3바퀴

     10 20 40 50 30

            == ==

             40 50

            ==     ==

             30      40

    ============== 3 round  2바퀴

     10 20 30 50 40

                 == ==

                 40 50

    ============== 4 round  1바퀴

     10 20 30 40 50

                      ===> n ==> n-1

/*

* 20 30 10 40 50

* ==

* i=0 j=1

* 20 30 10 40 50

*     ==

*     i=1 j=2

*/

int[] arr={30,10,40,20,50}; // ASC => DESC
System.out.println("정렬전:");
for (int i:arr) {
	System.out.print(i+" ");
    }
System.out.println("\n오름차순정렬후:");

// 선택 정렬
/*int a = 10;
*int b = 20;
*    ==> a = 20, b = 10
*    a = b; ==> a=20
*    b = a; ==> b=20
*    
*    int temp = a;
*    a=b;
*     ==
*      20 => a=20;
*    b=temp;
*      =====
*      10 => b=10;
*/
        
for (int i=0; i<arr.length-1; i++) {
	for (int j=i+1; j<arr.length; j++) {
    	if(arr[i]>arr[j]) {
        	int temp=arr[i];
      	 	arr[i]=arr[j];
       		arr[j]=temp;
        }
    }
}

for (int i:arr) {
	System.out.print(i+" ");
    }
    
System.out.println("\n내림차순정렬후:");
		
for (int i=0; i<arr.length-1; i++) {
	for (int j=i+1; j<arr.length; j++) {
		if(arr[i]<arr[j]) {
		   int temp=arr[i];
		   arr[i]=arr[j];
		   arr[j]=temp;
		   }
	}
}

for (int i:arr) {
	System.out.print(i+" ");
}

 (2) 버블정렬

     20 10  40  50  30

    == ==

     10 20

         == ==

         20  40

              == ==

              40  50

                   == ==

                   30  50

    ============= 1

    10  20  40  30  50

   == ==

    10 20

        ==  ==

        20   40

              ==  ==

              30   40

    ============= 2

    10  20  30  40  50

    == ==

    10  20

         == ==

         20  30

    ============= 3

    10  20  30  40  50

    == ==

    10  20

   ============== 4

    10  20  30  40  50

int[] arr = {30,20,40,50,10};
/*
* i  j
* 0. 4 i+j=4 -> j=4-i
*                 => arr.length-1-i
* 1. 3
* 2. 2
* 3. 1
*
* => 추천
*/

System.out.println("정렬전:");
for(int i : arr) {
	System.out.print(i+" ");
    }
    
System.out.println("\n정렬후:");
    
//정렬 => bubble sort

for(int i=0; i<arr.length-1; i++) {
	for(int j=0; j<arr.length-1-i; j++) {
    	if(arr[j]>arr[j+1]) {
            int temp=arr[j];
            arr[j]=arr[j+1];
            arr[j+1]=temp;
        }
    }
}
for(int i:arr) {
	System.out.print(i+" ");
    }

 

 4) 빈도수계산

int[] arr = new int[10]; // 1~9
int[] count = new int[10];
// 초기값
for(int i=0; i<arr.length; i++) {
	arr[i]=(int)(Math.random()*10);
    }
// 출력 => 빈도수 계산할 데이터
for(int i:arr) {
	System.out.print(i);
    }
    
System.out.println("\n===== 결과 =====");
for(int i = 0; i<arr.length; i++) {
	count[arr[i]]++;
    }
    // count[0] ~ count[9] ==> 0
    // count[6]=1 count[7]=1 count[8]=1
    // count[6]=1 -> count[6]=2
    
//출력

for(int i = 0; i<arr.length; i++) {
	if(count[i]!=0) { // 갯수가 0이면 제외함
    System.out.println(i+"갯수"+count[i]);
    }
}

 

5. 문자열

//String[] title = new String[1900];
//String[] actor = new String[1900];

// String 에서 제공하는 기능 (메소드)
String[] title={
			"#살아있다",
		    "결백",
		    "사라진 시간",
		    "침입자",
		    "온워드: 단 하루의 기적",
		    "야구소녀",
		    "반도",
		    "엔딩스 비기닝스",
		    "배트맨 비긴즈",
		    "위대한 쇼맨"
};
String[] actor={
			"유아인(오준우), 박신혜(김유빈)",
		    "신혜선(정인), 배종옥(화자), 허준호(추시장)",
		    "조진웅(박형구), 배수빈(김수혁), 정해균(정해균)",
		    "송지효(유진), 김무열(서진)",
		    "톰 홀랜드(이안 라이트풋 목소리), 크리스 프랫",
		    "이주영(주수인), 이준혁(최진태)",
		    "강동원, 이정현",
		    "쉐일린 우들리(다프네), 제이미 도넌(잭)",
		    "크리스찬 베일(브루스 웨인/배트맨), 마이클 케인(알프레드)",
		    "휴 잭맨(P.T. 바넘), 잭 에프론(필립 칼라일)"
};

System.out.println("===== 영화 인기 Top 10 =====");
for (int i = 0; i<title.length; i++) {
		System.out.println("영화명:"+title[i]);
		System.out.println("출연:"+actor[i]);
		System.out.println("========================");
}
반응형
Comments