-
Java [ ArrayList 와 HashMap ]☕Java 2024. 12. 17. 11:30728x90
이것의 개념을 모르면 개발을 못한다
면접 가서 이정도는 알아야 개발좀 할 줄 아는 사람이네
- Data Structure = 데이터 저장 하는 방식
자바에서 우리가 배운것은 배열
- 변수1개 에 여러개의 데이터를 저장 할 수 있어야 한다.
- 신규 데이터를 추가 할 수 있어야 한다. ( Array 는 미리 갯수를 정해 놓기에 사용이 불편하다)
- 저장 된 데이터를 가져 올 수 있어야 하고
- 기존 데이터는 수정 할 수 있어야 하고
- 필요 없는 데이터는 삭제 할 수 있어야 한다.
위와 같은 규칙을 갖고 사용할 수 있는 기본적인것은
자바에서는 ArrayList, HashMap
실제 실생활에서 두가지를 섞어서 쓴다 . 우리는 저것을 판단 할 수 있어야 한다.
데이터 구조( Data Structure )는 컴퓨터에서 데이터를 효율적으로 접근하고 사용할 수 있도록 구성하고 저장하는 방법입니다. 효과적이고 최적화된 프로그램을 작성하기 위한 필수적인 구성 요소라고 할 수 있죠.
옷을 옷장에 아무렇게나 넣어두는 것이 아니라 셔츠는 셔츠끼리, 바지는 바지끼리 정리하는 것처럼, 데이터 구조는 컴퓨터 내의 데이터를 정리하는 방법을 제공합니다.
데이터 구조가 중요한 이유
- 효율성: 데이터를 효율적으로 검색, 저장 및 조작할 수 있도록 합니다. 적절한 데이터 구조를 사용하면 프로그램의 속도를 크게 향상시킬 수 있습니다.
- 구성: 데이터를 논리적이고 의미있는 방식으로 구성할 수 있는 방법을 제공합니다.
- 문제 해결: 다양한 계산 문제를 해결하기 위한 알고리즘을 설계하고 구현하는 데 필수적입니다.
- 배열: 연속된 메모리 위치에 저장된 요소의 집합입니다.
- 연결 리스트: 각 요소가 다음 요소를 가리키는 선형 데이터 요소 모음입니다.
- 스택: 접시 더미처럼 LIFO (Last-In, First-Out) 원칙을 따릅니다.
- 큐: 상점에서 줄을 서는 것처럼 FIFO (First-In, First-Out) 원칙을 따릅니다.
- 트리: 루트 노드와 분기를 가진 계층적 구조입니다.
- 그래프: 노드와 에지를 사용하여 다양한 요소 간의 관계를 나타냅니다.
- 저장되는 데이터 유형
- 데이터에 대해 수행될 작업
- 프로그램의 효율성 요구 사항
ArrayList
ArrayList는 자바에서 제공하는 가변 크기 배열입니다. 일반 배열과 달리, ArrayList는 요소를 추가하거나 삭제하면서 크기를 동적으로 조절할 수 있습니다. 즉, 미리 크기를 정해놓지 않아도 되고, 필요에 따라 유연하게 크기를 변경할 수 있다는 장점이 있습니다.
ArrayList의 주요 특징
- 크기 가변: ArrayList는 요소가 추가되면 자동으로 크기가 증가하고, 요소가 삭제되면 크기가 감소합니다.
- 객체 저장: ArrayList는 기본 데이터 유형(int, char 등) 뿐만 아니라 객체도 저장할 수 있습니다.
- 인덱스 접근: 배열처럼 인덱스를 사용하여 요소에 빠르게 접근할 수 있습니다.
- 다양한 메서드: 요소 추가, 삭제, 검색, 정렬 등 다양한 작업을 위한 메서드를 제공합니다.
ArrayList 사용 예시
import java.util.ArrayList; public class ArrayListExample { public static void main(String[] args) { // ArrayList 생성 ArrayList<String> fruits = new ArrayList<>(); // 요소 추가 fruits.add("사과"); fruits.add("바나나"); fruits.add("딸기"); // 요소 접근 System.out.println(fruits.get(1)); // "바나나" 출력 // 요소 삭제 fruits.remove(0); // "사과" 삭제 // 크기 확인 System.out.println(fruits.size()); // 2 출력 // 전체 출력 for (String fruit : fruits) { System.out.println(fruit); } } }
ArrayList의 장점
- 유연성: 크기가 동적으로 조절되므로 메모리를 효율적으로 사용할 수 있습니다.
- 사용 편의성: 다양한 메서드를 통해 리스트를 쉽게 조작할 수 있습니다.
ArrayList의 단점
- 삽입/삭제 비효율: 중간에 요소를 삽입하거나 삭제할 경우, 뒤에 있는 요소들을 이동시켜야 하므로 비효율적일 수 있습니다.
ArrayList는 언제 사용하면 좋을까요?
- 저장할 데이터의 개수가 미리 정해져 있지 않을 때
- 데이터를 자주 추가하거나 삭제해야 할 때
- 데이터에 빠르게 접근해야 할 때
ArrayList는 자바 컬렉션 프레임워크의 핵심 클래스 중 하나이며, 다양한 프로그래밍 상황에서 유용하게 활용될 수 있습니다.
실제 연습 예제
실제 실습 코드
import java.util.ArrayList; public class Main { public static void main(String[] args) { // 이름을 저장 하려고 한다. // 자바의 Array(배열)은, 처음 만들때 갯수를 정해야 하므로 // 프로그램을 유연하게 만들수가 없다. // 따라서, 갯수 제한없이 데이터를 마음대로 추가할 수 있는 // ArratList 를 사용한다 // 작성방법 - 아래 내용은 변수 1개에 여러개의 데이터를 쓸 수있게한다. ArrayList<String> nameList = new ArrayList<>(); // 클래스에 객체 생성할 때 new 를 쓴다 // 네임리스트는 문자열이라서 클래스 옆에 스트링을 넣어 주는데 <> 이런 표식을 쓴다 왜? // ArrayList 어떠한 테이터 타입으로 저장 할 지 지정 할때 사용한다 // 신규 데이터를 추가 하기 아래 방법이 데이터 추가 하는 방법이다 // 어레이처럼 갯수를 정하지 않고 게속 들어간다(무한은 아님) // CRUD 의 C Create nameList.add("홍길동"); nameList.add("김나나"); nameList.add("Mike"); nameList.add("학교"); nameList.add("소리"); nameList.add("미소"); nameList.add("추미애"); //데이터 가져오기 CRUD 의 R Read // 첫번째(index) 데이터를 가져온다. 자바에서 첫번째 라는 것은 0과 같다 첫번째==0 nameList.get(0); // 눈으로 확인 하기 System.out.println(nameList.get(0)); // 홍길동이 보인다 System.out.println(nameList.get(2)); // Mike 가 보인다. System.out.println(nameList.get(0)); // 없는 데이터를 하면 에러가 보인다. // 데이터 수정 : CRUD 의 U Update // 김나나를 홍나나로 바꾸고 싶다. // nameList 의 1번, 쉼표 찎고 변경할 데이터로 작성 nameList.set(1,"홍나나"); // (Index 는 0부터 시작 하는게 많이 햇갈리니 주의 필요. System.out.println(nameList.get(1)); // 데이터 삭제 : CRUD 의 D Delete nameList.remove("홍나나"); // 같은 이름이 들어 있는 데이터를 삭제 해줘 nameList.remove(1); // 1번 행에 있는 데이터를 삭제 해줘 System.out.println(); // 저장되어 있는 모든 데이터를 가져오는 방법 // 이번 예. 에서는, 가져와서 출력! // ArrayList 에 저장된 데이터의 갯수를 확인 하는 함수 nameList.size(); // 눈으로 확인 하는 방법 System.out.println(nameList.size()); // 오리지날 반복문을 이용해서 데이터를 가져오기 for(int i = 0; i < nameList.size(); i++) { // i 는 인덱스(행번호) System.out.println(nameList.get(i)); } // 실무에서 많이 사용하는 방법으로 데이터를 모두 가져오기 for( String god : nameList ) { // name 는 정해줘야 한다(변수), 문자열은 스트링 System.out.println(god); } // 저장된 데이터가 모두 필요없다. // 따라서 데이터를 싹 다 비워서 , 초기화 하고 싶다 nameList.clear(); // ArrayList 가 비워져 있는지 확인 하는 함수 isEmpty() System.out.println(nameList.isEmpty()); // 네임리스트가 비워져 있니~? System.out.println(nameList.size()); // 네임 리스트 사이즈가 얼마나 되니? "다지워셔 0이야" } }
HashMap
HashMap은 자바에서 제공하는 자료구조로, 키(Key)와 값(Value)의 쌍으로 데이터를 저장하는 데 사용됩니다. 마치 사전처럼, 특정 키를 이용해서 그에 해당하는 값을 빠르게 찾아낼 수 있도록 설계되었습니다.
HashMap의 주요 특징
- 키-값 쌍: 데이터를 키와 값의 쌍으로 저장합니다. 키는 중복될 수 없지만, 값은 중복될 수 있습니다.
- 해시 테이블: 내부적으로 해시 테이블이라는 구조를 사용하여 데이터를 저장하고 검색합니다. 해시 테이블은 키를 해시 함수라는 특수한 함수를 통해 계산된 인덱스에 저장하는 방식으로, 빠른 검색 속도를 제공합니다.
- 빠른 검색: 해시 테이블을 사용하기 때문에 키를 이용하여 값을 매우 빠르게 찾을 수 있습니다. 평균적으로 O(1)의 시간 복잡도를 가집니다.
- 동적 크기 조절: HashMap은 저장되는 데이터의 양에 따라 크기를 동적으로 조절합니다. 즉, 미리 크기를 정해놓지 않아도 되고, 필요에 따라 유연하게 크기를 변경할 수 있습니다.
HashMap 사용 예시
Javaimport java.util.HashMap; public class HashMapExample { public static void main(String[] args) { // HashMap 생성 HashMap<String, Integer> ages = new HashMap<>(); // 요소 추가 ages.put("철수", 30); ages.put("영희", 25); ages.put("민수", 28); // 값 가져오기 System.out.println(ages.get("영희")); // 25 출력 // 요소 삭제 ages.remove("철수"); // 키 존재 여부 확인 System.out.println(ages.containsKey("민수")); // true 출력 // 전체 출력 for (String key : ages.keySet()) { System.out.println(key + ": " + ages.get(key)); } } }
HashMap의 장점
- 빠른 검색: 해시 테이블을 사용하여 데이터를 빠르게 검색할 수 있습니다.
- 유연성: 크기가 동적으로 조절되므로 메모리를 효율적으로 사용할 수 있습니다.
- 사용 편의성: 다양한 메서드를 통해 맵을 쉽게 조작할 수 있습니다.
HashMap의 단점
- 순서 보장 안됨: HashMap은 데이터를 저장하는 순서를 보장하지 않습니다. 즉, 데이터를 넣은 순서대로 출력되지 않을 수 있습니다.
- 해시 충돌: 서로 다른 키가 같은 해시 값을 가지는 경우 성능이 저하될 수 있습니다. 하지만 HashMap은 이러한 해시 충돌을 최소화하기 위한 다양한 기법을 사용합니다.
HashMap은 자바에서 가장 많이 사용되는 자료구조 중 하나이며, 데이터를 효율적으로 저장하고 검색해야 하는 다양한 상황에서 유용하게 활용될 수 있습니다. 예를 들어, 사용자 정보를 저장하거나, 캐시를 구현하거나, 데이터베이스에서 가져온 데이터를 처리하는 등 다양한 용도로 사용됩니다.
HashMap 실제 연습 자료
import java.security.Key; import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { // 학생 이름과 정수를 저장 하려고 합니다. // 이순신은 95점, 홍길동은 80점, 김나나는 70점 // 즉, 이름과 점수의 쌍(pair) 으로 저장 하고 싶다. // 이 쌍(pair)를 key 와 value // 변수 이름 하나로, 여러 데이터를 저장 할 수 있다. HashMap<String, Integer> scoreMap = new HashMap<>(); // 데이터 추가 : CRUD C scoreMap.put("이순신",95); scoreMap.put("김나나",80); scoreMap.put("홍길동",70); // 데이터 가져오기, 데이터 엑세스 : CRUD R // 해쉬맵은, key 로 한번에 데이터 엑세스가 가능하다. // 김나나 점수는? // 헤쉬맵은 동일한 데이터가 있으면 안된다 // 예 김나나가 2명일 경우 마지막 김나나의 정보가 최신정보로 업데이트가 된다. scoreMap.get("김나나"); System.out.println(scoreMap.get("김나나")); // 김나나의 점수를 88점으로 바꾸세요 : CRUD U scoreMap.put("김나나",88); System.out.println(scoreMap.get("김나나")); // 데이터 삭제하기 : CRUD D Delete // 홍길동의 데이터를 사제하시오. // 데이터 삭제도 key 값으로 한다. scoreMap.remove("홍길동"); // 해쉬맵에 저장되어 있는, 전체 데이터를 모두 가져와서 출력. for (Map.Entry<String,Integer> scorePair : scoreMap.entrySet()){ System.out.println(scorePair.getKey() + " , "+scorePair.getValue()); } // 데이터 모두 삭제 scoreMap.clear(); // 잘 삭제되었는지 확인 System.out.println(scoreMap.isEmpty()); } }
- DataBase = 데이터를 영구 저장 하는 소프트 웨어
- DataBase = CRUD
Data 는 2개 이상을 뜻한다(복수형- 여러개)
728x90'☕Java' 카테고리의 다른 글
Spring Boot 기반 REST API 개발: 회원가입/로그인 기능 구현하기, ( Spring Boot, Spring Security, JWT 활용 ) (0) 2024.12.29 컨트롤러: 웹 서비스의 친절한 안내자 ( Controller 클래스 Java 개발 ) (0) 2024.12.29 Java에서 문자열과 숫자 간 변환: 쉽게 이해하기(부록 문자열 함수소개) (0) 2024.12.16 Java 추상(Abstract) 클래스와 인터페이스(Interface): 개념 잡고 활용하기 (0) 2024.12.16 Java 상속이란? + 문제풀이 (1) 2024.12.15