TIL(Today I Learned)/java

[내일배움캠프/2주차] JAVA 문법종합반 2주차 강의 2

jy3574 2024. 10. 14. 23:43

<목차>

3. 배열로 연속된 데이터를 효율적으로 저장하고 관리

4. 다차원 배열로 복잡한 데이터를 저장하고 관리

5. 컬렉션으로 연속된 데이터들을 효율적으로 저장하고 관리

6. 여러 컬렉션들의 기능을 익히고 적절하게 사용


배열
자료구조(분류통)로 정리하기

-여러개의 변수를 모아서 저장하고 싶을 때 "배열"이라는 변수에 저장(표현)함

-분류통이라고 표현한 이유는 여러개의 값들을 한번에 넣거나 하나씩 넣을 수도 있고, 꺼낼 때는 하나씩 꺼낼 수 있기 때문

-분류통=자료구조

 

<배열>

1. 선언 ([ ])

-배열형 변수는 여러 개의 값을 변수에 저장

-여러 개를 하나의 변수에 넣어놓고 들고 다니거나 하나씩 꺼내서 쓸 수 있음

-하나의 배열형 변수에는 같은 타입의 변수만 담을 수 있음

-한 번에 많은 양의 데이터를 다루거나 계산할 때 사용

-Array : 배열

-선언 방법은 2가지 방법이 있다.

방법1.
타입 [ ] 변수;

방법2.
타입 변수[ ];

----ex> int[] intArray; / int intArray[];

 

2. 생성 (new[ ])

-Array는 참조형 변수들처럼 new 명령을 통해서 생성하며, [대괄호] 안에 크기를 지정해줌.

-new 명령어로 생성하고 몇개를 담을지 미리 정의한다고 생각

-주의할점 : 사이즈를 지정해서 생성된 구조는 각 칸마다 순번이 있다

-순번은 0부터 시작하기 때문에 8개 사이즈라면 0~7번까지 있다

-배열은 생성될 때 각 타입별 초기값으로 초기화되어 채워짐

---초기값 : int = 0, boolean = false, String = null

------이런식으로 초기값이 정해져 있음

-참조형 변수이기 때문에 실제 값을 담지 않고 실제 값의 주소 값을 저장하고 있게 된다.(stack, heap)

 

3. 순회([i])

-배열 안에 담겨있는 변수들을 하나씩 꺼내서 사용하는 것

-배열의 값을 하나 뽑아서 조회하는 방법

---배열에는 순번이 있고, 해당 순번을 통해 하나의 값을 조회

---해당 배열 변수 뒤에 순번을 [대괄호]로 감싸서 명시

-배열을 순회하는 방법은 반복문을 사용하는 것이 가장 일반적인 방법

-반복문 안에서 단건 조회했던 것처럼 [대괄호]안에 반복문 순번 값 i를 넣어주면 됨

-.length() 메서드

---배열이 지원하는 메서드로써 해당 배열의 길이값을 응답해줌

---배열의 길이는 처음에 선언한 크기를 가지고 있음

 

4. 초기화(={...})

-배열을 초기화 할때는 3가지 방법이 있음

방법1. {중괄호}를 사용해서 초기화

방법2. 반복문 for문을 사용해서 초기화(또는 향상된 for문)

방법3. Arrays.fill 메서드를 사용해서 초기화

---Arrays클래스는 java에서 기본으로 제공하는 메소드가 담긴 클래스

 

5. 복사(.clone())

*얕은 복사

-배열은 참조형 변수이며 실제 값이 아닌 실제 값의 주소값을 가진다

---따라서, 배열 변수 간에 대입 연산자(=)를 사용해서 복사를 하게 되면 주소값만 복사됨

---이렇게 주소값만 복사되고 실제 값은 1개로 유지되는 것을 얕은 복사라고 함

-주소값만 복사된다 : 변수명은 서로 다르지만 같은 값을 보고 있다는 것을 뜻함

---ex) 하나의 카카오계정으로 핸드폰, pc에 로그인하는 것과 같음

 

*깊은 복사

-얕은 복사처럼 가짜 복사가 아니라 진짜 새로운 배열을 똑같이 만들고 싶을 때 깊은 복사를 사용

-깊은 복사는 결국 실제 값을 가지고 있는 배열의 기본형 값을 꺼내서 복사

-반복문 for문을 통해서 하나씩 꺼내서 복사해주는 방법과 여러 메서드를 사용하는 방법이 있음

 

 

