ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java [ ArrayList 와 HashMap ]
    ☕Java 2024. 12. 17. 11:30
    728x90

     

    이것의 개념을 모르면 개발을 못한다

    면접 가서 이정도는 알아야 개발좀 할 줄 아는 사람이네 

     

    - 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 사용 예시

    Java
     
    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개 이상을 뜻한다(복수형- 여러개)

     

    728x90
Designed by Tistory.