자바

JAVA STEP 20. Array

IT의 큰손 2023. 2. 13. 17:31
728x90

★ 배열 (Array)

  • 자료형 중 하나 > 데이터를 저장하는 구조 + 규칙
  • 참조형
  • 집합 > 집합 자료형 > 데이터를 여러개 저장할 수 있는 자료형
  • 같은 자료형을 저장하는 집합 > 같은 자료형 변수들의 집합
  • *** 방들은 연속으로 생성
  • 동일한 성격 + 동일한 자료형 > 데이터가 여러개 인 경우 > 배열을 사용!
  • 자바의 식별자는 조합해서 만들어낼 수 없다.
  • 자바의 식별자는 한번에 만들어야 한다.
  • 기본 양식
    • int [] ns = new int[3];
    • ns[0] = 100;
    • ns[1] = 200;
    • ns[2] = 300;
  • 기본 양식 2
    • int [] ns = {100, 200, 300}

 

예제 1) 요구사항 : 학생 3명 > 국어 점수 > 총점, 평균 (배열을 사용하지 않았을 경우)

  • 소스코드
  •  
		int kor1;
		int kor2;
		int kor3;
		//+297
		int kor300;
		
		kor1 = 100;
		kor2 = 90;
		kor3 = 80;
		//+297
		
		
		
		int sum = kor1 + kor2 + kor3; //+ kor4 + kor5...+ kor300
		
		double avg = sum/3.0; //3.0 > 300.0
		
		System.out.printf("총점 : %d점\n", sum);
		System.out.printf("평균 : %.1f\n", avg);

 

예제 2) 요구사항 학생 3명 > 국어 점수 > 총점, 평균 (배열을 사용하였을 경우)

  • 소스코드
  •  
public static void m2() {
		//요구사항] 학생 3명 > 국어 점수 > 총점, 평균
		//추가사항] 학생 수 증가 > 300명
		
		//배열 선언하기(생성하기)
		
		//- 자료형[] 배열명 = new 자료형[길이];
		
		// 자료형(int[]) 변수명(kors);
//		int n; //n의 자료형은? > int입니다.
//		int[] kors; //kors의 자료형은? > int[]입니다.(int 배열 입니다.)
//		
//		kors = new int[3]; //int 변수를 3개 만들어라!!
		
		//int[] kors = new int[3];
		int[] kors = new int[300];
		
		//변수 > 필드(field) >>> 프로퍼티(property), 속성(attribute)
		//kors 배열의 길이 (kors.length) == 방의 개수
		System.out.println(kors.length);
		
		//배열의 방에 접근하기(데이터 입출력)
		//int[] = int 따라서 에러발생
		//kors = 100; //Type mismatch: cannot convert from int(값형) to int[](참조형)
		
		//int = int
		kors[0] = 100;
		kors[1] = 90;
		kors[2] = 80;
		//.. +297 
		kors[299] = 60;
		
		//int sum = kors[0] + kors[1] + kors[2]; //+ kors[3] + ... + kors[299]
		
		int sum = 0; //누적변수
		
		for(int i = 0; i<=kors.length-1; i++) {
			
			//i: 0 > 1 > 2
			//System.out.println(kors[i]);
			sum += kors[i];
		}
		
		
		double avg = (double)sum / kors.length;
		
		System.out.printf("총점 : %d점\n", sum);
		System.out.printf("평균 : %.1f\n", avg);
		
	}//m2()

 

예제 3) 배열 사용 시 주의점

  • 컴파일 에러 x, 런타임 에러 o
  • int [] nums = new int[10];
  • ex) nums[10] = 110; //없는 방번호
  • 이유 : nums에 해당하는 배열은 10개의 방. 즉, (0~9에 해당하는 방번호를 갖고있기 때문)

 

예제 4) 각 자료형의 배열

  • 정수형 배열(byte, short, int, long)
  •  
		//정수 배열(byte, short, int, long)
		byte[] list1 = new byte[5];	//*****
		list1[0] = 10;
		System.out.println(list1[0]);
  • 실수 배열(float, double)
  •  
		//실수 배열(float, double)
		double[] list2 = new double[5];
		list2[0] = 3.14;
		System.out.println(list2[0]);
  • 문자 배열(char)
  •  
		//문자 배열(char)
		char[] list3 = new char[5];
		list3[0] = 'A';
		System.out.println(list3[0]);
  • 논리 배열(boolean)
  •  
		//논리 배열(boolean)
		boolean[] list4 = new boolean[5];
		list4[0] = true;
		list4[1] = false;
		System.out.println(list4[0]);
		System.out.println(list4[1]);
  • 참조형 배열
  •  
		String[] list5 = new String[5];
		list5[0] = "홍길동";
		System.out.println(list5[0]);
  • 캘린더형 배열
  •  
		Calendar[] list6 = new Calendar[5]; //변수 * 5개
		for(int i=0; i<list6.length; i++) {
       	 list6[i] = Calendar.getInstance();
       	 } //값 삽입

 

