Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Archives
Today
Total
관리 메뉴

memo6759 님의 블로그

2025-09-15(제네릭, 파이썬 설치 환경 및 VisualStudioCode) 본문

HDC 학습일지

2025-09-15(제네릭, 파이썬 설치 환경 및 VisualStudioCode)

heewon09 2025. 9. 16. 09:04

 Java Vector 기본 사용법

 Vector란?

  • java.util.Vector 클래스는 List 인터페이스를 구현한 가변 크기 배열.
  • JDK 1.0부터 제공된 레거시(List 초기 버전) 컬렉션.
  • 자동으로 크기 확장: 요소를 계속 추가하면 용량(capacity)이 2배씩 늘어남.
  • 동기화(synchronized) 지원:
    → 멀티스레드 환경에서 안전하지만, 단일 스레드 환경에서는 ArrayList보다 느림.

 

 

 Java ArrayList 완벽 이해 (Vector → ArrayList 변환)

 ArrayList란?

  • 가변 크기 배열을 제공하는 java.util 패키지의 클래스
  • List 인터페이스를 구현 → 순서가 유지되고 중복 저장 가능
  • 동기화 X
    • 단일 스레드 환경에서 Vector보다 빠름
    • 멀티 스레드 환경에서 동기화가 필요하다면 Collections.synchronizedList()와 함께 사용
package api.util;

import java.util.Vector;

public class VectorTest1 {

    public static void main(String[] args) {
        // 1. Vector 생성
        //    E는 제네릭 타입 파라미터로, 참조형만 가능
        Vector<Integer> v = new Vector<Integer>(); // int[] myarr = new int[10] 과 유사

        // 2. 요소 추가
        v.add(100); // myarr[0] = 100
        System.out.println("현재 벡터에 저장된 요소의 개수 => " + v.size());
        System.out.println("현재 벡터의 용량 => " + v.capacity());

        // 3. 1~10까지 추가
        for (int i = 1; i <= 10; i++) {
            v.add(i);
        }

        System.out.println("현재 벡터에 저장된 요소의 개수 => " + v.size());
        System.out.println("현재 벡터의 용량 => " + v.capacity());

        // 4. 특정 인덱스 요소 조회
        System.out.println("1번 요소의 값은 => " + v.get(1));

        // 5. 모든 요소 출력 - 일반 for문
        for (int i = 0; i < v.size(); i++) {
            System.out.println(i + "번째 요소 => " + v.get(i));
        }

        System.out.println("-------------------------------------------------------------");

        // 6. 향상된 for문
        for (int data : v) {
            System.out.println(data);
        }
    }
}

주요 메서드

메서드설명
add(E e) 요소를 끝에 추가
size() 현재 저장된 요소의 개수
capacity() 내부 배열의 실제 용량(초기 기본값 10, 꽉 차면 2배 증가)
get(int index) 특정 인덱스 요소 조회
remove(int index) 특정 인덱스 요소 삭제
clear() 모든 요소 제거

코드 실행 흐름

  1. Vector 생성
    • 기본 용량(capacity)은 10.
  2. 첫 요소 100 추가
size = 1
capacity = 10
  • 1~10까지 추가
    • 기존 요소 1개 + 10개 추가 → 총 11개.
    • 10개 용량을 초과하면 **자동으로 2배(20)**로 확장.
  • 인덱스 접근
    • get(1)은 두 번째 요소 출력 (100 다음 값, 즉 1).
  • 전체 요소 출력
    • 일반 for문과 향상된 for문 모두 사용.

 예상 실행 결과

(순서 고정)

 

현재 벡터에 저장된 요소의 개수 => 1
현재 벡터의 용량 => 10
현재 벡터에 저장된 요소의 개수 => 11
현재 벡터의 용량 => 20
1번 요소의 값은 => 1
0번째 요소 => 100
1번째 요소 => 1
2번째 요소 => 2
...
10번째 요소 => 10
-------------------------------------------------------------
100
1
2
3
4
5
6
7
8
9
10

 ArrayList와 Vector의 차이

구분ArrayListVector
동기화 ❌ 기본 비동기 ✅ 기본 동기화
속도 빠름 상대적으로 느림
등장 시기 JDK 1.2 JDK 1.0
사용 추천 현대 자바에서 일반적으로 사용  레거시 코드 유지 시에만

새로운 프로젝트는 ArrayList가 권장됩니다.

 

제네릭(Generics) 사용

ArrayList<E>에서 <E>는 요소(Element)의 타입을 지정합니다.

  • 참조형 타입만 가능
    → 기본형(int, double 등)은 래퍼 클래스(Integer, Double …)를 사용해야 함.
  • 타입 안정성(Type Safety) 확보
ArrayList<Integer> list = new ArrayList<>();  // Integer만 저장 가능
package api.util;

