시작부터 내가 정말 컴알못임을 알려주니까 글로 쓸 때 부끄럽기는 하지만 그래도 일단 오늘 알게된 내용을 쓴다. 당장 하둡을 설치해봐야 하는데 어디에 설치해야 하는지 몰라서 대충 찾아봤다.

 

1. 배포판이라는 건 어떤 회사같은데서 정기적/비정기적으로 업데이트해서 배포해주는 거다(지금은 시간이 없어서 대충 이렇게만 이해하고 넘어간다.)

2. 하둡은 리눅스 및 다양한 유닉스 계열에 설치하는데(필수인지 권장인지 모르겠다), 리눅스의 배포판에는 CentOs, 레드햇, 우분투 등이 있다. CentOS는 레드햇의 무료판같은 거다.

3. 하둡도 배포판이 있는데 Cloudera, HotonWorks 등이 있다. 현재는 Cloudera와 HotonWorks가 합쳐졌다.

4. 결론적으로, 하둡은 리눅스 환경에서 돌려야 하니까 공부용으로 사용하려는 나는 무료로 쓸수 있는 우분투나 CentOS를 내 윈도우 피씨에 가상환경으로 깔고 거기에 하둡을 설치해서 쓰면된다.

 

+ 가상 OS를 돌리기 위해 VM Ware 무료판을 받아서 설치할 생각인데, 도커로 해도 된다고 들었다. 근데 도커가 뭔지 아직 제대로 모른다. 찾아봐야한다.

 컴퓨터공학을 전공하지 않았고 IT일을 하리라고는 25년동안 한번도 생각해보지 않았다. 25살에 처음 취직한 회사가 맘에 안들어 다른일을 알아보게 되었고 26살에 국비교육과정으로 6개월간 IT교육을 받았다. 그리고 운이 좋았던건지 취직노력을 열심히 해서인건지 27살에 SI업체에 취직했다. 그리고 지금은 회사에서 일을 위해 교육받거나 혹은 스스로 공부하고 있다. 윈도우 설치도 할줄 몰랐던 내가 갑자기 윈도우도 아닌 운영체제를 보게 되고, 새로운 환경에 하둡이라는 걸 구축해봐야하는 날이 오게 된게, 순식간에 벌어진 일 같다. 갑자기 내 상황을 보니 웃기기도 하고 앞으로 내가 하고있을 일들을 생각해보니 조금은 어이가없기도 해서 웃긴 이 일들을 기록해보기로 했다. 그리고 사실 기록하는 일의 가장 큰 목적은 컴알못인 내가 새로 알게 된 것을 기록해두고 까먹지 않도록 노력하려는 것이다. 가끔 내가 새로 알게된 사실들을 정리해보면, 컴퓨터를 전공하거나 IT업계에서 일하는 사람들의 눈에는 어떻게 저런 것도 모르는 사람이 작지도 않은 SI업체에서 일을 하고 있나 싶은 생각이 들 것같다. 그래도 뭐, 나같은 사람도 먹고 살려면 이렇게 한번 해봐야지.

 

 

자바라는 걸 처음 배울때는 String밖에 몰랐다. 그래서 +로 여러개의 string을 붙이곤 했다. 그러다가 누군가가 StringBuffer라는 걸 쓰는 걸 처음 봤을 때는 엄청나게 신기했다. 그래도 교육들을 때는 바쁘고 정신없어서 계속 String만 써왔는데, 알고리즘 문제를 풀다보니 성능(시간과 메모리)에 신경을 안쓸 수 가 없게 된 터라 제대로 검색해서 찾아보게 되었다. 


1. String

  String 내용이 조금이라도 바뀌거나 다른 String과 결합하게 되면 객체를 만든다. 기존 객체는 garbage collection의 대상이 된다. 새로운 객체에 새 주로를 주므로 hash code도 변한다. 이러한 과정때문에 StringBuffer와 비교해서, 시간이 오래 걸린다.


2. StringBuffer

 StringBuffer는 초기 크기를 지정해줄 수 있다. 그리고 StringBuffer에 저장하는 크기가 초과되면 자동으로 처음에 지정한 크기만큼 buffer를 늘려준다. StringBuffer는 말그래도 버퍼에서 내용물을 추가하고 삭제하기 때문에 주소값이 그대로 이고 새로운 객체를 생성하지 않는다.