예제 5) 성적표를 생성하라 (10명, 국어,영어,수학 : 난수를 이용하여 점수)

  • 소스코드
  •  
public static void m5() {
		
		//성적표
		//- 10명
		//- 국어, 영어, 수학 > 난수
		
		//데이터 저장 > 배열 
		int size = 10;
		int sum = 0;
		
		String[] name = new String[size]; //학생명
		int[] kor = new int[size];		//국어점수
		int[] eng = new int[size];		//영어점수
		int[] math = new int[size];		//수학점수
		
		//데이터 확보
		name[0] = "홍길동";
		name[1] = "아무개";
		name[2] = "유재석";
		name[3] = "임성빈";
		name[4] = "유찬욱";
		name[5] = "김한빈";
		name[6] = "유정목";
		name[7] = "이채린";
		name[8] = "차지니";
		name[9] = "송재경";
		
		for(int i=0; i<size; i++) {
			
			//60~100
			//0~40
			kor[i] = (int)(Math.random() * 41) + 60;
			eng[i] = (int)(Math.random() * 41) + 60;
			math[i] = (int)(Math.random() * 41) + 60;
			
		}
		
		//점수 계산 > 총점, 평균
		//1. 총점배열, 평균배열 > 미리 계산 > 저장
		//2. 출력할 때 즉시 계산
		
		//화면 설계
		System.out.println("=======================================================");
		System.out.println("               		성적표");
		System.out.println("=======================================================");
		
		System.out.println("[이름]\t[국어]\t[영어]\t[수학]\t[총점]\t[평균]");
		
		for (int i=0; i<size; i++) {
		System.out.printf("%s\t%4d\t%4d\t%4d\t%4d\t%4.1f\n"
							,name[i]
							,kor[i]
							,eng[i]
							,math[i]
							,kor[i]+eng[i]+math[i]
							,(kor[i]+eng[i]+math[i])/3.0
							);
			sum += kor[i]+eng[i]+math[i]; //모든 학생의 총점 누적
		}
		
		System.out.println("------------------------------------------------------");
		System.out.printf("반평균\t\t\t\t\t%4.1f\n", sum / 3.0 /10);
	}//m5()
  • 실행결과
  •  

예제 5 실행결과

 

예제 6) 배열의 길이 문제

  • 메모리의 공간은 할당되면 절대로 늘리거나 줄일 수 없다.
  • 소스코드
  •  
public static void m6() {
		
		//*** 메모리의 공간은 할당되면 절대로 늘리거나 줄일 수 없다. 
		
		int[] nums = new int[3]; //int x 3 = 4Byte x 3 = 12byte
		
		nums[0] = 10;
		nums[1] = 20;
		nums[2] = 30;
		
		//사용하다보니.. 어라? 배열의 길이가 조금 부족함;; 길이 5개!!
		// > 불가능!!!
		// > ********* 미리 예측!!! > 사용할 배열의 길이가 충분한지!!
		
		//학생 성적 처리 프로그램
		// > 교장선생님 > 학생 수 몇명? > 280명(지금) > 250~320
		int[] kors = new int [350]; //280!!!
		
		
	}//m6()

 

예제 7) 배열의 복사

  • 배열 복사 (= 모든 참조형 복사)
  • 값형(원시형) 끼리의 복사
  •  
//값형(원시형)끼리의 복사
		int a = 10;		//원본
		int b;			//복사본
		
		b = a;			//원본 수정
