나를 기록하다
article thumbnail
반응형

TIL을 7월 초까지 작성하다가 TIL 대신 카테고리별로 나눠서 글을 올리곤 했었다.

그 당시에는 카테고리화하여 업로드하는데 TIL을 또 올리는 건 비효율적이라 생각했다.

 

하지만 요즘 나의 공부 방법에 대해서 돌이켜보면서,
인터넷 강의, 각종 자료 등을 통해서 공부를 하지만 정리가 되지 않는 느낌이 들었다.

그래서 다시 TIL을 작성하면서 매일 공부한 내용을 돌이켜보고자 한다.

 

TIL에는 엄청 구체적인 내용보다 간략하게 내가 오늘 어떤 내용을 공부했고, 복습할 수 있게끔 기록할 생각이다.

 

함수형 프로그래밍

함수형 프로그래밍

함수형 프로그래밍이란?

최소 단위가 함수이고 함수를 통하여 새로운 데이터를 만들어가며 파이프 형태로 프로그래밍하는 방식

함수형 프로그래밍은 거의 모든 것을 순수 함수로 나누어 문제를 해결하는 기법.

작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해준다.

Functional Programming is programming without assignment statements.
함수형 프로그래밍은 대입문이 없는 프로그래밍이다.
- Robert C.Martin -

예시

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class FunctionalProgrammingExample {
    public static void main(String[] args) {
        // 문자열 리스트 생성
        List<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        names.add("Charlie");
        names.add("David");
        names.add("Eva");

        // 람다식을 사용하여 문자열 길이가 5 이상인 이름들을 필터링
        List<String> filteredNames = names.stream()
                .filter(name -> name.length() >= 5)
                .collect(Collectors.toList());

        // 필터링된 결과 출력
        System.out.println("길이가 5 이상인 이름들: " + filteredNames);

        // 람다식을 사용하여 이름 리스트의 각 요소에 "Hello, "를 추가
        List<String> greetings = names.stream()
                .map(name -> "Hello, " + name)
                .collect(Collectors.toList());

        // 변환된 결과 출력
        System.out.println("인사말 리스트: " + greetings);
    }
}

 

 

특징

  1. 1급 객체(First-Class Object)
    1. 사용할 때 다른 요소와 아무런 차별이 없는 객체(일급 함수)
    2. 변수나 데이터 안에 담을 수 있음
    3. 파라미터로 전달 가능
    4. 반환값으로 사용 가능
    5. 할당에 사용된 이름과 무관하게 고유한 구별 가능
  2. 부수 효과(Side Effect)
    1. 변수의 값 변경
    2. 자료 구조를 제자리에서 수정
    3. 객체의 필드값 설정
    4. 예외나 오류 발생하여 실행 중단
    5. 콘솔 또는 파일 I/O 발생
  3. 순수 함수(Pure Function)
    1. 부수 효과들을 제거한 함수, 함수형 프로그래밍에서 사용하는 함수
    2. 함수 자체가 독립적이며 부수 효과가 없기에 스레드 안정성 보장
    3. 스레드 안정성을 보장받아 병렬 처리를 동기화 없이 진행 가능
  4. 참조 투명성(Referential Transparency)
    1. 동일한 인자에 대해 항상 동일한 결과 반환
    2. 기존의 값은 변경되지 않고 유지

자바 컬렉션 프레임워크(Java Collection Framework)

자료구조의 분류(형태에 따른 자료구조)

선형 자료구조

  • List, Queue, Deque

비선형 자료구조

  • Graph, Tree

기타

  • Set

Java Collection Framework / 출처: Stranger's LAB(하단 링크)

점선은 구현 관계, 실선은 확장 관계

녹색 부분이 구현된 자료구조

 

Map은?

Java에서 Map은 Collection이라고 보지 않는다.

 

이유

  1. Collection Interface와 Map Interface의 호환성
    Collection을 상속하여 구현된 클래스들은 모두 단일 데이터를 처리하지만,
    Map은 Key와 Value가 쌍을 이루며 처리한다.
  2. Iterable Interface와 Map 간의 문제
    Iterable은 반복 가능한 형태
    Map은 구조상 Key에 대응되는 Value라는 특징 → Key와 Value 중 어떤 것을 반복해야 하나? → iterator() 구현에 문제
  3. Java에서 상속이라는 모델링은 한가지 유형의 공통성을 모델링 한다는 것에 의미
    1, 2번 모두 상속과 거리가 멀다.

List

  1. 배열의 기능 + 동적 크기 할당
  2. 종류: ArrayList, LinkedList, Vector(+Stack)

ArrayList

  1. Object[] 배열을 사용하면서 내부 구현을 통해 동적으로 관리
  2. 요소 접근에 뛰어남.
  3. 중간의 요소가 삽입, 삭제가 일어나는 경우 비효율적임.(그 뒤의 요소들은 한 칸씩 밀어야 하거나 당겨야 하기 때문에)

