DAY09 —호눅스와 알고리즘
JUnit TEST
Integration TEST
하나의 Method에는 한가지 기능을 포함하고 있어야 한다.
그리고 일반적으로 재활용이 가능하거나 반복되면 Method로 분리한다.
분리하지 않으면 중복코드가 발생되기 때문이다.
반복되는 코드의 문제점은 유지보수하기 힘듬(여기고치고 저기고치고)
TDD는 테스트를 먼저 작성하고 코드를 작성하는 것.
단점 — 시간이 많이 걸린다, 코드의 생산성이 많이 떨어진다. TDD는 실제로는 찬반양론이 많음.
하지만 유닛테스트는 선택이 아닌 필수다.
객체지향
커다란프로그램, 복잡한 프로그램을 짤수있게 해주는 것
프로그램과 프로세스
프로그램 : 특정 목적을 위해명령어의 집합(하드디스크에 저장됨)
프로세스 : 메모리에 프로그램이 올라가서 돌아가는 것(메모리에서 동작됨)
하나의 CPU에는 하나의 프로세스만 돌아갈 수 있음.
자바 컴파일 파일(class)을 생성하면 바이트 파일이 생성된다.(C와 비교했을때 기계어가 적게 포함되어 있다.) 그리고 자바 클래스파일은 JVM에서 실행된다.
JVM때문에 OS에 종속되지 않고 프로그램을 만들 수 있다.
가상메모리?
32비트 시스템에서 프로세스 생성시 4기가 바이트의 메모리를 할당 받을 수 있는데, 4기가만으론 프로세스를 감당하기에 턱없이 부족하다. 그래서 OS에서는 램과 하드디스크를 하나로 묶어 가상메모리로 관리한다.
메모리영역을 두가지로 나눌수 있다.
- 컴파일시 크기가 고정되는 code, data, bss
- 실행시 메모리가 할당되었다가 반납되는 heap, stack
heap영역
프로그래머가 자율적으로 메모리 크기를 할당할 수 있는 영역. 함수로 할당된 영역을 반납해줘야 하므로 동적할당 영역에 속함
stack영역
stack영역은 지역변수가 할당되는 영역. 함수가 호출되었을때 실행되었다가 종료시 사라짐
알고리즘과 복잡도
복잡도분석복잡도(complexity) 분석
왜? 성능분석을 위해 사용되어 진다.
복잡도에는 공간복잡도(얼마나 적은 메모리와 디스크)와 시간복잡도(얼마나 빨리)가 있음
asymptotic notaion(점근 표기법)
알고리즘 복잡도를 단순히 표현하기 위해 사용(Bio-O notation사용)
g(x) = 성능상한선(최악의 경우)
느려졌을때 왜 느려졌는지를 알아내야함
$$ f(x) = O(g(x)) $$
or if and only if there exist constants N and C such that
$$ |f(x)| \le C|g(x)|\ for\ all\ x > N $$

Binary Search(이진탐색)
정렬되어 있을 경우만 사용가능. 1/2씩 나누어서 검색하는 것
어떠한 자료구조를 사용할꺼냐는 복잡도를 생각해서 결정해야함
JCF(Java Collection Framework)
Collection 객체를 묶어서 표현하는 객체
Class = state + behavior
ArrayList
- 배열을 대체할 수 있는 콜렉션 객체
- 동적으로 크기가 확장된다.
- 인덱스를 활용 가능
HashMap
- key와 value 쌍을 저장
- key를 이용해서 value를 검색
- key는 중복될 수 없음
Set
- 값을 저장
- 값이 중복되지 않음
- Iterator 사용 가능
상속은 언제?
남이 만들어 논 클래스를 내 마음대로 또는 비슷한 클래스 두개를 만들때 공통된 요소들을 묶기 위해서 코드중복을 피하기 위해서 사용된다.
abstract class
객체를 만들지 못하는 클래스. 기능을 제한하기 위해서 사용함
