본문 바로가기

Dev/[Java]

[JAVA] 6. Collection

반응형

 

배열 의 장점 :  객체를 저장하고 검색하는데 가장 효율적이다. 사용하기 편하다.

단점 : 사이즈 변경이 불가하다.

 

Collection  : 객체를 저장할 때 마다 크기를 자동으로 늘려준다.

Set계열 : 중복을 허용하지 않고, 추가되는 순서를 유지하지 않는다.

List 계열 중복을 허용하고, 추가되는 순서를 유지한다.

Map 계열 : 키와 값의 쌍으로 저장된다.(키와 값 모두 객체여야한다.)

java.util package에 있다.

 

 

generics

라는게 있다..

 

JAVA 4.xx 대와 JAVA 5.xx대의 차이가 굉장히 크다.

 

javase 1.4 api doc 문서 와 최신 문서를 보면 차이를 알 수 있다

 

www2.cs.duke.edu/csed/java/jdk1.4.2/docs/api/

 

Java 2 Platform SE v1.4.2

 

www2.cs.duke.edu

docs.oracle.com/javase/10/docs/api/index.html?overview-summary.html

 

Java SE 10 & JDK 10

 

docs.oracle.com

 

 

// 5버전 이전에는 이렇게 썼었다.
List list = new ArrayList();

//add(Object obj)
//각각의 다른 객체를 넣어줘도 컴파일타임에 문제가 없다.
list.add(new String("aa");
list.add(new Interger(100));

//근데 만약 이걸 돌리면?
// Integer를 String으로 타입캐스팅 불가하잖아?
// 그래서 타입캐스팅 익셉션 난다.(런타임에)
for(int i=0;i<list.size();i++){
	String val = (String)list.get(i);
}

// 그래서 5.xx대 버전 이후부터는 generics 라는게 나왔다.
// 아래와 같이 쓰면, String 타입의 객체만 받겠다!
List<String> list = new ArrayList<String>();

// 7.xx대 버전 이후에서는 이렇게 썼다.
// 그래서 저 아래처럼 add로 넣어밨을때, 컴파일타임에 잡아낼 수 있다.
List<String> list = new ArrayList<>();

list.add(new String("aa");
list.add(new Interger(100));

// 이것도 가능하다.
for(String st : list){
	System.out.println(st);
}

 

LIST  쓰는 방법!!

 

List<String> list = new ArrayList<>();
		
list.add("JAVA");
list.add("PYTHON");
list.add("JAVA");

// 2번째 인덱스에 들어있는 값을 가져옴
String value = list.get(2);


// for문쓰는방법2가지
for (String string : list) {
	System.out.println(string);
}
for(int i = 0 ; i < list.size();i++) {
    System.out.println(list.get(i));
} 

 

이터레이터 쓰는 방법!

// iterator 쓰는 법
// iterator 선언!
Iterator<String> iterator = list.iterator();
		
// iterator 쓸 때는 보통 while 문 쓴다고한다.
while(iterator.hasNext()) {
	value = iterator.next();
}

 

 

 

람다식으로 Iterable 로 쓰는법!

 

 

// iterable 쓰는 법
// (람다식으로 표현)
System.out.println("---- Iterable 사용, 람다식 Lambda");
list.forEach(val -> System.out.println(val));


System.out.println("---- Iterable Method Reference");
list.forEach(System.out::println);

 

 

function sayHello(msg){
  return "Hello " + msg;
}

console.log(sayHello("자바스크립트"));

// arrow function, lambda expression

let sayHello2 = msg => "Hello " + msg;
console.log(sayHello2("람다"));

 

 

Set 쓰는법!

Set 에 객체를 저장하는데 Hash 를 사용하여 처리 속도가 빠르다.

hashCode() 및 equals()를 재정의 해야 중복 삽입 등을 막을 수 있다.

오직 하나의 NULL객체를 가질 수 있따.

 

 

Set<String> mySet = new HashSet<>();
mySet.add("자바");
mySet.add("파이썬");
mySet.add("부트");

for (String val : mySet) {
	System.out.println(val);
}

Set<MyDate> dateSet = new HashSet<>();

MyDate myDate1 = new MyDate(2021,1,31);
MyDate myDate2 = new MyDate(2021,2,31);
MyDate myDate3 = new MyDate(2021,1,31);
dateSet.add(myDate1);
dateSet.add(myDate2);
dateSet.add(myDate3);

Iterator<MyDate> iterator = dateSet.iterator();

while(iterator.hasNext()) {
	System.out.println(iterator.next());
}

 

아래와 같이 하면 Equals 함수 썼을 때 false 를 내뱉는다

 

Set<MyDate> dateSet = new HashSet<>();

MyDate myDate1 = new MyDate(2021,1,31);
MyDate myDate2 = new MyDate(2021,2,31);
MyDate myDate3 = new MyDate(2021,1,31);
System.out.println("myDate1 의 해시코드 = "+myDate1.hashCode());
System.out.println("myDate2 의 해시코드 = "+myDate2.hashCode());
System.out.println("myDate3 의 해시코드 = "+myDate3.hashCode());

System.out.println("equals = "+myDate1.equals(myDate3));

 

따라서 equals를 override해줘야한다.

	@Override
	public boolean equals(Object obj) {
		boolean isEqual = false;
		
		if(obj instanceof MyDate) {
			MyDate date = (MyDate)obj;
			if((this.year == date.year)&&(this.month == date.month)&&(this.day == date.day)) {
				isEqual = true;
			}
		}
		return isEqual;
		
	}

 

hashcode override하는 것

@Override
	public int hashCode() {
		return this.year ^ this.month ^ this.day;
	}

 

 

위 두개를자동생성 가능하다.

 

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + day;
		result = prime * result + month;
		result = prime * result + year;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		MyDate other = (MyDate) obj;
		if (day != other.day)
			return false;
		if (month != other.month)
			return false;
		if (year != other.year)
			return false;
		return true;
	}

 

 

맵 사용법!!!

 

중복된 키는 무시된다.

 

 

 

반응형