import java.util.ArrayList;

public class ArrayListTest1 {
    public static void main(String[] args) {
        // ① ArrayList<Integer> 객체 생성
        //    int[] myArr = new int[10] 과 비슷하지만 크기가 자동 확장됨
        ArrayList<Integer> v = new ArrayList<Integer>();

        // ② 요소 추가 (1~10)
        for (int i = 1; i <= 10; i++) {
            v.add(i);
        }

        // ③ 요소 개수 출력
        System.out.println("현재 ArrayList에 저장된 요소의 개수 => " + v.size());

        // ④ 특정 인덱스 요소 접근 (인덱스는 0부터 시작)
        System.out.println("1번 요소의 값은 => " + v.get(1));

        // ⑤ 전체 요소 출력 - 일반 for문
        for (int i = 0; i < v.size(); i++) {
            System.out.println(i + "번째 요소 => " + v.get(i));
        }

        System.out.println("---------------------------------------");

        // ⑥ 전체 요소 출력 - 향상된 for문
        for (int data : v) {
            System.out.println(data);
        }
    }
}

코드 상세 해설

구문설명
ArrayList<Integer> v = new ArrayList<>(); Integer 타입 요소만 담는 ArrayList 객체 생성
v.add(i); 요소 추가 (자동으로 끝에 삽입)
v.size(); 현재 저장된 요소 개수 반환
v.get(1); 1번 인덱스(두 번째 요소) 조회
for (int i = 0; i < v.size(); i++) 인덱스로 접근하여 요소 출력
for (int data : v) 향상된 for문으로 모든 요소를 순차 접근

💡 주의

  • v.get(1)은 두 번째 요소를 의미합니다. (인덱스는 0부터 시작)
  • add()로 추가한 데이터는 자동으로 끝에 삽입되며, 배열처럼 크기를 미리 지정하지 않아도 됩니다.

 

ArrayList 주요 메서드 정리

메서드설명
add(E e) 요소 추가
add(int index, E e) 특정 위치에 삽입
get(int index) 요소 조회
set(int index, E e) 요소 수정
remove(int index) 요소 삭제
contains(Object o) 값 존재 여부 확인
clear() 모든 요소 삭제
isEmpty() 비어있는지 여부 확인

 

 핵심 포인트

  • 배열과 달리 크기가 유연하며, 삽입·삭제가 쉽다.
  • 순서 유지 & 중복 허용한다.
  • 동기화가 필요한 환경이 아니라면 Vector 대신 ArrayList를 사용하는 것이 표준.

정리:
기존 Vector 코드를 거의 그대로 ArrayList로 바꿀 수 있으며,
멀티 스레드가 아닌 일반 프로그램이라면 ArrayList가 더 빠르고 효율적입니다.

package api.util;

import java.util.ArrayList;

public class ArrayListTest2 {

    public static void main(String[] args) {
        // ArrayList<String> 생성
        ArrayList<String> list = new ArrayList<String>();
        list.add("java");
        list.add("java");
        list.add("java");
        list.add("java");
        list.add("jdbc");
        list.add("java");
        list.add("java");    
        list.add("java");
        display(list);

        // 1) set() : 4번 요소 수정
        list.set(4, "rasberry PI & MQTT");
        display(list);
        System.out.println("사이즈 => " + list.size());

        // 2) add() : 맨 뒤에 요소 추가
        list.add("fornd - end");   // 오타: 'front-end' 의도인 듯
        display(list);
        System.out.println("사이즈 => " + list.size());

        // 3) remove(index) : 인덱스로 요소 삭제
        list.remove(6);
        display(list);
        System.out.println("사이즈 => " + list.size());

        // 4) remove(Object) : 값으로 삭제 → 동일한 값이 여러 개면 첫 번째만 삭제
        list.remove("java");
        display(list);
        System.out.println("사이즈 => " + list.size());

        // 5) contains() : 특정 요소 존재 여부
        System.out.println(list.contains("java"));   // true
        System.out.println(list.contains("spring")); // false

        // 6) isEmpty() : 리스트가 비어있는지 확인
        System.out.println(list.isEmpty());

        // 7) addAll() : 다른 리스트 요소 모두 추가
        ArrayList<String> list2 = new ArrayList<String>();
        list2.add("html");
        list2.add("css");
        list2.add("javascript");

        display(list2);

        // list2에 list2를 다시 추가 → 자기 자신 추가 (주의!)
        list2.addAll(list2);
        display(list2);
        System.out.println(list2);
    }

    // 리스트 전체 요소를 출력하는 유틸 메서드
    public static void display(ArrayList<String> list) {
        System.out.println("------------------------------");
        for (String data : list) {
            System.out.println(data);
        }
    }
}

 주요 메서드별 상세 설명