3. StringBuilder 

 String으로 문자열을 +를 활용해 합치는 경우 정확히 어느 버전까지인지 모르겠는데요. 매번 String 인스턴스를 생성하는 방식이였어요. 그래서 성능상의 이슈가 많았죠. 이런 성능 이슈를 개선하기 위해 JDK 1.5 (@changhwa.oh 설명에 따르면) 버전 이후에는 컴파일 단계에서 StringBuilder로 컴파일 되도록 변경되었어요. 그래서 JDK 1.5 이후부터는 +를 활용해도 성능상에 큰 이슈는 없습니다.


StringBuffer, StringBuilder는 동기화 지원 여부입니다. 두 클래스가 제공하는 메소드는 같아요. 단, 메소드를 보면 StringBuffer는 각 메소드 별로 synchronized keyword가 존재하죠. 즉, 멀티 쓰레드 상태에서 동기화를 지원한다는 것이 다릅니다.

Slipp에서 위와 같은 글을 봤다.

일단은 여기까지만 정리한다.

'WEB > java' 카테고리의 다른 글

OR, AND 논리연산자  (0) 2017.12.27
[구글링] stack & queue  (0) 2017.12.20
[NOTE] Field, method in static method  (0) 2017.12.19
[생활코딩]제네릭  (0) 2017.12.08
[자바의 정석] Collection Framework  (0) 2017.12.08

논리연산자  (의미 : 또는)

a | b

a || b


무슨 차이가 있을까?

둘 다 같은 의미이다. 

하지만 (차이점) a|b 는 a, b의 값을 평가한다. 즉, a 가 참이라도 b 를 검사한다. 

a||b 의 경우 a 가 참이면 b를 검사하지 않는다. 즉 b 가 단항연산자(++ ,-- 등) 이 있어 검사할 경우와 그렇지 않을 경우에 결과에 차이가 있다. 



마찬가지로 &, && 에도 비슷하다. 


추가로 

&, |  는 논리연산자로만 사용하는 것이라 아니라 비트연산자로도 사용한다. 

a&b : 비트단위의 논리곱

a|b : 비트단위의 논리합

'WEB > java' 카테고리의 다른 글

String, StringBuffer, StringBuiler 차이  (0) 2017.12.28
[구글링] stack & queue  (0) 2017.12.20
[NOTE] Field, method in static method  (0) 2017.12.19
[생활코딩]제네릭  (0) 2017.12.08
[자바의 정석] Collection Framework  (0) 2017.12.08

피보나치 수열을 구하는 방법을 예로 들어 몇가지 패턴을 정리해본다.


1. Recursion Function


int fib(int n){

if(n==1 || n==2){

return 1;

}else{

return fib(n-1) + fib(n-2);

}

}


재귀 함수를 이용하여 값을 구할 경우에는 top-down 방식으로 진행된다. 이때 각 tree모양으로 함수들이 뻗쳐나가기 때문에 중복되어 연산되는 경우가 급격히 늘어난다.


2. Memoization 


Cache 배열에 계산된 값을 버리지 않고 저장하므로 같은 fib(n)을 중복으로 계산하는 일이 없어진다. '캐싱한다'고 한다. 


int fib(int n){

if(n==1 || n==2){

return 1;

}else if(cache[n]>-1){

return cache[n];

}else{

cache[n] = fib(n-1) + fib(n-2);

return cache[n];

}

}


메모이제이션은 top-down방식이고 실제 필요한 sub problem을 푼다. 동적계획법의 일부이다.


3. Dynamic Programming


int fib(int n){

array[1] = array[2] = 1;

for(int i=3; i<=n; i++){

array[n] = array[n-1] + array[n-2];

}

return array[n];

}


이처럼 가장 기본적인 값으로 특정한 값을 계산하려는 것을 bottom-up 방식이라고 한다. 동적계획법의 좁은 의미 가운데 하나이다. 재귀에 수반되는 overhead가 없는 것이 특징이다.



