코드스테이츠 - 3회차 백엔드 부트캠프/Section 2
2022.09.20 화 - 재귀
곰돌이볼
2022. 9. 20. 16:53
📄 학습내용
재귀함수
- 재귀(recursive) : 문제를 작은 문제로 나누고 이 작은 문제를 해결을 통해서 문제를 해결하는 방식
- 재귀함수 : 자기 자신을 호출하는 메서드
- 장점
- 코드 간결 및 수정 용이
- 변수 사용 횟수 감소
- 단점
- 직관적인 코드 흐름 파악이 어려움
- proccess stack에 지역변수, 매개변수, 반환값 저장 → 많은 메모리 사용
- 복귀할 때 컨텍스트 스위치 비용 발생
- 사용하는 경우
- 작은 문제로 나눌 수 있는 경우
- 중첩된 반복문이 많거나 중첩 횟수 예측이 어려운 경우
- 변경 가능 상태(mutable state)를 제거해서 오류 발생 가능성을 줄이는 경우
- 모든 재귀 함수 → 반복문 표현 가능
- 장점
재귀함수 작성
- 재귀함수의 입출력 정의
- 재귀함수 : 입력 → 출력
- 기준 설정 및 문제 분해하기
- 기준 : 입력값이나 문제의 순서와 크기
- 문제 분해하기
- 더 이상 분해 가능한 경우와 아닌 경우
- 재귀의 기초(Base Case)
- 종료 조건 구현(더 이상 분해되지 않는 경우)
- 나머지 경우의 수(Recursive Case)
- 재귀의 기초 이외의 경우의 수 구현
- 코드 구현
객체지향프로그래밍 설계원칙(SOLID)
- 단일 책임 원칙(SRP, Single Responsibility Principle)
하나의 모듈은 하나의 책임만을 가진다. - 개방 폐쇄 원칙(OCP, Open-Closed Principle)
확장에 열려 있다 : 프로그램의 동작 추가 및 기능 확장 가능
변경에 닫혀 있다 : 코드를 수정하지 않고 프로그램의 동작 추가 및 변경 가능 - 리스코프 치환 원칙(LSP, Liskov Substitution Principle)
다형성(객체의 하위 타입은 상위 타입으로 대체 가능) - 인터페이스 분리 원칙(ISP, Interface Segregation Principle)
여러 개의 범용 인터페이스보다 하나의 인터페이스 구조가 나음 - 의존 역전 원칙(DIP, Dependency Inversion Principle)
추상화에 의존하고 구체화에 의존하지 않는 설계 원칙
하위 레벨 모듈의 변경이 상위 레벨 모듈의 변경을 요구하지 않음
⭐ 공부 난이도
재귀함수 ☆☆★★★
🌕 느낀점
예전에 재귀를 공부했을 때에 이론은 이해가 되었는데 구현이 어려웠다. 어떻게 구현을 해야하는지 모르겠고 할 때마다 고민을 해도 잘 모르겠다는 생각이 들었다. 지금 재귀를 하루종일 공부를 해보니까 왜 구현이 어려웠는지 알 것 같다. 재귀의 이론만 알고 어떻게 구현할지에 대해서 고민을 제대로 해보지 않았던 것 같다. 이번에 예제를 직접 작성해보고, 관련 문제를 계속 풀어서 이제는 어떻게 해야할지 감이 잡힌다. 깊이우선탐색이나 너비우선탐색을 아무리 풀어도 제대로 풀지 못했던 이유가 재귀에 대한 개념이 제대로 안 잡혀 있어서 그런 것 같다. 기초가 정말 중요하다고 다시금 깨닫는다.