메서드사용 예설명
add(E e) list.add("java") 요소를 맨 끝에 추가
add(int idx, E e) list.add(2, "spring") 특정 인덱스에 삽입
set(int idx, E e) list.set(4, "rasberry PI & MQTT") 해당 인덱스 요소를 수정
get(int idx) list.get(1) 해당 인덱스 요소 조회
remove(int idx) list.remove(6) 인덱스로 삭제
remove(Object o) list.remove("java") 값으로 삭제 (첫 번째 매칭 값만 제거)
contains(Object o) list.contains("java") 포함 여부 반환 (true/false)
isEmpty() list.isEmpty() 컬렉션이 비어있으면 true
addAll(Collection c) list2.addAll(list) 다른 컬렉션의 모든 요소를 한 번에 추가

 코드 실행 흐름

  1. 초기 데이터 추가
    "java" 7개 + "jdbc" 1개 → 총 8개 요소
  2. set(4, …) : 4번 인덱스 "jdbc" → "rasberry PI & MQTT"로 수정
  3. add("fornd - end") : 맨 뒤에 "fornd - end" 추가 (총 9개)
  4. remove(6) : 6번 인덱스 삭제 → 크기 8
  5. remove("java") : 첫 번째 "java" 삭제 → 크기 7
  6. contains("java") → true, contains("spring") → false
  7. isEmpty() → false (리스트가 비어있지 않음)
  8. addAll(list2) : list2에 자기 자신을 또 추가
    → "html","css","javascript","html","css","javascript" (총 6개)

 실행 결과 예시(일부)

------------------------------
java
java
java
java
jdbc
java
java
java
------------------------------
java
java
java
java
rasberry PI & MQTT
java
java
java
사이즈 => 8
...
true
false
false
[html, css, javascript, html, css, javascript]

 실습 포인트 & 주의 사항

  • 중복 허용: java를 여러 번 넣어도 모두 저장된다.
  • remove("java")는 첫 번째 일치 값만 삭제.
  • addAll(list2)에 자기 자신을 넣으면 데이터가 두 배로 복사된다.
    → 보통은 list2.addAll(list)처럼 다른 리스트의 데이터를 합칠 때 사용.
  • "fornd - end"는 오타 가능성 → front-end 로 수정 권장.

 HashSet 기본 사용법과 특징

 HashSet이란?

  • java.util.HashSet 클래스는 Set 인터페이스를 구현.
  • 순서를 유지하지 않음
    → 저장·출력 순서가 입력 순서와 다를 수 있음.
  • 중복 불가
    → 동일한 값은 한 번만 저장됨.
  • 내부적으로 HashMap을 이용해 요소를 저장하기 때문에 검색 속도가 빠르다.
package api.util;

import java.util.HashSet;

public class HashSetTest1 {

    public static void main(String[] args) {
        // 1. HashSet 생성 (문자열만 저장)
        HashSet<String> set = new HashSet<String>();

        // 2. 데이터 추가
        set.add("java");
        set.add("python");
        set.add("mysq");   // 오타 추정: "mysql" 의도
        set.add("java");   // 중복 추가
        set.add("jdbc");

        // 3. 저장된 요소 개수 확인
        System.out.println("set에 저장된 요소의 갯수 => " + set.size());

        // 같은 값 또 추가 (중복 허용 안 함)
        set.add("java");
        System.out.println("set에 저장된 요소의 갯수 => " + set.size());

        // 4. 특정 값 포함 여부
        System.out.println(set.contains("java")); // true

        System.out.println("======================================");

        // 5. 전체 요소 순회
        for (String e : set) {
            System.out.println(e);
        }
    }
}

 주요 메서드 정리

메서드설명
add(E e) 요소 추가. 이미 존재하면 false 반환하고 저장 안 함
size() 저장된 요소 개수
contains(Object o) 특정 요소 포함 여부 확인
remove(Object o) 요소 삭제
isEmpty() 비어있는지 확인
clear() 모든 요소 삭제

코드 동작 흐름

  1. HashSet 객체 생성
    HashSet<String> set = new HashSet<>();
  2. 데이터 추가
    • "java", "python", "mysq", "java", "jdbc" 차례대로 추가
    • "java"는 중복 → 한 번만 저장됨
  3. 저장 개수 확인
set에 저장된 요소의 갯수 => 4

 

  • (java, python, mysq, jdbc)
  • 다시 "java" 추가 시에도 개수는 변하지 않음
set에 저장된 요소의 갯수 => 4

 

  1. contains("java") → true
  2. for-each 반복문으로 전체 요소 출력
    • 출력 순서는 무작위(해시 구조)

 실행 결과 예시

