총점과 평균 구하기
public static void main(String[] args) {
int[] score = new int[] {100, 88, 100, 100, 90};
int i, sum=0;
double avg=0;
for(i=0; i<score.length; i++)
{
sum+=score[i];
}
avg = (double)sum/score.length;
System.out.printf("총점 : %d \n",sum);
System.out.printf("평균 : %.1f",avg);
}
총점 : 478 평균 : 95.6 |
cnt++를 넣을 필요 없는 이유는 이미 우리는 배열의 크기를 알고있다!
score.length가 배열의 크기 라서 나누면 됨!
(double)을 넣으면 타입 변형이 되어서 나누어진다
printf에서 출력할 때 소수자리는 %.1f
int[] score = {100, 88, 100, 100, 90};
선언할 때 이렇게 줄일 수 있다.
public static void main(String[] args) {
//각 5개 층에 기화 0을 넣어주면서, arr에 배열 시작 주소를 복사한다.
int[] arr = new int[5];
int i;
//값을 넣어준다.
for(i=0; i<arr.length; i++)
{
arr[i] = i + 1;
}
System.out.println("[변경전]");
System.out.printf("arr.lenth : %d \n", arr.length);
for(i=0; i<arr.length; i++)
{
System.out.printf("arr[%d] : %d \n", i, arr[i]);
}
//별도의 두 배 사이즈(10) 배열을 새로 생성
//참조형 변수는 자바가 알아서 초기화(0)를 해준다.
// = 연산자를 통해서 위처럼 할당을 받는다. 주소값을 가짐
int[] tmp = new int[arr.length * 2];
//배열의 값 복사. 원래는 메소드를 지원해준다.
//arr.length까지 하는 이유는 복사를 해야하니까
for(i=0; i<arr.length; i++)
{
tmp[i] = arr[i];
//내용 복사
}
//복사한 것을 넣어준다.
// tmp가 가지고 있는 시작 주소값을 arr에 뒤집어 씌운다.
// 그래서 arr과 tmp는 같은 주소값을 갖고 있는다.
arr = tmp;
System.out.println();
System.out.println("[변경후]");
System.out.printf("arr.lenth : %d \n", arr.length);
for(i=0; i<arr.length; i++)
{
System.out.printf("arr[%d] : %d \n", i, arr[i]);
}
}
[변경전] arr.lenth : 5 arr[0] : 1 arr[1] : 2 arr[2] : 3 arr[3] : 4 arr[4] : 5 [변경후] arr.lenth : 10 arr[0] : 1 arr[1] : 2 arr[2] : 3 arr[3] : 4 arr[4] : 5 arr[5] : 0 arr[6] : 0 arr[7] : 0 arr[8] : 0 arr[9] : 0 |
int[] tmp = new int[arr.length * 2];
arr[]의 두 배로 새로운 배열을 만들어준다.
for(i=0; i<arr.length; i++)
{
tmp[i] = arr[i];
//내용 복사
}
arr[i]의 값을 tmp[i] 안에 넣어준다.
그 뒤로는 0값을 넣는다.
참조형 변수는 값을 자동으로 초기화 해주기 때문에 0을 넣는 것임
int의 기본값이 0이기 때문에
arr = tmp;
둘 다 배열명이다. 배열명은 배열의 첫번째 주소값을 갖고 있다.
arr에 tmp를 대입하면 tmp의 첫번째 주소값이 arr에 복사가 된다.
이말인즉슨 같은 곳을 가리키게 된다. (주소값이 같음!)
그래서 arr[]을 출력하면 tmp의 값이 나오게 되는 것이다~~
그렇다면...
원래 있던 arr의 값은?
자바의 강점인 Garbage Collector(GC)가 나중에 알아서 쓰레기 값을 처리 해준다.
메모리에서 없애준다는 뜻!
tmp[3] = 33;
System.out.printf("arr[3] : %d \n", arr[3]);
arr[9] = 99;
System.out.printf("tmp[9] : %d \n", tmp[9]);
System.out.println();
for(i=0; i<arr.length; i++)
{
System.out.printf("arr[%d] : %d \n", i, arr[i]);
}
arr[3] : 33 tmp[9] : 99 arr[0] : 1 arr[1] : 2 arr[2] : 3 arr[3] : 33 arr[4] : 5 arr[5] : 0 arr[6] : 0 arr[7] : 0 arr[8] : 0 arr[9] : 99 |
같은 곳을 바라보고(주소값이 같음) 있기 때문에 하나가 바뀌면 모두 바뀌는 것이다.
클래스 = 객체 = 인스턴스
다 같은 말이고 어느 관점에서 보냐에 따라서 조금씩 다른 말임
char[] abc = {'A', 'B', 'C', 'D' };
char[] num = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
System.out.println(abc);
System.out.println(num);
//배열 abc
char[] result = new char[abc.length + num.length];
//14만큼 잡아 넣음. 시작주소가 들어가있다.
System.arraycopy(abc, 0, result, 0, abc.length);
//abc시작주소 인덱스0부터 어디에다가 result 배열의 시작주소의 0번째부터 몇 개를 복사할거야? abc.length
System.arraycopy(num, 0, result, abc.length, num.length);
//result 현재는 abc.length까지 복사가 돼 있으니 [4]부터 시작을 한다.
//복사할 대상? 어디서부터? 어디에 복사를 하나? 어디서부터?, 어디까지?
System.out.println(result);
/*
for(int i=0; i<abc.length; i++)
{
result[i] = abc[i];
}
*/
ABCD 0123456789 ABCD0123456789 |
char[] result = new char[abc.length + num.length];
char타입의 result 배열을 생성한다.
char[ ] 대괄호 안에는 보통 숫자가 들어가는데
abc.lenth + num.lenth가 들어가면 둘을 합친 값을 생성한다는 뜻이다.
결과적으로 char[] result는 14 크기 만큼 방을 잡은 것이다.
result에 직접적으로 방이 있는 게 아니라 그 방의 주소값이 입력된다.
System.arraycopy()
이 메소드는 배열 복사를 위한 메소드이다.
5가지 순서대로
복사할 대상 / 그 대상의 어디서부터? / 어디에다가 복사를? /
복사가 될 예정인 대상의 몇번째부터? / 어디까지 복사를 할 거냐
System.arraycopy(abc, 0, result, 0, abc.length);
abc의 [0]부터 복사를 합니다.
result의 [0]부터 abc의 크기 만큼요.
System.arraycopy(num, 0, result, abc.length, num.length);
num의 [0]부터 복사를 합니다.
result에 복사를 하는 대신
abc 크기부터 시작을 해서 num.length의 크기 만큼 복사한다.
System.out.println(result);
result를 출력하면 abc+num 값이 복사 돼서 나오는 것임
'개발일지 > Java + Spring' 카테고리의 다른 글
211021 java - 다차원 배열과 객체 (0) | 2021.10.21 |
---|---|
211020 Java - 시험 풀이 (0) | 2021.10.20 |
211019 Java - Array (0) | 2021.10.19 |
211019 Java - while (0) | 2021.10.19 |
JAVA 211019 - today (0) | 2021.10.19 |