package ex00.arr.array00;
/*
1. 배열의 의미
배 : 짝
열 : 나란히 줄서있다
배열 : 동일한 자료형들이 나란히 줄서있다(물리적으로 연속된 공간)
2. 배열의 필요성 - 왜 배열을 만들까?
1)동일한 자료형이 여러 개 쓰일 때 한번에 만들고,
2)반복문으로 접근하는 것이 편리하니까
*/
/*
형변환
1. 서로 다른 자료형끼리 연산할 일이 종종 있다
그런데 서로 다른 자료형은 메모리에 저장되는 bit가 다르므로
동일한 자료형으로 만들어줘야 연산이 가능하다
2. short < int < long < float < double
1) 정수와 실수가 만나면 무조건 정수는 실수로 변화한다
2) 같은 정수라도 작은 사이즈의 정수와 큰 사이즈의 정수가 만나면
큰 사이즈의 자료형으로 변화한다
3) float와 double을 연산하면 float는 자동으로 double로 변화한다
3. 평균 계산시 제일 많이 쓰인다
sum(int)/3(int) => 결과도 int
(float)sum => float형으로 변화
(float)sum/3 => 3도 float형으로 변화
결국 float/float가 되어서 연산의 결과는 float가 된다
*/
public class WhyArray {
public static void main(String[] args) {
// 3명의 학생의 국어점수의 총합과 평균을 구하세요
int kor0=99, kor1=98, kor2=80;
int sum=0;
float avg=0f;
// 총합과 평균 계산
sum = kor0+kor1+kor2;
avg = (float)sum/3; // sum/(float)3
//avg = sum/3; // 정수와 정수의 연산은 무조건 정수
// 결과 출력
System.out.println("총합 : " + sum);
System.out.println("평균 : " + avg);
// 그렇다면 10명, 100명, 1000명일 때는?
// 변수선언하기 싫어진다
// => 배열이 필요하다
}
}
package ex00.arr.array01;
public class UsingArray {
public static void main(String[] args) {
int[] kor = {99, 98, 80};
// int[] kor = new int[3] {99, 98, 80};
int sum = 0;
float avg = 0f;
// index를 변수로 바꾸면 반복문도 가능하겠네?
// System.out.println(kor[0]);
// System.out.println(kor[1]);
// System.out.println(kor[2]);
/*
= (대입연산자)
1. 왼쪽 = 오른쪽
1) 왼쪽 : 변수의 공간
2) 오른쪽 : 변수의 값
2. 마지막에 연산되는 연산자이다
*/
for (int i = 0; i < kor.length; i++) {
sum = sum + kor[i];
}
avg = (float)sum/kor.length;
// 297/3 => 297.0/3 => 297.0/3.0 => float결과
System.out.println("총합 : " + sum);
System.out.println("평균 : " + avg);
}
}
스택은 공간이 힙보다 상대적으로 작다.
스택의 용도 : 그때 그때 필요한 것을 올려놓고 사용, 지역변수들 - 중괄호가 끝나는 지점에서 소멸.
힙 : new 라는 연산자(배열,객체)가 할당되는 공간 (덩어리가 큰 것들), jvm이 판단 -> 가비지 컬렉터(GC)가 처리.
배열 주소는 jvm에 의해서 해석되는 것 -- > kor에 들어있는 값은 참조값 = hashcode = reference value
jvm이 해석해주기 위한 위치값.
저 공간을 가리키는 걸로 해석해서 값을 얻어올수 있도록 해준다.
얕은복사
package ex00.arr.array03;
public class ArrayRef {
static void viewArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println(); // 개행해라
}
public static void main(String[] args) {
//int[] kor = {99, 89, 80}; // 관습적으로 사용, new 생략
//int[] kor = new int[] {99, 89, 80}; // 선언과 동시 초기화
int[] kor = new int[3]; // 힙에 할당 후 저장
kor[0] = 99;
kor[1] = 89;
kor[2] = 80;
System.out.println("kor의 참조값 : " + kor);
// 참조값만 복사, 결국 같은 위치를 가리키게 된다
// 위치만 복사 => 얕은 복사
int[] subject = kor;
System.out.println("subject의 참조값 : " + subject);
viewArray(kor);
viewArray(subject);
subject[1] = 20;
viewArray(kor);
viewArray(subject);
}
}
깊은 복사
: kor과 subject는 공간이 다르므로 서로 다른 참조값이 출력된다.
subject의 값만 20으로 바뀐다.
package ex00.arr.array04;
import java.util.Arrays;
public class DeepArrayCopy{
static void viewArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] kor = new int[3];
kor[0] = 99;
kor[1] = 89;
kor[2] = 80;
System.out.println("kor의 참조값 : " + kor);
// kor과 동일 자료형, 같은 크기의 새로운 공간을 할당해서
// 그 공간 참조값을 반환해준다.
int[] subject =Arrays.copyOf(kor, kor.length);
System.out.println("subject의 참조값 : " + subject);
viewArray(kor);
viewArray(subject);
subject[1] = 20;
viewArray(kor);
viewArray(subject);
}
}
arraycopy() 메소드
package ex00.arr.array12;
import java.util.Arrays;
public class CopyOfArray {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int[] temp = new int[5];
int[] temp1 = new int[10];
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(temp));
System.arraycopy(arr, 0, temp, 0, arr.length);
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(temp));
System.out.println();
System.arraycopy(arr, 0, temp1, 3, arr.length);
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(temp1));
}
}
정렬
package ex00.arr.array05;
import java.util.Arrays;
public class ArraySort {
public static void main(String[] args) {
int[] scores = {98, 12, 99, 9, 25};
System.out.println(Arrays.toString(scores));
//정렬
Arrays.sort(scores);
System.out.println(Arrays.toString(scores));
//출력값
//[98, 12, 99, 9, 25]
//[9, 12, 25, 98, 99]
}
}
배열의 for문
package ex00.arr.array06;
public class ForEach {
public static void main(String[] args) {
int[] scores = {89, 99, 21, 10, 100};
//for문 접근
for(int i = 0; i < scores.length; i++) {
System.out.print(scores[i] + " " );
}
System.out.println();
//forEach 접근
for(int score : scores) {
System.out.print(score + " ");
}
}
}