Presentation is loading. Please wait.

Presentation is loading. Please wait.

DataScience Lab. 박사과정 김희찬 (수)

Similar presentations


Presentation on theme: "DataScience Lab. 박사과정 김희찬 (수)"— Presentation transcript:

1

2 DataScience Lab. 박사과정 김희찬 2017-07-12 (수)
Big Data Analytics Short Courses, Summer, 2017 라이브러리와 File IO DataScience Lab. 박사과정 김희찬 (수)

3 라이브러리 라이브러리는 코드를 쉽게 다시 쓰기위한 것 자바에만 있나요? 클래스를 손쉽게 사용할 수 있도록 뭉쳐둔 묶음
다른 사람이 이미 작성한 것을 가져와 사용하기 위함 소스 코드(.java)의 덩어리 jar 라는 확장자를 가짐 매번 소스코드를 내 프로젝트에 복사해서 넣으면 문제점 발생 일단 절차가 귀찮고 같은 클래스를 사용하는데, 클래스를 구성한 코드가 같은지 보장안됨 수정가능성이 존재하기 때문 여러 클래스를 쓰는 경우, 여러 개의 파일을 유지해야하는 어려움 존재 자바에만 있나요? 모든 프로그래밍 언어에서는 같은 기능을 제공함 SAS나 R에서 외부 패키지를 가져오는 것과 같음

4 Make Cabinet Class Great Again!
상품 클래스를 라이브러리로 만들어보자 새로 만든 프로젝트에 소스코드를 붙혀넣는 것은 지양 상품 클래스 선택 후 우측 버튼 -> Export -> Java -> JAR file -> Browse를 이용하여 원하는 경로 및 이름.jar 로 저장 바탕화면에 저장하자

5 Make Cabinet Class Great Again!
상품 클래스를 라이브러리로 만들어보자 신규 프로젝트를 생성 -> 방금 생성한 jar 파일을 프로젝트 폴더 내에 복사 -> 프로젝트 우측클릭 후 Properties -> Library -> Add JAR -> 라이브러리 선택 후 추가

6 Make Cabinet Class Great Again!
상품 객체를 키보드 입력으로부터 생성해보자 사용자가 입력한 내용으로 상품 객체를 생성 및 하자 입력 형태는 상품명과 가격을 나누는 방법은 다음과 같음

7 Make Cabinet Class Great Again!
내가 만든 클래스를 리스트로 엮을 수 있을까? 내가 만든 클래스도 클래스니까 List<Product> 이때 데이터를 넣을 때는 앞서 한 것처럼 값을 넣어서는 안됨 객체를 생성할 때 new를 이용하여 생성한 것처럼 리스트에 추가할 객체를 생성해야함

8 Make Cabinet Class Great Again!
언제까지 상품을 입력할 순 없잖아 If, Break를 써보자 ‘끝’ 이라고 입력하면 쇼핑 바구니에 더 이상 추가할 게 없다는 의미 문자열을 비교해야함

9 직접 해보기! 업그레이드된 진열장 클래스 만들기 Question 이름과 가격을 키보드로부터 입력받아 상품 생성 및 추가
개수의 제한은 없음 -> 리스트 사용 필요 ‘끝’ 이라고 입력되면 상품 생성을 멈춤 멈춘 후 지금까지 추가된 상품을 출력함 Question 입력된 상품들 중 같은 것이 있는지 확인할 수 있을까?

10 상품 간 비교 상품 객체 간 비교를 한다면 ==로 가능한가? 우리가 원하는 바 대로는 불가능함
지폐의 일련번호와 액면가의 관계와 유사함 두 만원 짜리가 같은가? 의 질문은 정말 같은 지폐인가를 묻는 것일 수 있고 (존재한다면 위조지폐) 같은 액면가인가를 묻는 것일 수 있음 우리가 원하는 것은 액면가가 같은지를 확인하는 것 → 다른 방법을 통하여 확인하여야함

11 왜 그런가? 값을 참조하는 방법이 다르기 때문 Call by Value
일반 변수의 값을 비교하거나 메소드의 파라미터로 사용하는 것은 값을 복사해서 사용하는 것

12 왜 그런가? Call by Reference 변수의 값을 비교하거나 메소드의 파라미터로 사용하는 것은 상자 자체를 그대로 사용하는 것

