1

blog·2022년 12월 15일
0

Keywords

목록 보기
1/3

함수형 언어 (함수형 프로그래밍 언어)

함수형 프로그래밍?

자료처리를 수학적 함수의 계산으로 취급하고, 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나. 함수형 프로그래밍에서 기본 단위는 함수로, 가장 간단한 계산에도 사용 된다. 변수도 함수로 대체된다. 모든 변수는 한 번만 할당되며 수정할 수 없다. Java에서 final (C++ : const)로 선언하는 것과 동일하다. 그 외 함수는 일급 객체이며, 기본 제어구조로 재귀를 사용하고 계산 방법 보다는 무엇을 계산할지에 더 중점을 둔다는 특징을 가진다.

함수형 언어는 이런 함수형 프로그래밍을 지향하는 언어이다.
함수형 언어로는 Lisp, Scheme, Haskell, ML, OCAML, Clean, Mercury, Erlang 등이 있다.

Functional Programming For The Rest of Us (Akhmechet, Slava)
Functional programming in Python (by David Mertz)

높은 수준의 추상화를 제공 (JAVA 객체지향 관련 추상화와 연관지어 조사)

추상화?

추상 (사전적 의미)

여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용.

추상화란 구체적인 것을 분해해서 관찰자가 관심있는 특성만 가지고 재조합하는 것으로 정리할 수 있다. 객체와 클래스를 통해 이 추상화를 살펴볼 수 있는데, 클래스를 추상화한 결과가 객체(Object, Instance)이다. 즉, 객체는 클래스에서 공통되는 특성이나 속성 따위를 추출하여 생성하는 것이다. JAVA에서는 단순히 클래스뿐만 아니라 인터페이스와 추상 클래스 등으로 더 높은 추상화를 제공한다.

참고 : 스프링 입문을 위한 자바 객체지향의 원리와 이해

CAS

Compare and Swap

동시성 알고리즘을 설계할 때 사용하는 기술. 변수의 예상값과 실제 값을 비교, 값이 일치하면 실제 값을 새로운 값으로 교체한다. 이 때 널리 쓰이는 패턴이 '체크-액트'이다. 이 패턴은 변수의 값을 확인하여 해당 값을 전제로 다음 동작을 수행한다. 멀티스레드에서 '체크-액트' 연산이 제대로 수행되려면 '연산의 원자성'이 필요하다. '체크'와 '액트'의 동작이 분리되지 않은 하나의 원자적인 코드 블록으로 실행되어야 함을 의미. (synchronized를 사용하여 원자성을 부여할 수 있다.)

Java 5부터는 Java.concurrent 패키지에서 CAS 기능을 제공한다. AtomicBoolean 클래스를 이용하여 변수를 선언하면, 해당 인스턴스 값을 예상값과 비교하여 두 값이 일치하면 실제 값을 새 값으로 세팅하는 compareAndset() 메소드를 사용할 수 있다. (그 외에 ConcurrentHashMap, AtomicInteger들도 있다.)

public static class MyLock {
    private AtomicBoolean locked = new AtomicBoolean(false);

    public boolean lock() {
        return locked.compareAndSet(false, true);
    }

}

예제 : AtomicBoolean locked의 값을 false로 비교하여 false가 맞으면 AtomicBoolean locked의 값을 새 값인 true로 세팅한다.

Java의 컴페어 스왑 클래스들은 CPU의 기본 컴페어스왑기능을 사용하기 때문에 빠른 스왑연산이 가능하므로, 컴페어 스왑 기능을 사용하는 것이 좋다.

Compare and Swap
컴페어 스왑(Compare and Swap)

System Call

운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스

시스템 호출

Cache

데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다. 캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간없이 더 빠른 속도로 데이터에 접근할 수 있다. CPU캐시, 디스크 캐시 등이 있다.

캐시

Block

전산에서는 기억장치의 영역을 나누는 하나의 단위로, Cache에서도 Byte보다 큰 블록 단위(64Byte 또는 32Byte) 접근을 하며블록의 갯수와 블록의 크기가 캐시의 크기를 결정한다.

블록

GC (Garbage Collector)

Garbage Collection

메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중 필요 없게 된 영역(garbage)을 해제하는 기능. 주로 저수준의 언어(C, C++ 등)에서는 사용자가 메모리 해제 (free())를 직접 해주나 java나 python등의 언어에서는 Garbage Collector가 Garbage Collection을 통해 동적메모리를 관리한다.

Garbage Collector

Garbage Collection을 시행하면서, 애플리케이션의 메모리 할당 및 해제를 관리한다.

쓰레기 수집 (컴퓨터 과학)
Fundamentals of garbage collection

LRU

Last Recently Used

가장 오랫동안 참조되지 않은 페이지를 교체하는 기법
(java.lang.ref 패키지에서 제공하는 soft, weak, phatom reference class를 사용하면 GC에 일정부분 관여하거나 LRU 캐시 등을 손쉽게 구현할 수 있다.)

Least Recently Used
Java Reference와 GC

profile
👩‍💻

0개의 댓글