<String 배열>

1. 선언, 생성, 초기화

-배열 중에서도 가장 많이 사용하게 될 문자열 배열은 String 배열

-선언하고 생성하는 방법은 기존 배열과 동일

 

*string 배열의 선언과 생성

String[] stringArray = new String[3];

 

*string 배열의 초기화

//선언 후 하나씩 초기화
String[] stringArray = new String[3];
stringArray[0] = "val1";
stringArray[1] = "val2";
stringArray[2] = "val3";

//선언과 동시에 초기화
String[] stringArray1 = new String[]{"val1","val2","val3"};
String[] stringArray2 = {"val1", "val2", "val3"};

 

*string 기능 활용(=char 배열)

-문자열=문자배열

-char 배열은 "문자 배열", String은 문자열    String = char[]

-String은 char 배열과 같기 때문에 둘다 문자열을 저장할 수 있는 변수

---하지만 String을 많이 쓰는 이유는? 참조형 변수가 더 많은 기능들을 가지고 있기 때문

 

*char 배열에는 없는 String만 가지고 있는 기능

메서드 응답값 타입 설명
length() int 문자열의 길이를 반환한다.
charAt(int index) char 문자열에서 해당 index의 문자를 반환한다.
substring(int from, int to) String 문자열에서 해당 범위(from~to)에 있는 문자열을 반환한다.
(to는 범위에 포함되지 않음)
equals(String str) boolean 문자열의 내용이 같은지 확인한다.
결과는 같으면 true, 다르면 false가 된다.
toCharArray() char[] 문자열을 문자배열(char[])로 변환해서 반환한다.
new String(char[] charArr) String 문자배열(char[])을 받아서 String으로 복사해서 반환한다.

 

 

*기본형 변수와 참조형 변수의 차이

-기본형 변수 char / 참조형 변수 String

-기본형 변수 : 소문자로 시작

-참조형 변수 : 대문자로 시작

 

<다차원 배열>

1. 2차원 배열(2열 배열), 순회

-위에서 본 1열로 구성된 배열은 1열 배열 또는 1차원 배열이라고 부른다.

-1열 배열을 위로 쌓으면 2열 배열이 되고, 이걸 2차원 배열이라고 한다.

>그림으로 표현하면 이런식이라고 볼 수 있음

>저장소 관점으로 표현하면 이런식이라고 볼 수 있음

 

*선언

-2차원 배열을 선언할 때는 1차원 배열에 대괄호를 하나 더 추가하면 됨

int[][] array
int array[][]
int[] array[]

 

-1차원 배열과 2차원 배열의 선언에 따른 저장소 할당 차이점

 

-노란색 네모 안의 코드로 해당 값을 하나의 변수로써 저장하거나 조회할 수 있다.

 

*생성

-2차원 배열을 생성할 때도 대괄호를 하나 더 추가하면 됨

int[][] array = new int[][];

 

*초기화

-2차원 배열을 초기화하는 방법은 2가지가 있음

방법1. 중괄호를 사용해 선언과 동시에 초기화

int[][] array = {
    {1,2,3},
    {4,5,6}
};

 

방법2. 선언/생성 이후 반복문을 통해 초기화

int[][] array = new int [2][3];

for (int i = 0; i < array.length; i++) {
    for(int j = 0;, j < array[i].length; j++) {
        arr[i][j] = 0;
    }
}

 

 

2. 가변 배열

-java 프로그래밍에서는 2차원 배열을 생성할 때 열의 길이를 생략하여, 행마다 다른 길이의 배열을 요소로 저장할 수 있다.

-가변배열 : 행마다 다른 길이의 배열을 저장할 수 있는 배열

 

 

3. 2차원 배열 이상의 다차원 배열 이해

-2차원 배열 외에도 3,4차원 등이 있지만 대부분 3차원까지만 사용하는 경우가 많음

 

<3차원 배열>

*3차원 배열 선언은 2차원 배열 생성에 대괄호를 하나 더해주면 됨

int[][][] multiArray

 

*초기화할때는 중괄호를 더 추가하면 됨

{{{배열원소1},{배열원소2}},{{배열원소3}}}

ex>
{{{1,2},{3,4}},{{5,6},{7,8}}}

 

4. 다차원 배열 조회

-2차원 배열을 조회할 때는 2차원 인덱스를 가진만큼 이중반복문을 통해 출력

-2중 반복문을 통해 가변 배열도 출력 가능

 

 

