1장* 빅데이터란빅데이터란 데이터가 너무 방대하여 기존의 방법이나 도구로 수집, 저장, 분석이 어려운정형 및 비정형 데이터를 의미한다.* 빅데이터의 3 요소1) 크기(Volume) : 기존 시스템으로 저장, 분석이 어려울정도로 데이터의 크기가 거대한데 이것을 처리 해야함2) 속도(velocity) : 데이터의 생성, 저장 등의 과정이 빨리 이루어져야함 (배치처리, 실시간 처리)3) 다양성(variety) : 정형, 반정형, 비정형 등 다양한 데이터로 구성되고 처리할수 있어야함(정형 : 문자 그대로 정형화된 데이터, 고정된 필드에 저장되어있는 데이터,반정형 : 고정된 필드에 저장되지는 않지만 xml이나 html과 같이 메타데이터나 스키마를 포함하는 데이터,비정형 : 고정된 필드에 저장돼 있지 않은 데이터를 의미)* 하둡이란대용량 데이터를 분산 처리할 수 있는 자바 기반의 오픈소스 프레임워크이다.(분산 파일 시스템인 HDFS에 데이터를 저장하고 분산 처리 시스템인 맵리듀스를 이용해 데이터를 처리)* SSH란네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고, 다른 시스템으로 파일을복사할 수 있게 해주는 응용 프로토콜이나 응용 프로그램 또는 그 프로토콜을 가리킨다.* HBase란HDFS 기반의 컬럼 데이터베이스이며 NOSQL이다.(데이터 저장기능)* Scribe란페이스북에서 개발한 데이터 수집 플랫폼이며 페이스북, 트위터등에 쓰인다.(데이터 수집기능)* Pig란데이터 처리를 할 때 사용하는 플랫폼* NoSQL이란 관계형 데이터 모델과 SQL문을 사용하지 않는 데이터베이스 시스템 혹은 데이터 저장소를 의미2장* 하둡의 클러스터는 한 대의 네임노드와 여러 대의 데이터노드 서버로 구성된다. (물리적 차원)* 하둡 프레임워크는 여러 개의 데몬 프로그램으로 구성되며 상호 동작하는 master-slave의 형태를 띄고 있음(논리적 차원)* 하둡은 HDFS와 MapReduce로 이루어져있음* 하둡은 3가지의 모드로 이루어져있다.1) 독립 실행 모드 : 하둡의 기본 실행 모드이며 로컬 모드이다.2) 가상 분산 모드 : 하나의 장비에 모든 환경설정을 하고 가상으로 여러 대인 것처럼 작동하는 방식3) 완전 분산 모드 : 여러대의 장비에 하둡을 설치하고 사용하는 경우* SSH란 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고, 다른 시스템으로 파일을 복사 할 수있게 해주는 응용 프로토콜이나 응용프로그램 또는 그 프로토콜을 가리킨다.(rsh, rlogin, telnet 등을 대체하기 위해 설계, 22번 포트 사용, ssh localhost 명령어로 접속 확인)* .bashrc 파일을 수정하여 하둡 환경변수 설정1) 루트계정으로 가서 gedit .bashrc (하기전 ls ?al로 확인하기)2) 맨 아래에 한 줄띄고 export PATH=$PATH:/home/hadoop/hadoop/bin/:. 이라고 적고 저장(하둡 계정의 하둡폴더에 하둡이 설치된 것으로 가정)3) source .bashrc을 실행한후 실행하면 ./bin/hadoop이 아닌 hadoop만 타이핑해도 작동함* tar xvfz 파일.gz - 압축해제 명령어* ln ?s 디렉토리명 사용할이름 ? 심볼릭 링크 생성 명령어* hadoop namenode ?format (네임노드 초기화 명령어)* start-all.sh, stop-all.sh (각각 실행, 중지 명령어)* hadoop fs ?put 파일이름 복사할파일이름 (HDFS에 파일을 업로드하는 명령어)* hadoop jar 파일이름.jar 클래스명 입력파일 출력파일 과 같은 형식으로 사용* 수정하는 파일은 hadoop-env.sh, core-site.xml, hdfs-site.xml, mapred-site.xml 4개이다.3장* HDFS는 블록 단위로 데이터를 저장함 (기본 사이즈 : 64mb, ver.2는 128mb)(4가지의 설계 목표가 있음)1) 장애 복구 : 장애를 신속히 감지하고 대처할 수 있게 설계되었음 (원본과 복제본을 함께 저장해 유실 방지)2) 스트리밍 방식의 데이터 접근 : 저장이나 조회를 위해 스트리밍 방식으로 접근해야함(높은 데이터 처리량에 중점)3) 대용량 데이터 저장 : HDFS는 하나의 파일이 GB에서 TB 이상의 사이즈로 저장될 수 있게 설계됨4) 데이터 무결성 : HDFS는 한 번 저장한 데이터는 수정할 수 없고 읽기만 가능해서 무결성을 유지함* HDFS는 기본적으로 블록당 3개씩 HDFS에 나눠 저장되게 되어있음(320mb의 데이터는 디폴트가 64mb일 경우 5개의 블록에 3개씩 나뉘어 저장됨)* HDFS는 마스터와 슬레이브 아키텍처로 구성됨(마스터 역할을 하는 네임노드와 슬레이브 역할을 하는 여러대의 데이터노드로 구성되며 데이터 노드는하트비트를 보내며 마스터 노드는 하트비트 메시지를 보고 모니터링을 한다. (디폴트 3초))* 보조네임노드는 HDFS의 메타데이터를 관리하기 위해 editlog와 fsimage 파일을 사용한다.(체크포인팅이란 작업을 통해 파일 시스템 이미지파일의 크기를 축소하는 역할을 하며 체크포인트 서버로불리지만 네임노드의 백업 서버는 아님)1) editslog는 HDFS의 모든 변경 이력을 저장한다.2) fsimage는 메모리에 저장된 메타데이터의 파일 시스템 이미지를 저장한 파일이다.* 네임노드가 구동될 경우 다음과 같은 과정으로 사용한다.1. 네임노드가 구동되면 로컬에 저장된 editslog, fsimage 파일을 조회한다.2. 메모리에 저장된 fsimage를 로딩해 파일 시스템 이미지를 생성한다.3. 메모리에 로딩된 파일 시스템 이미지에 editslog에 기록된 변경 이력을 적용한다.4. 메모리에 로딩된 파일 시스템 이미지를 이용해 fsimage 파일을 갱신한다.5. editslog를 초기화한다.6. 데이터노드가 전송한 블록리포트를 메모리에 로딩된 파일 시스템 이미지에 적용한다.* HDFS 명령어는 (hadoop fs 명령어)와 같이 사용한다.1) ls, lsr ? ls는 파일목록을 보고 lsr은 현재 디렉토리의 하위 디렉토리 정보까지 출력2) du, dus ? du는 디렉토리나 파일의 사용량을 확인하며 dus는 전체 합계 용량만 출력3) cat, text ? 2개 모두 파일의 내용을 볼 때 사용한다. (text는 zip 파일 형태로 압축된 파일도 텍스트 형태로 출력)4) mkdir ? 지정한 경로에 디렉토리를 생성하는 명령어 (중복 시 오류 발생)5) put, get, getmerge, cp, copyFromLocal, copyToLocal ? 파일을 목적지 경로로 복사하는 명령어(getmerge는 지정한 경로의 모든 파일을 복사하여 하나의 파일로 복사한다.)(put은 로컬 파일을 HDFS로 복사할 때 사용, get은 HDFS의 파일을 로컬로 복사할 때 사용)(copyFromLocal은 put과 동일, copyToLocal은 get과 동일)(cp는 여러 개의 파일을 복사할 경우 반드시 디렉토리로 복사되도록 설정)(mv, moveFromLocal은 파일을 목적지 경로로 옮길 때 사용, moveFromLocal은 복사후 본 파일 삭제)6) rm, rmr ? 모두 파일을 삭제할 때 사용하는 명령어, rmr은 비어있지 않은 디렉토리도 삭제가능7) count ? 디렉토리의 개수 정보를 출력하는 명령어8) tail, head ? 파일의 마지막, 처음 1kb에 해당하는 내용을 출력 (-x 값을 줘서 원하는만큼 설정 가능)9) chmod ? 지정한 경로에 대한 권한을 변경하는 명령어10) stat, setrep ? 지정한 경로에 대해 통계 정보를 조회하는 명령어, 복제 데이터 개수를 변경하는 명령어11) expunge ? HDFS의 .Trash/라는 임시 디렉토리를 비우는 명령어12) test ? 지정한 경로에대해 파일 형식을 확인하는 명령어* 기존 대용량 파일 시스템은 DAS(소규모), NAS(중규모), SAN(대규모)로 이루어져 있음* jps (java virtual machine process status tool)4장* Mapreduce는 간단히 map과 reduce라는 두 개의 메소드로 구성(맵 : list(k1,v1) -> list(k2, v2), 리듀스 : list(k2, list(v2)) -> list(k3, v3))(HDFS와 마찬가지로 잡트래커와 태스크트래커는 하트비트를 통해 태스크트래커의 상태와 작업 실행 정보 교환)* Mapreduce의 Map은 단어 별 빈도수를 출력 및 정렬, 병합함, reduce는 각 단어의 빈도수를 합산해서 출력* Combine 클래스는 셔플할 데이터의 크기를 줄이는 데 도움을 줌* Mapreduce의 데이터 플로우맵-1) HDFS의 파일을 일겅 배치처리를 한 뒤 가상으로 블록단위로 데이터를 분리한다.(HDFS의 블록크기만큼씩)맵-2) 태스크는 데이터를 한 줄씩 읽어 사용자가 정의한 맵 함수를 실행((k1,v1) -> list(k2, v2))(데이터를 영구 저장할 필요가 없으니 서버에 로컬 디스크에 저장됬다 잡이 종료된 후 삭제됨)셔플-1) 맵 태스크의 출력 데이터가 리듀스 태스크에 전달되는 일련의 과정, 리듀스 태스크는 데이터를내려받아 연산을 수행함 (파티셔너는 맵의 출력 레코드를 읽어 출력키의 해시값을 구하는데각 해시값은 레코드가 속하는 파티션 번호로 사용됨셔플-2) 파티셔닝된 맵의 출력 데이터는 네트워크를 통해 리듀스 태스크에 전달됨
이미테이션 게임을 보고…….학과 :학번 :이름 :앨런 튜링이란 수학자를 주제로 최근에 영화가 개봉되었다. 수학이라는 학문을 소재로 한 영화가 흔하지 않기 때문에 개봉하자마자 관심을 가지고 보게 되었다.영화의 내용은 앨런 튜링이 제 2차 세계 대전 때 독일의 에니그마라는 암호 생성기를 풀 수 있는 콜로서스(영화에서는 크리스토퍼)라는 기계를 여러 분야에서 뛰어난 지식을 가진 동료들과 함께 만들고 그것을 이용하여 전쟁의 승리에 이바지하는 내용이다. 영화에서 앨런 튜링은 유머라고는 전혀 모르고 돌려 말하는 것을 불필요하다고 생각하는 직설적이고 냉철한 성격으로 표현되어있다. 그러다 조안 클라크라는 여성을 만나는데 그 이후로 앨런 튜링의 성격이 바뀌게 된다. 그동안 동료와 어울리지 못했다는 것을 알게 된 조안 클라크는 동료들에게 농담도하고 밥도 같이 먹으라는 등의 조언을 해주었고 앨런 튜링도 사과를 나누어주고 농담을 하려고 노력도 하고 점점 따뜻해지고 협력이라는 것을 배워가기 시작했다. 그렇게 되자 불신하던 동료들의 마음도 잡을 수 있게 되었고 더욱더 빠른 시간에 전쟁에 큰 도움을 줄 수 있게 되었다. 영화의 마지막에는 앨런 튜링의 전쟁이후의 모습과 업적을 기리는 화면이 나오며 끝이 난다.마지막 자막이 올라가고 영화 크레딧이 올라가고 영화관 입구를 나서고 나서 다시 한 번 내용을 되 집어 보자 앨런 튜링과 콜로서스에 대한 궁금증이 머릿속에 차올랐다. 그래서 앨런 튜링과 콜로서스에 대해 찾아보기 시작했다. 먼저 콜로서스의 원리는 처음에 독일군이 암호화한 내용을 도청한 뒤 그 도청한 음을 종이테이프에 천공한 기호 형태로 콜로서스에 넣으면 콜로서스가 사람의 몇 천배의 속도로 조사하는 원리였다고 한다. 이 콜로서스 덕에 전쟁을 2년여 빨리 끝냈다고 하고 나중에 에니악이라는 컴퓨터에 모티브를 주었다고 한다. 그리고 주인공인 앨런 튜링에 대해 찾아보았는데 42세의 나이로 자살을 해서 삶을 마감했었던 천재 수학자였다. 동성애자였으며 그 당시 사회적 시선과 법률 때문에 화학적 거세라는 벌을 받고 호르몬치료가 끝난 후 1년 후에 앨런은 청산가리가 첨가된 사과를 먹고 자살을 하였다고 한다. 앨런 튜링의 죽음에 대해 자세히 알게 되자 굉장한 천재 수학자를 단지 다른 사람과 조금 다른 성적 취향을 가지고 있었다는 것만으로 간접적으로 죽음으로 내몰았던 영국의 과거 법률이 조금 밉기도 했다. 전쟁 영웅에게 치욕적인 형벌을 내리고 그로인해 평생 독신으로 살게 되고 홀로 외롭게 죽어간 앨런 튜링, 만약 앨런 튜링이 요즘처럼 장수했다면 수학 학문이나 과학의 발전이 지금보다 더욱더 빨랐을 것 이고 과장한다면 영화 ‘ 마이너리티 리포트 ’ 에 나오는 첨단 컴퓨터가 등장 했을 수도 있을 것이다. “ 천재들은 일찍 죽는다.” 라는 말도 있듯이 앨런 튜링이란 인물을 일찍 잃은 것은 국적도 인종도 다른 나 또한 매우 아깝게 느껴졌다. 그래도 다행히 최근 들어서는 앨런 튜링의 이름을 딴 튜링상을 만들고 앨런 튜링의 죄를 무죄 판결 내리는 등의 노력을 보여주고 있다고 한다.앨런 튜링의 정보를 알아본 뒤 조금 더 깊이 영화의 내용을 이해해보고 감독의 영화 촬영의도를 추측해보기도 하였다. 내 생각으로는 영화에서 동성애를 조심스럽게 보여주는데 아마도 그런 감독의 의도는 아직도 세계의 많은 사람들이 동성애라는 성적취향을 특이한 것으로 보는 경향이 존재한다고 보았고 그것을 줄여보려고 시도한 것 같았다. 나도 최근에서야 동성애를 재미있게 다룬 웹툰인 ‘ 모두에게 완자가 ’를 보고 생각이 바뀌었기 때문에 그전에는 동성애자를 색안경을 끼고 보고 있었다고 할 수 있다. 그래서 영화를 보고 반성도 하고 동성애자가 이상한 것이 아니라는 생각을 더욱더 확실히 가질 수 있게 되었다. 만약 이 영화를 누군가에게 추천한다면 동성애자를 차별하는 사람이나 앨런 튜링에 대해 오해를 하고 있는 사람에게 추천하고 싶다. 그리고 앨런이 주인공인 ‘ 앨런 튜링의 최후의 방정식’이라는 책도 있는데 영화와 함께 참고해서 읽는다면 앨런 튜링에 대해 자세히 알 수 있을 것 같아 추천하고 싶다.
그대는 눈부시게 아름답다.- [ 아프니까 청춘이다 ]● 학과 :● 학번 :● 이름 :총평생각보다 두껍고 딱딱한 내용 때문에 읽는 도중 읽기 싫었던 적도 있지만 읽을수록 내가 겪었던 일이나 봐왔던 것에 대해 진지하게 다루고 힘들어하는 나에게 힘이 되 준 책이고 중학교시절부터 베스트 셀러 였는데 이제 봤다는 것이 조금 아쉬웠던 책이었다. 누가 읽더라도 공감되는 내용으로 이루어져있고 우리에게 ‘힘든 것을 아는데 너는 젊어 그러니 좌절 하지마’ 라는 말을 전체에 걸쳐 하고 있다. 고등학생부터 막 회사에 들어간 사회 초년생이 읽으면 좋은 책인 것 같다.강의 시간 중 언젠가 이준 교수님께서 이 책을 읽어보라고 추천해주셨고 마침 책도 집에 있었기 때문에 바로 읽게 되었다. ‘ 아프니까 청춘이다 ’ 라는 제목은 언뜻 보면 어려운 철학을 담은 책인 것 같기도 하고 서울대 교수가 쓴 책인 만큼 그 수준에 맞는 책 일 것 같아 처음에는 조금 부담스러웠다. 하지만 차근차근 읽기 시작하며, 이 문장이 어떤 의미를 가지고 있고 이 파트가 ‘왜’ 이 부분에 있는지 ‘왜’ 이런 내용이 있는지 생각하며 읽어보자 여러 가지 깨달음을 느낄 수 있었고 정말 좋은 책이라는 것을 직감적으로 느낄 수 있었다. 오늘날의 젊은이들에게 김난도 교수님께서 편지 쓰듯이 쓴 책이라 하나하나가 인상 깊었다. 나는 그중에서도 사람이 태어나서 죽을 때까지의 일생을 2모자이크 퍼즐로 비유한 것이 매우 인상 깊었다. 죽는 나이를 80살로 가정하고 계산 했을 때 우리는 29,200피스의 퍼즐과 같다고 했다. “ 하루하루를 살아가는 것이 퍼즐을 채우는 것과 같고 큰 ‘한 방’이 아니라 작은 ‘하나하나’가 쌓여야 하는, 대략 29,200피스의 퍼즐을 채우는 것과 같다.” 이 부분은 나에게 많은 생각을 하게 해주었다. 시험기간에 벼락치기로 고득점을 노리는 파렴치한 행동을 했던 나에게 ‘한 방’이 아니라 ‘하루하루’ 즉 꾸준히 공부해야 한다는 것을 당연한 것이지만 다시 한 번 일깨워 주었다. 그리고 이 비유를 한 다음부분에는 다음과 같은 내용이 있다. “인생의 성공이란 커다란 한 번의 성취가 아니라, 매일 매일의 작은 승부로 직조하는 것이다.” 하루하루를 빈 조각으로 비어있게 하지 않고 빈틈없이 가득 채우라는 의미이고 그러면 인생은 조금씩, 조금씩 달라진다고 한다. 이 부분 또한 나에게 새로운 깨달음을 준 부분이다. 이 외에도 많은 내용이 있지만 하나하나가 많은 영감과 깨달음을 주어서 고르는데 고민일 정도로 마음에 와 닿은 책이었다.요즘같이 스피드가 중시되는 사회에 나 역시 무언가를 성취하기 위해 이것저것 손을 대보고 남들이 좋다고 하는 것들도 해보고 끝맺음 없이 손만 벌리고 있었던 적이 있었다. 최대한 빨리 무언가를 얻고 싶은 마음에 가장 중요한 ‘꾸준함’ 없이 무언가를 하니 잘 될 리가 없다. 이 책에서도 그 부분에 대해서 다루고 있다. 꾸준함 없이 이루어지는 것은 없으며 우연찮게 이루어 질수도 있지만 그것은 나의 것이 아니다 라는 내용이었다. 그래서 이 부분을 읽고 나도 또한 반성을 하게 되었다. 하루에 3시간씩 10년간 공부를 하면 1만 시간을 하게 된다고 한다. 그리고 어떤 것을 1만 시간 접하게 되었을 때 그것에 대해 전문가가 된다고 한다. 이렇게 까지 해야 전문가가 될 수 있지만 조금의 노력으로 큰 결과를 얻고자하는 태도에 대해 반성을 하게 되었다. 그리고 이 글쓴이가 했던 방법처럼 1-1원칙을 참고하여 나만의 원칙을 만들어 보게 되었다.
스티브 잡스를 읽고 ...신입생 세미나 시간에 교수님에게 책을 추천 받았는데 내가 추천받은 책은 ‘스티브 잡스’였다. 핸드폰도 애플사의 제품이고 집에 아이패드도 있는 등 애플제품을 좋아하는 나로 써는 읽을 흥미도 생겼었고 또한 재미있게 읽을 수 있었다. 각자 책 이름을 봉투에 적어 주셨는데 내 봉투에는 ‘스티브 잡스는 채식주의자?’라고 쓰여 있었다. 그래서 동네의 국립도서관에 가서 책을 빌려서 읽어보았다. 상당히 두꺼운지라 다 읽지는 못하고 소제목 중 흥미로워 보이는 부분만 읽었다. 그중에서 나는 이 구절이 가장 괜찮았고 여러 가지를 느낄 수 있었다. “ ‘집중’이란, ‘포기’하는 것이다. 다른 소중한 것들의 가치를 알면서도 ‘포기’ 해야 한다.” 이 부분이 가장 감명 깊었다. 나 자신의 한계를 알아야 된다는 뜻을 내포하고 있는 것 같았다. 나는 천재가 아니고 완벽해질 수가 없다. 포기해야하는 것이 반드시 생기고 그것을 하지 못한다는 것을 인정해야한다고 나에게 말하는 것 같았기 때문에 와 닿았고 여러 가지를 느끼게 해주었다. 그리고 이 구절 바로 뒤의 문장도 정말 좋았다. ‘전부 다 잡으려고 하면, 전부 다 놓친다. 하나만, 딱 하나만 보고 달려야한다. 그래야 성공한다. 그것이 집중의 힘이고, 그러기 위해서는 포기해야 한다.’ 이 부분 역시 나에게 큰 영감을 주었다. 한 가지만 바라본다면 천재들도 이길 수 있고, 비록 다른 선발주자보다 뒤쳐져 시작했지만 따라 잡을 수 있다는 용기를 주었다.봉투에 쓰여 있었던 채식주의자? 에 대한 궁금증이 생겨 책을 뒤져보았다. 읽어본 결과 잡스는 철저한 채식주의자이며 견과류를 매우 사랑했다고 한다. 췌장암 투병 중에도, 애플 제품의 미래에 대해 논의할 때조차도 육식은 절대하지 않았다고 한다. 글로만 봐도 끔찍하게 채식만을 했다는 것을 알 수 있었다. 그리고 이 부분에서 죽는 한이 있더라도 원칙을 고집하는 성격, 즉 완벽 주의자의 면모를 느낄 수 있었다.
미분적분학 리포트이름 :학번 :학과 :담당 교수 :제출일 :함수의 종류1) 다항함수(다항함수중 1,2,3 차 함수 예시)* 요약 :다항함수란 f(x)가 x에 관한 다항식일 때, 이 함수를 다항함수라고 한다.2) 유리함수* 요약 :함수 y = f(x)가 x에 관한 유리식일 때이 함수를 유리함수라 하고,분모가 상수가 아닌 유리함수를 분수함수라 한다.(유리함수중 분수형 예시)3) 무리함수* 요약 :함수 y = f(x)에서 f(x)가 x에 대해 무리식인 경우를 무리함수라 지칭한다.특히 무리함수는 √ 안의 값이 음수가 되지 않는조건을 만족해야 함수가 되므로 정의역이 한정된다.( 꼴로 예시)4) 삼각함수* 요약 :평면 위에 O를 원점으로 갖고X, Y축을 갖는 좌표계를 그린 후각 θ 에 따라 사인, 코사인, 탄젠트, 시컨트, 코 시컨트, 코탄젠트의 함수 값을 나타낸 것이다.(삼각함수 예시)5) 역함수* 요약 :y가 x의 함수일 때, 역으로 x를 y의 함수로 본 것으로x의 함수 y=f(x)가 있을 때,그 치역(値域)에 속하는 y의 각 값에 대하여y=f(x)인 관계에 있는 x를 대응시킴으로써,x를 y의 함수로 간주할 수가 있다.이 함수를 원래의 함수의 역함수라고 하며, 보통은 x=g(x)=f-1(y)로 나타낸다.(역함수 예시)6) 합성함수* 요약 :두 함수 f : X → Y, g : Y → Z가 주어졌을 때,X의 임의의 원소 x에 Z의 원소 g(f(x))를 대응시키는새로운 함수를 f와 g의 합성함수라고 하고 g?f로 나타낸다.그리고 g?f(x) = g(f(x)) 또는 (g?f)(x) = g(f(x)) 로 정의한다.(합성함수 예시)7) 지수함수* 요약 :수학용어로서 a를 양의 상수, x를 모든 실수 값을 취 하는 변수라 할 때 y=ax 로 주어진 함수를 가리킨다.(지수함수 예시)8) 로그함수* 요약 :a를 1이 아닌 양의 상수라고 할 때,두 변수 x와 y 사이에 ay=x인 관계가 있으면y는 a를 밑으로 하는 x의 로그함수라 하고,y=loga x로 나타낸다.로그함수는 지수함수 y=ax(a>0, a≠1)의 역함수이다.(로그함수 예시)9) 주기함수(사인 함수 예시)*요약 :어떤 주기를 가지고 함수 값이 반복되는 함수.10) 일대일 함수 (단사함수)* 요약 :X의 임의의 두 원소 x1, x2에 대하여 x1 ≠ x2 이면 f(x1) ≠ f(x2) 를 만족할 때 함수 f를 일대일 함수라고 한다.
○ Fetch Policy- 메모리를 언제 가져오나1) 필요로 할 때 가지고 옴 (페이지 폴트, 메모리 폴트가 생기면 가지고옴) - Demand paging (용어 암기 必)2) 미리 예측하여 가지고 옴 ? Prepaging○ PLacement Policy- 디스크에서 읽어 온 페이지를 메모리 어디에 둘 것인가(페이징 시스템에선 빈 프레임 아무 곳에나 두면 됨, 윈도우 리눅스 등 거의 모든 운영체제)- 세그멘테이션 시스템에서는 빈 메모리 크기가 다 다르므로 동적 메모리 할당이 이루어져야 함(메모리 컴팩션이 생김, 실제로 사용하는 운영체제는 없다,)○ Replacement policy- 디스크에서 읽어온 페이지를 로드하기 전 가득 찬 메모리의 일부를 디스크로 빼내 빈 공간을 만들어야 함(4가지 Page replacement algorithm이 있음)1) OPT (Optimal policy) - 미래에 가장 오랫동안 참조되지 않을 페이지를 선택 (실제로 구현 불가능)2) LRU (Least Recently Used) - 과거 가장 오랫동안 참조되지 않은 페이지를 선택 (오버헤드가 심함)3) FIFO (Firest-in, First-out) - 메모리에 가장 오랫동안 있던 페이지 선택 (성능이 제일 안 좋음)4) CLOCK (Clock policy) - 규칙에 따라 페이지 선택 (가장 많이 사용)ㄴ CLOCK이 헷갈리니 연습을 많이 해야 함ㄴ 그림으로 보여주고 채워 넣는 식으로 나온다고 함 (그림으로 이해하고 그릴 줄도 알아야함)Enhanced Clock Policy (업그레이드 버전) - modify bit (m)이 하나 더 추가됨○ Cleaning Policy ? 언제 백업을 받을 것인가 (둘다 장 단점이 있다, 정답은 없다)1) 미리 예측해서 백업을 받기 (precleaning) - 교체될 필요도 없는 것을 백업하는 등 비효율적 일수 있다2) 교체가 결정이 됐으면 백업을 받기 (Demand cleaning) - I/O 작업이 2번 일어남 (백업 시, 넣을 시) 들어 온 순서대로 실행 (FIFO와 동일)(레디 큐에 가장 오랫동안 있었던 프로세스가 가장 우선순위가 높음, 중간에 새로운 프로그램이 들어와도 스케줄 링을 하지않고 다 실행 후 스케줄링을 한다.)2) Shortest Process Next (SPN, 비선점형) - 서비스 시간이 가장 짧은 프로그램을 먼저 실행한다.(간단하지만 구현은 힘들다. 왜냐하면 서비스 시간이란 것을 정확히 알 수가 없기 때문에)3) Shortest Remaining Time (SRT, 선점형), (SPN의 선점형 버전) - 남아있는 시간이 가장 짧은 프로그램을 실행(새로운 프로그램이 도착할 때 마다 스케줄링을 하므로 조금 복잡, 차트를 비워놓고 그려보라 라는 식의 문제가 나옴)4) Highest Response Ratio Next (HRRN, 비선점형) - response ratio(R)이 가장 낮은 프로그램을 실행( R = (레디큐에서 기다린 시간 + 서비스 시간) / 서비스 시간 ), (대기 시간이 길면 서비스 시간도 길다, 비례 관계)( 다른 프로그램의 서비스가 끝났을 때 계산과 스케줄링을 실시함)5) Round-Robin (RR, Time sharing) - 타임 퀀텀 (Time quantum)(한 프로그램에 주어지는 시간을 타임 슬라이스(Time Slice) 혹은 타임 퀀텀(Time Quantum)이라 말한다.)(주어진 타임 퀀텀동안에 새로운 프로그램이 들어와도 스케줄링을 하지 않는다. 타임 퀀텀만큼 실행한다)(I/O 작업은 없다고 가정, 타임 퀀텀을 사용 후 그 순간 새로운 프로그램이 들어온다면 새로운 프로그램을 앞으로넣고 타임 퀀텀을 사용한 프로그램은 그 뒤로 보낸다.)(I/O가 별로 없는 프로그램을 CPU 바운드 프로그램이라고 한다. I/O를 주로 하는 것은 I/O바운드 프로그램이라 한다.)(I/O가 많은 프로그램은 타임 퀀텀을 다 사용하지 못하고 cpu를 넘겨주는 경우가 많다. 이점을 해결하기 위해 고안한 것을 Virtual Round-Robin 이라고 한다. 중간에 다 한다. (그림 참고)- 디스크를 나눈다 하는 것을 ‘파티션을 나눈다.’ 라고 하는데 파티션을 나누는 단위는 실린더이다.- 디스크의 arm에 헤더가 하나씩 달려있고 헤더 하나당 독자적으로 움직이며 데이터를 읽는다. 동시에 같은 위치의데이터를 읽을 경우 더욱 빠르게 데이터를 읽을 수 있다.○ Disk I/O time (계산을 할 줄 알아야함)- seek time : 헤드가 해당 트랙을 찾아가는 시간- rotational delay (latency) : 디스크의 반 바퀴를 회전하는 시간, 먼저 한 바퀴 회전시간을 구해야 구할 수 있음(‘디스크가 100번 회전하는데 걸리는 시간이 0.6초였다 이때 rotational delay는?’ 이런 식으로 잘 나누어떨어지게 나온다고 함)- transfer time : 데이터를 읽어내는데 걸리는 시간(한 트랙이 32섹터로 이루어져있을 때 16섹터를 읽는데 걸리는 시간은? = 반 바퀴 회전하는 시간)(한 바퀴를 읽는데 걸리는 시간 = 한 트랙을 읽는데 걸리는 시간 = 한 실린더를 읽는데 걸리는 시간, 헷갈리면 안 됨)- Total Access Time : 파일을 읽는데 걸리는 종합 접근 시간 (seek time + rotational delay + transfer time)- 계산하는데 편하게 하기위해 MB = 2^20, GB = 2^30과 같은 것을 외워두기○ 디스크를 읽는 방식이 3개가 있다- 디스크 한 표면에 연속적으로 파일을 저장 (연속된 섹터이므로 seek time이 처음 빼고 필요 없다.)- 디스크 한 표면에 랜덤으로 흩어지게 파일을 저장 (연속된 섹터가 아니므로 전부 seek time이 필요하다.)- 파일이 연속된 실린더에 저장된 경우 (동시에 더 많은 트랙을 읽으니 최상의 경우)ㄴ 위의 것을 보고 계산하는 것을 연습 많이 하기(Seek time이 성능을 좌우한다.)○ 디스크 스케줄링 (디스크에서 데이터를 읽는 순서에 대한 스케줄링)- 데이터를 읽어달라는 트랙 번호가 주어지면 그 번호를 스케줄링- 1~4번 알고리즘은 서는 한 라인(레코드)으로 생각해도 되고 바이너리 파일에서는 한 라인을 서로 다른 구조체의 정보들이라고 생각하면 된다. (각 레코드의 크기가 다 다름)2) Sequential File ? 각 레코드의 크기가 같음, 키값의 순서대로 연속적으로 파일에 저장됨- 원하는 정보를 찾으려면 모든 데이터를 순서대로 검색을 해봐야 한다.- 기존에 있던 파일을 마스터 파일이라 한다.- 별도의 로그, 트랜잭션 파일에 저장한다. (나중에 마스터 파일과 순서적으로 일괄 업데이트를 한다.)(변경 사항이 있으면 바로 수정하는 게 아닌 로그, 트랜잭션 파일에 저장 후 업데이트 한다.3) Indexed Sequential File ? 두 개의 파일로 구성 됨(데이터파일, 인덱스 파일)- 데이터파일을 Sequential File과 동일하게 연속적으로 저장된다.- 인덱스 파일은 정해준 단위로(ex) 1000개 단위로) 각 레코드의 시작위치를 저장하고 있다.(파일 내의 위치를 나타냄)- 인덱스 위치를 이동후 하나씩 이동하여 찾는 값을 찾는다. (1400이면 1000으로 이동후 400번 검색)(Indexed Sequential File이 ‘이런 의미다’라는 것을 이해, 시험에는 파일에 대한 간단한 설명 후 어떤 파일에 대한설명이냐 고르는 문제, 이런 파일의 특성을 간단히 설명해라 라는 식으로 나온다고 함)4) Indexed File ? 오늘날 대부분 사용하고 있는 파일이다.- 프로그램이 직접 index 파일을 만들어 B트리나 AVL트리로 모든 레코드에 대한 키 값과 레코드의 위치를 가지고 있다.- 각 레코드는 키 값의 순서와 상관없이 파일 내의 어디든지 저장될 수 있다.- binary tree 형식으로 되어있어 매우 많은 레코드에서 특정 레코드를 찾을 때 적은 비교로 찾을 수 있다.5) Direct or Hashed File ? 레코드의 개수는 많지 않지만 tree로 관리하기 부담스러운 경우 사용- 각 레코드에 대해 키 값이 있어야 함, 한 번에 바로 원하는 레코드의 위치를 찾아내고자 할 때 사 하지만 중간의 데이터는 찾아가지 못해서 처음부터 찾아가야 된다.- FAT16은 2bytes를 사용하고 FAT32는 4bytes를 사용, 파일 시스템마다 파일을 읽어오는 알고리즘 등 방법이 다름- 파일을 지우면 첫 번째 블록만 지운다. (나머지 다음 블록 데이터는 그대로 있지만 처음이 없으니 접근 불가)3) Indexed allocation (가장 많이 쓰이는 파일 할당 방법)- 일반 블록을 이용하여 인덱스 블록을 만든다. (인덱스 블록 내에는 파일 블록 번호들이 있고 더 큰 경우 또 다른인덱스 블록로 연결할 수 있다.- 파일의 중간도 접근 가능- 블록을 4kb로 쓰는데 인덱스 블록 안에는 1024개의 블록 번호를 가질 수 있다. (4MB 크기의 파일 크기임)(4GB 파일 저장하는 데는 인덱스 블록 몇 개가 필요한가? 시험가능성 약간 있음)- 파일의 상세정보는 별도의 영역에 저장되어 있다.○ Free Space Management (빈 블록 할당하는 방법)- Disk allocation table : 디스크의 빈 블록에 대한 정보를 가지고 있음1) Bit Tables : 빈 블록을 할당 되어있으면 1 안 되어있으면 0 과 같이 bit table을 관리(이 Bit Table의 크기가 은근히 크다. 16GB 파일이면 bit table이 4MB 차지한다. 계산 연습해보기)(‘그림을 보고 Bit Table을 적어보아라’ 라는 문제가 나올 수도 있음)2) Chained Free Portions- 빈 블록들을 링크드 리스트로 관리, 블록을 하나 할당할 때마다 블록을 한번 읽어야 함- 비트테이블 필요 없고 별도의 디스크 공간 필요 없음3) Indexing- 빈 블록들의 번호를 인덱스 블록들에 저장하고 있음 (앞 Indexed allocation과 동일)- 별도의 디스크 공간 필요 없음, 리눅스 시스템에서 사용한다.4) Free Block List- FAT16, FAT32처럼 빈 블록들을 관리함- 디스크 별도의 영역에 빈 블록들의 블록번호를 기록해두고 일부분을 메모리에 읽어다.
□ 운영체제의 목적- 편리성 ? 개발기능, 프로그램 실행기능, 파일 시스템 기능 등을 제공- 효율성 ? 메모리, 디스크 등 시스템의 자원을 효율적으로 관리- 진화성 ? 에러, 버그 픽스, 하드웨어, 소프트웨어의 업그레이드에 맞게 진화Q. 시스템 부팅 시 메모리에 설치되는 거대한 API 함수 및 관련 함수들의 집합이 무엇이냐A. 커널(Kernel)Q. 커널 함수의 호출 시점은?A. 응용 프로그램에서 API함수를 호출 했을 때I/O 장치에서 인터럽트가 들어왔을 경우Q. 멀티 프로그램 시스템과 시분할 시스템의 차이점A. 목적의 차이는 멀티 프로그래밍 방식은 CPU 이용률 최대화이고 시분할 시스템은 응답시간의 최소화이다. 그리고 CPU의 이용률에서 멀티 프로그램 시스템의 경우 cpu를 다른 프로세스에 넘겨주는 cpu 스위치 시간이 없다는 차이점이 있어 cpu 이용률이 더 높다. 응답시간의 경우 시분할 시스템이 0.1초씩 분할하여 프로그램을 실행하기 때문에 프로그램이 종료될 때까지 실행하는 멀티프로그램과 다르게 응답시간이 더 빠르다는 차이점이 있다.○ OS : 커널 + 시스템 프로그램들로 이루어져 있다.○ 운영체제의 프로세스 구조체는 링크드 리스트로 관리된다.○ 실행가능한 프로세스중 우선순위가 가장 높은 프로세스를 골라 CPU를 넘겨주는 것을 스케줄러라고 한다.○ 프로세스의 생성Spawned by existing process : 새로운 프로그램은 기존의 프로세스에 의해서 이루어진다. (혼자하는 것이 아니다)(기존 프로세스에 의한 생성)○ 프로세스의 종료Normal completion (정상 종료) : 정상적으로 수행 되었을 때 종료된다.Bounds violation (접근 범위 위반) : 프로세스가 접근이 제한된 곳에 잘못 접근 시 종료된다.Arithmetic error (산술 오류) : 0으로 나누는 잘못된 계산이나 허용된 범위 밖으로 사용하려고 할시 종료된다.Invalid instruction (잘못된 명령어) : 프로세스가 존재하지 않거나 잘못된 명령어를 실행할시 종료된다.○ 프로세스의 상태Running : 프로세스가 실행 중인 상태Ready : 프로세스가 언제든지 실행할수 있게 준비된 상태Blocked : I/O 장치에서의 대기 상태일 때 대기하는 상태이며 프로세서가 할당되도 실행이 되지 않음, 데이터가 도착할 경우 Ready상태로 변화됨New : 프로그램의 실행을 준비하는 상태Exit : 프로그램 실행이 완료되어 폐기 되어가는 상태 (프로세스 상태 변화도) ¬○ Suspended state 가 필요한 이유 : 모든 프로세스가 I/O 대기를 하고 프로세서가 idle 상태가 될 수 있다이럴 때 스와핑 방법을 이용하여 별도의 디스크에 대기상태의 프로세스를 빼고 다른 프로세스를 실행하는데 이러한 스와핑을 사용하기 위해 Suspended state가 필요하다.arg & envstack (함수의 지역변수)??heap (메모리 동적할당시 사용하는 공간)초기화되지 않은 전역변수초기화된 전역변수실행명령어들(exe 파일과 같은 실행 파일)텍스트 (코드)○ 큐는 프로세스 구조체들을 링크드 리스트로 관리한다.○ 프로세스 구조체 (프로세스 컨트롤 블록의 구성요소, 그림그려 설명하기)- 프로세스 식별(프로세스 ID, 프로세스를 생성한 프로세스 ID, 그룹 ID 등이 있다.)- 프로세서 상태 정보(general working register, program counter, program status word 등으로 이루어진 context data가 있다.)- 프로세스 제어 정보(프로세스의 상태 값, 프로세스의 우선순위 값, 큐의 링크드 리스트 등에 여러 상황에 쓰이는 포인터 변수 등이 있다.)○ PC (Program Counter) : 다음 명령어의 주소를 저장하는 곳○ PSW (Program Status Word) : 프로세스 실행 중 오버 플로우와 같은 상황의 상태 값을 저장하는 곳○ General Working Register : 연산 등의 일반적인 작업을 할 때 사용 하는 곳, 8 or 32개가 있는 것이 보통이다.○ Context data : 실행중인 프로세스가 일시 중지될 때 프로세서의 문맥 데이터를 전부 백업 시켜 놓는 곳(재실행시 문맥 데이터를 다시 프로세스로 다운로드 시켜야함)○ SP (Stack Pointer Register) : 현재 스택의 Top 위치를 가리키는 레지스터○ 스택에 저장 되는 것- 함수 인자- 지역 변수- 함수를 호출했던 곳으로 되돌아갈 주소○ CPU의 실행 모드- 유저모드 (유저의 프로그램을 실행할 때)- 커널모드 (운영체제의 프로그램을 실행할 때)○ 프로세스 생성과정1. 프로세스 ID 할당2. 프로세스 구조체 초기화3. 메모리 확보4. 사용되는 여러 포인터들 세팅 (링크드 리스트 등)5. 다른 데이터 구조를 만들거나 확장 한다.○ 인터럽트의 발생 시 처리 과정1. I/O 디바이스, 타이머 등 인터럽트 발생 시 인터럽트 처리함수의 시작주소로 점프 (백터링) (유저모드 -> 커널모드)2. 현재 실행 중인 프로세스의 문맥을 스택에 저장 (문맥저장)3. 인터럽트 처리함수의 고유 기능 수행4. 스케줄러 함수 호출 (커널모드 -> 유저모드)┖ 그림으로 표현된 모습 (그릴 줄 알아야함)○ 프로세스 스위치가 발생하는 경우크게는 2가지 (인터럽트 발생 시, I/O함수 호출 시) 가 있다세부적으로 보면 아래와 같이 5가지가 있다.1. 타이머 인터럽트2. I/O 인터럽트3. 트랩 인터럽트4. 메모리 폴트 인터럽트5. I/O 함수 호출 (프로세스 상태 변화도와 프로세스위치 발생 시점) ¬○ 메모리 관리 요구조건은?1. 재배치 (디스크 스왑 아웃 후 스왑 인 할 때, 메모리 컴팩션을 할 때)2. 메모리 보호 (MMU와 함께 다른 프로그램이 침범할 때 보호)3. 메모리 공유 (프로그램 코드, DLL 라이브러리 코드 공유)○ 메모리 분할과 배치1. 고정 분할 (과거에 사용되었던 방식, 요즘에는 동적 분할방식을 쓴다.)2. 동적으로 분할 (베스트 핏, 퍼스트 핏, 넥스트 핏 알고리즘, 버디 시스템이 있다)- 베스트 핏 알고리즘 : 요청된 메모리 블록보다 큰 블록 중 가장 작은 것을 할당함(메모리 컴팩션이 자주 발생하고 성능이 가장 안 좋음)- 퍼스트 핏 알고리즘 : 요청된 메모리 블록보다 큰 블록 중 맨 처음으로 만나는 것을 할당(간단하고, 빠르고, 성능도 가장 좋다)- 넥스트 핏 알고리즘 : 마지막으로 할당 되었던 메모리 블록 다음부터 찾아 처음으로 만나는 할당 가능한 공간을할당 하는 방식 (반드시 마지막 할당 되었던 곳의 주소를 알아야함, 중간정도의 성능)- 워스트 핏 알고리즘 : 베스트 핏과 반대 방식으로 요청된 메모리 블록보다 큰 블록 중 가장 큰 곳을 할당(중간정도의 성능 (= 넥스트 핏)) (각 알고리즘의 예, 직접 알고리즘에 맞게 넣을 줄 알아야함) ¬- 버디 알고리즘 : 메모리 할당을 2의 지수 승 으로 할당함○ 33의 메모리가 필요하면 64 할당)○ 64가 없다면 2배, 계속 없으면 있을 때까지 2배 할당○ 33을 할당하기 위해 할당 가능한 곳을 찾다 512를 할당했다면 반을 나눈뒤 맨 왼쪽에 할당 후 나누고 할당하고를 33이 수용되는 2의 지수 승까지 반복한다.○ 같은 크기로 분할된 것을 버디 친구라고 한다.○ 메모리 블록을 반납 후 버디를 검사해 그곳도 free 상태라면 합쳐 두 배의 큰 블록으로 만든다. (아니면 X)(버디 시스템의 예) ¬위의 그림을 그리고 요청, 반납 시 어떤 곳에 어떻게 되는지 알 고 있어야 한다.○ Real Memory System과 Virtual Memory System의 차이점- Real Memory System은 프로세스 전체가 메모리에 로드가 되야 실행 가능함 (궁극적인 차이점)
5장- 추상클래스를 만들 때는 abstract라는 키워드를 클래스나 메소드 맨 앞에(메소드의 경우 접근지정자 다음) 추가해주어야 한다.- 추상클래스는 객체를 생성할 수 없다.- 추상메소드가 있으면 그 클래스는 추상클래스로 선언해주어야 한다.- 추상클래스를 상속 받은 후 추상메소드를 오버라이딩 하지 않으면 상속받은 클래스도 추상 선언을 해야 한다.- 추상클래스는 추상메소드를 통해 서브 클래스가 구현해야하는 메소드를 명료하게 알려주는 인터페이스 역할을 한다.- 추상메소드를 선언할 때는 이름만 선언하면 된다. (반드시 abstract 키워드를 붙여야하고 코드도 없음)- 추상메소드를 선언할 때 코드를 적으면 안된다.- 인터페이스를 선언할 때는 interface 키워드를 사용하면 된다.- 추상메소드는 다른 접근 지정자로 지정할 수 없다, 인터페이스는 default, static, private로 선언이 가능하며 private는인터페이스 내에서만 접근가능, default는 public으로 고정이며, static은 default는 public 또는 private로 선언가능(static, default는 인터페이스 내에 메소드 코드가 선언이 되어야 한다. 추상메소드는 public abstract 키워드 생략이 가능함)- 인터페이스는 객체를 생성할 수 없다.- 인터페이스 타입의 레퍼런스 변수는 선언 가능하다. ( ex) photointerface exam)- 인터페이스끼리 상속이 가능하다.- 인터페이스를 구현할 때는 클래스에 extends처럼 implement 키워드로 구현가능하다. (다중 상속 가능)(인터페이스의 구현이란 내부의 추상 메소드들을 구현하는 것이고 default 메소드는 자동으로 상속된다.)- 인터페이스란 클래스의 규격 선언이며, 클래스의 다형성을 실현하는 도구이다.- 클래스에서 인터페이스의 메소드를 구현 시 public 접근지정자를 반드시 넣어줘야 한다.- 인터페이스와 추상 클래스는 유사한 점이 있는데, 객체를 생성할 수 없고, 상속을 위한 슈퍼클래스로만 사용- 패키지를 선언하려면 package 파일명; 키워드로 선언이 가능하다.- 디폴트 패키지는 현재 디렉토리이다.- java.lang의 패키지들은 import문을 사용하지 않아도 자동으로 import된다.- java.util (날짜, 시간, 해시맵 등), java.io(키보드, 모니터, 파일 등 입출력 클래스), java.awt(gui 프로그래밍)- Object 클래스는 java.lang에 속하며 아무 클래스도 상속받지 않는 최상위 클래스이다.(모든 클래스가 자동으로 상속 받는 클래스이다.)- Object 클래스의 주요 메소드로는 equals, getClass, hashCode, toString, notify, nofityAll, wait 등이 있다.- 개발자들은 toString 메소드를 오버라이딩하여 자신만의 문자열을 리턴하도록 할 수있다.- Object 타입 객체를 받은 후 필요한 타입으로 다운 캐스팅하여 사용하는 것 기억하기- Wrapper 클래스는 각 형의 키워드를 첫글자는 대문자로 풀네임을 적은 것이다. (char -> Character)- Wrapper 클래스를 선언할 때는 valueOf 키워드를 사용한다. ( ex) Integer.valueOf(10);)- Wrapper 객체의 값을 객체.타입명Value() 로 리턴받을 수 있다. ( ex) int a = I.intValue();)- 기본 타입의 값을 Wrapper 객체로 변환하는 것을 박싱, 반대의 경우를 언박싱이라 하는데 자동 처리된다.- 스트링 리터럴은 리터럴 테이블로 관리하고, new로 생성되는 스트링은 힙메모리에 생성된다.- 일단 생성된 스트링 객체는 수정이 불가능하다.- 앞뒤 공백을 제거하는 trim, x번째 값을 리턴하는 charAt(x), 특정문자를 바꾸는 replace(“”, “”),비교하는 compareTo(), 연결하는 concat() 등 많은 메소드들이 있다.- StringBuffer는 가변 버퍼를 가져 문자열 수정이 가능하다. (초기 버퍼 크기 16으로 생성)import문 필요 에 있으며 import문이 필요하다 (import java.util.calendar;)7장- 컬렉션은 가변 크기로서 객체의 개수를 염려할 필요가 없다.- 컬렉션은 제네릭 기법으로 만들어졌다. (컬렉션의 요소는 객체만 가능하다)- 제네릭 타입의 매개변수는 한 개의 대문자를 이용한다.(E : 컬렉션의 요소를 의미, T : 타입을 의미, V : Value를 의미, K : 키를 의미)- Vector v = new Vector(); 와 같이 선언한다. ( ()에 값을 넣어 그 크기로 선언가능)(Integer 타입으로 선언하면 integer 타입만 넣을 수 있다.)- 벡터는 add(), capacity(), clear(), contains(), get(), remove(), size(), toArray(), elementAt()과 같은 메소드 사용- add()는 중간에 삽입도 가능하고 인덱스를 안 적을시 맨 끝에 추가한다. removeAllElement()는 모두 삭제- add(Integer.valueOf(100)); 과 같이 넣어야 하지만 자동 박싱이 되어 add(100)이라고 해도 잘 작동한다. (get도 마찬가지)- 컬렉션을 매개변수로 가지는 메소드도 만들 수 있다.- Vector = new Vector(); 라고 적어도 알아서 추론하여 채워준다. (var v = new Vector();도 된다)- ArrayList는 Vector와 거의 같이만 스레드간 동기화를 지원하지 않아 다수의 스레드가 동시에 접근시 데이터 훼손이 일어날수도 있다. 하지만 동기화 작업이 없어 속도는 더 빠르다.- ArrayList는 Vector와 거의 같은 메소드들을 사용한다. (capacity, removeAllElement 메소드는 없다.)- Vector, ArrayList, LinkedList와 같은 순서대로 저장된 컬랙션을 접근할 때 Iterator 인터페이스를 사용하면 편하다.- Vector v = new Vector(); Iterator it = new v.iterator(); 와 Search() 등의 메소드로 편하게 해당 기능을 사용가능하다.(모두 static 메소드이므로 Collection.sort()와 같이 접근하면 된다.)- 제네릭 클래스를 직접 만들수도 있다.- ex) public class myClass { T var; void set(T a){ var = a; } } 와 같이 만들면 된다.(그 후 선언할 때 myClass과 같이 타입 매개변수를 구체적으로 적는다.)- myClass와 같이 기본 타입은 불가 (Wrapper 타입을 적어야함)- 제네릭 클래스 내에서 제네릭 타입의 객체 생성은 허용되지 않는다. (Object 타입으로 선언하는 등의 방법 사용)- 제네릭 타입의 배열은 선언할 수 없다. (myClass[] = new myClass[10]; 는 안된다.)하지만 제네릭 타입의 배열선언은 허용 된다- 제네릭 메소드로 선언가능한데 리턴타입 앞에 선언한다. ( void func(){} )- 제네릭의 장점으로는 컴파일시 타입이 정해지므로 안전하고 런타임 충돌이 방지되고 타입캐스팅 절차가 불필요하고 ClassCastException을 방지할 수 있다.8장- FileReader를 이용하여 텍스트 파일을 읽을수 있다. (파일의 맨 끝은 ?1을 리턴한다.)- .close()를 이용하여 스트림을 닫을 수 있다.- read() 함수로 읽는데 char형 배열에 한꺼번에 읽어 받는 것도 가능하다.- 를 이용하여 “\”로 써 경로를 쓰는 방식과 /를 사용하는 방식 모두 지원한다.- FileReader는 FileNotFoundException을 발생시킬 수 있고 write, read, close와 같은 함수는 IOException을 발생시킬 수 있다.- InputStreamReader를 이용해서도 텍스트 파일을 읽을 수 있다. (바이트 스트림을 전달 받아 생성하는 방식)- 문자 형식도 같이 지정해주어야 한다. (.getEncoding() 함수로 인토딩 형식을 받을 수 있다.)- FileInputStream fin = new FileInpu으므로 다음과 같이 선언해서 사용해야한다.BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out), 5);- 스트림에는 문자 스트림과 바이트 스트림이 있는데 연결할 때 맞는 것끼리 연결해야한다.- File 클래스는 파일이나 디렉토리에 대한 정보를 제공한다.- File 객체를 생성할때는 경로를 이용하거나 경로와 파일명으로 분리하여 선언이 가능하다.- 파일의 크기를 알려주는 size() 함수, 파일명을 알려주는 getName(), 완전경로명을 알려주는 getPath(), 부모 디렉토리를 알려주는 getParent() 함수, 파일인지 디렉토리인지 알려주는 inFile, inDirectory 함수, 디렉토리 내의 파일리스트를 알려주는 listFile 함수가 있다. (파일이 있는지 검사하는 exists() 함수, 이름을 바꾸는 renameTo(), 생성하는 mkdir() 함수)- 문자 스트림을 이용하여 파일을 복사 할수도 있다. (바이트 스트림도 마찬가지)- 위처럼 하면 복사 속도가 느리티 버퍼 스트림을 이용하여 블록 단위로 빠르게 복사할 수도 있다.9장- AWT와 Swing은 자바 GUI 프로그래밍을 할 때 사용한다.- 자바 스윙을 사용하기 위해서는 import문을 사용해야한다. (import java.swing.*;)- 스윙의 프로그램은 JFrame을 상속받아 만들면 된다.- 프레임 타이틀을 정하는 setTitle(), 사이즈를 조정하는 setSize(), 창을 보일지 안보일지 설정하는 setVisible()- JFrame을 상속받은 클래스를 생성하면 스윙의 프레임 역할을 한다.- 프레임에 타이틀을 달 때 super 함수를 이용해 JFrame 생성자를 호출하거나 setTitle() 함수를 이용한다.- 스윙은 컨텐트팬에만 컴포넌트를 부착할 수 있다. (JFrame 객체를 생성시 컨텐트팬이 생성되고 getContentPane() 함수로 알아낸다.)- 컨텐트팬은 컨테이너이기 때문에 add() 함선언)
- 레퍼런스 타입 (3가지) : 배열, 클래스, 인터페이스- 레퍼런스 타입 아닌 것은 null로 초기화 불가능- 스트링은 기본 리터럴이 아니다- var 변수는 반드시 초기 값을 줘야 컴파일러가 유추해 형을 결정한다.- 상수도 반드시 초기 값을 줘야 된다. (final 키워드 사용)- Scanner는 import java.util.Scanner을 추가하고 사용해야함- next는 다음 토큰을 읽어 문자열로 저장, nextLine은 n까지 읽고난뒤 n을 빼고 리턴함- 증감연산자 계산 확실히 할 줄 알기- 조건연산자 ? 사용법 알기 ex) (a>b)?a-b:b-a, if문과의 변환 자유자재 필수- switch 문에 실수 리터럴은 안되고 문자, 문자열, 정수 리터럴만됨- 자바만의 for each문 이해하기 ex) for(String n : aa) system.out.println(n[i])- do while은 최소한 한번은 실행한다, 비교문이 뒤에 있음- 문자열 비교시 equals 함수 사용- 자바의 특별한 비정방형 배열 선언하는 법 사용법 익히기- 자바는 레퍼런수 타입 사용시 new연산자를 사용한다 ex) int num[] = new int[8];- 자바 배열 초기화 방식은 2가지가 있다. (초기 선언시 값을 넣으면 안되고 new로 해야함)- Scanner 사용후 반드시 닫아야함 ex) sc.close();- 메소드의 배열리턴도 가능 ex) int[] example(){}- 메인함수는 반드시 public static void 형이야 함- 자바의 예외처리 알아야함 (try-catch-finally), 흐름도 알아야함- 객체 지향의 특징은 다형성(같은 이름을 가진 메소드가 다른 기능을 실행하게 함), 캡슐화(외부로부터 보호), 상속성(속성을 물려받고 기능 확장) 3가지다- 객체지향의 목적은 실세계의 일을 보다 쉽게 프로그래밍 하기 위함 그 외 상속, 다형성 특징 서술하면됨- 기본 생성자는 안적으면 자동으로 만들어준다- 생성자는 리턴타입이 있으면 안되고, 메소드이다. 그리고 목적은 객체의 초기화이고 만들 때 무조건 실행된다 그리고 오버로딩이 가능하다.- 기본생성자가 아닌 생성자를 하나이상 만들면 컴파일러가 자동으로 기본생성자를 만들어 주지 않는다.- this는 객체 자신에 대한 레퍼런스를 나타낼 때 사용, 메소드의 변수명이 객체의 멤버명과 같은 경우, 메소드가 객체의 레퍼런스를 반납할 때, 어떤 곳에 객체의 레퍼런스를 전달할 때- this()는 객체 자신의 생성자를 호출할 때 사용, 반드시 생성자 첫줄에 있어야한다. 생성자에서만 사용 가능- 객체끼리의 치환은 복사하는게 아닌 그 레퍼런스를 복사하는 것, 객체도 배열로 만들 수 있음- 자바의 메소드는 반드시 클래스 내에 있어야함 (캡슐화)- 자바의 인자 전달 방식은 2가지 있음, 기본타입 전달방식(실인자값은 전달되지 않음), 레퍼런스 전달방식(객체나 배열이 복사되어 넘어가는게 아닌 레퍼런스를 넘기는 것)- 메소드 오버로딩은 매개변수의 개수나 타입이 다르고 이름이 같게 만드는 것 (리턴타입은 상관 무)- 논스태틱은 객체마다 독립적으로 별도이나 스태틱은 객체마다가 아닌 클래스당 하나 생성됨 그리고 객체를 생성하지 않아도 사용가능, 논스태틱은 사용 불가 그리고 객체를 생성해야 멤버도 생성되지만 스태틱은 처음 로딩부터 만들어져 있음, 논스태틱은 공유가 아니고 스태틱은 공유임 (공간, 시간, 공유)- 스태틱은 객체의 멤버로 접근하거나, 클래스 명으로 접근 가능- 스태틱 메소드는 논 스태틱 메소드와 필드 사용 불가, 논스태틱은 스태틱 멤버 사용가능, this도 사용불가(정해진 레퍼런스가 없기 때문에)- final로 선언된 클래스 상속이 안되고 메소드는 오버라이딩이 되지않는다.- 상속을 하면 자식클래스가 간결해짐, 멤버 중복작성 예방, 계층적 분류, 확장 용이, 클래스 작성 빠름- extends 키워드를 쓰며 부모는 슈퍼클래스 자식은 서브클래스라 부름, 다중 상속 안되며 횟수는 무제한- 접근 지정자도 그대로 씀 public(모든 클래스), protected(같은 패키지 + 상속받은 자식), private(전부 안됨), default(같은 패키지)
보안 요구사항1) confidentiality(기밀성) - 정보를 무단으로 보는 것을 막는 것 (평문을 암호화해서 볼수없게 하는 것, 하나의 방편)2) Integrity(무결성) - 정보를 무단으로 쓰는 것을 막는 것3) Availability(가용성) - 필요할 때 서비스를 제공할 수 있는 것 (DOS 공격의 출현으로 중요하게 됨)보안 수명 주기1) 보안 정책 정의2) 정책을 시행하기위한 메커니즘 선택3) 메커니즘과 정책이 안전하다는 보장 제공접근 제어를 할 때 Authentication과 Authorization이 결합되어 이용됨Authentication는 누구인지 허가받은 사람인지 권한은 어떠한지 확인하는 인증과정Authorization는 사용자의 행동이 허가받은 것인지 등을 판단하고 권한을 제어하는 것* Cryptography ? 암호를 어떻게 만들지* Cryptanalysis ? 암호를 어떻게 해독할지* Cryptology ? cryptography와 cryptanalysis를 모두 포함하는 것* Crypto ? 위의 것들을 모두 포함하는 것plaintext(평문) -> encryption(암호화) -> ciphertext(암호문)* 키는 암호시스템을 설정할 때 사용횐다.* symemetric key는 암호화와 복호화에 사용되는 키가 같은 암호시스템을 의미한다.* public key는 암호화와 복호화에 사용되는 키가 다른 암호시스템을 의미한다.* crypto의 기본 가정은 공격자가 암호 시스템의 동작과정을 모두 알고 있고 키만 모른다는 가정이다.커크호프의 원칙란 키를 제외한 암호 알고리즘이 모두 알려지더라도 암호 체계는 안전해야한다는 것을 의미한다. (암호 알고리즘의 보안은 유지될 수 없으며 암호 알고리즘은 비밀이 아니며 키만 비밀이다.)* 시저 사이퍼(shift by 3) : 키가 평문에서 왼쪽으로 3칸만큼 이동한 것ABCDEFGHIJKLMNOPQRSTUVWXYZDEFGHIJKLMNOPQRSTUVWXYZABC* shitf by n 알고리즘은 시저 사이퍼와 같은 방식으로 n만큼 shift 시키는 것인데경우의 수가 26가지라 잘 쓰이지 않음 (복호화는 모두 시도해보는 방식으로 가능)* 위의 shift 방식에서 permutation을 할 경우 조금 더 경우의 수가 늘어난다.(경우의 수가 커서 모두 시도해보는 방식으로는 복호화가 힘듦, 26가지 -> 26!가지)* 위의 permutation 방식을 모두 시도하긴 힘드니 일반적인 문장에서 알파벳의 빈도수를 파악해 그것을이용하여 조금 더 빠르게 복호화를 할 수 있음 (통계 정보를 유효하게 사용 가능)* 암호화 알고리즘의 보안성은 일반적으로 키의 길이로 판단한다.* 암호 알고리즘에 shortcut 공격방법이 있을 경우 안전하지 않다.* Double Transposition방식은 행렬 섞기이고 키가 행렬의 재배치, 형태 정보가 된다.* shift by n 류를 공격하는 방식은 무차별 대입공격, 영어의 통계 정보를 활용하는 방식 등이 있다.)* one-time pad 암호화 : 평문과 키를 xor 연산을 하여 암호문을 만드는 방식의 알고리즘(키의 길이는 평문의 길이만큼 필요하며 2진수 표현으로 바꿔줄 코드 규약이 필요하다.)* one-time pad를 복호화 하기 위해서는 암호문과 키가 필요하며 암호문에 키를 한번 더 xor연산을 시행하여 복호화 할 수 있다.* one-time pad는 키를 안전하게 공유할 공간이 필요하며 랜덤이고 한번 사용후 pad를 바꾸어야한다.pad는 송신자와 수신자만 알고 있어야하며 사전에 pad가 공유되어야 한다. 키와 메시지의 크기는 동일하고 무결성의 용도로는 적합하지 않다. (Project VENONA로 실제로 쓰인적이 있음)* codebook은 말그대로 코드가 있는 책이며 평문마다 코드값이 있다.(동일한 키가 반복적으로 사용되면 안된다.)* zimmerman telegram (code-book)project VENONA (one-time pad)election of 1876 (code-book + transposition)* 정보보호에는 중요한 컨셉 2가지가 있다. confusion과 diffusion이다.confusion : 원문의 내용을 짐작하기 어렵게 하는 것 (연관 관계를 숨기는 방향)diffusion : 알고리즘의 패턴을 추론하기 어렵게 만들어야 한다. (통계정보를 퍼트려 보안성 강화)* 암호문 공격 : 알고리즘 정보, 암호문 샘플이 있음방법) 추측후 체크, 빈도수 분석목적) 암호문으로 평문을 찾는 것알려진 평문 공격 : 평문과 그에 대응하는 암호문 샘플이 있음목적) 평문과 그에 대응되는 암호문을 복구하는 것선택된 평문 공격(CPA) : 공격자가 고른 평문과 그에 대응된 암호문이 필요방법) 잠깐 암호 시스템에 접근하여 가로챈 평문을 시스템에 넣고 암호문을 얻어냄)목적) 평문과 암호문을 얻는 것한계) 시스템에 제한적으로 접근할 수 있어야 하므로 사실상 일반인은 불가능선택된 암호문 공격(CCA) : 공격자가 고른 암호문과 그에 대응된 평문이 필요방법) 암호 시스템에 제한적으로 접근하여 암호문을 넣어 평문을 얻어냄목적) 평문과 암호문을 얻는 것(암호문 공격보다 아랫것들은 더 많은 정보를 가지고 있고 알려진 평문은 아무거나 이지만 선택된 평문공격은 공격자가 선정한 것이다.)* 암호 시스템에 제한적인 접근과 공격자가 고른 평문과 그에 대응된 암호문으로 실시 (lunchtime attack)* Lunchtime attack (CCA1) : 미리 준비해 놓은 n개의 암호문을 보내 n개의 평문을 얻고자하는 공격* adaptive chosen-cipertext(CCA2) : 미리 준비해 놓은 n개의 암호문을 보내 n개의 평문을 얻은 다음분석하여 다른 암호문을 보내는 것을 반복하여 adaptive하게 고름* CCA1과 다르게 CCA2는 분석 과정이 있어 adaptive하다.* Symmetric key crypto에는 2가지 방식이 있음1) Stream cipher2) Block cipher* Stream cipher ? A5/1, RC4와 같은 알고리즘이 있음n 비트의 키를 이용하여 긴 키 스트림을 생성한뒤 메시지와 XOR연산을 하여 사용* A5/1 ? hw으로 구현되는 스트림암호 사용키 스트림이 비트 단위, 64비트의 키를 사용하고 19, 22, 23으로 나눠 3개의Linear feedback shift register를 만들어 사용, 키는 레지스터의 초기 채우기용으로 사용하나이 keystream 만드는 과정m = maj(x[8], y[10], z[10]) (maj 함수는 더많은 숫자를 뱉음 (1,1,0) 이면 1을 리턴)x.8과 m의 값이 같으면 t값을 구함 (t = x.13 XOR x.16 XOR x.17 XOR x.18) 하고모두 오른쪽으로 밀고 x[0]을 t로 넣음y.10과 m의 값이 같으면 t값을 구함 (t = y.20 XOR y.21)모두 오른쪽으로 밀고 y[0]을 t로 넣음z.10과 m의 값이 같으면 t값을 구함 (t = z.7 XOR z.20 XOR z.21 XOR z.22)모두 오른쪽으로 밀고 z[0]을 t로 넣음Key Stream bit = x.18 XOR y.21 XOR z.22 하면 하나의 keystream이 생성된 것임, 필요한만큼 반복* RC4 ? sw으로 구현하기에 최적화키 스트림이 바이트 단위, 0부터 255바이트 사이의 랜덤한 길이의 key를 사용, 처음 만든 키는 패기한다.1) lookup table을 초기화S[] : lookup tablekey[] : 공유키0부터 255까지 반복문을 통해 s[i]=i로 key[i] = key[i mod N]으로 초기화(키 길이가 128이라면 Key[]가 키*2로 채워지게됨, 똑같은게 있다는 말)j=0, 반복문을 통해 0부터 255까지 j = (j + s[i] + k[i]) mod 256를 해주고 swap(s[i], s[j]를 해준다.I=j=02) keystream을 생성i = (i+1) mod 256j = (j + s[i]) mod 256swap(s[i],s[j])t = (s[i] + s[j]) mod 256keystreamByte = s[t]위의 과정을 통해 키스트림이 생성됨스트림 사이퍼는 과거에나 인기있었고 지금은 거의 사장되어간다.