Programming Languages 8

이상한 Kotlin의 세계 - Type inference

이거슨 사실 일종의 버그라 Kotlin이 이상하다고 하긴 애매하지만, 어쨌든 이것 때문에 스프링의 주요 기능이 동작하지 않고 있으니까 이상한걸로 치기로 했다. (링크 - p.19 WebTestClient Type Inference Issue in Kotlin) 수다쟁이 Java에 불만을 가진 사람들이 만든 JVM 기반의 언어들 중 Kotlin의 타입 추론은 참 이상하다는 느낌을 받았다. // Java class A { int a; char b; } void inner() { System.out.println("(void)"); } void inner(T t) { System.out.println(t.toString()); } void outer() { inner(); inner(10); inner("te..

이상한 Kotlin의 세계 - Iterable.map()

Java야 뭐, 기존 타입이 functional programming에 적합하지 않기 때문에, Array, List, Set 등등의 타입을 다 Java 8부터 제공하는 Stream으로 변환해놓고 처리하니까... import java.util.*; import java.util.stream.*; public class A { public static void main(String[] args) { // 1. Array String[] ss = { "1", "2", "3" }; Stream.of(ss) .map(s -> Integer.valueOf(s)) .forEach(i -> System.out.println("Value: " + i + " (" + i.getClass().getName() + ")"))..

Scala Option

Scala에는 Option이라는 재미있는 클래스가 있습니다. 이 클래스는 기본적으로 옵셔널(Optional, 존재 여부가 불확실함)한 값을 표현하기 위해 사용하며, 아래와 같은 정의로 구성되어 있습니다. sealed abstract class Option[+A] extends Product with Serializable object Option extends Serializable object Option은 주로 Empty Option 값(None)을 만들어내기 위해 사용합니다. 이 글에서는 Companion class Option 에 대해 주로 다룰 예정입니다. 보다시피, class Option의 선언 옵션 중 sealed 때문에 부가적인 확장이 불가능하며, abstract 때문에 Option 인스턴..

[추상자료형] 리스트(List)

[추상자료형] 리스트(List)정의: 값들의 순서있는 나열 (같은 값이 한 번 이상 나올 수 있다)순서있는 (ordered): 각 값들 간의 대소관계가 아닌, 값들의 등장 순서 예) [1, 2, 3] ≠ [3, 2, 1] 나열 (sequence): 없거나 하나 이상의 값을 순서있게 배치한다.용어객체(entity): 리스트를 구성하는 개별 값 빈 리스트 (Nil, Not in list): 포함하는 객체가 없는 리스트크기(length): 리스트 내 객체의 개수 리스트의 구성List of T = head(T) :: tail(List of T) 타입 T의 리스트(List of T)는 '타입 T 객체인 head'와 '타입 T 리스트(List of T)인 tail'의 재귀로 이루어져 있다. 머리(head): 리스트..

[추상자료형] 집합(Set)

[추상자료형] 집합 (Set) 정의: 서로 구분되는 값들의 순서 없는 무리서로 구분되는(distinct): 하나의 집합은 동일한 값을 포함하지 않는다. 예) { 1, 2, 3 } (O), { 1, 2, 3, 3 } (X, 또는 앞의 집합과 동일하게 취급) 순서없는(unordered): 서로 다른 집합을 구분하는 요소로 순서는 해당하지 않는다. 예) { 1, 2, 3 } = { 3, 2, 1 } 무리(collection): 없거나 하나 이상의 값을 포함한다.용어원소(element): 집합을 구성하는 각 대상을 지칭한다.속한다/포함한다(inclusion/containment): 집합 A, B가 있을 때, 집합 B를 구성하는 모든 원소가 집합 A를 구성하는 원소의 전체 또는 일부일 때, '집합 A는 집합 B를..

glibc/open_memstream() 소개

C에서 키보드로부터 입력을 받을 때 어떤 방식을 사용하시나요? 보통은 여유있는 고정된 크기의 배열을 버퍼로 많이 사용하죠? char *input; char buf[1024]; fgets(buf, sizeof(buf), stdin); input = malloc(strlen(buf) + 1); memset(input, 0, sizeof(input)); memcpy(input, buf, sizeof(input)); //input에 키보드 입력 저장 buf라는 1024bytes 크기의 배열에 키보드 입력을 받아온 후, 이를 바탕으로 input에 buf의 크기만큼 메모리공간을 할당, input에 buf를 복사합니다. 이렇게 되면 input에는 키보드 입력이 저장됩니다. 간단하죠.그런데 역시 C는 귀찮아요, Jav..

객체지향 Makefile 관리하기

...네, 사실 제목은 낚시입니다. 그냥 체계적인 Makefile 관리법 정도가 맞겠죠.그럼에도 불구하고 저 제목을 쓴 이유는, 이 방법을 찾기 위한 푸념을 모 후배가 듣고는 'Makefile을 OOP 하듯이 만들다니' 라고 했기 때문...이라고 하면 좀 그런가 (...)(본문의 범위는 automake 같은 툴과는 관련없는 내용으로, GNU Make의 동작을 기록하는 Makefile 자체에 대해서만 다룹니다.) 예제 코드는 아래와 같습니다. $ cat test.c #include int main() { #warning "Makefile Test" return 0; } $ cat Makefile CFLAGS= LDFLAGS= TARGET=test all: $(TARGET) $(TARGET): $(TARGE..