이것의 개념을 모르면 개발을 못한다
면접 가서 이정도는 알아야 개발좀 할 줄 아는 사람이네
- Data Structure = 데이터 저장 하는 방식
자바에서 우리가 배운것은 배열
- 변수1개 에 여러개의 데이터를 저장 할 수 있어야 한다.
- 신규 데이터를 추가 할 수 있어야 한다. ( Array 는 미리 갯수를 정해 놓기에 사용이 불편하다)
- 저장 된 데이터를 가져 올 수 있어야 하고
- 기존 데이터는 수정 할 수 있어야 하고
- 필요 없는 데이터는 삭제 할 수 있어야 한다.
위와 같은 규칙을 갖고 사용할 수 있는 기본적인것은
자바에서는 ArrayList, HashMap
실제 실생활에서 두가지를 섞어서 쓴다 . 우리는 저것을 판단 할 수 있어야 한다.
데이터 구조( Data Structure )는 컴퓨터에서 데이터를 효율적으로 접근하고 사용할 수 있도록 구성하고 저장하는 방법입니다. 효과적이고 최적화된 프로그램을 작성하기 위한 필수적인 구성 요소라고 할 수 있죠. 옷을 옷장에 아무렇게나 넣어두는 것이 아니라 셔츠는 셔츠끼리, 바지는 바지끼리 정리하는 것처럼, 데이터 구조는 컴퓨터 내의 데이터를 정리하는 방법을 제공합니다. 데이터 구조가 중요한 이유
|
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 사용 예시
import 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개 이상을 뜻한다(복수형- 여러개)
'☕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 |