컬렉션
참조형 분류통으로 정리하기

-java 프로그래밍에서는 배열을 더 고도화시켜서 "컬렉션"이라는 이름으로 참조형 자료구조를 제공하고 있음

-컬렉션 : 참조형 변수만 저장함으로써 여러 기능을 많이 제공

<컬렉션>

-java에서 컬렉션은 배열보다 다수의 참조형 데이터를 더 쉽고 효과적으로 처리할 수 있는 기능을 많이 가지고 있음

-컬렉션 기능 : 크기 자동조정, 추가, 수정, 삭제, 반복, 순회, 필터, 포함확인 등...

 

*컬렉션 종류

-Collection : List, Set, Queue, Map 등이 있음

-List : 순서가 있는 데이터의 집합, 데이터의 중복 허용 - 배열과 비슷

-Queue : 빨대처럼 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있는 집합

---First In First Out : 먼저 들어간 순서대로 값을 조회할 수 있다.

-Set : 순서가 없는 데이터의 집합, 데이터의 중복 허용 X - 순서 없고 중복 없는 배열

-Map : 순서가 없는 (Key, Value) 쌍으로 이루어진 데이터의 집합, Key값 중복허용X

 

*자주쓰는 참조형 변수

-int의 참조형 변수 = Integer

-long의 참조형 변수 = Long

-double의 참조형 변수 = Double

-String(원래 참조형)

 

<List>

-순서가 있는 데이터의 집합, 데이터의 중복 허용 - 배열과 비슷

 

1. ArrayList

-Array(배열)처럼 일렬로 데이터를 저장하고 조회하여 순번 값(인덱스)로 값을 하나씩 조회할 수 있음

*특징

-배열처럼 크기가 정해져 있지 않고 필요할때마다 크기가 점점 늘어남

*기능(형태 예시)

-선언: ArrayList<Integer> intList 

-생성: new ArrayList<Integer>();

-초기화: 사이즈를 지정하는 것이 없기 때문에 초기화가 필요 없음

-값 추가: intList.add({추가할 값})

-값 수정: intList.set({수정할 순번},{수정할 값})

-값 삭제: intList.remove({삭제할 순번})

-전체출력: intList.toString(), 전체 값을 [대괄호]로 묶어서 출력

-전체 제거: intList.clear()

 

 

*Array vs ArrayList

-Array : 크기를 고정하여 생성, 기본형 변수로 저장, 정적배열

---메모리에 연속된 공간을 요청한 사이즈만큼 받아서 실제 값을 저장하는 기본형 변수로 저장

 

-ArrayList : 크기가 가변적으로 늘어남, 참조형 변수로 저장, 동적배열

---생성시점에 작은 연속된 공간을 요청해서 참조형 변수들을 담아놓고, 값이 추가될 때 더 큰 공간이 필요하면 더 큰 공간을 받아서 저장

 

 

2. LinkedList

-메모리에 남는 공간을 요청해서 여기저기 나누어서 실제 값을 담아놓고, 실제값이 있는 주소값으로 목록을 구성하고 저장

*특징

-기본적인 기능은 ArrayList와 동일하지만 LinkedList는 값을 나누어 담기 때문에 모든 값을 조회하는 속도가 느리다.

---대신, 값을 중간에 추가하거나 삭제할 때는 속도가 빠름

-중간에 값을 추가하는 기능이 있음(속도 빠름)

*기능(형태 예시)

-선언: LinkedList<Integer> linkedList

-생성: new LinkedList<Integer>();

-초기화: 사이즈를 지정하는 것이 없기 때문에 초기화가 필요 없음

-값 추가: linkedList.add({추가할 값})

-값 중간에 추가: linkedList.add({추가할 순번},{추가할 값})

-값 수정: linkedList.set({수정할 순번},{수정할 값})

-값 삭제: linkedList.remove({삭제할 순번})

-전체 출력: linkedList.toString()/ 전체 값을 [대괄호]로 묶어서 출력

-전체 제거: linkedList.clear()

 

 

3. Stack

-값을 수직으로 쌓아놓고 넣었다가 빼서 조회하는 형식으로 데이터를 관리

-Last In First Out : 나중에 들어간 것이 가장 먼저 나온다, 주로 상자와 같음

*특징

-상자에 물건을 넣고 빼는 것 처럼 밑에서 위로 쌓고, 꺼낼 때는 위에서부터 꺼내는 형식

-넣는 기능(push()), 조회(peek()), 꺼내는 기능(pop()) 만 존재

