ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 10. 배열
    개발자 수업/Java 2021. 10. 6. 18:48

    1. 배열(Array)이란?
        1) 자료를 순차적으로 한꺼번에 관리하는 방법
        2) 동일한 자료형의 순차적 자료구조
        3) 배열의 순서는 0부터 시작
        4) 자바에서는 객체 배열을 구현한 ArrayList를 많이 활용함

    2. 배열 선언과 초기화
        1) 배열 선언하기
            int[] arr = new int[10];
            int arr[] = new int[10];
        2) 배열 초기화하기
            - 배열은 선언과 동시에 자료형에 따라 초기화 됨 (정수는 0, 실수는 0.0, 객체는 null)
            - 필요에 따라 초기값을 지정할 수 있음

            int[] numbers = new int[] {10, 20, 30};     // 개수 생략해야 함

            int[] numbers = {10, 20, 30};               // new int[] 생략 가능

            int[] ids;
            ids = new int[] {10, 20, 30};               // 선언 후 배열을 생성하는 경우 new int[] 생략할 수 없음
        3) 배열 사용하기
            - [] 인덱스 연산자 활용 : 메모리 위치를 연산하여 찾아줌

    /*
     * 배열(Array)
     *  - 똑같은 데이터 타입의 여러 변수를 하나로 묶어 처리하는 자료구조
     *  - 많은 데이터 양을 다룰 때 유용함
     *  - 컬렉션 프레임워크의 기초가 됨
     *  - 배열의 각 요소들은 메모리에서 연속적으로 배치됨
     */
    
    public class ArrayTest {
    	public static void main(String[] args) {
    		
    		// score는 참조변수
    		int[] score = null;
    		// 메모리 할당이 안 되어 있는데 값을 대입하고 있기 때문에 에러
    		// score = {100, 200};
    		
    		// score는 5개의 메모리 공간을 heap에 생성함(20바이트)
    		score = new int[5];
    		
    		System.out.println("score의 주소값 : " + score);
    		
    		/*
    		 * 배열이름.length : 배열의 크기를 알려줌
    		 * 아래에서는 5가 됨, 5번 반복하면서 배열의 값을 출력해줌
    		 */
    		
    		for(int i=0; i<score.length; i++) {
    			System.out.println("score[" + i + "] = " + score[i]);
    		}
    		System.out.println();
    		
    		/*
    		 * score[0]는 변수와 동일함
    		 * score는 주소임
    		 * [] 안에 들어가는 숫자를 인덱스(첨자)라고 함
    		 */
    		
    		score[0] = 100;
    		for(int i=0; i<score.length; i++) {
    			System.out.println("score[" + i + "] = " + score[i]);
    		}
    		System.out.println();
    		
    		/*
    		 * score[0] = 10
    		 * score[1] = 11
    		 * score[2] = 12
    		 * score[3] = 13
    		 * score[4] = 14
    		 */
    		
    		for(int i=0; i<score.length; i++) {
    			score[i] = 10 + i;
    			System.out.println("score[" + i + "] = " + score[i]);
    		}
    	}
    }
    public class ArrayTest02 {
    	public static void main(String[] args) {
    		
    		int sum = 0;
    		double avg = 0.0;
    		
    		// int[] score = {100, 200, 300};
    		int[] score = new int[] {100, 90, 80, 50, 70};
    		System.out.println("배열의 크기 : " + score.length);
    		
    		/*
    		 * 총점 :
    		 * 평균 :
    		 */
    		
    		for(int i=0; i<score.length; i++) {
    			sum += score[i];
    		}
    		System.out.println("총점 : " + sum);
    		
    		avg = sum/score.length;
    		System.out.println("평균 : " + avg);
    	}
    }
    public class ArrayTest03 {
    	public static void main(String[] args) {
    		// 40바이트
    		int[] arr = new int[10];
    		for(int i=0; i<arr.length; i++) {
    			System.out.println("score[" + i + "] = " + arr[i]);
    		}
    		System.out.println();
    		
    		for(int i=0; i<arr.length; i++) {
    			// 범위 1 ~ 10까지의 난수를 대입
    			arr[i] = (int)(Math.random()*10) + 1;
    		}
    		
    		for(int i=0; i<arr.length; i++) {
    			System.out.println("score[" + i + "] = " + arr[i]);
    		}
    		System.out.println();
    		
    		// 배열의 값들을 출력(보기좋게)
    		for(int i=0; i<arr.length; i++) {
    			if(i != 9) {
    				System.out.print(arr[i] + ", ");
    			}
    			else {
    				System.out.print(arr[i]);
    			}
    		}
    	}
    }
    import java.util.Arrays;
    
    public class ArrayTest03 {
    	public static void main(String[] args) {
    		// 40바이트
    		int[] arr = new int[10];
    		for(int i=0; i<arr.length; i++) {
    			System.out.println("score[" + i + "] = " + arr[i]);
    		}
    		System.out.println();
    		
    		for(int i=0; i<arr.length; i++) {
    			// 범위 1 ~ 10까지의 난수를 대입
    			arr[i] = (int)(Math.random()*10) + 1;
    		}
    		
    		for(int i=0; i<arr.length; i++) {
    			System.out.println("score[" + i + "] = " + arr[i]);
    		}
    		System.out.println();
    		
    		// 배열의 값들을 출력(보기좋게)
    		for(int i=0; i<arr.length; i++) {
    			if(i != 9) {
    				System.out.print(arr[i] + ", ");
    			}
    			else {
    				System.out.print(arr[i]);
    			}
    		}
    		System.out.println();
    		
    		// Arrays 클래스는 배열을 조작하기 쉽게 만들어 놓은 유틸리티 클래스 (static 메서드인 toString 활용) 
    		System.out.println(Arrays.toString(arr));
    		
    		// 6바이트가 힙에 생성
    		char[] chArr = new char[] {'a', 'b', 'c'};
    		System.out.println(Arrays.toString(chArr));
    		
    		String[] str = new String[10];
    		boolean[] bool = new boolean[10];
    		
    		// 주소값 출력
    		System.out.println(arr);	
    		System.out.println(arr.toString());
    		System.out.println(str);
    		System.out.println(bool);
    		
    		// char 타입만 주소를 출력하려면 toString() 호출해야 함
    		System.out.println(chArr);				// abc
    		System.out.println(chArr.toString());	// 주소값
    	}
    }
    import java.util.Arrays;
    
    public class ArrayTest04 {
    	public static void main(String[] args) {
    		int[] ball = new int[5];
    		
    		for(int i=0; i<ball.length; i++) {
    			ball[i] = (int)(Math.random()*45)+1;
    			
    		}
    		System.out.println("정렬 전");
    		for(int i=0; i<ball.length; i++) {
    			System.out.print(ball[i] + " ");
    		}
    		
    		System.out.println();
    		
    		for(int i=0; i<ball.length; i++) {
    			for(int j=0; j<ball.length-1; j++) {
    				
    				// 버블정렬 (오름차순)
    				if(ball[j] > ball[j+1]) {
    					int temp = ball[j];
    					ball[j] = ball[j+1];
    					ball[j+1] = temp;
    				}
    			}
    		}
    		
    		System.out.println("정렬 후");
    //		for(int i=0; i<ball.length; i++) {
    //			System.out.print(ball[i] + " ");
    //		}
    		
    		System.out.println(Arrays.toString(ball));
    	}
    }

     

    3. 2차원 배열 사용하기
        1) []의 개수가 차원의 수를 의미함
        2) 타입[][] 배열이름;   <-- 권장
           타입 배열이름[][];

           int[][] arr = new int[5][5];     // 5행 5열 2차원 배열 생성 => 100바이트 생성

        3) 마지막 인덱스가 [n-1][m-1]의 공식이 성립함
        4) 2차원 배열에서는 2차원 배열도 주소 값이며 1차원 배열도 주소 값임
        5) 가변배열(열이 서로 다른 배열)

    4. 향상된 for문 사용하기
        1) 배열의 n개 요소를 0부터 n-1까지 순차적으로 순회할 때 간단하게 사용할 수 있음
        2) for(변수 : 배열) {

            }

     

    public class TwoDArrayTest {
    	public static void main(String[] args) {
    		/*
    		 * [][] 대괄호의 개수가 곧 차원을 의미함
    		 * 2차원 배열을 선언과 동시에 초기화함
    		 */
    		int[][] score = new int[][] {
    			{100, 100, 100},
    			{50, 50, 50},
    			{10, 20, 30},
    			{60, 20, 40}
    		};
    		
    		// 2차원 배열의 값을 읽고 쓰기 위해서는 더블 루프가 필요함
    		for(int i=0; i<score.length; i++) {
    			for(int j=0; j<score[i].length; j++) {
    				System.out.println(score[i][j]);
    			}
    		}
    		
    		System.out.println("2차원 배열 주소 : " + score);
    		System.out.println("2차원 배열 크기 : " + score.length);
    		
    		for(int i=0; i<score.length; i++) {
    			System.out.println("1차원 배열 주소 : " + score[i]);
    			System.out.println("1차원 배열 크기 : " + score[i].length);
    		}
    		
    		score[0][0] = 999;
    		System.out.println(score[0][0]);
    	
    		
    		/*
    		 * 향상된 for문 (jdk 1.5)
    		 * collection framework, 배열 객체에 접근할 때 유용하게 사용하는 방법
    		 * for(가져올 타입 : 가져올 장소) 
    		 */
    		int sum = 0;
    		for(int[] temp : score) {
    			for(int i : temp) {
    				sum += i;
    			}
    		}
    		System.out.println("2자원 배열 score 값 합계 : " + sum);
    	}
    }
    public class TwoDArrayTest02 {
    	public static void main(String[] args) {
    		
    		int[][] score = new int[][] {
    			{100, 70, 50},
    			{70, 50, 30},
    			{50, 80, 70},
    			{55, 85, 77},
    			{100, 80, 50}
    		};
    		
    		int korTotal = 0;		// 국어 총점
    		int engTotal = 0;		// 영어 총점
    		int mathTotal = 0; 		// 수학 총점
    		int totalSum = 0;		// 개인별 총점의 합계
    		double totalAvg = 0.0;	// 개인별 평균의 평균
    		
    		System.out.println("번호\t국어\t영어\t수학\t총점\t평균");
    		System.out.println("----------------------------------------------");
    		
    		for(int i=0; i<score.length; i++) {
    			int sum = 0;		// 개인별 총점
    			double avg = 0;		// 개인별 평균
    			
    			korTotal += score[i][0];
    			engTotal += score[i][1];
    			mathTotal += score[i][2];
    			
    			System.out.print(i+1);
    			for(int j=0; j<score[i].length; j++) {
    				sum += score[i][j];	// 개인별 총점
    				System.out.print("\t" + score[i][j]);
    			}
    			
    			totalSum += sum;	// 개인별 총점의 합계
    			
    			avg = (double)sum / score[i].length;	// 개인별 평균
    			
    			totalAvg += avg;						// 개인별 평균의 합
    		
    			System.out.println("\t" + sum + "\t" + avg + "\n");		// 개인별 총점, 평균
    		}
    		
    		totalAvg /= score.length;		// 개인별 평균의 평균
    		System.out.printf("총점\t%d\t%d\t%d\t%d\t%.2f",
    						  korTotal, engTotal, mathTotal, totalSum, totalAvg)
    	}
    }



    5. 객체 배열 사용하기
        1) 기본 자료형 배열은 선언과 동시에 배열의 크기만큼 메모리가 할당됨
        2) 객체 배열은 요소가 되는 객체의 주소가 들어갈(4바이트) 메모리만 할당되고(null) 각 요소 객체는 생성하여 저장해야 함

    public class TwoDArrayTest02 {
    	public static void main(String[] args) {
    		
    		int[][] score = new int[][] {
    			{100, 70, 50},
    			{70, 50, 30},
    			{50, 80, 70},
    			{55, 85, 77},
    			{100, 80, 50}
    		};
    		
    		int korTotal = 0;		// 국어 총점
    		int engTotal = 0;		// 영어 총점
    		int mathTotal = 0; 		// 수학 총점
    		int totalSum = 0;		// 개인별 총점의 합계
    		double totalAvg = 0.0;	// 개인별 평균의 평균
    		
    		System.out.println("번호\t국어\t영어\t수학\t총점\t평균");
    		System.out.println("----------------------------------------------");
    		
    		for(int i=0; i<score.length; i++) {
    			int sum = 0;		// 개인별 총점
    			double avg = 0;		// 개인별 평균
    			
    			korTotal += score[i][0];
    			engTotal += score[i][1];
    			mathTotal += score[i][2];
    			
    			System.out.print(i+1);
    			for(int j=0; j<score[i].length; j++) {
    				sum += score[i][j];	// 개인별 총점
    				System.out.print("\t" + score[i][j]);
    			}
    			
    			totalSum += sum;	// 개인별 총점의 합계
    			
    			avg = (double)sum / score[i].length;	// 개인별 평균
    			
    			totalAvg += avg;						// 개인별 평균의 합
    		
    			System.out.println("\t" + sum + "\t" + avg + "\n");		// 개인별 총점, 평균
    		}
    		
    		totalAvg /= score.length;		// 개인별 평균의 평균
    		System.out.printf("총점\t%d\t%d\t%d\t%d\t%.2f",
    						  korTotal, engTotal, mathTotal, totalSum, totalAvg);
    		
    		
    	}
    }
    
    
    
    
    public class BookTest {
    	public static void main(String[] args) {
    		Book[] book = new Book[5];
    		
    		book[0] = new Book("도커에서 어쩌구 저쩌구", "앨튼");
    		book[1] = new Book("단위 테스트", "블라디미르");
    		book[2] = new Book("클라우드 컴퓨텅", " 토마스");
    		book[3] = new Book("자바스크립트","어쩌구");
    		book[4] = new Book("타입스크립트","저쩌구");
    		// 5개 넘어가면 에러나지만 ArrayList는 계속 늘릴 수 있음
    		
    		for(int i=0; i<book.length; i++) {
    			//System.out.println(book[i]);
    			book[i].showInfo();
    		}
    	}
    }
    public class MainArguTest {
    	public static void main(String[] args) {
    		
    		if(args.length != 3) {
    			System.out.println("프로그램 사용법");
    			System.out.println("아이디입력 패스워드입력 오늘날짜");
    		}
    		
    		String str1 = args[0];
    		String str2 = args[1];
    		String str3 = args[2];
    		
    		System.out.println("아이디 : " + str1);
    		System.out.println("패스워드 : " + str2);
    		System.out.println("오늘 날짜 : " + str3);
    		
    	}
    }

    '개발자 수업 > Java' 카테고리의 다른 글

    과제1 - TwoDArrayTest03  (0) 2021.10.08
    11. 컬렉션 프레임워크  (0) 2021.10.07
    9. 객체지향프로그램3  (0) 2021.10.06
    8. 객체지향프로그래밍2  (0) 2021.10.05
    6. Review / 7.객체지향프로그램  (0) 2021.10.04

    댓글