(순서는 JVM에 따라 달라질 수 있음)

 
set에 저장된 요소의 갯수 =>4
set에 저장된 요소의 갯수 =>4
true
======================================
python
jdbc
java
mysq

 HashSet 특징 요약

  • 중복 데이터 자동 제거
  • 저장 순서 유지 안 함
  •  검색·추가·삭제 속도 빠름
  •  인덱스로 접근 불가 (get(index) 없음)

 

 

 HashMap 생성

HashMap<String, Integer> map = new HashMap<String, Integer>();

 

  • Key : String
  • Value : Integer
  • 특징 : 키(Key)는 중복 불가, 값(Value)은 중복 가능.
    삽입 순서를 보장하지 않음.

데이터 저장

map.put("ao1", 1000);
map.put("ao2", 2000);
map.put("ao3", 3000);
map.put("ao4", 4000);
map.put("ao5", 5000);

 

  • put(key, value) 로 저장.
  • 같은 키를 넣으면 값이 덮어쓰기 됨.
System.out.println(map.size());
  • 현재 map에 5개의 키-값 쌍이 있으므로 5 출력.

 개별 값 꺼내기

System.out.println(map.get("a01"));
System.out.println(map.get("a02"));

 

핵심 정리

  • HashMap 특징
    • key는 유일해야 함.
    • 순서가 없음.
    • get(키)는 정확히 일치해야만 값 반환.
  • 오타나 공백, 대소문자 차이로 키가 맞지 않으면 null이 출력됨.

 

 

📂 프로젝트 개요

  • 목표: ArrayList, HashSet, HashMap 등 자바 컬렉션 프레임워크에 Person 객체를 저장하고 각 자료구조의 특징을 비교·출력.
  • 클래스 구성
    • Person: 이름, 나이, 주소를 저장하는 간단한 VO(Value Object).
    • CollectionExam: 컬렉션에 Person 객체를 넣고 출력하는 예제.
public class Person {
    private String name;
    private int age;
    private String addr;

    public Person() {}

    public Person(String name, int age, String addr) {
        this.name = name;
        this.age = age;
        this.addr = addr;
    }

    // Getter / Setter
    public String getName() { return name; }
    public int getAge() { return age; }
    public String getAddr() { return addr; }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", addr=" + addr + "]";
    }
}

 

  • 단순히 데이터를 담는 용도로 잘 작성됨.
  • equals & hashCode가 없음 → HashSet에서 중복 객체 제거가 안 됨(내용이 같아도 다른 객체로 취급).

 CollectionExam 주요 코드

 객체 생성

Person p1 = new Person("김남준", 30, "서울");
Person p2 = new Person("김남", 35, "서울");
Person p3 = new Person("남준", 34, "광주");

 ArrayList 저장

ArrayList<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);

 HashSet 저장

HashSet<Person> set = new HashSet<>();

set.add(p1);
set.add(p2);
set.add(p3);

 

 HashMap 저장

HashMap<String, Person> map = new HashMap<>();
map.put(p1.getName(), p1);
map.put(p2.getName(), p2);
map.put(p3.getName(), p3);

 출력 메서드들

ArrayList 출력

 

public static void print(ArrayList<Person> list) {
    for (Person p : list) {
        System.out.println("이름 : " + p.getName() + ", 나이 : " + p.getAge());
    }
    System.out.println("---------------------------------");
}

HashSet 출력

public static void print(HashSet<Person> set) {
    for (Person p : set) {
        System.out.println("이름 : " + p.getName() + ", 나이 : " + p.getAge());
    }
    System.out.println("---------------------------------");
}

HashMap 출력

public static void print(HashMap<String, Person> map) {
    Set<String> keyset = map.keySet();
    for (String key : keyset) {
        Person value = map.get(key);
        System.out.println("key : " + key +
                           ", 이름 : " + value.getName() +
                           ", 나이 : " + value.getAge());
    }
    System.out.println("---------------------------------");
}


💡 기존 코드엔 "이름 : " + p + value.getName() 식으로 키와 값이 중복 출력되는 부분이 있었음 → 위처럼 수정.

 

 

🏁 실행 예시 출력

이름 : 김남준, 나이 : 30
이름 : 김남, 나이 : 35
이름 : 남준, 나이 : 34
---------------------------------
이름 : 김남준, 나이 : 30
이름 : 김남, 나이 : 35
이름 : 남준, 나이 : 34
---------------------------------
key : 김남준, 이름 : 김남준, 나이 : 30
key : 김남,   이름 : 김남,   나이 : 35
key : 남준,   이름 : 남준,   나이 : 34
---------------------------------

 

✍️ 정리

  • ArrayList: 순서 유지, 중복 허용.
  • HashSet: 순서 없음, 중복 제거. (※동일성 판단을 위해 equals/hashCode 필요)
  • HashMap: Key-Value 구조, Key 중복 불가..

 

 

C:\Users\Admin\AppData\Local\Programs\Python\Python313
개발할수있는 환경 메세지