13 왜 중요한가? 모호하면 데이터를 처리할 때 실수 유발 가능 p1의 값을 변경하였는데 get1의 값 또한 변경됨!

14 파일 읽기 매번 데이터를 코드에 직접 입력하는 건 비효율적 파일에서 불러오자! 매번 키보드 입력도 번거로움
txt 파일로 필요한 정보를 저장해두고 읽어오면 간편하다! 컴퓨터는 0101…의 데이터 나열이 프로그램이 사용하는 메모리 안으로 쏱아져 들어감 흘러들어간다고 하여 이 통로는 스트림(Stream)이라 불림

15 파일 읽기 파일을 읽어야하니까 File 클래스를 사용하여 “파일”을 선택함 그러면 스트림이란 녀석을 그러면 어떻게 만들지?
다행이도 Stream 클래스는 이미 구현되어 있다! 우리가 사용할 Stream 클래스는 FileReader

16 파일 읽기 저장한 파일 모양대로 읽어오고 싶다 버퍼를 사용하는 스트림 리더
하나씩 읽어오는 것에서 일정 단위만큼 읽어오면 되지 않을까 단위라 하면 한 줄 일정 단위 만큼 모으려면 그만한 공간이 필요함 이 공간을 버퍼(Buffer)라고 부름 버퍼를 사용하는 스트림 리더 BufferedReader

17 Exception Handling 그래도 에러가 발생한다. 에러 내용은? “놓친 예외”라는 표현은 무엇인가?
놓친 예외가 있단다 “놓친 예외”라는 표현은 무엇인가? 특정 메소드가 발생하는 예외를 적절히 처리하지 못했다는 것 예외 처리는 방금한 것 아닌가? main 메소드가 예외를 발생(throw)한다고 정의한 것 예외 처리는 되지 않음 메소드가 예외를 던질 때 적절히 잡아내면 그것이 예외 처리

18 Exception Handling Try-catch 구문을 사용하자 예외를 던지는 메소드들은 try구역에서 실행

19 Exception Handling Try-catch 예 정수를 0으로 나누는 경우
‘예외 처리 테스트 완료’는 출력되지 않고, 에러를 출력하며 프로그램이 죽음! 어찌되든 프로그램이 죽지 않고 마지막까지 실행되면 좋겠는데..

20 Exception Handling Try-catch 예 정수를 0으로 나누는 경우
사칙 연산 예외가 발생 ArithmeticException

21 Exception Handling File IO에서 발생하는 예외는?
파일 리더로 스트림을 생성하는 것 -> FileNotFoundException 파일이 읽을 준비가 되었는지, 읽을 때 -> IOException (InputOutput) 이 예외도 클래스의 일종이기 때문에 상하 관계가 존재 IOException이 FileNotFoundException보다 상위이므로 상위 예외 하나만 추가하면 됨

22 NumberCount 한 글자씩 읽는 건 앞서 사용하였던 read() 메소드 사용

23 NumberCount 문자열을 정수로 변경 읽은 글자가 숫자인지 어떻게 확인하는가? 정수로 변경해야 숫자로 관리하기 편함
무슨 글자인지는 모르지만 일단 숫자로 바꿔보자 숫자가 아닌 경우 예외 발생 -> 예외 처리 IOException은? -> 읽는 함수 도중 발생하는 예외 숫자 형태가 아니라서 발생하는 예외는? -> NumberFormatException 예외가 발생하면 그것은 숫자가 아니므로, 다음으로 넘어감 continue

24 NumberCount 등장 횟수 저장 방법 각 숫자의 등장 횟수를 세는 것이므로 10칸짜리 배열을 이용
0번째 배열의 값을 확인하고, 그 값에다가 1을 더한 다음에 0번째 배열에 다시 저장 숫자 등장 횟수 2 3 2+1=3 3 2

25 NumberCount 구조도 파일ready? 한 글자 읽기 결과 출력 숫자? 배열에 1 늘려서 저장 false true
파일/스트림생성 배열 생성 파일ready? false true 한 글자 읽기 결과 출력 false 숫자? true 배열에 1 늘려서 저장