//원본을 수정해도 복사본에는 영향을 주지 않는다. // Side Effect가 없다.
		a = 20; //원본 수정
  • 배열의 복사
  •  
		int[] nums = new int[3];
		
		nums[0] = 10;
		nums[1] = 20;
		nums[2] = 30;
		
		int[] copy;
		
		//int[] = int[] 
		//복사 > nums와 copy가 한몸~ > 배열을 복사를 하게 되면 그 값이 복사되는 것이 아닌 힙에 위치한 해당 공간의 주소를 복사하는 것.[참조형 자료형]
		copy = nums;
		
		// 원본을 수정하면 복사본도 수정이 된다. > Side Effenct가 있다.
		nums[0] = 100;
		copy[2] = 300;
  • 배열의 복사 종류
  • 1. 얕은 복사, Shallow Copy
    • 주소값 복사
    • Side Effect 발생(원본 <-> 수정본)
    • 기본 동작
  • 2. 깊은 복사, Deep Copy
    • 실제 값 복사
    • Side Effect 발생 안함
  •  
		int[] nums = new int[3];
		
		nums[0] = 10;
		nums[1] = 10;
		nums[2] = 10;
		
		//int[] copy;
		
		//참조형끼리 복사, 참조형 변수끼리 복사
		//얕은 복사
		
		//int[] = int[] > 참조형 복사 > 주소값 복사 > 얕은 복사
		//copy = nums;
		
		int[] copy = new int[3];
		
		//int = int > 값형 복사 > 값 복사 > 깊은복사
		copy[0] = nums[0];
		copy[1] = nums[1];
		copy[2] = nums[2];
		
		for (int i=0; i<nums.length; i++) {
			copy[i] = nums[i];
		}
		nums[0] = 100;
		
		System.out.println(copy[0]);

 

예제 8) 유틸리티 클래스

  • Arrays 클래스
  • 배열과 관련된 작업(기능)들을 미리 제공해주는 클래스
  • 유틸리티 클래스를 이용하지 않고 배열의 상태를 보려면 하는 행동
  •  
		//Arrays : 제일 효과적인 방법
		//Arrays.toString()
		//- 데이터를 가지는 공간내부의 상태를 문자열로 반환 > 행동 > 덤프(dump)
		System.out.println(Arrays.toString(nums));
		System.out.println();
		
		//nums > copy 깊은 복사
		int[] copy;
		
		//깊은 복사
		copy = Arrays.copyOfRange(nums, 0, nums.length);
		
		nums[0] = 100;
		
		System.out.println(Arrays.toString(nums));
		System.out.println(Arrays.toString(copy));
  • 유틸리티 클래스를 이용하여 배열의 상태를 보면
  •  
		int[] nums = new int[3];
		
		nums[0] = 10;
		nums[1] = 20;
		nums[2] = 30;
		
		//배열의 상태?? > 배열안에 데이터가 잘 들어있는지?
		System.out.println(nums[0]);
		System.out.println(nums[1]);
		System.out.println(nums[2]);
		
		for(int i=0; i<nums.length; i++) {
			System.out.println(nums[i]);
		}
		System.out.println();

 

예제 9 ) 배열 자동 초기화

  • 배열은 생성 직후에 개발자가 아무것도 안해도 자동으로 값이 초기화
  • 생성자를 통해서 자동 초기화를 함.
  • 초기화규칙(***)
    • 1. 정수배열 > 0
    • 2. 실수배열 > 0.0
    • 3. 문자배열 > \0
    • 4. 논리배열 > false
    • 5. 참조형배열 > null
  •  
		double[] nums2 = new double[3];
		System.out.println(Arrays.toString(nums2));
		
		char[] list1 = new char[3];
		System.out.println(Arrays.toString(list1));
		
		boolean[] list2 = new boolean[3];
		System.out.println(Arrays.toString(list2));
		
		String[] list3 = new String[3];
		System.out.println(Arrays.toString(list3));

 

예제 10) 배열 자동 초기화 > 초기화 리스트

  •  
int[] nums1 = new int[5];
System.out.println(Arrays.toString(nums1));
  • 직접 초기화
  •  
nums1[0] = 96;
nums1[1] = 79;
nums1[2] = 99;
nums1[3] = 85;
nums1[4] = 65;
System.out.println(Arrays.toString(nums1));
  • 초기화 리스트
  •  
//초기화 리스트
int[] nums2 = new int[] {96, 79, 99, 85, 65};
System.out.println(Arrays.toString(nums2));
  • 가장 많이 사용하는 방법
  •  
int[] nums3 = {96, 79,99,85, 65}; //가장 많이 사용하는 방법
System.out.println(Arrays.toString(nums3));
String[] name1 = new String[3];
name1[0] = "홍길동";
name1[1] = "아무개";
name1[2] = "하하하";
		
