풀스택 개발 학습 과정/백엔드(Java, Spring)
[자바] ArrayList, HashSet, HashMap
육츠
2024. 1. 29. 10:14
ArrayList (***)
: 자바의 List 인터페이스를 상속받은 여러 클래스 중 하나
ArrayList 특징
- 배열과 유사하다.
- 오로지 객체만 저장할 수 있다.
- 선형 자료구조(순서가 있는 형태)(linear)
- 상위 인터페이스는 List 이다.
- index 값으로 접근한다.
- 데이터의 순서가 있다.
ArrayList = 클래스(concreate class _ 객체 생성 가능한 클래스) | abstract 클래스 (interface, abstract class) |
List = 인터페이스 | 객체 생성 불가능한 클래스 |
package struct;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import shape.vo.MyPoint;
public class ArrayListTest01 {
public static void main(String[] args) {
// List<String> list = new ArrayList<>();
List<String> list = new Vector<>(); // 같은 형제이기 때문에 이렇게도 가능하다.
List<String> list2 = null;
// List<String> points = new ArrayList<>(); //명시하는 것이 좋다.
List<MyPoint> points = new ArrayList<>();
// 다형성때문에 Mypoint에 하위 클래스는 전부 들어 갈 수 있다.
// 데이터 추가 (append)
list.add("사과") ; // 문자열만 가능
list.add("배") ;
list.add("바나나") ;
list.add("복숭아") ;
list.add("딸기") ;
// C
//데이터 꺼내기
// list.get(1);
// System.out.println(list.get(1));
// 삽입
// 위치를 알면 위치값과 함께 넣으면 됨
list.add(1,"수박");
System.out.println("데이터의 개수: " + list.size());
for (String s : list) System.out.println(s); // 전체 순회 출력
System.out.println("=========");
System.out.println(list);
// Arraylist 의 toString()이 오버라이드 되어 있기 때문에 주소대신 목록이 출력되는 것이다.
// R
//수정 U
list.set(1,"오렌지");
//삭제 D
list.remove(0);
System.out.println("남은 데이터: " + list.size());
list.clear();
System.out.println("남은 데이터: " + list.size());
System.out.println(list);
}
}
키워드 | 의미 | 코드 |
add | 데이터 추가 | list.add("사과") ; |
get | 데이터 한 개 읽기 | list.get(1); |
set | 데이터 수정 | list.set(1,"오렌지"); |
remove | 데이터 한 개 지우기 | list.remove(0); |
clear | 데이터 전체 지우기 | list.clear(); |
코드 | 의미 |
List<String> list = new ArrayList<>(); List<String> list = new Vector<>(); |
같은 형제이기 때문에 이렇게도 가능하다. |
List<String> points = new ArrayList<>(); List<MyPoint> points = new ArrayList<>(); |
다형성때문에 Mypoint에 하위 클래스는 전부 들어 갈 수 있다. 타입을 명시하는 것이 좋다. |
package struct;
import java.util.ArrayList;
import java.util.List;
class Person {
String name;
int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
// 기본 생성자가 없으므로 기본생성자 모양으로 넣으면 오류
}
public class ArrayListTest02 {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
// list 에는 Person 타입만 넣을 수 있다.
list.add(new Person("홍길동", 12));
// 반드시 객체를 생성해서 넣어야함
list.add(new Person("전우치", 25));
list.add(new Person("손오공", 30));
list.add(new Person("사오정", 31));
// 삽입
list.add(1,new Person("저팔계",15));
// 홍 - 저 - 전 - 손 - 사
// 데이터 사이즈 : 5
Person p = list.remove(4);
// list.remove(4); // 위치값을 알면 위치를 넣으면 됨
// 사오정 삭제 , 4번 위치의 데이터가 튕겨나옴
// 데이터 사이즈 : 4
// p 에는 사오정이 대입됨
//손오공(3) -> 삼장법사
// 홍 - 저 - 전 - 삼 / 데이터 사이즈 : 4
p = list.set(3, new Person("삼장법사", 65));
// p에 손오공이 튕겨져 들어가고 그 자리에는 삼장법사가 들어감
// 홍 - 저 - 전 - 삼
p = list.get(1); // 저팔계가 p에 들어있음.
System.out.println(list);
// toString() 을 오버라이딩 해야 안에 글자가 제대로 보임 .
}
}
코드 | 의미 |
class Person { String name; int age; public Person(String name, int age) { super(); this.name = name; this.age = age; } |
기본 생성자가 없으므로 기본생성자 모양으로 넣으면 오류 |
public class ArrayListTest02 { public static void main(String[] args) { List<Person> list = new ArrayList<>(); list.add(new Person("홍길동", 12)); |
- list 에는 Person 타입만 넣을 수 있다. - 반드시 객체를 생성해서 넣어야함 |
Person p = list.remove(4); |
p 에는 사오정이 대입된다. ( 사오정 삭제 , 4번 위치의 데이터가 튕겨나옴 ) |
HashSet
- Set 은 인터페이스 이기 때문에 객체 생성 안되어서 HashSet 사용한다.
- return 타입 : boolean
- index 의 개념이 없다. ==> 데이터를 하나씩 꺼내 오는 것이 불가능하다.
package struct;
import java.util.HashSet;
import java.util.Set;
public class SetTest01 {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
// Set = 인터페이스 -> 객체 생성 안됨
set.add("아이스아메리카노");
set.add("카페모카");
set.add("아이스초코");
set.add("자바프라프치노");
set.add("돌체라떼");
set.contains("허니블랙티"); // 포함 여부
// false 반환
set.add("카페모카");
// 기존에 동일한 데이터가 있는 경우 들어가지 않는다.
set.size(); // 데이터 사이즈 : 5
set.isEmpty(); // false
// set.clear(); 전부삭제
set.remove("아메리카노"); // 없어서 지워지지 않음
// false
set.toArray(); // return object // 반환을 설정할 수 있는 옵션 있다.
// set.get(); 없음 => index의 개념이 없기 때문에
}
}
코드 | 의미 |
Set<String> set = new HashSet<>(); | Set은 인터페이스라서 객체생성이 안되기 때문에 HashSet 사용한다. |
set.add("아이스아메리카노"); set.add("카페모카"); set.add("카페모카"); |
기존에 동일한 데이터가 있는 경우 들어가지 않는다. |
// set.get(); | 없다. ==> index의 개념이 없기 때문에 |
HashMap
package struct;
import java.util.HashMap;
import java.util.Map;
public class MapTest01 {
public static void main(String[] args) {
// 키밸류를 어떤 타입으로 넣어야 하는지 정해야 한ㄴ다.
// Map<int ,> ==> X
Map<Integer,String> map = new HashMap<>();
// 데이터 넣기
map.put(100, "홍길동"); // add
map.put(200, "사오정");
map.put(300, "저팔계");
System.out.println(map);
// 가장 마지막 값을 저장한다.
map.put(100, "삼장법사");
System.out.println(map);
// get(index) ==> get(key)
System.out.println(map.get(300));
// 정수 300이 객체형 데이터 타입 300 으로 자동 변경된다.
// = Auto Boxing
// 위치값 아님 300 이라는 키이다.
System.out.println(map.get(700));
// 키가 없으면 반환 할 데이터가 없기 때문에 null이 반환된다.
map.containsKey(700); // false
// 포함 여부 체크
map.containsValue("삼장법사"); // 있으면 true, 없으면 false
map.remove(200); // 키 200 인 데이터를 삭제
// 100번 키가 있는 경우 아래 두 메소드의 차이는?
map.replace(800, "전우치"); // 키가 100인 값의 value를 수정
System.out.println(map); // 수정만 가능
map.put(800, "전우치");
System.out.println(map); // 삽입, 수정 가능
}
}
키워드 | 의미 | 코드 |
put | 데이터 삽입, 수정 | map.put(100, "홍길동"); |
get | key 데이터 조회 | map.get(300) |
containsValue | key 데이터 포함 여부 | map.containsValue("삼장법사"); |
containsKey | Value 데이터 포함 여부 | map.containsKey(700); |
replace | 데이터 수정 | map.replace(800, "전우치"); |
코드 | 의미 |
Map<Integer,String> map = new HashMap<>(); | Map<int ,> ==> X : 정해진 선언 방법이 존재한다. |
map.put(100, "홍길동"); map.put(100, "삼장법사"); |
가장 마지막 값을 저장하기 때문에 삼장법사가 출력된다. |
System.out.println(map.get(300)); | 정수 300이 객체형 데이터 타입 300 으로 자동 변경된다. (= Auto Boxing ) 위치값이 아닌 300 이라는 key 이다. |
System.out.println(map.get(700)); | 키가 없으면 반환 할 데이터가 없기 때문에 null이 반환된다. |
Syntax
package syntax;
import java.util.Objects;
class Friend{
String name;
int age;
public Friend(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Friend [name=" + name + ", age=" + age + "]";
}
}
public class BasicSyntax {
public static void main(String[] args) {
Friend f1 = new Friend("홍길동", 10);
Friend f2 = new Friend("홍길동", 10);
// 다른 객체
//equals : 문자열 비교시 데이터가 같은지 비교
String s1 = "사과";
System.out.println(s1.equals(s1));
System.out.println(f1.equals(f2)); // false
}
}
equals : 문자열 비교시 데이터가 같은지 비교하는 것
코드 | 의미 |
System.out.println(f1.equals(f2)); | false 전달되는 타입은 앞의 호출한 타입과 같은 타입이어야 한다. |
만약 f1 f2의 값이 모두 같으면 true 반환되도록 하려면?
class Friend{
String name;
int age;
public Friend(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Friend [name=" + name + ", age=" + age + "]";
@Override
public int hashCode() {
return Objects.hash(age, name);
}
@Override
public boolean equals(Object obj) {
// f1 = this
if(!(obj instanceof Friend)) return false; // obj 가 같은 타입이 아니면 false 반환
Friend tmp = (Friend)obj; // obj 를 다운캐스팅
// 이름도 같고 나이도 같으면 같은 데이터로 인정 ==> true
if(this.name.equals(tmp.name) && this.age == tmp.age)
return true; // f1 의 이름, 나이 와 f2의 이름,나이 같은지
return false;
}
코드 | 의미 |
@Override public int hashCode() { return Objects.hash(age, name); } |
데이터가 같으명 객체를 하나만 만들어 준다. ==> 데이터를 넣어서 주소를 계산한다. (키가 유일한 이유) |
@Override public boolean equals(Object obj) { if(!(obj instanceof Friend)) return false; Friend tmp = (Friend)obj; if(this.name.equals(tmp.name) && this.age == tmp.age) return true; return false; |
obj 가 같은 타입이 아니면 false 반환 obj 를 다운캐스팅 f1 의 이름, 나이 와 f2의 이름,나이 같다면 동일한 데이터로 인정한다. ( true ) 전체적으로는 false 를 반환 |
(p) dict ==> (J) HashMap ==> (JS) JSON : Key 접근
(p) list ==> (J) ArrayList ==> (JS) List : 위치값 접근