26 WordCount 문제 정의 영문 테스트 파일에서 알파벳 세기 (대소문자 구분 안함) 우리가 필요한 알파벳은
컴퓨터는 0과 1만으로 모든 것을 이해 알파벳 또한 숫자로 표현되어 있음 아스키 코드(ASCII Code) 우리가 필요한 알파벳은 대문자 A~Z : 65~90 소문자 a~z : 97~122

27 WordCount 문제 풀이 힌트 등장 횟수를 저장할 배열 26개 생성 읽은 것이 숫자가 아닐 때 대문자? / 소문자?
소문자면 대문자로 변경하여 통일

28 WordCount 구조도 파일ready? 한 글자 읽기 결과 출력 문자? 대소문자 통일 배열에 1 늘려서 저장 false
파일/스트림생성 배열 생성 파일ready? false true 한 글자 읽기 결과 출력 false 문자? true 대소문자 통일 배열에 1 늘려서 저장

29 WordCount Adv. 문제 정의 문제점 주어진 파일에서 특정 단어가 몇 번이나 등장하는지 확인
1) 특정 단어는 띄어쓰기 기준으로 나누자 2) 특정 단어와 등장 횟수를 하나의 데이터로 저장하자 문제점 1) 띄어쓰기로 어떻게 나누나? 키보드 입력을 이용한 상품 객체 생성 시 사용한 split 메소드 2) 단어가 어떤 것이 등장할지 모르는데? 배열로는 역부족 리스트도 등장 횟수를 저장할 수 없으므로 역부족 Hashtable 이라는 새로운 자료구조를 사용해야함

30 WordCount Adv. Hashtable?
<key, value> 의 한 쌍이 하나의 엔트리(entry)인 자료 구조 key와 value 모두 사용자가 원하는 데이터 타입을 지정할 수 있음 하나의 Hashtable에서는 중복되는 키를 사용할 수 없음 중복일 경우 덮어 씀

31 WordCount Adv. Hashtable?
각 엔트리에 자료형이 아닌 객체를 넣을 때는 당연히 Call by Reference로 관리되므로 주의를 요망 get()의 파라미터로 들어간 key와 매칭되는 value를 가져옴 key가 정수라서 순번이라고 생각될 수 있으나 그렇지 않음

32 WordCount Adv. Hashtable? 특정 키와 연결된 value 를 변경하려면 기존 값을 가져옴
원하는 값으로 변경함 같은 키를 이용하여 덮어 씀

33 WordCount Adv. Hashtable? 테이블 내 모든 데이터를 보려면?
모든 키를 가져온 후 하나씩 value를 가져오는 방식

34 WordCount Adv. 구조도 파일ready? 한 줄 읽기 결과 출력 띄어쓰기로 나눔 false true true
파일/스트림생성 해시테이블 생성 파일ready? false true 한 줄 읽기 결과 출력 띄어쓰기로 나눔 true 배열 끝? false key과 value =1을 테이블에 추가 false 테이블 key 존재 true 해당 value 값을 1더하여 저장

35 파일 쓰기 파일 쓰기는 프로그램이 사용하는 메모리의 내용을 파일에 저장하는 것 읽기와 마찬가지로 010…의 스트림을 사용함
파일에 내용을 쓰는 것이므로 FileWriter 객체가 필요 그 이외에는 읽기와 유사함

36 파일 쓰기 읽기와 유사한 방식 처음 보는 것들 System.lineSeparator()는 줄 바꿈 기호를 리턴함
메소드 형태인 이유는 OS마다 줄 바꿈 코드가 다르기 때문 flush()는 무엇인가? 스트림에 남아있는 모든 정보를 파일에 바로 보내는 것 flush() 전에 스트림이 닫히면 스트림 내에 데이터가 남아있는 데이터가 유실 될 수 있음

37 파일 쓰기 BufferedReader와 같은 역할의 BufferedWriter
신규 줄 바꿈을 추가할 때는 newLine() 메소드를 사용하면 됨

38 WordCount Adv. WordCount 의 결과 저장 “단어 등장횟수” 의 형태로 저장해보자
Hashtable의 내용을 화면에 출력하는 것처럼 파일에 쓰면 되겠지?

39 THANKS


Download ppt "DataScience Lab. 박사과정 김희찬 (수)"

Similar presentations


Ads by Google