풀스택 개발 학습 과정/백엔드(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 : 위치값 접근