저번 시간은 List를 공부했다. 이번시간에는 Set을 공부하자.
간단하게 지난번에 정리한 것을 다시 한번 가져왔으니 잠깐 확인해보자.
List (목록)
- 배열의 모양이라고 생각하면 편하다.
중복이 가능하고 순서를 유지할 수 있다.
set(집합)
- 주머니 모양이라고 생각하자.
중복 및 순서 유지가 안된다.
그림에 보면 Colloction이라고 묶여 있다.
이것은 둘다 중복되는 코드가 많아서, colloction으로 묶어져 있다.
즉, List Set의 공통 코드를 작성한 단순한 부모 인터페이스
위에서 Java Colloction랑 햇갈리지말자! Java Colloction는 자바의 자료 구조 모음(List,Set,Map)이있다!
Map
- 출석부 모양이라고 생각하면 편하다.
1번 나와! -> 박도비
2번 나와! -> 박봉자
key | value |
1번 | 박도비 |
2번 | 박봉자 |
3번 | 박코딩 |
3번 | 박코린 |
3번 나와! 했을때 박코딩/ 박코린이 둘중에 누가 나올지 모른다.
그래서 key는 중복이 안되지만, value는 중복이 가능하다.
인터페이스 (접점)
관련없는 것들 연결 공통된 메소드명을 제공하여 규약을 만듬
추상메소드 상속 받으면 상속 받은 자식이 오버라이딩 해야함
모든 자식 클래스가 같은 이름의 메소드를 갖는다,.
인터페이스 == 객체 생성이 불가능하다!
왜 ? 객체 생성이 불가능해 ? 추상메소드라서 ! 미완성 메소드라서!
객체생성이 블가능하지만! 부모 참조 변수로는 가능하다 !
== List와 동일한 개념 !
Set (집합)
1. 주머니 모양이라 순서를 유지 하지 않는다.
2. 중복을 허용하지 않는다 ( + null값도 중복 안됨 ! )
● 중복을 확인하는 방법
객체가 가지고 있는 필드 값이 모두 같으면 중복으로 판단한다!
이때! 필드값이 모두 같은지 비교하기위해서는 equals() 반드시 ! 오버라이딩 되어 있어야한다.
객체만들기
Set<String> set = new HashSet<String>();
HashSet : Set 대표적인 자식 클래스
ㄴ 저장되는 객체에 equals 오버라이딩 필수 / 저장되는 객체에 hashCode() 오버라이딩 필수
Hash 함수 : 입력된 단어를 지정된 길이의 문자열로 반환하는 함수 (중복 x)
ex) 입력 : 111 -> "agjvd" (5글자)
입력 : 1234567->"dvsga"(5글자)
hashCode() : 필드 값이 다르면 중복되지 않는 숫자를 만드는 메소드
HashSet() : 중복 없이 데이터를 저장 (Set)하고 데이터 검색이 빠름 (Hash)
*참고* :Hash라는 단어가 붙은 컬랙션은 반드시 저장되는 객체에 equals(),hashCode()를 오버라이딩 해야함
( 위에 쓰여져 있는 것은 오버라이딩이 필요 없다 왜? String은 이미 개발자들이 오버라이딩 했기 때문이다!)
● Set 객체에 객체 추가하는 방법
형식 : List . add ( Object e )
Set.add(String e)
ㄴ String 이라고 작성한 이유는 위에 제네럴 String 으로 넣어놨기 때문이다.
set.add("네이버");
set.add("카카오");
set.add("라인");
set.add("쿠팡");
set.add("배달의민족");
set.add("배달의민족");
set.add("null");
set.add("null");
System.out.println(set);
// 출력 : [배달의민족, 카카오, null, 네이버, 쿠팡, 라인]
ㄴ 순서 유지 되지 않고, 중복 된 것도 제거 된다.
● 저장된 데이터 개수 반환
System.out.println("저장된 데이터의 수 : "+set.size());
위에 작성한 것으로 따지면, 총 6개 출력된다.
● Set 객체에 객체제거 하는 방법
remove(String e) : Set 저장된 객체 중 매개변수 e와 필드값이 같은 객체를 제거
Hash라는 단어가 포함된 Set이면 hashCode()도 같아야함
set.remove("라인") -> 제거가 되었으니 출력 해보면 true로 출력
● Set 저장된 객체 하나를 얻어 올 수 있는 방법이 있을까 ?
ㄴ 내가 원하는 걸 하나만 쏙! 빼 올 수는 없다 대신 Set 전체 데이터를 하나씩 반복적으로 얻어올 순 있따!
1. Iterator(반복자)
컬렉션에서 제공하는 컬렉션 객체 반복 접근자
(컬렉션에 저장된 데이터를 임의로 하나씩 반복적으로 꺼내는 역할)
(주머니에서 한개 꺼내서 너 네이버야? 아니네 다시 꺼내 너 네이버야? 너 네이버야? 오 맞네!)
● Iterator<String> it = set.iterator();
while(it.hasNext()) { // 한개씩 꺼냈을때 다음 값이 없을 경우 == 종료
String temp = it.next();
System.out.println(temp);
}
2.향상된 포문
for(하나씩 꺼내는 저장할 변수 : 컬렉션)
● for(String temp : set) {
System.out.println(temp);
}
● Wrapper클래스
w: 기본 자료형 → 객체로 포장하는 클래스
컬렉션에 기본 자료형 값을 저장할 때 사용
기본 자료형에 없던 추가 기능, 값을 이용하고 싶을때 사용
기본자료형 | Wrapper 클래스 |
int | Integer |
double | Double |
boolean | Boolean |
byte | Byte |
short | Short |
float | Float |
char | Character |
long | Long |
ex)
int iNum = 10;
double dNum = 3.14;
//기본 자료형 -> 객체로 포장
Integer w1 = new Integer(iNum); //int가 Integer로 포장
Double w2 = new Double(dNum); //double를 Double로 포장
● Wrapper클래스 AutoBoxing
Integer w1 = new Integer(100);
삭제선 == deprecated == 해당 구문은 삭제될 예정이다.
==> 사용을 권장하지 않는다.
Integer w2 = 100;
Integer w3 = 100;
(Integer) (int -> Integer) 자동포장 ==AutoBoxing
Integer는 int의 포장형식이라는 것을 Java가 인식하고 있어서 오류가 나지 않는다!
● Wrapper클래스 AutoUnBoxing
Integer w2 = 100;
Integer w3 = 100;
System.out.println("w2+ w3 =" + (w2+w3));
Wrapper클래스는 기본 자료형을 객체로 만들어 주는 것이다.
w2 -> 객체
w3 -> 객체
원래 였으면 객체 + 객체는 불가능하지만
Integer는 int 포장형태라는 Java가 인식하고 있어 연산 시 포장을 벗겨내 200이라는 값이 출력된다.
Integer +Integer객체 = int + int (자동 포장 해제) ==AutoUnBoxing
● parsing : 데이터의 형식을 변환
문자열 (String) 데이터를 기본 자료형으로 변환 !
Character는 parsing기능을 제공하지 않음
int num1 = Integer.parseInt("100"); //문자열 "100"을 int형식으로 변환
double num2 = Double.parseDouble("1.23456"); //문자열 "1.23456"을 double 형식으로 변환
System.out.println(num1+num2); 출력 : 101.23456
로또 만드는 예시!
public void lotto(){
//set<int>lotto = new HashSet<int>();
//< > 안에는 객체 타입만 저장할 수 있기에 int는 못들어간다!
//Wrapper Class를 이용해서 기본 자료형을 객체로 만들어준다!
set<Integer> lotto = new Treeset <Integer>;
while(lotto.size()<6) {
int random = (int)(Math.random()*45+1);
lotto.add(random);
}
System.out.println("로또번호 : "+lotto);
'ON > JAVA' 카테고리의 다른 글
[JAVA] 메소드 공부 (0) | 2023.05.30 |
---|---|
18일 _ Map계열 /입출력 /네트워크 (0) | 2023.05.13 |
16일_ 컬랙션 List계열 및 향상된 for문 (0) | 2023.05.10 |
15일차 _ 인터페이스 및 예외처리 (4) | 2023.05.09 |
14일차_객체지향 복습 및 다형성/바인딩 (0) | 2023.05.04 |