2-11
배열 (Array)
- 선언
int와 같은 기본형 변수는 1개의 값만 변수에 저장할 수 있음
int[] 와 같은 배열형 변수는 여러개의 변수에 저장 가능!
- 여러개를 하나의 변수에 넣어놓고 들고다니거나 하나씩 꺼내 쓸 수 있다는 점에서 분류통의 개념과 비슷
- 단, 하나의 배열형 변수에는 같은 타입의 변수만 담을 수 있음 ( = 김치통엔 김치만~)
한번에 많은 양의 데이터를 다루거나 계산할 때 사용 -> for문 등 반복문과 같이 사용. length와 같이 사용하기도함
선언방법 예시
1. 타입 [] 변수; <- 일반적인 방법
ex. int[] intArray;
2. 타입 변수[]
ex. int intArray[];
- 생성
배열(Array)는 참조형 변수들처럼 new 명령을 통해서 생성하며, 대괄호 [] 안에 크기를 지정해준다.
- 분류통을 만들때 new 명령어로 생성하고 분류통에 몇개를 담을지 미리 정의해준다고 생각!
- 주의할점은 분류통은 각 칸마다 순번이 있음. 순번은 0번부터(index) 시작하기 때문에 8개 사이즈 분류통이라면 0~7번까지 있음.
- int array[] = new int[8] -> 0~7번까지 있음
- 타입별 초기값으로는 int는 0, boolean은 false, String은 null
package week02.array;
public class Arr01 {
public static void main(String[] args) {
// 배열 생성
int[] intArray = new int[3]; // {0, 0, 0}
boolean[] boolArray = new boolean[3]; // {false, false, false}
String[] stringArray = new String[3]; // {"", "", ""}
// 배열 선언 먼저! -> 나중에 초기화
int[] intArray2;
intArray2 = new int[3]; // {0, 0, 0}
// 생성한 배열을 '순회' -> 배열의 값을 하나씩 뽑아서 조회한다.
// (1) 단건 조회
System.out.println(intArray[1]); // {0, "0", 0} 0, 1, 2번 순서이기 때문에 가운데 0이 출력
System.out.println("------");
// (2) !!다건 조회!!
// length : 길이를 구하는 메서드
for (int i=0; i<intArray2.length; i++) {
System.out.println(intArray2[i]);
}
}
}
package week02.array;
import java.util.Arrays;
public class Arr02 {
public static void main(String[] args) {
// 초기화
// 1. 배열의 특정값 대입해서 선언
int[] intArr = {1, 2, 3, 4, 5};
String[] stringArray = {"a", "b", "c", "d", "e"};
// 2. for문을 통해서 대입 + 다건출력
for(int i=0; i<intArr.length; i++) {
intArr[i] = i; // intArr 배열에 1씩 더해지면 i값이 추가
System.out.println(intArr[i]); // {0, 1, 2, 3, 4}
}
// 향상된 for문 사용
for (int item: intArr) { // {0, 1, 2, 3, 4}
System.out.println(item);
}
// 배열의 주소를 모두 같은 값으로 초기화
Arrays.fill(intArr, 1); // (배열명, 원하는 초기값)
for (int item: intArr) { // {1, 1, 1, 1, 1}
System.out.println(item);
}
}
}
2-12
복사
- 얕은 복사
배열은 참조형 변수이기 때문에 주소값을 이용한다.
따라서 얕은 복사를 해버리면 배열의 값이 같아지는게 아닌, 배열의 '주소값'이 같아진다(공유)
package week02.array;
public class Arr03 {
public static void main(String[] args) {
// 얕은 복사
int[] a = { 1, 2, 3, 4 };
int[] b = a; // 얕은 복사 -> 똑같은 값을 가지는게 아니라 같은 주소값만 공유하게된다!!
b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정. (1 -> 3)
System.out.println(a[0]); // 3. <- a 배열의 0번째 순번값도 3으로 조회.
}
}
- 깊은 복사
- 얕은 복사처럼 가짜 복사가 아니라 진짜 새로운 배열을 값이 똑같게 만들고 싶을때 사용.
- 실제 값을 가지고 있는 배열의 기본형 값을 꺼내서 복사하는 방법.
- 반복문 for 등을 통해서 하나씩 꺼내서 복사해주는 방법과 여러 메서드를 사용하는 방법등이 있음.
반복문 for을 통한 깊은복사
package week02.array;
public class Arr03 {
public static void main(String[] args) {
// 깊은 복사
int[] a = { 1, 2, 3, 4 };
int[] b = new int[a.length];
for (int i = 0; i < a.length; i++) {
b[i] = a[i]; // 깊은 복사
}
b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정. (1 -> 3)
System.out.println(a[0]); // 출력 1 <- 깊은 복사를 했기때문에 a 배열은 그대로.
}
}
clone() 메서드
- 간단하지만, 2차원이상 배열에서는 얕은 복사로 동작한다.
2차원 이상의 배열 : ["a", "b", "c"] 가 아닌 [ [1, 2], [3, 4] ... ] 식의 배열안에 배열이 있는 구조에 대해서는 얕은 복사로 동작한다. 가장 바깥의 괄호 내의 주소값만 새로 지정해 복사해주기 때문에 안에 있는 작은 배열들에 대해서는 얕은복사로 동작하는 것.
때문에
Arrays.copyOf() 메서드
package week02.array;
import java.util.Arrays;
public class Arr04 {
public static void main(String[] args) {
// 2. Arrays.copyOf() 메서드
int[] a = {1, 2, 3, 4};
int[] b = Arrays.copyOf(a, a.length); // (배열 a, 배열a의 길이)
a[3] = 0;
System.out.println(a[3]); // 0. 4 -> 0
System.out.println(b[3]); // 4
}
}
String배열들
package week02.array;
public class Arr05 {
public static void main(String[] args) {
// 문자(char / 1byte), 문자열(String)
// String = char[]
// 기본형 변수 vs 참조형 변수
// 1. 기본형 변수는 '소문자로 시작함' 반면, 참조형 변수는 '대문자로 시작함'
// - Wrapper class에서 기본형 변수를 감싸줄 때(boxing), int -> Integer
// 2. 기본형 변수는 값 자체를 저장, 참조형 변수는 별도의 공간에 값을 저장 후 그 주소를 저장(= 주소형 변수)
// char < String(훨씬 더 많이씀)
// String이 가지고 있는 기능이 너무 많아서..
// Wrapper class와도 상당히 비슷 ->
// 기본형 변수가 가지고 있는 기능이 제한 ->
// 다양한 기능을 제공하는 Wrapper을 감쌈으로써, 추가기능을 더함
// String 기능 활용 예시
String str = "ABCD";
// (1) length
int strLength = str.length();
System.out.println(strLength); // 4
// (2) charAt(int index)
char strChar = str.charAt(1);
System.out.println(strChar); // B. 0, 1, 2~ 순서이기때문
// (3) substring(int formIdx, int toIdx)
String strSub = str.substring(0, 3); // 0부터 3번째 '전'까지.
System.out.println(strSub); // A, B, C
// (4) equals(String str) -> 어떠한 string이 입력받은 string과 같니?
String newStr = "ABCD";
boolean strEqual = newStr.equals(str); // equals는 같은지 물어보기 때문에 boolean으로 판별용 변수
System.out.println(strEqual); // true. newStr과 str의 String 값이 같음
// (5) toCharArray() : String -> char[]
char[] strCharArray = str.toCharArray();
// (6) 반대로 char[] -> String -> char
char[] charArray = {'A', 'B', 'C'};
String charArrayString = new String(charArray);
System.out.println(charArrayString);
}
}
'Backend > Java' 카테고리의 다른 글
| Java 문법 2주차 2-14,15,16 컬렉션 (5) | 2023.11.22 |
|---|---|
| Java 문법 2주차 2-13 다차원 배열 (3) | 2023.11.22 |
| Java 문법 2주차 2-9,10 while, break, continue, 반복문 활용 (1) | 2023.11.21 |
| Java 문법 2주차 2-6,7,8 if, switch, for (조건문, 반복문) (1) | 2023.11.21 |
| Java 문법 2주차 2-3,4,5 대입연산자~ 연산자 우선순위 (1) | 2023.11.21 |