240423
# 오늘 꼭 기억 해야 할 것!
1. 얕은복사와 깊은복사의 개념
2. 배열을 만들때 사용한 new의 대한 주소값 개념
오늘의 학습
● 1. 배열의 선언 및 초기화
● 2. 배열의 값 넣기 및 뽑기(출력)
● 3. 얕은복사
● 3. 깊은복사
배열 ( Array )
배열이라는 "변수"에 변수나 값들을 넣어 보관하여 원할 때 꺼내서 쓰거나 넣거나 할 수 있는 자바의 자료구조이다.
배열에는 "인덱스"라는 것이 존재하며 만들어진 배열의 칸 하나하나를 접근하는데 쓰이는 구분자 역할을 한다.
참고 : index는 앞에서 0부터 시작한다. 즉, 배열의 제일 앞의 값의 인덱스는 0인 것이다.
1. 배열의 선언 및 초기화
1. 배열의 선언
// 배열의 선언
int[] intArray2;
// 배열의 초기값으로 초기화
intArray2 = new int[3]; // => 3칸의 배열 칸을 만들고 초기값이 자동으로 세팅이 된다.
// 배열의 초기값 :: int => 0 / String => ""(null) / boolean => false 이다.
// 선언과 초기값 세팅 동시 진행
int[] intArray = new int[5];
// 배열의 종류
int[] intArray; // 정수 배열
long[] longArray; // 정수 배열
double[] doubleArray; // 실수 배열
boolean[] booleanArray; // 논리 배열
char[] charArray; // 문자 배열
String[] stringArray; // 문자열 배열
위의 코드 예시와 같이 배열은 선언을 하고 초기값 세팅을 진행할 수 있고, 선언과 초기화를 동시에 진행 할 수도 있다.
"int a = 1"와 같은 기본형 변수는 a의 값을 한개밖에 저정을 못한다면, 배열은 칸을 따로 만들어 그 칸안에
변수나 값을 저장할 수 있다.
2. 배열의 선언과 동시에 초기화
배열의 초기화는 배열의 칸 하나하나에 값을 넣어줘서 초기화를 진행한다. 예시 코드로 알아보자.
// 1. 배열의 선언과 동시에 초기화 : 배열의 인덱스 하나하나에 1~5까지의 숫자를 넣어준다.
// 자동으로 숫자에 맞춰서 배열의 칸이 만들어져서 값이 대입이 된다.
int[] intArr = {1, 2, 3, 4, 5}
2. 배열의 값 넣기 및 뽑기(출력)
배열의 값을 넣는 방법과 뽑는(출력) 방법은 예시코드로 알아보자.
// 배열의 값을 넣기
int[] intArr = new int[3]; // 배열의 선언 후 초기값 세팅
intArr[0] = 1; // 배열의 0번째 인덱스에 "1"이라는 정수를 대입
intArr[1] = 2;
intArr[2] = 3;
// 배열의 값을 뽑기(출력)
System.out.println(intArr[0]); // 출력결과 : 1
System.out.println(intArr[1]); // 출력결과 : 2
System.out.println(intArr[2]); // 출력결과 : 3
// 배열의 선언과 동시에 초기화
int[] intArr = {1, 2, 3, 4, 5}
intArr[0] = 1;
System.out.println(intArr[0]); // 출력결과 : 1
// 마찬가지로 출력결과 1을 얻을 수 있다.
위의 코드와 같이 값을 넣을때와 뽑을때는 크게 다르지 않다. 넣을때도 마찬가지로 인덱스 번호를 통해 값을 넣고
뺄때도 마찬가지로 인덱스의 번호를 통해 뽑을 수 있다.
3. 얕은복사
배열을 생성하게 되면 해당 배열은 주소값을 가지게 된다. 해당 주소값을 통해 인덱스에 접근을 하게되어 값을 넣거나
뺄 수 있게 된다. 하지만 얕은복사를 통해 다른 배열에 배열의 정보를 넣게 된다면 다른 배열의 주소값을 공유해 두개의
배열 모두가 영향을 받게된다. 아래의 예시 코드를 이해를 해보자.
int[] arr1 = {1,2};
System.out.println("arr1 = " + arr1[0]); // arr1의 0번째 index 결과 : 1
System.out.println("arr1 = " + arr1[1]); // arr1의 1번째 index 결과 : 2
// 얕은복사
int[] arr2 = arr1; // arr2에 arr1을 대입을 해준다.
System.out.println("arr2 = " + arr2[0]); // arr2의 0번째 index 결과 : 1
System.out.println("arr2 = " + arr2[1]); // arr2의 0번째 index 결과 : 1
// arr2의 배열 값으로 10, 20으로 값을 변경해준다.
arr2[0] = 10;
arr2[1] = 20;
// arr1 출력
System.out.println("arr1 = " + arr1[0]); // arr1의 0번째 index 결과 : 10
System.out.println("arr1 = " + arr1[0]); // arr1의 1번째 index 결과 : 20
// arr2 출력
System.out.println("arr2 = " + arr2[0]); // arr2의 0번째 index 결과 : 10
System.out.println("arr2 = " + arr2[0]); // arr2의 1번째 index 결과 : 20
위의 코드와 같이 arr1의 1 , 2의 정수를 배열에 담아 두었다. 그리고 arr1의 값을 새로만든 arr2의 배열에 대입을 해서 넣어 두었다. 이렇게 대입을 하게 되면 문제는 주소값을 공유하기 때문에 arr2의 값을 수정을 하면 arr1의 값도 arr2의 값으로
바뀌게 된다. 이것이 얕은복사의 문제점이다.
4. 깊은복사
깊은복사 같은 경우에는 앞서 얕은복사는 주소값을 가져와 공유되는 개념인데 깊은복사는 주소값이 아닌 배열의 크기와
값을 복사해서 사용을 한다. 예시 코드를 통해 알아보자.
int[] arr1 = {1,2,3,4};
int[] arr2 = new int[arr1.length];
arr2[0] = arr[0];
arr2[1] = arr[1];
arr2[2] = arr[2];
arr2[3] = arr[3];
new를 통한 주소값이 생성이 되었기 때문에 새로운 배열을 new로 생성을 해주고 기존의 배열의 길이를 넣어줌으로써
기존의 길이만큼의 배열이 생성이 되었다. 배열이 생성된 후 기존의 배열의 값을 하나하나 대입을 해주면 깊은 복사가된다.
=> new를 통해 만든 배열은 주소값이 할당이된다. 그 해당 주소값을 공유하느냐 안하느냐에 차이에 따라 복사가 결정된다.
# 오늘의 회고
오늘은 집중이 잘 안돼서 공부를 많이 못한 부분이 너무 아쉽다. 일단 오늘 배운 조건문 , 반복문, 배열에 대해서 어느정도
이해가 된 것 같다. 배열의 주소값의 대한 공부를 좀 하면 좋을 것 같다.
'내일배움캠프 Spring 5기' 카테고리의 다른 글
내일배움캠프 9일차 TIL - 클래스(Class) (1) | 2024.04.25 |
---|---|
내일배움캠프 8일차 TIL - 컬렉션(Collection) (0) | 2024.04.24 |
내일배움캠프 6일차 TIL - 변수(Variable) (0) | 2024.04.22 |
내일배움캠프 5일차 TIL( 웹 서비스 ) (0) | 2024.04.19 |
내일배움캠프 4일차 TIL( SQL ) (0) | 2024.04.18 |