자바 가끔 헷갈리는 것들 (3)

황상익·2024년 10월 11일

배열 초기화

//배열 생성후 초기화하면 배열의 주소가 할당된다.
int[] intArray = new int[3]; // 초기값 {0,0,0}
boolean[] boolArray = new boolean[3]; // 초기값 {false, false, false}
String[] stringArray = new String[3]; // 초기값 {"","",""}

boolean default 값 = false

//3. 배열의 주소를 모두 같은값으로 초기화
Arrays.fill(intArray, 1);//배열의 모든 값을 1로 초기화

for (int i : intArray) {
System.out.print(i); // 11111
}

//2-2. 향상된 for문을 통한 배열 출력
for (int i : intArray) {
System.out.print(i); // 01234 => 인덱스 값 하나하나 나옴 
}

복사

  • 얕은 복사
    참조형 변수, 실제값이 아닌 실제값의 주소값을 갖는다.
    "="을 사용하면 주소값만 복사
    주소값만 복사되고 실제 값은 1개로 유지 -> 얕은 복사
// 얕은 복사
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으로 조회됩니다.

-깊은 복사
진짜 새로운 배열을 똑같이 만들고 싶을때 깊은 복사를 사용
실제 값을 갖고 있는 배열의 기본형 값을 꺼내서 복사
반복문을 통해 하나씩 꺼내서 복사해주는 방법, 여러 메서드 사용 방법

// 깊은 복사
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 배열은 그대로 입니다.

// 깊은 복사 메서드
// 1. clone() 메서드 
int[] a = { 1, 2, 3, 4 };
int[] b = a.clone(); // 가장 간단한 방법입니다.
// 하지만, clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작합니다!!


// 깊은 복사 메서드
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// 2. Arrays.copyOf() 메서드
int[] a = { 1, 2, 3, 4 };
int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어줍니다. -> 새로운 배열을 생성 => a와 b는 완전 다른 배열이 생성 된다. 

기본형 변수 VS 참조형 변수
기본형 변수 => 소문자, 값 자체를 저장함
참조형 변수 => 대문자, 별도의 값을 저장후 그 주소를 저장

다차원 배열

int[][] array = new int[2][3]; // 최초 선언 2 * 3 배열이라고 생각하면 됨 
for (int i = 0; i < array.length; i++) { //가로
  for (int j = 0; j < array[i].length; j++) { //세로
arr[i][j] = 0; // i, j 는 위 노란색 네모박스 안에있는 숫자를 의미하며 인덱스 라고 부릅니다.
}
}

가변배열

// 선언 및 초기화
int[][] array = new int[3][];
// 끝에 값이 비어있으면 나중에 배열 크기 변경 가능

// 배열 원소마다 각기다른 크기로 지정 가능합니다.
array[0] = new int[2];
array[1] = new int[4];
array[2] = new int[1];

// 중괄호 초기화할때 도 원소배열들의 크기를 각기 다르게 생성 가능합니다.
int[][] array2 = {
{10, 20},
{10, 20, 30, 40},
{10}
};

최대값 최소값

  1. 최대값
// 최대값 구하기
int[] arr = { 3, 2, 1, 5, 1 };
// 최대값 초기값 세팅
int max = arr[0];
// 최대값 구하기
for (int num : arr) {
if (num > max) { // 반복문 돌면서 나(max)보다 값이 작으면 저장
max = num;
}
}
// 최대값 5 출력
System.out.println(max);
  1. 최소값
// 최소값 구하기
int[] arr = { 3, 2, 1, 5, 1 };
// 최소값 초기값 세팅
int min = arr[0];
// 최소값 구하기
for (int num : arr) {
if (num < min) { // 반복문 돌면서 나(min)보다 값이 작으면 저장
min = num;
}
}
// 최소값 1 출력
System.out.println(min);

컬렉션

Collection -> List, set, Queue, Map 등이 있음
Collection 기능 -> 크기 자동조정, 추가, 삭제, 수정, 반복, 순회, 필터

List : 순서가 있는 데이터의 집합 (데이터 중복 허용) - 배열과 비슷
Queue : 빨대🥤처럼 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있는 집합
First In First Out : 먼저들어간 순서대로 값을 조회할 수 있다.
Set : 순서가 없는 데이터의 집합 (데이터 중복 허용 안함) - 순서없고 중복없는 배열
Map : 순서가 없는 (Key,Value) 쌍으로 이루어진 데이터의 집합 (Key값 중복 허용 안함)

Array Vs List

Array는 최초 길이를 알아야 함(정적), List는 가변적으로 늘어남(동적)

LinkedList

메모리에 남는 공간을 요청해 여기저기 나누어 실제 값을 담고, 실제 값이 있는 주소값으로 목록을 구성
속도가 느림, 단 중간에 추가하거나 삭제 속도는 빠름

선언 : LinkedList<Integer> linkedList 형태로 선언합니다.
생성 : new LinkedList<Integer>(); 형태로 생성합니다.
초기화 : 사이즈를 지정하는것이 없기 때문에 초기화가 필요 없습니다.
값 추가 : linkedList.add({추가할 값}) 형태로 값을 추가합니다.
값 중간에 추가 : linkedList.add({추가할 순번}, {추가할 값}) 형태로 값을 중간에 추가합니다.
값 수정 : linkedList.set({수정할 순번}, {수정할 값}) 형태로 값을 수정합니다.
값 삭제 : linkedList.remove({삭제할 순번}) 형태로 값을 삭제합니다.
전체 출력 : linkedList.toString() 형태로 전체 값을 대괄호 [] 로 묶어서 출력합니다.
전체 제거 : linkedList.clear() 형태로 전체 값을 삭제합니다.

stack (Last in First Out)

최근 저장도니 데이터 나열, 중복 처리 막고 싶을때 사용
먼저 들어간 것이 나중에 나온다

Queue (First in First Out)

먼저 들어간 것이 먼저 나온다.

Set

순서가 없는 데이터 집합 -> 순서 없고 중복 배열
생성자가 존재하는 HashSet을 사용해 Set을 생성해서 받을 수 있음

HashSet : 가장 빠르며 순서를 전혀 예측할 수 없음
TreeSet : 정렬된 순서대로 보관하며 정렬 방법을 지정할 수 있음
LinkedHashSet : 추가된 순서, 또는 가장 최근에 접근한 순서대로 접근 가능

Map

key-value 구조로 구성된 데이터를 저장

HashMap : 중복을 허용하지 않고 순서를 보장하지 않음 , 키와 값으 로 null이 허용
TreeMap : key 값을 기준으로 정렬을 할 수 있습니다. 다만, 저장시 정렬(오름차순)을 하기 때문에 저장시 간이 다소 오래 걸림

length vs length() vs size() - 길이값 가져오기

  1. length
    arrays(int[], double[], String[])
    length 는 배열의 길이를 조회해줍니다.
  2. length()
    String related Object(String, StringBuilder etc)
    length() 는 문자열의 길이를 조회해줍니다. (ex. “ABCD”.length() == 4)
  3. size()
    Collection Object(ArrayList, Set etc)
    size() 는 컬렉션 타입목록의 길이를 조회해줍니다.
profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글