오늘은 입출력에 관한 유용한 클래스를 배웠다.
Java는 입출력을 할 때 Stream이라는 것을 사용하는데 보통 Java 수업이 끝나도 결국 이걸 이해를 못하고 끝난단다. Stream을 한국말로 하면 물줄기인데 피크닉 음료수 사진을 보여주더니 이걸 생각하면 된단다.
은근 튼튼한 포장지 안에 주스가 들어있는데 이 안에 주스를 마시려면 포장지의 약점인 빨대 꽂는 곳에 빨대를 꽂아 마신다. 여기서 이 빨대가 바로 Stream 같은 존재라고 하셨다.
프로그램을 만드는데 입출력 장치에 있는 데이터를 프로그램으로 가져오고 싶다면 Stream(빨대)를 통해서 데이터를 가져올 수 있다. 그런데 이 빨대는 2종류다. 장치에서 프로그램으로 데이터를 가져올 때(InputStream) 따로 프로그램에서 장치로 데이터를 집어 넣을 때(OutputStream) 따로 있다.
이 프로그램과 장치는 글자가 1byte인데 Java의 1글자는 2bytes라서 글자 하나 못 땡겨오기 때문에 InputStreamReader, OutputStreamWriter을 사용한다. 이 둘은 2bytes이다.
그리고 최종급인 BufferedReader와 BufferedWriter도 있다. (1String의 큰 크기를 가지며 1줄 단위로 논다.)
정리하자면 이렇다.
위 설명이 기본형에 대한 내용이고 개조형 또한 존재한다.
FileReader - InputStreamReader
FilePutoutStream - OutputStream
printStream - OutputStream
우리가 계속 해서 사용해왔던 Scanner의 System.in 또한 콘솔창에 붙어있던 장치, 프로그램의 빨대였고 Sacnner는 InputStream 사용을 편하게 도와주는 객체였다.
그리고 그거 보다 먼저 써왔던
콘솔창에 붙어있던 장치, 프로그램에서 장치로 보낼 때 사용하는 빨대였다.
원래 이런식의 형태를 가진 아이였다.
일단 이렇게 입력한 것을 똑같이 출력하는 형태를 만들고 이 시스템아웃을 다른데다 한번 쏘아보자고 하셨다.
OutputStreamWriter를 파일 쓰기 편하게 개조 해 놓은 것이다.
파일결로를 지정하고 사용한다. 만약 지정한 파일이 없다면 파일은 만들어주는데 폴더는 못 만들어준다. 폴더가 있더라도 그 폴더의 쓰기 권한이 없으면 안 되니까 예외처리 하라고 밑에 빨간줄이 나온다.
Buffered 급은 빨대 굵기가 더 굵다 생각하면 된다. 그래서 2글자 3글자 쓴 정도로는 용량이 다 차질 않아서 파일은 만들어지지만 내용은 안 나온다. 그때 flush를 사용하면 용량만큼 안 채워도 강제로 데이터를 전송해준다.
계속해서 입력 값을 넣어보면 메모장의 내용이 계속 바뀌게 되는데 생성자 선택할 때 append를 선택하고 파일경로 뒤에 true를 붙혀주면 계속해서 내용을 추가해주게 바뀐다.
그리고 \r\n을 붙혀주면 입력 때 마다 엔터가 되면서 내용을 추가해준다. 콘솔창은 \n만 했어도 엔터 효과가 나왔지만 이제는 \r\n을 붙혀주어야 된다.
우리가 이 메모장을 프로그램을 통해 내용을 바꾸고 있는데 내용을 집어 넣는 빨대를 우리가 쓰고 있기에 다른 프로그램에서 같이 쓸 수가 없다. 다른 프로그램에서도 빨대를 쓸 수 있게 close를 통해 닫아줘야한다.
그런데 try 안 쪽 소스에 10나누기 0 같은 오류가 있었다면 catch로 넘어가게 되면서 close는 넘어가게 되고 빨대가 안 닫힌다. 그래서 try, catch 밖으로 빼줘야 되는데 그럼 변수가 안 먹힌다. 그래서 밖으로 빼준다음 close만 별도로 try, catch를 먹여줘야 한다. 지금 bw안에 포함된 fw 상태인데 close를 하면 알아서 둘다 닫아준다고 하신다.
인코딩과 디코딩을 할 때 인코딩은 A 방식으로 하고 디코딩을 B방식으로 하면 파일이 깨진다며 우리 입장에서는 FileWriter는 2bytes로 인식하기에 못쓴다며 한급 낮은걸로 쓰자고 하셨다.
utf-8은 전 세계적으로 잘 쓰이는 인코딩 방식이다.
같은 사연으로 읽는 것 또한 1byte 짜리인 FileInputStream으로 해야되며 반글자, 한글자 역시 답답하기에 버퍼드를 이용하고 각자 예외 처리 하기엔 귀찮기에 Exception으로 전부 묶어준다. 그리고 readLine은 한줄 씩 읽어주는 것이다.
아까 Output 처럼 버퍼드는 밖에 빼주고 br을 close로 닫아준다.
그리고 출력은 반복문으로 처리한다.
학생정보[이름,생일,국어,영어,수학] : 홍길동, ~~~~ 입력하면
--------------------
여기 값이 메모장에 뜨게끔
이번엔 위 처럼 해보라 하셨다.
대충 아까 했던 거 비슷하게 복붙해가며 만들었다.
강사님이 직접 하시면서 파일확장자를 .csv로 하시고 확장자에 대한 설명을 해주셨다.
.txt : 메모장 파일
.hwp : 한글파일
.xls : 엑셀파일
로 알고 있지 않냐고 하셨다.
[파일명.확장자] 확장자는 windows에만 있는 허상이고 아무 의미 없으며 사람이 보고 무슨파일인지 보기좋게 하려고 만든 것 뿐이란다. 사실상 .txt : 메모장 파일 -> 메모장에서 열면 잘 열리는 파일일 뿐이라고 하셨다.
그럼 csv는 뭘까?
csv(comma separated value) 각 값들이 ,로 구분된 파일 ,로 값 받는 김에 이렇게 해보셨단다. 그리고 여담으로 microsoft와 apple은 전 세계적인 흐름을 안 따르기로 유명해서 utf-8으로 설정하면 열리긴 하는데 글자 다 깨진단다.
아무튼 완성하고 나서 데이터분석 스러운 짓 좀 해볼테니 여러개 입력하라 하셨다.
이제 새로운 메인에 방금 입력한 값들이 콘솔창에 고대로 뜨게 만들란다.
그냥 복붙하고 파일명만 바꾸니까 잘 돌아간다.
그리고 저 클로즈 같은 경우 닫기만 하는 건데 공간은 겁나 차지해서 나중가면 저 colse만 한 트럭 되는 경우도 있으니
이렇게 해놓는게 좋다고 하셨다. 굳이 가독성을 챙길 필요도 없으니까 말이다.
그리고 지금이야 내가 만들고 내가 불러왔기에 상관 없지만 나중에 누군가 보내준 분석용 파일을 불러올 때 utf-8이 안 맞으면 다 깨져버리는 경우가 많아서 골치가 많이 아플거라 하셨다.
위의 메모장 파일에 적힌 값을 다시 다른 메인 클래스에서 콘솔창으로 출력하면 이런식으로 나오는데 값이 하나씩 뜯어져서 나오게끔 바꾸라하셨다.
이름
생일
국어
영어
수학
-----
이런식으로
반복문 활용은 이제 어느정도 감을 잡은 것 같다.
그런데 이제 이걸 객체지향으로 만들어보라 하셨다. 나는 이게 너무 어렵다.
값은 똑같은데 이걸 어떻게 객체로 만들라는 건지 이해조차 안 됬다. 반복문을 굳이 다른 클래스에 쓸 이유가 있는건가..? 아니면 이게 메인클래스가 아니라고 생각하고 객체 생성하는 반복문을 만들고 새로운 클래스에 값만 받아오게끔 해야 되는건가..? 라고 손 놓고 고민만 하다가 강사님 하는걸 보니 바로 기억이 났다.
메인에서는 단순히 그 값들을 객체로 만들어주기만 하고 학생 클래스를 만들어서 그 클래스에서 스플릿으로 뜯어주고 출력해주는 구조였다.
(다음 부턴 따로 캡처를 떠야겠다.)
그리고 나중에 반복문 돌릴 때 잘못된 정보가 있어서 catch에 걸리면 그냥 넘기고 할 것인지 아니면 걸려서 멈추게할 것인지는 상사한테 물어보고 하라고 하셨다.
이제 여기서 생년이 제각각이니 나이가 출력되게 하고 좀 이쁘게 출력하랬다.
객체 클래스의 printInfo 부분을 수정한 것이다.
이젠 반 평균을 구해보자 하셨다.
빅데이터를 하게 되면 그 데이터의 총량을 어떻게 셀 것인가?
저번 시간에 나왔던 Java 배열의 단점들 때문에 배열로 반 평균을 구하는게 매우 비합리적이다.
그래서 그냥 와일문에 학생수 증감 되는 Count를 넣고 학생들의 전체 점수가 sum이라는 변수에 저장되게 반복문을 만든 뒤 sum 나누기 studenCount를 해서 반평균을 구한다.
그리고 강사님 피셜 쓸 데 없는 클래스에 대하여 알려주셨다.
-UselessClass (쓸데없는 클래스..?)
통신에는 HTTP통신, Socket통신 등등이 있다.
HTTP 통신 : 요청 - 응답(기본적인 형태)
Socket 통신 : 실시간
실시간으로 무언가를 하려면 전화를 할 땐 전화번호가 필요하듯이 인터넷에선 IP주소가 필요하다.(cmd에 ipconfig에서 확인 가능.) 또한 포트번호는 하나의 서버라도 접속하는 목적(서비스)에 따라 포트번호가 다르다.
서버 : 서비스를 제공하는 컴퓨터
클라이어트 : 서비스를 이용하는 컴퓨터
통신을 할 때는 항상 try, catch를 쓰게된다.
여기서 양쪽에 Input Output을 더 추가해주면 실시간으로 채팅하는 콘솔창인데
동시작업을 만든 것이 아니여서 너 한번, 나 한번 수준이고 실시간은 아니라 하셨다. 다 하고 나니 아까 만들었던 글쓰면 메모장 파일 만들어지고 그 파일 값 가져와서 작업하는 그 메커니즘이랑 비슷하게 생겼다.
실시간도 못하는 Socket 통신 그만하고 이제 다시 쓸만한 클래스로 돌아오잖다.
-HTTP
전에 한번 프로그래밍 언어를 잘한다는 소리를 들으려면 조건문, 반복문, 배열 그리고 그 언어만의 특징을 잘 다뤄야 한다고 했었는데 그 언어로 HTTP통신을 할 수 있다면 마스터 했다고 볼 수 있단다.
JSP/Spring : HTTP서버
BD/AI : HTTP 통신해서 받아온 데이터 분석.
우리가 하는 모든 과정을 통괄하는 느낌이다.
하지만 서버는 몇 달 해야되는거고 우리가 오늘 할 것은 클라이언트다.
HTTP 클라이언트는 Socket 처럼 뭐가 없어서 그냥 때려 만들어야 한단다.
(Java 언어의 특징 : 남이 만든 거 잘 쓰기)
apache.org에 접속해보라 하셨다. 우리는 앞으로 이 곳의 신세를 많이 질 거란다. 저기서 HTTP 프로젝트를 다운 받고 jar 파일 추가해주고 불러온다.
http통신 : 요청[GET/POST] -> 응답
HttpGet 객체 만듦 (무언가 달라고 하는 요청 객체다.)
그리고 요청을 하면 응답이 온다.
HttpResponse 우리는 남이 만든걸 쓰는 중이기에 Java 자체 생성자를 불러오면 안 된다.
아무튼 위 처럼 하면 한 사이트의 소스를 받아올 수 있다.
그리고 반복문 안에 HttpGet과 HttpResponse만 남기고는 이게 뭐냐고 물으셔서 '어.. 설마 디도스..?' 했는데
뭐 이렇게 간단하게 만들건 아니지만 여러분은 이제 위험한 존재라고 하셨다.
그리고 사실 Java에도 Http 기능이 생겨서 굳이 위에 apache에서 가져온건 굳이 할 필요 없었단다.
그냥 우리가 이 통신 단계를 알았으면 하는 생각에 시켜본 거란다.
이것이 바로 주소 객체
http or https(돈 좀 써서 보안성 높은 것)
Connection은 위에 s 있고 없고 따라서 적고 open~~ 위에 마우스 올려서 첫번째꺼 눌러준다. - (연결이라는 의미)
내용 꺼낼 빨대
이하 내용은 전과 동일 해서 굳이 설명은 생략했다.
이번엔 네이버 주소를 넣었기에 메인 페이지의 전 소스가 다 받아졌었다.
갑자기 기상청으로 가보잖다.
JSP/Spring
클라이언트가 html요청 - html 만들어서 응답해주는거 인데
사실 하나 더 할일이 남았단다.
클라이언트가 데이터만 요청하게 되는 경우도 있다.(빅데이터/인공지능 등에 써먹게) - xml/json형태로 응답해주는거
기상청 홈페이지 하단에 RSS를 누른다.
동네 선택 다 하고 끝에 RSS를 누르고 주소를 받는다.
그 주소로 접속하면 이런게 뜨는데 이런 것도 할줄 알아야 된다는 것이다. (물론 위 소스는 매우 불 필요하게 쓰여진 소스라 하셨다.)
데이터와 어떤 형식을 서버와 클라이언트 사이에서 주고 받을 때 xml과 json이 2가지 형식이 있는데 우리는 기상청에서 받아온 이 정보를 java로 xml parsing이란 것을 하고 싶은데 자바에는 이게 없다.
mvnrepository.com에 접속해서 kxml을 검색. 상단에 있는 것 최신버전 jar파일로 다운로드 후 적용한다. json parsing 또한 없으니 아까 사이트에서 json-simple 검색 해서 받아온다. jar 파일 같은 경우 자주 쓰는 것들은 한 곳에 모아놨다가 계속해서 쓴다고 하셨다.
오늘은 설치 까지만 하고 parsing은 내일 해보자 하셨다.
'비전공자의 코딩 일지 > 학원 수업 정리' 카테고리의 다른 글
코딩 학원 17일차 (Java json과 multi-thread) (2) | 2022.06.29 |
---|---|
코딩 학원 16일차(Java xml과 json) (0) | 2022.06.28 |
코딩 학원 14일차 Java (예외 처리, 유용한 클래스) (0) | 2022.06.25 |
코딩 학원 13일차 (Java 객체 지향, 추상 개념) (0) | 2022.06.23 |
코딩 학원 12일차 ( Java 객체 지향, Pattern) (0) | 2022.06.22 |