※JAVA - 배열
1. 배열 (array)
1) 변수와 비슷하지만 같은 자료형 값 여러 개를 저장할 수 있다
2) 자료형: Object
3) 배열[] , 메서드(), 객체{}
4) 방번호와 갯수는 다름.
5) 길이: length
2. 배열 선언
->타입[] 변수명; ([] 중괄호는 타입에 붙던 변수명에 붙던 상관없음)
1) 선언만 하고 빈방으로 만들기
타입[] 변수명 = new 타입[방개수];
2) 선언과 동시에 초기값도 저장하면서 만들기
타입[] 변수명 = { 10, 20, 30 };
* 중요: 변수는 값이 박스에 디렉트로 저장되지만
배열은 어딘가에 있는 실제값의 주소값을 참조.
sout으로 찍어보면 배열의 주소값이 나옴
3. for문
1) 기존 for문
for(초기식;조건식;증감식) {}
2) 향상된 for문
for문처럼 초기, 조건, 증감을 정의하지 않아도 callback 함수를 통해 기능을 수행할 수 있음.
forEech 문은 배열(array)에서만 사용 가능.
for(변수타입 변수명 : 배열이름) {}
※ 배열(빈방) 예제
int num_arr[] = new int[3];//방개수만 만들어놓은것
num_arr[0] = 10; //각인덱스 방에 값을 집어넣음.
num_arr[1] = 20;
num_arr[2] = 30;
System.out.println(num_arr); //이렇게 변수명을 적을시 주소값이 출력이되고 값은 각각 인덱스로출력해야됨.
System.out.println(Arrays.toString(num_arr)); // Arrays 클래스의 toString을 이용해서 한방에 찍을수는 있음.
// for문으로 한번에 배열 출력하기
for(int i=0; i<num_arr2.length; i++) {
System.out.println(num_arr2[i]);
} // 10 20 30 세로로 출력
for(int tmp : num_arr2) {
System.out.println(tmp);
} // 10 20 30 세로로 출력
※JAVA - 다차원배열
1. 배열 안의 각 방에 배열이 또 들어가 있는 것.
2. 배열 선언 방법
1) 기본 배열
타입[][] 변수명 = new 타입[방개수][방개수];
ex) int [][] arr = new int [2][3];
위에 처럼 하면 [방 1, 방 2, 방 3], [방 1, 방 2, 방 3]처럼 만들어진다.
2) 가변 배열
ex) int [][] arr = new int [2][];
대신 이렇게 하면 작은방은 별도로 선언을 해야 된다.
* 실제로 나중에배우게 되는 collection 파트에서 ArrayList를 많이 사용한다.
※ 다차원배열 예제
// 가변배열 방식으로도 만들수 있다.// 대신 이렇게 하면 작은방은 별도로 선언 해야한다.
int[][] arr = new int[2][]; //[[],[]] -> 작은방 선언안한거 (가변배열)
arr[0] = new int[3]; //[[x,x,x], []]
arr[1] = new int[2]; //[[x,x,x], [x,x]]
System.out.println("arr: " + arr);
System.out.println("arr: " + arr[0]); // 이것도 배열 덩어리라서 주소값으로 불러온다.
System.out.println("arr: " + arr[1]);
System.out.println(Arrays.toString(arr[0])); //[0,0,0]->값을넣은적이없으니 0으로나온다
//이렇게 전체적으로 출력할수있다
//아래와같은 배열로 출력한거나 마찬가지다
// System.out.println(arr[0][0]);
// System.out.println(arr[0][1]);
// System.out.println(arr[0][2]);
System.out.println(Arrays.toString(arr[1])); //[0,0]->값을넣은적이없으니 0으로나온다
// 각 방 길이
System.out.println("길이: " + arr[0].length); // 길이:3
System.out.println("길이: " + arr[1].length); // 길이:2
}
※JAVA - 배열복사
-> 배열의 복사는 '얕은 복사'와 '깊은 복사'가 있다.
1. 얕은 복사(Shallow Copy): 복사된 배열이나 원본 배열이 변경될 때 서로 간의 값이 같이 변경된다.
(복사해도 값 바꾸면 다른 복사본도 바뀜)
*얕은 복사는 그냥 배열을 참조해서 사용합니다.
※ 얕은복사 예제
int[] arr = {10,20,30};
int[] shallow_arr = arr;
// 얕은복사시 arr 과 shallow_arr 를 출력해보면 주소값이 동일하게 나온다.
System.out.println("arr: " + arr); //주소값 동일
System.out.println("shallow_arr: " + shallow_arr); //주소값 동일
System.out.println(Arrays.toString(arr)); //[10,20,30]
System.out.println(Arrays.toString(shallow_arr)); //[10,20,30]
System.out.println("[0]값 바꾸기 전: " + arr[0]); //10
System.out.println("[0]값 바꾸기 전: " + shallow_arr[0]); //10
arr[0] = 1000; //원본 arr에 10의값을 1000으로 바꿧다.
System.out.println("[0]값 바꾼후: " + arr[0]); //1000
System.out.println("[0]값 바꾼후: " + shallow_arr[0]); //1000
2. 깊은 복사(Deep Copy): 복사된 배열이나 원본 배열이 변경될 때 서로 간의 값이 같이 변경되지 않는다.
(원본 값 바꿔도 상관없음)
*깊은 복사는 new 인스턴스화 해서 사용한다.
※ 깊은복사 예제
int[] arr = {10,20,30};
int[] deep_arr = new int[arr.length];//깊은복사는 new해서 사용해야된다->방갯수만 선언함
// 별도의 배열로 만들었기 떄문에 arr과 deep_arr 의 주소는 다르다 (남남이다)
System.out.println("arr: " + arr); //주소다름
System.out.println("deep_arr: " + deep_arr); //주소다름
// 깊은복사임
// deep_arr[0] = arr[0];
// deep_arr[1] = arr[1];
// deep_arr[2] = arr[2];
for (int i = 0; i<arr.length;i++){ // for문을 통해 deep_arr배열안에 arr배열값들을 대입해줌.
deep_arr[i] = arr[i];
}
System.out.println("arr[0]값 바꾸기 전: " + arr[0]); // 1000
System.out.println("deep_arr[0]값 바꾸기 전: " + deep_arr[0]);//위에 for문으로 대입해줬기때문에1000
arr[0]= 10;
System.out.println("arr[0]값 바꾼후: " + arr[0]); // 10
System.out.println("deep_arr[0]값 바꾼후: " + deep_arr[0]); //1000 -> new한인스턴스주소가 다르기때문에값이 같이 안바뀐다.
※JAVA - 배열메서드
-> 배열 사용 시 주로 사용하는 메서드 정리
1. tostring() - 출력 전용 메서드(배열전용 아님) -> 주소값대신에 여기에 써놓은 값 나오는 것
모든 자바 Object에 포함되어 있는 메서드(그래서 Arrary 여기도 있음)
배열 자체를 System.out.println()으로 출력하면 데이터가 출력되지 않고 주소값(Object ID) 이 출력됨
Arrays.tostring()를 이용해서 안에 들어있는 데이터를 모두 출력할 수 있다.
2. sort() - 정렬
배열원소(배열값)를 정렬한다. 원본 배열 자체가 원소들의 정렬된 순서로 변경됨
3. copyOf(배열, 길이) - 깊은 복사
배열을 복사해서 새로운 배열로 반환
copyOfRange(배열, 시작방번호, 끝방-1)
특정 범위만 반환
4. asList()
배열을 ArrayList로 반환해서 자바 컬렉션 API를 사용할 수 있다.
반환되는 ArrayList는 크기가 고정된 타입으로 새롭게 값을 추가할 수 없다.
※ 배열메서드 예제(sort)
String[] car = {"santaFe", "Benz","audi","bmw"};
Arrays.sort(car); //sort - 원본 배열 자체가 원소들의 정렬된 순서로 변경됨 ,(내림차순,asc)
System.out.println("변경후1 : "+Arrays.toString(car)); //-[audi, benz, bmw, santaFe]
Arrays.sort(car, Collections.reverseOrder()); // 역순으로 정렬 (한마디로:desc)
System.out.println("변경후2 : "+Arrays.toString(car)); //-[santaFe, bmw, benz, audi]
//0 번째 부터 2번째까지만 정렬
String[] car2 = {"santaFe", "Benz","audi","bmw"};
Arrays.sort(car2, 0,3); // 0번째부터 2번방까지 정렬 - bmw안건드리고 앞에꺼만 정렬
System.out.println("변경후3 : "+Arrays.toString(car2));//대문자 우선정렬
//변경후3 : [Benz, audi, santaFe, bmw]
※ 배열메서드 예제(copyOf)
String[] car_copied = Arrays.copyOf(car2,car2.length); //깊은복사한거 주소값다름
System.out.println("car_copied: " + Arrays.toString(car_copied));//[Benz, audi, santaFe, bmw]
car_copied[0]= "benz";
System.out.println("car_copied: " + Arrays.toString(car_copied));//[benz, audi, santaFe, bmw]
System.out.println("car2: " + Arrays.toString(car2));//[Benz, audi, santaFe, bmw]
※ 배열메서드 예제( copyOfRange)
//원하는 구간만 복사
String[] car_copied2 = Arrays.copyOfRange(car2, 0,2); //car2에 배열 0번쨰부터 2번째미만-> 0~1까지 배열출력
System.out.println("car_copied2: " + Arrays.toString(car_copied2) + " , " + car_copied2.length);
//car_copied2: [Benz, audi] , 2
//복사하면서 새롭게 방 추가 가능
String[] car_copied3 = Arrays.copyOfRange(car2,1,10);
//car2에 배열 1번쨰부터 10번째미만-> 1~9까지 배열출력,값이비어있으면 null로 출력됨
System.out.println("car_copied3: " + Arrays.toString(car_copied3) + " , " + car_copied3.length);
//car_copied3: [audi, santaFe, bmw, null, null, null, null, null, null] , 9
※ 배열메서드 예제(asList - ArrayList처럼 반환)
List<String> car_list = Arrays.asList(car_copied);
System.out.println("car_List: " + car_list); car_List: [benz, audi, santaFe, bmw]
//기본적으로 list 에는 tostring메서드가 포함되있어서 위에처럼 출력해도 값이 출력된다.
// 여기부터는 Collection의 List 영역임, 나중에 할거임
List<String> list = new ArrayList<>(Arrays.asList(car_copied));
// 배열에 추가,삭제,싹다 삭제
list.add("kia"); //추가
System.out.println("List: " + list); //List: [benz, audi, santaFe, bmw, kia]
list.remove(1);
System.out.println("List: " + list); //List: [benz, santaFe, bmw, kia]
list.clear();
System.out.println("List: " + list); //List: []
'국비교육' 카테고리의 다른 글
국비지원 57일차(JAVA - 변수, 메서드) (2) | 2023.10.14 |
---|---|
국비지원 56일차 (JAVA - 객체지향언어 ,클래스, 객체) (0) | 2023.10.13 |
국비지원 54일차 (JAVA - 연산자, 문자열,조건문(if,switch공식)) (0) | 2023.10.11 |
국비지원 53일차 (JAVA - Scanner,형변환(casting)) (0) | 2023.10.10 |
국비지원 52일차 (JAVA - 출력문) (1) | 2023.10.09 |