String[] name2 = {"홍길동", "아무개", "하하하"};
		
System.out.println(Arrays.toString(name1));
System.out.println(Arrays.toString(name2));

 

예제 11) 정렬 기능

  • 데이터 집합 or 배열 > 정렬
  • 크기 비교 후 > 재배치
  • 1. 오름차순
    • 숫자 : 작은수 > 큰수
    • 문자(열) : 문자코드값 순으로
    • 날짜시간 : 과거 > 미래
  • 2. 내림차순
    • 숫자 : 큰수 > 작은수
    • 문자(열) : 문자코드값 역순으로
    • 날짜시간 : 미래 > 과거
  • 정렬 방법
    • 1. 직접 구현 > 정렬 알고리즘
    • 2. JDK 기능 사용
  • ex) 버블 정렬
  •  
		int [] nums = { 5, 3, 1, 4, 2};
		
		System.out.println(Arrays.toString(nums));
		System.out.println();
		
		for(int i=0; i<nums.length-1; i++) { //0, 1, 2, 3 > 배열의 길이 -1 만큼 사이클 돔
			
			
			//i(0), j(0, 1, 2, 3)
			//i(1), j(0, 1, 2)
			//i(2), j(0, 1)
			//i(3), j(0)
			for (int j=0; j<nums.length-i-1; j++) {
				
				if(nums[j] > nums[j+1]) {
					//여기 부등호를 < 변경하게 되면 오름차순 정렬로 됨
					//swap
					int temp = nums[j];
					nums[j] = nums[j+1];
					nums[j+1] = temp;
					
				}
				
			}
			System.out.printf("%d Cycle\n", i);
			System.out.println(Arrays.toString(nums));
		}
		System.out.print("result : ");
		System.out.println(Arrays.toString(nums));
  • 실행결과
  •  

버블정렬 실행결과

 

예제 12) 문자열 정렬 + 버블 정렬

  • String s1 = "A";
    String s2 = "B";
  • System.out.println(s1>s2); 불가능
  • 문자형으로 하나하나 변환 후 비교
  •  
		String s1 = "홍길동입니다";
		String s2 = "홍길동";
		
		System.out.println(compare(s1, s2));
		
		String[] names = {
				"홍길동",
				"아무개",
				"테스트",
				"유재석",
				"김철수",
				"나영희",
				"고길동"
		};
		
		for (int i=0; i<names.length-1; i++) {
			
			
			for (int j=0; j<names.length-1-i; j++) {
				
				//if(compare(names[j], names[j+1]) > 0) {
				//String형을 비교해주는 메소드 첫번째 비교 대상자.compareTo(두번째 비교 대상자)
				if(names[j].compareTo(names[j+1]) > 0) {
				
					String temp = names[j];
					names[j] = names[j+1];
					names[j+1] = temp;
					
				}
				
			}
		}
		
		System.out.println(Arrays.toString(names));
	}//m13()
	
	//두 문자열의 문자코드값을 비교하는 로직
	//1 : 앞이 큼
	//-1 : 뒤가 큼
	//0 : 동일 
	public static int compare(String s1, String s2) {
		
		int length = s1.length() > s2.length() ? s2.length() : s1.length();
		
		for(int i=0; i<length; i++) {
			
			char c1 = s1.charAt(i); //'홍'
			char c2 = s2.charAt(i); //'아'
			
			if(c1> c2) {
				return 1;
				
			} else if(c1<c2) {
				return -1;
			} 
			
			
		}
		if (s1.length() > s2.length()) {
			return 1;
		}else if(s1.length() < s2.length()) {
			return -1;
		}
		return 0;
	}//compare()

 

예제 13) Calendar 정렬

    •  getInstance를 통해 시간을 받아온다
    • add를 통하여 자료들의 날짜를 분산시킨다.
    • 버블 정렬을 적용하여 정렬
    •  
