<목차>
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()는 컬렉션 타입 목록의 길이를 조회해 줌
'내배캠 > java' 카테고리의 다른 글
[내일배움캠프/백엔드] JAVA 문법종합반 3주차 강의 2. 상속 (0) | 2024.10.23 |
---|---|
[내일배움캠프/2주차] JAVA 문법종합반 3주차 강의 1. 클래스 (0) | 2024.10.18 |
[내일배움캠프/2주차] JAVA 문법종합반 2주차 강의 1 (2) | 2024.10.12 |
[내일배움캠프/2주차] JAVA 문법종합반 1주차 강의 2 (0) | 2024.10.11 |
[내일배움캠프/2주차] JAVA 문법종합반 1주차 강의 1 (5) | 2024.10.08 |