* 피보나치 수열외에,  이항계수 문제도 nCk = n-1Ck-1 + n-1Ck 의 성질을 이용하여 위의 방법들과 마찬가지로 해결할 수 있다.


 순환(recursion)이란 어떤 알고리즘이나 함수가 자기 자신을 호출하여 문제를 해결하는 프로그래밍 기법이다. 

 (재귀함수)

 

 예를 들어, 정수의 팩토리얼이 있다.


 n!  =     1 (n=0),     n*(n-1)!  (n>=1)


 C언어 코드는 다음과 같다.

 int factorial(int n)

{

if(n<=1) return(1);

else return (n* factorial (n-1) );


 기본적으로 반복과 순환은 그 표현 능력이 같으며 많은 경우 , 특히 순환 호출이 끝에서 이루어지는 순환 알고리즘의 경우, 반복 알고리즘으로 바꾸어 쓸 수 있다. 그러나 순환은 어떤 문제에서는 반복에 비해 알고리즘을 훨신 명확하고 간결하게 나타낼 수 있다는 장점이 있다. 

 그렇다면 순환과 반복 중에서 어떤 형태가 바람직할까? 원래의 정의가 순환적으로 되어 있는 경우, 대개 순환 형태의 코드가 더 이해하기 쉽다. 그러나 순환적인 코드의 약점은 수행시간이다. 그러나 적지 않은 경우에 순환을 사용하지 않으면 도저히 프로그램을 작성할 수 없는 경우가 종종 있다. 

 순환의 원리는 분할 정복(divide and conquer)이다. 순환은 알고리즘의 정의가 순환적으로 되어 있는 경우에 유리하다. 예를 들어 팩토리얼 함수 계산, 피보나치 수열, 이항계수 계산, 각종 이진 트리 알고리ㅈ즘, 이진 탐색, 하노이 탑 문제들은 순환 알고리즘을 쓰는 것이 자연스러운 알고리즘들이다.


  • 거듭 제곱 계산
  • 피보나치 수열의 계산
  • 하노이탑 문제


 대부분의 컴퓨터 프로그램은 자료(data)를 처리하고 있고 이들 자료는 자료구조(data structure)를 사용하여 표현되고 저장된다. 또한 주어진 문제를 처리하는 절차가 필요하다. 이것은 알고리즘(algorithm)이라고 불린다. 따라서 일반적인 프로그램은 논리적으로 따져보면 자료구조와 알고리즘으로 구성되어 있다고 할 수 있다.  

 프로그램 = 자료 구조 + 알고리즘 

 엄밀하게 이야기하면 알고리즘이란 문제와 컴퓨터가 주어진 상태에서 문제를 해결하는 방법을 정밀하게 장치가 이해할 수 있는 언어로 기술한 것이다. 따라서 알고리즘은 특정한 일을 수행하는 명령어들의 집합이다.

 

 추상 데이터 타입이란 새로운 데이터 타입을 추상적으로 정의한 것이다. 자료구조(data structure)는 이러한 추상 데이터 타입을 프로그래밍 언어로 구현한것이라 할 수 있다.


알고리즘의 성능 분석 : 시간 복잡도 함수, 공간 복잡도 함수

1. Stack

마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO(Last In First Out)구조

순차적 데이터 추가/삭제하는 ArrayList적함

사용 예: 수식계산수식괄호검사, undo/redo, 뒤로/앞으로(웹브라우져)


Stack st = new Stack<>();


pop(); push(); peek(); empty();


2. Queue

처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO구조

데이터의 추가/삭제가 편한 LinkedList적합

사용 예 : 최근 사용문서, 인쇄작업대기목록, 버퍼(buffer)


Queue q = new LinkedList();  LinkedList implements Queue?????


peek();     return null when queue is empty.

poll();       꺼내온다. 비어있으면 null

revmove(); 꺼내온다. 비어있으면 예외발생

offer();      저장한다. 성공하면 true, 실패하면 false.

isEmpty();


'WEB > java' 카테고리의 다른 글

String, StringBuffer, StringBuiler 차이  (0) 2017.12.28
OR, AND 논리연산자  (0) 2017.12.27
[NOTE] Field, method in static method  (0) 2017.12.19
[생활코딩]제네릭  (0) 2017.12.08
[자바의 정석] Collection Framework  (0) 2017.12.08

+ Recent posts