public static void m14() {
		
		Calendar c1 = Calendar.getInstance();
		c1.add(Calendar.DATE, -1); //어제
		
		Calendar c2 = Calendar.getInstance();//오늘
		
		System.out.println(c1.getTimeInMillis() > c2.getTimeInMillis());
		
		System.out.println(c1.compareTo(c2)); //누가 더 큰지 비교할 수 있음.
		System.out.println(c2.compareTo(c1));
		System.out.println(c1.compareTo(c1));
		
		Calendar[] list = new Calendar[5];
		
		list[0] = Calendar.getInstance();
		list[0].add(Calendar.DATE, -2);
		
		list[1] = Calendar.getInstance();
		list[1].add(Calendar.DATE, 1);
		
		list[2] = Calendar.getInstance();
		list[2].add(Calendar.DATE, -7);
		
		list[3] = Calendar.getInstance();
		list[3].add(Calendar.DATE, 3);
		
		list[4] = Calendar.getInstance();
		
		
		//오름차순 정렬
		for (int i=0; i<list.length-1; i++) {
		
			for(int j=0; j<list.length-1-i; j++) {
				
				if(list[j].compareTo(list[j+1]) > 0) {
					
					Calendar temp = list[j];
					list[j] = list[j+1];
					list[j+1] = temp;
				}
			}
		}
		
		
		for(int i=0; i<list.length; i++) {
			
			System.out.printf("%tF\n", list[i]);
		}
	
	}//m14()
  • 실행결과
  •  

Calendar 정렬 결과

 

예제 14) 자바의 정렬 기능을 사용

  • 자바에는 내장함수로 Arrays.sort라는 Quik 정렬 알고리즘을 제공해주고있다.
  •  
public static void m15() {
		
		//자바의 정렬 기능 사용
		
		int[] nums = { 5, 3, 1, 4, 2};
		
		Arrays.sort(nums); //정렬 > Quik 정렬 알고리즘
		//Arrays.reverse(nums); > 다른언어에서는 내림차순을 사용할때 사용하는데 자바에서는 제공 안함.
		
		System.out.println(Arrays.toString(nums));
		
		String[] names = {
				"홍길동",
				"아무개",
				"테스트",
				"유재석",
				"김철수",
				"나영희",
				"고길동"
		};
		
		Arrays.sort(names);
		
		System.out.println(Arrays.toString(names));
		
		
		Calendar[] list = new Calendar[5];
		
		list[0] = Calendar.getInstance();
		list[0].add(Calendar.DATE, -2);
		
		list[1] = Calendar.getInstance();
		list[1].add(Calendar.DATE, 1);
		
		list[2] = Calendar.getInstance();
		list[2].add(Calendar.DATE, -7);
		
		list[3] = Calendar.getInstance();
		list[3].add(Calendar.DATE, 3);
		
		list[4] = Calendar.getInstance();
		
		Arrays.sort(list);
		
		for(int i=0; i<list.length; i++) {
			
			System.out.printf("%tF\n", list[i]);
		}
	}
  • 실행결과
  •  

Arrays.sort를 이용한 정렬

 

예제 15) 직접 요구사항 만들고 작성하여 보기

  • 요구사항 : 배열문을 사용하여 사용자에게 5명에 대한 국어,영어,수학점수를 입력받아 성적표를 만들어라
  •  
public class day5_practice {

	public static void main(String[] args) {
		//요구사항 : 배열문을 사용하여 사용자에게 5명에 대한  국어,영어,수학점수를 입력받아 성적표를 만들어라
		
		Scanner scan = new Scanner(System.in);
		
		String [] name = new String [5];
		
		int [] kor = new int[5];
		int [] eng = new int[5];
		int [] math = new int[5];
		int [] sum = new int[5];
		double [] avg = new double[5];
		
		for(int i=0; i<name.length; i++) {
		System.out.print("사용자의 이름을 입력하세요 : ");
		name[i] = scan.next();
		System.out.print("국어점수를 입력하세요 : ");
		kor[i] = scan.nextInt();
		System.out.print("영어점수를 입력하세요 : ");
		eng[i] = scan.nextInt();
		System.out.print("수학점수를 입력하세요 : ");
		math[i] = scan.nextInt();
		sum[i] = kor[i] + eng[i] + math[i];
		avg[i] = sum[i]/3.0;
		}
		System.out.println("===================================================");
		System.out.println("                      성적표");
		System.out.println("===================================================");
		System.out.printf("이름\t국어점수\t영어점수\t수학점수\t합산점수\t평균\n");
		
		for(int i=0; i<name.length; i++) {
			System.out.printf("%s\t%3d\t%3d\t%3d\t%3d\t%.1f\n",name[i],kor[i],eng[i],math[i],sum[i],avg[i]);
		}
	}

}
  • 실행결과
  •  

예제 15 실행결과

 

728x90