LinkedList

  1. 데이터와 주소로 이루어진 클래스를 만들어 서로 연결하는 방식(객체끼리 연결한 방식)
  2. 요소 검색 성능 떨어짐.(모든 노드 방문해야 함)
  3. 삽입, 삭제 시 뛰어난 성능(노드의 링크를 끊거나 연결만 해주면 됨)

List 메서드


Queue

  1. 선입선출(FIFO)
  2. 종류: LinkedList, ArrayDeque, PriorityQueue

LinkedList

  1. Deque 또는 Queue를 LinkedList처럼 노드 객체로 연결해서 관리하길 원할 때 사용

ArrayDeque

  1. ArrayList처럼 Object[] 배열로 구현되어 있음.

→ 자바에서 지원하는 컬렉션에서 일반적인 큐를 사용하고자 한다면 LinkedList로 생성하여 Queue로 선언하면 된다.

Queue<T> queue = new LinkedList<>();

PriorityQueue

  1. 우선순위 큐
  2. 따로 정렬방식 지정하지 않을 시 낮은 숫자가 높은 우선순위
  3. 사용자가 정의한 객체를 타입으로 쓸 경우 반드시 Comparator 또는 Comparable을 통해 정렬 방식을 구현해주어야 함.

queue 메서드


Set

  1. 데이터를 중복해서 저장할 수 없다.
  2. 입력 순서대로의 저장 순서를 보장하지 않는다.
    (예외) LinkedHashSet은 입력 순서대로의 저장순서 보장
  3. 종류: HashSet, LinkedHashSet, TreeSet

HashSet

  1. 입력 순서 보장 X
  2. 사용: 아이디 생성 시 [중복확인]
  3. hash 안에 데이터의 위치를 특정시켜 해당 데이터를 빠르게 색인 가능(Hash + Set)
  4. 삽입, 삭제, 색인이 매우 빠름

LinkedHashSet

  1. Link + Hash + Set
  2. 중복은 허용하지 않으면서 순서를 보장받고 싶은 경우를 위한 Set
  3. 사용: 페이리를 열 때 해당 페이지가 중복될 경우 캐시는 다시 적재할 필요가 없지만, 새로운 페이지를 할당해야 할 경우 최근에 사용하지 않은 캐시를 비우고자 할 때, 가장 오래된 캐시를 비우는 것이 현명함
    → LRU 알고리즘(Least Recently Used Algorithm) (현실적으로는 LinkedHashMap이라는 자료구조가 대부분을 차지함)

TreeSet

  1. 가중치에 따른 순서대로 정렬 보장


자료구조 분류 정리

출처: http://javabeans.asia


회고

백엔드 개발자가 갖춰야 할 역량을 보았는데 내가 생각했던 것보다 훨씬 많은 공부가 필요할 것 같다.

아직 내가 공부한 내용이라곤 Java 기초와 Spring 기초, JPA, 알고리즘 기초, SQL 기초 정도이다.

아직 제대로 된 프로젝트를 해보지 못했고 배포 경험 또한 없다.

 

그리고 요즘 공부하면서 느꼈던 것은 기초 CS의 중요성이다.

SpringBoot를 이용해서 미니 프로젝트를 만들면서 아무 생각없이 @GetMapping, @PostMapping 등을 사용하여 매핑하다가, 이 어노테이션들이 어떤 기능을 대신해서 해주는건지 모르고 사용하고 있는 내 모습을 돌이켜보며 반성했다.

 

그래서 시작한 것이 네트워크 공부이다.

TCP/IP 등을 정보처리기사를 공부하면서 겉햝기 식으로 공부했었는데, 우선 학교 전자책 도서관에 모두의 네트워크라는 책이 있어, 기초 네트워크 공부를 하고 그 후엔 인프런 강의를 통해 공부할 것이다.

 

또한 개인 미니 프로젝트를 완성하긴 했는데 아직 초라하고, 기초 CRUD만 갖춘 상태이다.

기능을 더 추가하고 AWS 공부를 따로 해서 배포까지 제대로 해보고 싶다.

 

알고리즘과 자료구조 또한 아직 많이 부족하다.

문제를 계속 풀다보니 백준 티어는 골드4이지만, 실질적으로 제대로 풀 수 있는 건 실버 하위권이다.

시간의 여유만 있다면 알고리즘에 몰입하여 실력을 올리고 싶지만 프로젝트도 없고 부족한 부분이 태산이라 그러지 못하고 있다.

 

주위에 개발자를 준비하는 취준생이나 현업 개발자가 없다보니 정보 공유와 코드 리뷰 등을 받지 못해 어려움이 많다.

물론 혼자 공부하는 것만의 장점도 있겠지만, 연말에 뽑는 싸피나 우테코와 같은 부트캠프에 합격한다면, 같은 목표를 가진 많은 동료들과 함께 성장하고 싶다.


참고자료

https://st-lab.tistory.com/142

https://mangkyu.tistory.com/111

https://yozm.wishket.com/magazine/detail/1334/

 

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...