일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 자바
- DB
- SQL
- iBATIS
- 환경설정
- scope
- mybatis
- 개선
- extends
- html
- Set
- JCF
- String
- 자바스크립트
- regex
- Selector
- java
- jdbc
- for문
- JavaScript
- jar
- 자료구조
- controller
- 정규화표현식
- jquery
- interface
- 형변환
- 참조타입
- 알고리즘
- jsp
- Today
- Total
프로그래밍공부노트
Day 21 - JAVA(JCF, Set, List, Map) 본문
Set(중복 없음, 순서 없음)
- 자료구조에 넣으려고 HashCode를 확인하였는데 이미 자료구조에 같은 HashCode를 가진 값이 있다면 넣지 않을거야 왜냐하면 중복 안됨
- add()를 통해서 집어넣고 꺼낼때는 iterator 인터페이스를 사용하여 꺼낸다. 객체가 갖고 있는 값에 의한 HashCode Overriding이 발생하고 이 HashCode를 통하여 같은 값인지 비교한다.
- ** 자료구조는 주소전달이 아니라 값이 들어가 있는 것 (pass by reference와 다르다)
Set타입으로 우리가 사용을 하는 것이지 <Generic>으로 타입이 결정되는게 아님 오늘 헷갈렸다.
Generic은 그저 자료구조에 넣고 다시 추출할 타입을 정하는 것이다
- remove() (자료구조 안에서 참조타입 삭제)
변수의 hashcode 값을 통해서 자료구조에 똑같은 hashcode 있는지 찾아서 삭제하고 그 값을 반환해줌
즉, 뭘 삭제했는지 반환해줌
- 출력 방법 2가지
1) iterator 객체를 사용하자(while문 사용) : Set_Feature4 마지막 출력에 사용
import java.util.HashSet;
public class Set_Feature4 {
public void set_Remove() {
Set<String> sets = new HashSet<String>();
sets.add("하늘"); //하늘 자료구조에 넣음 h01
sets.add("바람"); //바람 자료구조에 넣음 h02
sets.add("별"); // 별 자료구조에 넣음 h03
String re = "하늘"; // String pool에 생성 하늘 h01
String re2 = new String("하늘"); //heap에 생성 하늘 h01
String re3 = "꿈"; // String pool에 생성 꿈 ho4
//삭제하는 방법은 변수의 주소를 통해서 가지고 있는 값의 오버라이딩된 hashcode로 삭제함
sets.remove("하늘");
// 이 코드가 적용 된다면 "하늘"에 의해 Overriding 된 HashCode를 갖고 있는 객체를 지운다
sets.remove(re);
// 이것 또한 String re = "하늘"이고 이 코드를 실행하면 역시 Overriding 된 HashCode를 갖고 있는 객체 지운다
sets.remove(re2);
// 이것 또한 똑같다
sets.add(re3); // "꿈"을 자료구조에 넣음 h04
re3 = "자바";// String re3을 "자바"라고 다른 값을 선언했어 h05
sets.remove(re3);
// 여기서 re3을 지우면?"자바"에 의해 Overriding된 HashCode가 자료구조 안에 없어 삭제되는 것 없음
Iterator<String> iter = sets.iterator(); // Iterator 사용
while (iter.hasNext()) { // while문을 통하여 값이 있다면(True) 계속 반복 , hasNext 값 있는지 T/F 반환
String s = iter.next();// next() 값을 반환
System.out.println(s);
}
}
}
2) 기본배열로 만든 후에 출력하자
- returnSet은 Set타입이야 Set는 interface야 그래서 최상위 클래스인 Object 클래스로 casting 한후 JCF를 기본배열로 만들어 주는 toArray 사용하여 기본배열 만들고 Object 타입으로 반환 후 Arrays.toString 사용하여 껍데기가 아닌 값을 출력
Object[] iArray = (Object[])returnSet.toArray();
List (순서 있음(index), 중복 가능)
- 자료구조 add() 똑같음
- remove() Overloading된 함수중 index를 통해석 삭제 가능, 값을 통해서 삭제 가능(HashCode)
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.event.ListSelectionEvent;
//Vector, ArrayList, LinkedList...
//값의 중복이 가능함
//값을 입력하면 자동으로 index를 부여해줌
//1[0],2[1],3[2] -> 2번의 값을 삭제하면 1[0],3[1]이 됨
public class List_Feature {
public void list_Check() {
List<Integer> list = new ArrayList<Integer>();
// Vector< Integer> v = new Vector<Integer>(5,5);
int n1 = 10;
int n2 = 20;
int n3 = 30;
Integer n4 = new Integer(30);
// Integer n5 = 30;
list.add(n1);
list.add(n2);
list.add(n3);
for (int i = 0; i < list.size(); i++) { //size 3이야 3개 들어있어
System.out.println(list.get(i));
}
//n3에 새로운 값을 입력
n3 = 40;
// n3의 값은 기본타입의 int 따라서 remove의 오버로딩된 함수 중 index를 통해서 삭제하는 함수를 실행
// 근데 현재 생성된 List 객체는 10[0] 20[1] 30[2]의 객체가 입력되어 있기 때문에 index 번호는 2를 넘을 수 없음
// list.remove(n3); -> list.remove(40);이라고 인식하여 indexOutyOfBoundaryException이 발생
list.remove(n3);
Integer r = 30; // 객체
list.remove(r); // AutoBoxing과 AutoUnBoxing은 연산과 선언에서만 발생됨
list.remove(new Integer(30)); //값의 hashcode 판단해서 30과 같은 hashcode니까 삭제
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
Map(Key, Value)
- Map은 새로운 값을 넣으면 그값으로 대체 된다
- Key를 통해서만 Value를 찾고 삭제 가능
- 자료구조에 입력을 위해 add()가 아니라 put()을 사용, 삭제 remove()
- value 갖고 삭제 할 수 없어요, key값으로는 가능함
- contains 있는지 확인 key, value 둘다 확인 가능, 참조타입 value 확인시 HashCode로 확인함
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
//입력시 put이라는 명령어를 사용 get(키객체)
//key는 중복이 불가능하다
// 근데 key가 같으면서 값이 다른 객체는 어떻게 입력이 될까?
//pass by value 처럼 마지막 값을 입력 한다
public class Map_Feature {
public void map_Check() {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("가", 10);
map.put("나", 20);
map.put("다", 30);
map.put("다", 1000);
System.out.println(map.get("다"));
}
public void mapUse() {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("가", 10);
map.put("나", 20);
map.put("다", 30);
map.put("다", 1000);
System.out.println("값을 가져오기");
System.out.println("map.get(키) : "+map.get("가"));
System.out.println("value를 가지고 삭제하기");
Integer v = 10;
System.out.println("map.remove(value)"+map.remove(v));
System.out.println("key를 가지고 삭제하기");
//map은 반드시 key를 통해서 삭제 가능하고 삭제하면 가지고 있는 value를 반환해준다.
System.out.println("map.remove(key) : " + map.remove("가"));
//가지고 있는 key와 value가 있는지 없는지 확인 contains
System.out.println("key여부 확인 : "+ map.containsKey("나"));
System.out.println("value 여부 확인 : " + map.containsValue(1000));
int vv = 1000;
Integer vI = vv;
System.out.println("int 여부 확인 : "+ map.containsValue(vv));
System.out.println("Integer 여부 확인 : " + map.containsValue(vI));
}
}
}
public class Map_Feature {
public void mapUse() {
//만약에 map에 있는 전체 값을 출력하고 싶다면
//key만을 추출해서 Set 타입으로 만들고 Set타입을 다시 Iterator 타입으로 만들고 while 문을 통해 출력할때 key로 맵을 호출
Set<String> keys = map.keySet();
Iterator<String> iter = keys.iterator();
while (iter.hasNext()) {
String keyString = iter.next();
System.out.println(keyString+" : "+map.get(keyString));
}
}
}
keySet() 사용하여 Key만 추출하고 Set 타입으로 변환하여 Iterator 사용 값을 꺼냄 없을때까지
'JAVA' 카테고리의 다른 글
Day 26 - Java(Cloneable) (0) | 2021.03.18 |
---|---|
Day 24 - JAVA(야구게임) (0) | 2021.03.16 |
Day 20 - JAVA( JCF, SET) (0) | 2021.03.10 |
Day 19 - JAVA(Interface, Abstract Class) (0) | 2021.03.09 |
Day 18 - JAVA(예외 처리, Exception) (0) | 2021.03.08 |