-불편해 보이지만 최근 저장된 데이터를 나열하고 싶거나 데이터의 중복 처리를 막고 싶을 때 사용

*기능

-선언: Stack<Integer> intStack

-생성: new Stack<Integer>();

-추가: intStack.push({추가할 값})

-조회: intStack.peek()

-꺼내기: intStack.pop()/ 꺼내고 나면 삭제됨

 

<Queue>

-빨대처럼 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있는 집합

---First In First Out : 먼저 들어간 순서대로 값을 조회할 수 있다.

*특징

-넣는 기능(add()), 조회(peek()), 꺼내는 기능(poll()) 만 존재

-Queue는 생성자가 없는 껍데기라서 바로 생성할 수는 없다.(껍데기 = 인터페이스)

-생성자가 존재하는 클래스인 LinkedList를 사용하여 Queue를 생성해서 받을 수 있다.

Queue<Integer> intQueue = new LinkedList<Integer>();

*기능

-선언: Queue<Integer> intQueue

-생성: new LinkedList<Integer>();

-추가: intQueue.add({추가할 값}) / 값을 제일 위에 추가

-조회: intQueue.peek() / 맨 아래 값을 조회

-꺼내기: intQueue.poll() / 맨 아래 값을 꺼냄, 꺼낸 후에 삭제

 

<Set>

-순서가 없는 데이터의 집합, 데이터의 중복 허용 X - 순서 없고 중복 없는 배열

*특징

-순서가 보장되지 않는 대신 중복을 허용하지 않도록 유지할 수 있다.

-Set은 그냥 Set으로 쓸 수도 있지만, HashSet, TreeSet 등으로 응용하여 사용할 수 있다.

-Set은 생성자가 없는 인터페이스라서 바로 생성할 수 없다.

-생성자가 존재하는 클래스인 HashSet을 사용하여 Set을 생성해서 받을 수 있다.

*기능

-선언: Set<Integer> intSet

-생성: new HashSet<Integer>();

-추가: intSet.add({추가할 값}) / 값을 맨 위에 추가

-삭제: intSet.remove({삭제할 값}) / 직접 지정

-포함 확인: intSet.contains({포함 확인 할 값}) / 해당 값이 포함되어 있는지 boolean 값으로 응답받음

 

*HashSet : 가장 빠르며 순서를 전혀 예측할 수 없음

*TreeSet : 정렬된 순서대로 보관하며 정렬 방법을 지정할 수 있음

*LinkedHashSet : 추가된 순서 또는 가장 최근에 접근한 순서대로 접근 가능

-HashSet을 주로 쓰다가 순서 보장이 필요하면 LinkedHashSet을 사용

 

<Map>

-순서가 없는 (Key, Value) 쌍으로 이루어진 데이터의 집합, Key값 중복허용X

-이때까지는 value 값들만 넣어서 관리하는 자료구조였지만, Map은 key-value 구조로 구성된 데이터를 저장할 수 있음

*특징

-key - value 형태로 데이터를 저장하기 때문에 기존에 순번으로만 조회하던 방식에서, key 값을 기준으로 value를 조회할 수 있다.

-key 값 단위로 중복을 허용하지 않는 기능을 가지고 있다.

-Map은 그냥 Map으로 쓸 수도 있지만 HashMap, TreeMap 등으로 응용하여 사용할 수 있다.

*기능

-선언: Map<String, Integer> intMap / key타입과 value 타입을 지정해서 선언

-생성: new HashMap<>();

-추가: intMap.put({추가할 key값},{추가할 value값})

-조회: intMap.get({조회할 key값}) / 키에 있는 밸류값 조회

-전체 key 조회: intMap.keySet() 

-전체 value 조회: intMap.values()

-삭제: intMap.remove({삭제할 key값})

 

*HashMap : 중복을 허용하지 않고 순서를 보장하지 않음, 키의 값으로 null이 허용

*TreeMap : key 값을 기준으로 정렬을 할 수 있다. 다만, 저장시 정렬(오름차순)을 하기 때문에 저장시간이 다소 오래 걸림

 

 

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

1. length

-arrays(int[], double[], String[])

-length는 배열의 길이를 조회해 줌

 

2. length()

-String related Oject(String,StringBuilder etc)

-length()는 문자열의 길이를 조회해 줌

 

3. size()

-Collection Object(ArrayList, Set etc)

-size()는 컬렉션 타입 목록의 길이를 조회해 줌