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()
- 실행결과
예제 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()
- 실행결과
예제 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]);
}
}
- 실행결과
예제 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]);
}
}
}
- 실행결과
728x90
'자바' 카테고리의 다른 글
JAVA STEP 22. String 문자열 (0) | 2023.02.15 |
---|---|
JAVA STEP 21. Array 예제 모음 (0) | 2023.02.14 |
JAVA STEP 19. for문 예제모음 (0) | 2023.02.10 |
JAVA STEP 18. if문 & for문 예제 모음 (0) | 2023.02.09 |
JAVA STEP 17. for문 (0) | 2023.02.09 |