<이번주 교육내용>
1. 콜렉션 프레임워크 - Set, Map
2. 파일 I/O
<Set 컬렉션>
1. Set 컬렉션의 특징 및 주요 메소드
- 특징
* 수학의 집합에 비요
* 저장 순서가 유지되지 않음 -> 인데스가 없다.
* 객체를 중복 저장 불가
* 하나의 null만 저장 가능
- 구현 클래스
*HashSet, LinkedHashSet, TreeSet (Hash - 잘게 잘라낸다, 작은 조각으로 식별하겠다.)
** 작은 조각 -> 식별용 / 객체정보 -> hash 함수 -> int 정수 / Object -> hashCode() (디폴트 : 참조값)
- hash 함수의 특징 : 단방향 함수 (큰 정보 -> 작은 정보)
(작은 정보 -> 큰 정보 는 안됨)
비밀번호 암호화할때 자주 쓰임. (그런데, 이때는 작은 정보(6자리)를 큰 정보(128자리)로 키우는 것에 해당됨.)
- 주요 메소드
기능 | 메소드 | 설명 |
객체 추가 (C) | boolean add(E e) | 주어진 객체를 저장, 객체가 성공적으로 저장되면 true를 리턴하고, 중복 객체면 false를 리턴 |
객체 검색 (R) | boolean contains(Object o) | 주어진 객체가 저장되어 있는지 여부 |
isEmpty() | 컬렉션이 비어있는지 조사 | |
Iterator <E> iterator() | 저장된 객체를 한번씩 가져오는 반복자 리턴 | |
int size() | 저장되어있는 전체 객체수 리턴 | |
객체 삭제(D) | void clear() | 저장된 모든 객체를 삭제 |
boolean remove(Object o) | 주어진 객체를 삭제 |
U(Update)가 없는 이유 : index가 없기 때문임.
hashCode()와 equals()를 사용해야지 제대로 동작함(?) -> 업데이트 시..
- 전체 객체 대상으로 한 번씩 반복해 가져오는 반복자(Iterator) 제공
* 인덱스로 객체를 검색해서 가져오는 메소드 없음
* boolean - hashNext() : 가져올 객체가 있으면 true리턴, 없으면 false 리턴
* E :
*
* boolean, E 를 통해서 주로 순회를 함.
2. HashSet
- hashCode(), equals()로 중복 체크 및 검색 역할을 함.
- Set<E> set = new HashSet<E>();
- 특징
* 동일 객체 및 동등 객체는 중복 저장하지 않음.
* 동등 객체 판단 방법
- JAVA API 객체 : hashCode(), equals() -> 우리가 만드는 객체, 사용빈도가 낮은 편 (?)
hashCode는 중복이 되도 상관없으며, 확률적으로 낮냐만 있으면 됨.
<Map 컬렉션>
사용빈도 : List - Map - Set
1. Map 컬렉션의 특징 및 주요 메소드
- 특징
* 키(Key)와 값(Value)으로 구성된 Map.Entry객체를 저장하는 구조 (Map.Entry : 앞의 것 안에 뒤에 것이 또 정의됨. Entry는 내부클래스, Map은 인터페이스)
* 키와 값은 모두 객체
* 키는 중복될 수 없지만 값은 중복 저장 가능
* 키 : 유일하다, 중복이 안됨.
- 구현 클래스
* HashMap, Hashtable, LinkedHashMap, Properties, TreeMap
(Hash 가 들어간 클래스가 많은 이유 : Key 값이 중복이 안되기 때문.)
- 키(key)와 값(value)으로 구성된 Entry 객체를 저장하는 구조
- 키, 값 모두 객체
- 키로 가장 많이 쓰는 타입 : String 임.
- 주요 메소드
1) 객체 추가 - V put(K key, V value) - 주어진 키와 값을 추가, 저장이 되면 값을 리턴
* 키를 갖고 있으면 교체, 없으면 값이 입력됨.
2) 객체 검색
- boolean containsKey(Object key) - 주어진 키가 있는지 여부
- boolean containsValue(Object value) - 주어진 값이 있는지 여부
- Set<Map.Entry<K,V>> entrySet() - 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴
* Map -> Set 으로 변환
- V get(Object key) - 주어진 키의 값을 리턴 (가장 많이 씀)
- boolean isEmpty() - 컬렉션이 비어있는지 여부
- Set<K> keySet() - 모든 키를 Set객체에 담아서 리턴
* Key 파트만 Set으로 리턴해달라는 뜻.
- int size() - 저장된 키의 총 수를 리턴
- Collection<V> values() - 저장된 모든 값 Collection에 담아서 리턴
3) 객체 삭제
- void clear() - 모든 Map.Entry(키와 값)를 삭제
- V remove(Object key) - 주어진 키와 일치하는 Map.Entry 삭제, 삭제가 되면 값을 리턴
-> 제너릭 안에 제너릭이 들어간 형태.
2. HashMap
3. Properties
- 특징
* 키와 값을 String 타입으로 제한한 Map 컬렉션
* Properties는 프로퍼티(~.properties) 파일을 읽어 들일 때 주로 사용
- 프로퍼티(~.properties) 파일
* 옵션 정보, 데이터베이스 연결 정보, 국제화(다국어) 정보를 기록 : 텍스트 파일로 활용
* 애플리케이션에서 주로 변경이 잦은 문자열을 저장 : 유지 보수를 편리하게 만들어줌
* 키와 값이 = 기호로 연결되어 있는 텍스트 파일 : 한글이 있는 경우 유니코드(Unicode)로 인코딩
* .ini : init의 약어로 초기화시 필요한 정보를 담은 파일을 말한다.
* properties는 설정 파일을 만들때 주로 쓰이며, 키 : 값 을 쌍으로 구성되어 있다.
* 주의 : 공백도 데이터로 인식하기 때문에 공백 없이 입력해야 함.
- 프로그램의 구성을 크게 2가지로 나누면
* 코드파일(java 파일)
* 그 외의 파일 => resource (자원) 파일
* properties 파일에 들어가는 것은 무조건 UTF-8 이어야 함.
* properties 파일의 Map은 key, value가 모두 String 타입이다.
* src 폴더와 resources 폴더는 물리적으로는 다른 위치지만, 논리적으로는 같은 위치이다. (소스파일을 넣는 폴더이므로)
<기존 프로젝트>
Service -> MemberDao -> MemberMapDao
<현재 프로젝트>
Service -> MemberDao
Service -> MemberMapDao
==> 이렇게 만들려면 abstract와 인터페이스 2가지 중 하나를 쓰는게 좋음
==> interface 이름은 MemberDao로 결정..! ==> 기존 MemberDao는 MemberListDao로 이름 변경
==> MemberListDao에서 interface 추출 (Extract interface)
<지금까지 코딩한 내용>
<<MemberDao>> (인터페이스로 구현) <- MemberListDao <- Service
<<MemberDao>> (인터페이스로 구현) <- MemberMapDao
이것을 이제
<<MemberDao>> (인터페이스로 구현) <- MemberListDao
<<MemberDao>> (인터페이스로 구현) <- MemberMapDao
<<MemberDao>> (인터페이스로 구현) <- Service
==> SOLID -> OCP 로 변경됨.
MemberDao dao;
public MemberService(MemberDao dao) {
this.dao = dao;
}
인터페이스 타입으로 받아서 구현하면 MemberMapDao, MemberListDao 두가지 중에서 다 선택해서 초기화해 사용 가능함.
==> SOLID의 D(Dependency Injection)
@Override
public List<Member> getMemberList() {
//어떤 Collection을 ArrayList로 바꿀때 생성자의 매개변수로 바꾸면 ArrayList로 만들어진다.
return new ArrayList<>(memberMap.values());
}
<<바이트 스트림 - 입출력 파트>>
<IO 스트림>
1. 입력 스트림과 출력 스트림
- I/O장치 : CPU, MM(Main Memory)를 제외한 나머지 장치를 모두 입출력장치(I/O장치) 라고 부름.
--> 어떤 장치들이 있을까? : 마우스, 키보드, 프린터, HDD등..
나의 프로그램이 입출력 장치를 사용할때, 어떤 프로그램을 사용하느냐에 따라서 결과가 달라질까..? : 모든 장치마다 각각 프로그램이 다르다면 개발자 입장에서 너무 힘들 것이다.
따라서, 1가지 방법으로 모든 I/O가 모양이 같아야 한다. -> 이를 OS 철학이라고 한다.
OS 철학의 표준 : OS 7 Layers..?
- 표준 I/O의 방식 : File을 처리하는 것.
2. 입력 스트림과 출력 스트림의 개념 (stream : 개천 -> 방향성이 있다.)
- 출발지 : 1)키보드, 2)파일, 3)프로그램
- 한번 흘러간 것은 되돌릴 수 있나? : 되돌릴 수 없다.
- 출발지(키보드, 파일, 프로그램) -> 도착지(프로그램) : 입력스트림
- 출발지(프로그램) -> 도착지(모니터, 파일, 프로그램) : 출력스트림
- 기준CPU(Memory) <- 외부 : Input
- 기준CPU(Memory) -> 외부 : Output
3. 바이트 기반 스트림과 문자 기반 스트림
- 바이트 기반 스트림 : 그림, 멀티미디어, 문자 등 모든 종류의 데이터를 받고 보내는 것 가능(메모장으로 열었을때 깨짐)
- 문자 기반 스트림 : 문자만 받고 보낼 수 있도록 특화(메모장으로 열었을때 안깨짐)
-최상위 클래스(추상 클래스)
* 바이트 기반 스트림
** 입력 스트림 : InputStream
** 출력 스트림 : OutputStream
* 문자 기반 스트림
** 입력스트림 : Reader
** 출력스트림: Writer
- 하위 클래스(자식 클래스)
* 바이트 기반 스트림
** 입력 스트림 : XXXInputStream(FileInputStream)
** 출력 스트림 : XXXOutputStream(FileOutputStream)
* 문자 기반 스트림
** 입력스트림 : XXXReader(FileReader)
** 출력스트림: XXXWriter(FileWriter)
- flush() : 버퍼를 비운다, 실제 출력이 일어남.
* 버퍼에 잔류하는 모든 바이트 : 맨 마지막에 남은 바이트 들을 의미함.
- HDD LED ON/OFF
- 출력할 때 신경써야 할 부분 : flush()
5. OutputStream
- write(int b) 메서드 : 매개변수로 주어진 int 값에서 끝에 있는 1바이트만 출력 스트림으로 보냄
- wirte(byte[]b) 메서드 : 매개변수로 주어진 바이트 배열의 모든 바이트를 출력 스트림으로 보냄
- I/O 속도에 영향을 미치는 것 : 데이터 크기, 횟수
* 더 크게 영향을 미치는 것 : 횟수
- 입, 출력 모두 배열로 한꺼번에 읽고 출력하는 것이 좋다.
<I/O 다시 정리>
제일 많이 쓰이는 것:
-입력 : int - read(byte[] b) -> -1의 의미 : 더 이상 읽을 것이 없다.
- 출력 : void - write(byte[] b) -> 배열의 크기만큼 출력해라
* write는 루프 돌려서 여러번 할 수 있다. 제일 처음 write하는 곳은 맨 앞.
* 자동으로 업데이트가 되면 그 뒷부분부터 write가 됨.
* 타입이 void : 에러 상황에 대해서 전제하지 않는다.
* 출력하다가 에러가 날 수 있을까? yes -> 언제? 파일이 갑자기 사라질때. -> 언제 파일이 갑자기 사라질까? 하드디스크가 충격으로 인해 갑자기 에러가 났을 때(대표적인 예 - 입력중일때 USB가 꼽혔을때)
- 입출력 기능은 에러 없이 컴파일 되도 언제든지 예외가 발생할 수 있다. = 소스코드와 무관하게 예외 발생 가능 = 문법엔 이상이 없지만 실행할때 언제든지 에러가 발생할 수 있다.
- 모든 I/O는 예외처리가 필수이다.
<문자 스트림 - 문자 : 문자코드해석>
- Reader : 문자 기반 입력 스트림의 최상위 클래스로 추상 클래스
* Reader의 주요 메소드
- 2,3번째 int의 뜻 : 실제 읽은 문자의 수
- reade() 메서드 : 한 개 문자(2바이트)를 읽고 4바이트 int 타입으로 리턴
* 더 이상 읽을 데이터가 없는 경우 -1을 리턴
2. Writeer
- 문자 기반 출력 스트림의 최상위 클래스
- write(String str) / write(String str, int off, int len) 이 추가됨.
- 문자열에서 문자가 아니라 캐릭터를 얻는 방법 : .toCharArray();
- 배열 통째로 기록하는 법 : .write();
바로 문자열 객체를 넘길 수 있음.
일부만 기록할 수 있음.
동일하게 close() 하기 전에 반드시 flush() 해줘야 함.
<File 클래스>
파일 : 내가 다뤄야 할 정보가 다른것과 약간 틀리다.
파일에는 실제 데이터가 있고, 메타데이터가 있음.
- 실제데이터 : 메모장으로 텍스트 파일을 열었을 때 메모장에서 보여주는 것.
- 메타데이터 : 파일명, 크기, 생성시간...
이번에 다룰 내용 : 메타데이터를 다룰 클래스..!
- 제일 많이 쓰이는 것 : getName(), getParent(), getParentFile(), getPath(), (isDirectory(), isFile()은 둘 중 하나만 알면 됨.)
- 가끔 쓰이는 것 : length()
File 클래스
- 디렉토리 파일 목록 추출 메서드
- String[] - list() : 배열 -> 그 당시에는 고정되어 있다.
- String[] - list(FilenameFilter filter) : 인터페이스
- File[] - listFiles()
- File[] - listFiles(FilenameFilter filter)
내일 시험문제 : 오후 1시 ~ 2시에 시험 봄. - 문항 수 20개
오늘부터 만족도 조사 할 수 있는데, 만족도 조사부터 먼저 하고 해야함.
60점 이상이면 합격됨.
오늘 수업 끝나고 만족도 조사 꼭!!!
'멀티캠퍼스 > Spring' 카테고리의 다른 글
230828 (월) (0) | 2023.08.29 |
---|---|
20230817 (목) (0) | 2023.08.17 |
20230811 (금) (0) | 2023.08.12 |
20230810 (목) (0) | 2023.08.10 |
20230809 (수) (0) | 2023.08.09 |