본문 바로가기

프로그래밍/면접기록

[알고리즘,용어] 신입 면접 질문

DAO,DTO의 차이란 무엇인가?

더보기

DAO (Data Access Object) : Database의 data에 접근하기 위한 객체이다. Database에 접근하여 비즈니스 로직을 처리한다.

DTO (Data Transfer Object) : 계층간 데이터 교환을 하기위해 사용되는 객체로, DTO는 로직을 가지지않는 순수한 데이터 객체(Getter & Setter)를 의미한다.

 

++

VO(Value Object) : 오브젝트로서 값을 위해서 사용되고 (Read-only) 사용하는 도중에 변경이 불가능하며 오직 읽기만이 가능하다.

DTO와 유사하지만 DTO는 setter를 가지고 있어 값이 변할수 있다.

 

댓글속에 대댓글로 쭉 댓글들이 달린다는 가정하에 이를 구사하는 알고리즘은 어떤것이 있나?

더보기

 

재귀함수 : 컴퓨터 과학에서 재귀란 자신을 정의할때 자기자신을 재 참조하는 방법을 의미한다.

(Recursion Function)이라 부르며 말 그대로 함수에서 자기자신을 다시 호출하여 작업을 수행하는 방식이다.

특정분기까지 자기 자신을 계속해서 호출하는데, 주로 반복문을 구현할때 사용한다.

 

이런 재귀함수의 대표적인 사용예제는 팩토리얼이다.

 

inf factorial(int n) {
 if (n == 1) {
 	return 1;
 }
 return n * factorial(n-1);
}
//인자로 5를 넣는다면 5 * 4 * 3 * 2 * 1 이 출력

 

 

5를 인자로 사용한 경우 해당코드가 수행될때의 콜스택

함수를 호출할때마다 콜스택에 함수의 매개변수, 지역변수, 반환주소 값들이 모두 저장되게 된다. factorial(5)를 호출하게되면 반환타입 부분에서 5 * factorial(5-1) 이 수행되며 factorial(4)를 호출하고 반환을 기다린다.

이러한 흐름으로 factorial(4) , factorial(3) , factorial(2) ,factorial(1) 까지 콜스택에 쌓이게되고, factorial(1)에서 if (n == 1) 분기에 걸리면서 해당 콜스택이 하나씩 수행되며 사라지는 형태이다.

 

 

이러한 재귀 함수 사용에는 스택 오버플로우를 주의해야한다. 만약 if ( n== 1) 분기가 빠지게 된다면 어떻게 될까?

int factorial(int n){
 return n * factorial(n-1);
}

n이 1일 경우 멈추었던 해당 함수는 이제 멈추지않고 -1, -2, -3, -n까지 무한대로 실행하게되며 메모리의 한계까지 다가가게 되며 스택오버플로우가 발생하게 된다. >> 자바에서 해당 코드를 수행한다면 콘솔창에서는 StackOverflowError를 확인할수 있다.

 

이러한 재귀함수의 장단점에 대하여 알아보자.

장점

- 변수를 여러개 만들 필요가 없다 

현재 상태를 저장해야하는 경우 tmp 변수를 만들기보다 상태 메서드를 재귀적으로 호출하면서 변경된 상태를 전달함으로써 변수의 수를 줄일수 있다.

-  while문이나 for 문 같은 반복문을 사용하지 않아도 되기에 코드가 간결해진다.

단점

- 지속적으로 함수를 호출하게 되면서 지역변수,매개변수, 반환값을 모두 process stack에 저장하게 된다.

그리고 이러한 과정은 선언한 변수의 값만 사용하는 반복문에 비해 메모리를 더 많이 사용하게 되고, 속도 저하로 이어지게 된다.

- 함수 호출 >> 복귀를 위한 컨텍스트 스위칭 비용이 발생하게 된다.

 

재귀함수의 단점 해결 방법 

