memo6759 님의 블로그
2025-09-15(제네릭, 파이썬 설치 환경 및 VisualStudioCode) 본문
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() | 모든 요소 제거 |
코드 실행 흐름
- Vector 생성
- 기본 용량(capacity)은 10.
- 첫 요소 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) | 다른 컬렉션의 모든 요소를 한 번에 추가 |
코드 실행 흐름
- 초기 데이터 추가
"java" 7개 + "jdbc" 1개 → 총 8개 요소 - set(4, …) : 4번 인덱스 "jdbc" → "rasberry PI & MQTT"로 수정
- add("fornd - end") : 맨 뒤에 "fornd - end" 추가 (총 9개)
- remove(6) : 6번 인덱스 삭제 → 크기 8
- remove("java") : 첫 번째 "java" 삭제 → 크기 7
- contains("java") → true, contains("spring") → false
- isEmpty() → false (리스트가 비어있지 않음)
- 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() | 모든 요소 삭제 |
코드 동작 흐름
- HashSet 객체 생성
HashSet<String> set = new HashSet<>(); - 데이터 추가
- "java", "python", "mysq", "java", "jdbc" 차례대로 추가
- "java"는 중복 → 한 번만 저장됨
- 저장 개수 확인
set에 저장된 요소의 갯수 => 4
- (java, python, mysq, jdbc)
- 다시 "java" 추가 시에도 개수는 변하지 않음
set에 저장된 요소의 갯수 => 4
- contains("java") → true
- 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 중복 불가..



'HDC 학습일지' 카테고리의 다른 글
| 2025-09-17(컴프리헨션, 내장 함수,리스트, 튜플, 딕셔너리)-1 (0) | 2025.09.17 |
|---|---|
| 2025-09-16(python 기본) (0) | 2025.09.17 |
| HDC 랩스 : 2025-09-08(생성자, static 변수) (0) | 2025.09.08 |
| HDC 랩스 : 2025-09-05 (0) | 2025.09.08 |
| HDC 랩스 : 2025-09-04 (0) | 2025.09.04 |