본문 바로가기
멀티캠퍼스/Spring

20230816 (수)

by 세크레투스 2023. 8. 16.
반응형
SMALL

<이번주 교육내용>

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점 이상이면 합격됨.

오늘 수업 끝나고 만족도 조사 꼭!!!

 

반응형
LIST

'멀티캠퍼스 > 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