꼬리 재귀 (tail call recursion) 사용

재귀 함수의 가장 큰 문제가 자기 자신을 호출한 뒤 결과를 기다리면서 생기는 콜스택의 부하로 인한 메모리 낭비였는데

꼬리 재귀라는 개념을 이용하여 재귀 호출이 끝나는 시점에서 아무일도 하지않고 바로 결과를 반환하도록 하는 방법으로 함수의 상태 유지 및 추가 연산을 하지 않기에 스택 오버플로우 현상을 해결할 수 있다.

//Basic Recursion
int factorial(int n){
 if(n == 1) {
  return 1;
 }
 return n * factorial(n-1);
}

//Tail Recursion
int factorial(int n, int total){
 if(n == 1) {
  return 1;
 }
 return factorial(n-1, n * total);
}

 꼬리 재귀의 핵심은 반환부에 연산이 없어야 한다는것이다. 

이렇게 반환부에 연산이 없도록 구현을 한다면 컴파일러는 꼬리 재귀 최적화를 지원하여 자체적으로 재귀함수를 해석해서 반복문으로 변경하여 실행한다.

 

 

 

 

 

참조 : https://catsbi.oopy.io/dbcc8c79-4600-4655-b2e2-b76eb7309e60

 

재귀함수의 장점과 단점 그리고 해결책

재귀(Recursion)란?

catsbi.oopy.io

http://tcpschool.com/c/c_memory_stackframe

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

 

빅데이터란 무엇인가?

더보기

직관적인 느낌은 "아주아주 많고 방대한 데이터"를 의미  -> 왜 빅데이터가 나왔을까?

- 기존의 데이터 처리방법으로는 감당하기 힘들 정도의 방대한 분량의 데이터

- 데이터 하나하나가 모여 의미와 가치가 있는 단위로 묶인 데이터 덩어리

- "빅데이터 프로세싱" 을 포함하여 일컫는 말

- 대용량 데이터가 뭉친 형태를 의미

 

빅데이터라 부를수 있는 크기는?

수십 TB(테라바이트) ~ PB(페타바이트) 

 

생활속의 빅데이터

- 역사적 데이터를 기반으로 한 과거 기상 데이터는 향후 몇 십년 내 지진이나 화산 폭발과 같은 예측에 도움을 준다.

- 심야버스(올빼미) 노선도나 심야 로켓배송, 카드사나 보험사의 고객 맞춤형 상품 출시

 

빅데이터의 양면성

정치, 사회, 경제, 과학 기술 등 전 영역에 걸쳐 사회와 인류에게 가치 있는 정보를 제공할 가능성을 제시하며 그 중요성이 주목받고있다. 하지만 빅데이터의 문제점은 바로 사생활 침해와 보안 측면에도 자리하고있다. 그렇기에 빅데이터를 수집,분석 할때 모은 데이터가 보안문제로 유출된다면 , 이 역시 모든 사람의 정보가 노출되는것이 때문에 큰 문제가 될 수 있다.

 

빅데이터의 특징

3V : 규모(Volume) , 다양성(Variety), 속도 (Velocity)

5V: 규모 (Volume), 다양성 (Variety), 속도(Velocity) + 정확성 (Veracity), 가치(Value)

 

규모

- 기술, ICT 발전 > 디지털 정보량 급증 > 제타바이트 시대 진입

다양성

- 텍스트 외 음성, 영상 등의 비정형 데이터 종류 증가

속도

- IoT, 실시간 정보 증가 > 데이터 생성 및 이동 증가 > 실시간 데이터 처리 분석 위한 속도의 중요성

정확성

- 방대한 데이터의 질이 데이터 분석 정확도에 영향을 미침

가치 

- 빅데이터가 추구하는 것이 바로 가치, 빅데이터 분석 > 통찰력 제공 > 기업의 현실문제 해결에 도움

 

 

참조 : https://modulabs.co.kr/blog/big-data/