티스토리 뷰
이틀간 재귀에 대한 학습을 했다.
재귀란 문제를 동일한 구조의 더 작은 문제로 나눌 수 있고, 작은 문제를 해결함으로써 전체 문제를 해결하는 방법이다.
반복문이 있는데 굳이 재귀를..?
재귀 함수의 장단점과 조건을 알아보면 된다.
장점
- 반복문의 중첩을 제거하므로 코드가 간결해지고 수정이 용이해진다.
- 변수를 여러개 사용할 필요가 없다.
단점
- 코드의 흐름을 직관적으로 파악하기 어렵다.
- 반복하여 메서드를 호출할 때 데이터가 stack에 쌓이므로 더욱 많은 메모리가 쓰인다.
- 메서드가 종료된 이후 복귀를 위한 컨텍스트 스위칭 비용이 발생하게 된다.
조건
- 문제의 크기를 점점 작은 단위로 쪼갤 수 있어야 한다. ex) [1, 2, 3] -> 1 [2, 3] -> 1 2 [3]
- 호출이 종료되는 시점(Base case)이 존재해야 한다.
실제로는 재귀를 쓰는 경우가 많지는 않고, 특별한 케이스이거나 알고리즘에 많이 쓰인다고 한다. ( + 코딩 테스트)
재귀의 동작
팩토리얼을 구현한다고 했을 때 ( 단편적인 구조 )
method ( int a ) { // 5라고 가정했을 때
if ( a <= 1 ) return 1 ; // a가 1이 되는 순간 재귀가 종료된다. (종료 조건)
return a * method ( int a-1) ; // 5 * method(4) → method(4) 호출
} // 4 * method(3) → method(3) 호출
// 3 * method(2) → method(2) 호출
// 2 * method(1) → method(1) 호출
// a → 1이 되어서 재귀가 종료됨
// 계산은 역순으로 된다고 생각 ( 1*2*3*4*5 = 120 ) ;
JSON
다른 프로그램과 데이터를 주고받을 때 사용한다. (데이터 교환 포맷)
코딩도 적게 필요하고, 처리 속도가 빠른 경량 언어이기 때문에 많이 애용한다고 한다.
직렬화 과정을 포함해야 한다.
직렬화란, 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부에서도 사용할 수 있도록
바이트 형태로 데이터 변환하는 기술 + 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)이다.
JSON을 이용한 과제를 진행했다.
메서드를 구현하는데, 입력된 값이 String, Integer, Boolean, Object [](배열), HashMap(해쉬 맵) 일 때
리턴 값을 어떻게 작성해야 데이터를 JSON으로 변환할 때 정상적으로 값을 받을 수 있을 지 구성하는 것이었다.
String, Integer, Boolean은 메서드가 String으로 리턴 값을 받고 있고 Object타입을 인자로 받고 있었기 때문에
Object타입이 갖고 있는 toString() 메서드를 이용하여 리턴 값을 String으로 변환해주면 쉽게 해결이 되었다.
배열과 해쉬 맵 안 에는 또 다른 배열과 해쉬 맵이 존재할 수 있고, 그러한 중첩된 존재가 몇 개나 있을지 알 수 없으며
반복문을 사용하기는 역부족이기 때문에, 재귀를 사용해야 했다.
배열은 list를 사용해 메서드를 계속해서 호출하면서 재귀하였고,
해쉬 맵은 for-each문을 사용했고, key와 value 두 개의 값이 존재하기 때문에 메서드를 각각 두 번 호출해주는 방식을
이용했다.
오늘의 일기
이틀간 페어님과 함께 학습을 진행했다.
문제는 물론 과제 또한 페어님에게 너무 많은 도움을 받아서 (거의 1대 1 강의 수준...)
압도적 감사를 드리고 왔다.
혼자 이해하기에는 생소한 개념이었기 때문에 아마 이틀은 족히 더 걸리지 않았을까 싶은데
재귀의 단편적인 구조는 파악했기 때문에 그나마 다행이라고 생각하고,
하나부터 열까지 다 알려주신 페어님에게 다시 한번 감사드리고 싶다.
'SEB_BE_41' 카테고리의 다른 글
| 09.26 스물 여섯 번째 수업 (tree, graph) (0) | 2022.09.27 |
|---|---|
| 09.22 ~ 23 스물 네, 스물 다섯 번째 수업 (stack, queue) (0) | 2022.09.24 |
| 09.19 스무, 스물한 번째 수업 (섹션1 회고) (1) | 2022.09.19 |
| 09.15 ~ 16 열여덟, 열아홉 번째 수업(람다, 스트림, 스레드) (2) | 2022.09.16 |
| 09.13 ~ 14 열여섯, 열일곱 번째 수업(컬렉션) (0) | 2022.09.15 |