Python
Hello World
Python에서 가장 첫 번째로 배우는 Hello World. 별도의 main 함수나 클래스 없이 한 줄로 실행됩니다.
IN-DEPTH GUIDES
흩어진 예제를 주제별로 묶어, 한 편을 끝까지 읽으면 그 영역이 정리되도록 다시 썼습니다. 138편의 가이드에 2225개 주제와 실행 가능한 예제 코드가 들어 있습니다.
Python
Python에서 가장 첫 번째로 배우는 Hello World. 별도의 main 함수나 클래스 없이 한 줄로 실행됩니다.
Python
Python의 동적 타이핑과 Python 3.5+의 타입 힌트(Type Hints)로 코드 안정성을 높입니다.
Python
가변 인자와 키워드 인자로 유연한 함수를 설계합니다.
Python
Python OOP의 핵심. __init__, @property, @classmethod, @staticmethod.
Python
Python에서 가장 많이 쓰는 자료구조. 생성, 조작, 컴프리헨션, 병합까지.
Python
functools 모듈로 함수형 프로그래밍 패턴을 구현합니다.
Python
Python의 비동기 I/O 라이브러리. 코루틴으로 I/O 대기 시간을 효율적으로 활용합니다.
Python
Python의 예외 계층과 올바른 예외 처리 패턴.
Python
pathlib으로 경로를 객체지향적으로 처리하고 파일을 안전하게 읽고 씁니다.
Python
Python 최고의 테스트 프레임워크 pytest로 효율적인 테스트를 작성합니다.
Python
타입 힌트로 코드 품질과 IDE 지원을 극대화합니다.
Python
의존성 주입 패턴과 contextvars로 스레드/코루틴 안전한 컨텍스트를 관리합니다.
Kotlin
Kotlin에서 가장 첫 번째로 배우는 Hello World. JVM 언어이지만 class 없이 top-level 함수로 바로 실행됩니다.
Kotlin
Kotlin의 두 변수 키워드. val은 재할당 불가(Java의 final), var은 재할당 가능. 기본은 val, 필요할 때만 var.
Kotlin
기본값 파라미터로 오버로딩을 줄이고, Named Argument로 호출 가독성을 높입니다.
Kotlin
Kotlin 클래스의 주 생성자(primary constructor)와 초기화 블록.
Kotlin
불변/가변 컬렉션 생성 함수와 기본 조작 방법을 익힙니다.
Kotlin
함수를 일급 객체로 다루는 Kotlin의 함수형 프로그래밍 핵심.
Kotlin
Kotlin 코루틴의 핵심 빌더. launch는 fire-and-forget, async는 결과를 반환합니다.
Kotlin
Kotlin의 예외 처리. 모든 예외가 unchecked입니다(checked exception 없음).
Kotlin
Kotlin의 람다 수신자(lambda with receiver)로 읽기 쉬운 DSL을 만듭니다.
Kotlin
Kotlin 친화적인 테스트 프레임워크로 읽기 쉬운 테스트를 작성합니다.
Kotlin
런타임 오버헤드 없이 타입 안전한 래퍼를 만드는 value class.
Kotlin
Kotlin에서 파일을 읽고 쓰는 가장 간단한 방법. java.io.File 확장 함수를 활용합니다.
Java
Java의 전통적인 Hello World부터 Java 21의 간결한 문법까지. 엔트리포인트와 출력 방법을 마스터합니다.
Java
Java의 원시 타입(primitive)과 래퍼 클래스(Wrapper)의 차이, 오토박싱/언박싱의 원리.
Java
Java 8의 람다 표현식과 java.util.function 패키지의 함수형 인터페이스를 마스터합니다.
Java
Java OOP의 핵심. 캡슐화, 상속, 다형성의 실전 적용.
Java
ArrayList, LinkedList, HashMap, LinkedHashMap, TreeMap, HashSet의 선택 기준과 사용법.
Java
Java 8의 Stream API로 컬렉션을 함수형으로 처리합니다. 중간 연산과 최종 연산을 마스터합니다.
Java
Java 8의 CompletableFuture로 비동기 작업을 조합하고 체이닝합니다.
Java
Checked/Unchecked 예외, 커스텀 예외 계층, try-with-resources로 리소스를 안전하게 관리합니다.
Java
Java 7+ NIO2의 Path와 Files로 파일 처리를 현대적으로 합니다.
Java
Effective Java가 권장하는 Builder 패턴으로 복잡한 객체를 안전하게 생성합니다.
Java
JUnit 5의 현대적 테스트 기능과 Mockito로 외부 의존성을 격리합니다.
Java
JVM의 Heap 구조, GC 알고리즘, 메모리 튜닝의 핵심을 이해합니다.
Go
Go 프로그램의 최소 구조. package main과 func main()이 진입점입니다.
Go
Go의 두 가지 변수 선언 방식과 제로값(zero value) 초기화.
Go
Go 함수의 핵심 특징: 여러 값을 반환하고, 에러를 마지막 반환값으로 처리합니다.
Go
Go에는 클래스가 없습니다. struct와 메서드로 OOP를 구현합니다.
Go
슬라이스는 동적 배열입니다. 내부적으로 배열 포인터, 길이, 용량을 갖습니다.
Go
Go의 경량 스레드인 고루틴과 동기화 도구 WaitGroup으로 병렬 처리를 구현합니다.
Go
Go의 에러 처리 철학: 에러는 값입니다. 예외 대신 명시적 반환으로 처리합니다.
Go
Go의 파일 처리. os, bufio, io 패키지를 활용합니다.
Go
Go에서 선택적 설정을 우아하게 처리하는 대표적인 패턴입니다.
Go
Go 내장 테스트 프레임워크로 표 기반 테스트를 작성합니다.
Go
임시 객체를 재사용하는 sync.Pool로 GC 압력을 줄입니다.
Go
Go 1.18+ 제네릭을 사용한 함수형 프로그래밍 유틸리티.
JavaScript
문자열 하나를 console.log로 표준 출력에 내보내고 끝에 줄바꿈을 붙입니다. 실행 환경이 제대로 잡혔는지 확인하는 첫 코드로 씁니다. console.log는 표준 출력, console.error는 표준 오류로 나가므로 파이프로 걸러 낼 때 둘이 구분됩니다.
JavaScript
let count = 1로 값을 담고, count > 5 비교 결과에 따라 label에 'small'이 들어가 출력됩니다. 값이 바뀔 변수는 let, 한 번 정해지면 그대로인 값은 const로 나눠 선언합니다. const는 재할당만 막을 뿐 객체 내부 속성 변경까지 막…
JavaScript
function 키워드로 add를 선언하고 두 인자의 합 3을 출력합니다. 이름 있는 선언은 호이스팅되어 정의보다 위쪽에서도 호출할 수 있습니다. +는 숫자 덧셈과 문자열 이어 붙이기를 겸하므로 인자 타입이 섞이면 결과가 달라집니다.
JavaScript
User 클래스가 name과 level을 받아 필드로 저장하고, summary()가 템플릿 리터럴로 두 값을 이어 붙여 돌려줍니다. 데이터와 그 데이터를 다루는 동작을 한곳에 묶고 싶을 때 이 형태로 출발합니다. class는 문법 설탕이라 summary는 인스턴스마다 …
JavaScript
items.map(value => value * 2)가 [1, 2, 3, 1]의 각 요소를 두 배로 만든 새 배열 [2, 4, 6, 2]를 돌려줍니다. 원본을 건드리지 않고 같은 길이의 결과가 필요할 때 씁니다. 콜백에서 값을 반환하지 않으면 그 자리가 undefine…
JavaScript
입력만으로 결과가 정해지는 addTax가 가격에 1.1을 곱해 10에 대한 값을 냅니다. 외부 상태를 건드리지 않아 테스트와 캐싱이 쉬운 형태입니다. 다만 부동소수점 곱셈이라 결과가 11이 아니라 11.000000000000002로 찍힙니다.
JavaScript
async function으로 선언한 run이 이미 이행된 Promise.resolve(1)을 await해 값 1을 꺼내 출력합니다. 콜백 중첩 없이 비동기 흐름을 위에서 아래로 읽고 싶을 때 이 형태로 시작합니다. 이미 완료된 프로미스라도 await는 마이크로태스크 …
JavaScript
JSON.parse('{')가 던진 SyntaxError를 catch가 받아, Error 인스턴스인지 확인한 뒤 message를 출력합니다. 외부에서 들어온 문자열을 파싱할 때 이 감싸기가 필요합니다. catch에는 Error가 아닌 값도 던져질 수 있어서, 검사 없이…
JavaScript
readFileSync로 package.json을 UTF-8 문자열로 읽은 뒤 앞 20자만 잘라 출력합니다. 설정처럼 작고 시작 시점에 한 번만 읽는 파일에 어울립니다. 인코딩 인자를 빼면 문자열 대신 Buffer가 돌아오고, 동기 호출이라 읽는 동안 이벤트 루프가 멈…
JavaScript
할인 계산 함수 두 개를 percent와 flat이라는 키에 담아 두고 필요한 것을 꺼내 실행합니다. 분기마다 if를 늘리는 대신 표를 만들어 두는 방식이라 항목 추가가 간단합니다. 키를 사용자 입력으로 받는다면 없는 이름이 들어올 때 undefined를 호출하게 되므…
JavaScript
조건이 어긋나면 예외를 던지는, if 한 줄짜리 수동 단언입니다. 테스트 러너 없이도 스크립트가 기대와 다르게 동작하는 순간 즉시 멈추게 만들 수 있습니다. 다만 실패 메시지에 실제 값이 담기지 않아, 어떤 값이 나왔는지 알려면 로그를 다시 심어야 합니다.
JavaScript
문자열 조각을 담은 배열을 구분자와 함께 join으로 한 번에 이어 붙입니다. 조각이 많이 쌓일 때는 반복문에서 +=로 붙이는 대신 배열에 모았다가 마지막에 합치는 이 방식이 다루기 편합니다. 다만 요즘 엔진은 문자열 연결을 내부적으로 최적화해서, 조각이 몇 개뿐이면 …
TypeScript
console.log 한 줄로 고정된 문자열을 표준 출력에 내보냅니다. 새 프로젝트에서 컴파일과 실행 경로가 제대로 연결됐는지 확인하는 첫 단계입니다. TypeScript 파일은 그대로 실행되지 않으므로 tsc로 JavaScript를 만들거나 tsx 같은 실행기를 거쳐…
TypeScript
count에 number를 명시하고, 5보다 큰지 비교한 결과로 label 문자열을 정합니다. 값과 타입을 함께 적어 두는 기본 선언 형태입니다. 리터럴로 초기화하면 타입이 추론되므로 : number는 생략해도 같고, 명시는 의도를 문서로 남기는 쪽에 가깝습니다.
TypeScript
add는 매개변수 두 개와 반환값에 모두 number를 붙인 가장 기본적인 함수 선언입니다. 인자 타입을 적어 두면 호출부에서 문자열을 넘겼을 때 실행 전에 잡힙니다. 반환 타입은 추론으로도 채워지지만, 명시해 두면 구현을 잘못 고쳤을 때 오류가 호출부가 아닌 함수 안…
TypeScript
생성자 매개변수에 public을 붙여 name과 level 필드를 별도 선언 없이 만들고, summary()가 둘을 콜론으로 이어 붙인 문자열을 돌려줍니다. 데이터와 그 데이터를 다루는 동작을 한 덩어리로 묶을 때 쓰는 형태입니다. 이 매개변수 프로퍼티 문법은 Type…
TypeScript
items.map이 각 요소에 2를 곱한 새 배열을 만들어 출력합니다. 원본은 그대로 남아 있어서 변환 결과만 따로 쓰고 싶을 때 적합합니다. map은 항상 원본과 같은 길이의 배열을 돌려주므로, 개수를 줄이려면 filter를 앞뒤에 붙여야 합니다.
TypeScript
addTax는 인자로 받은 가격에 1.1을 곱해 돌려주는 화살표 함수이며, 외부 상태를 읽거나 바꾸지 않습니다. 이런 순수 함수는 입력만 주면 결과가 정해지므로 테스트에서 준비 코드가 필요 없습니다. 다만 10 * 1.1은 부동소수점 특성상 정확히 11이 아닐 수 있어…
TypeScript
async function run()이 await Promise.resolve(1)로 값을 꺼내 출력하고, 반환 타입은 Promise<void>로 적었습니다. 비동기 함수의 골격을 잡을 때 이 형태에서 출발합니다. await은 이미 이행된 값이라도 마이크로태스크 한 턴…
TypeScript
일부러 깨뜨린 JSON 문자열을 JSON.parse에 넘겨 던져진 오류를 잡고, instanceof Error로 확인한 뒤 메시지를 출력합니다. 외부 문자열을 파싱하는 지점마다 이 형태가 필요합니다. 최신 설정에서는 error가 unknown이라 이 좁히기 없이는 me…
TypeScript
node:fs의 readFileSync로 package.json을 UTF-8 문자열로 읽은 뒤 앞 20자만 잘라 출력합니다. 프로그램 시작 시점에 작은 설정 파일을 한 번 읽는 정도라면 이 형태로 충분합니다. 세 번째 인자인 인코딩을 빼면 반환 타입이 string이 아…
TypeScript
이름별로 함수를 담은 strategies 객체를 만들고 percent를 골라 100에 적용해 90을 얻습니다. 분기 대신 키로 동작을 고르고 싶을 때 쓰는 최소 구조입니다. 이 객체의 키 타입은 "percent" | "flat"으로 좁게 추론되므로, 임의의 string…
TypeScript
조건 1 + 1 <= 1이 거짓이므로 아무 일도 일어나지 않고, 참이었다면 Error를 던져 실행을 중단시킵니다. 테스트 프레임워크 없이 스크립트에 검증을 심을 때 쓰는 가장 작은 방식입니다. 이런 수동 단언은 실패 시 기대값과 실제값을 알려 주지 않아, 원인 파악에는…
TypeScript
문자열 배열을 만들어 두고 마지막에 join("-")으로 한 번에 이어 붙입니다. 반복문 안에서 +=로 계속 붙이는 대신 조각을 모아 두는 방식입니다. 요소가 문자열이 아니어도 join은 각 항목을 문자열로 바꿔 넣는데, null과 undefined는 "null"이 아…
C#
Console.WriteLine 한 줄로 문자열을 표준 출력에 내보내고 줄바꿈까지 붙입니다. 실행 환경이 제대로 갖춰졌는지 확인하는 첫 코드로 씁니다. 클래스와 Main이 보이지 않는 이유는 최상위 문 문법 덕분이며, 이 방식은 프로젝트 안에서 파일 하나에만 허용됩니다…
C#
var count = 1;로 정수 변수를 만들고, 삼항 연산자로 5보다 큰지 비교해 문자열을 출력합니다. 값이 1이므로 결과는 small입니다. var는 타입을 생략하는 것일 뿐 동적 타입이 아니어서, 컴파일 시점에 int로 고정되고 나중에 문자열을 넣을 수 없습니다.
C#
두 정수를 더하는 지역 함수 Add를 식 본문으로 선언하고 Add(1, 2) 결과 3을 출력합니다. 짧은 계산을 파일 안에서만 재사용할 때 쓰는 형태입니다. 화살표 뒤 식의 값이 곧 반환값이라 return을 적지 않으며, 이 문법은 메서드와 속성에도 똑같이 적용됩니다.
C#
생성자에서 Name과 Level을 받아 읽기 전용 속성에 넣고, 만든 객체의 이름을 출력합니다. 값이 생성 시점에 정해지고 이후 바뀌지 않아야 하는 도메인 모델에 이 형태를 씁니다. get만 있는 자동 속성은 백킹 필드가 readonly라 생성자 밖에서는 대입 자체가 …
C#
Select가 배열 { 1, 2, 3, 1 }의 각 원소를 두 배로 바꾸고, string.Join이 그 결과를 이어 붙입니다. 원본 배열은 그대로 남고 새 시퀀스가 생깁니다. Select 호출 시점에는 아무 계산도 일어나지 않으며, 실제 곱셈은 Join이 열거를 시작해…
C#
배열의 네 값을 Aggregate로 왼쪽부터 접어 합계 7을 출력합니다. 누적 람다가 바깥 상태를 전혀 건드리지 않으므로 몇 번을 돌려도 결과가 같은 순수 함수의 전형입니다. 같은 계산을 Sum으로도 할 수 있지만, Sum은 오버플로 시 예외를 던지고 이 람다는 조용히…
C#
Task.FromResult(1)은 이미 완료된 태스크를 만들고, await가 그 안의 값을 꺼내 출력합니다. 비동기 인터페이스를 구현하면서 실제로는 캐시된 값을 즉시 돌려줄 때 이 형태를 씁니다. 완료된 태스크를 await하면 스레드 전환이 일어나지 않고 호출한 자리…
C#
int.Parse("x")가 숫자로 해석할 수 없는 문자열을 만나 FormatException을 던지고, catch가 그 메시지를 출력합니다. 실패 지점을 감싸 프로그램이 중단되지 않게 하는 기본 형태입니다. 다만 Exception을 통째로 잡으면 메모리 부족 같은 무…
C#
코드는 File.WriteAllText로 sample-1.txt를 만든 뒤 File.Exists로 존재 여부를 출력합니다. 읽기 코드를 시험하기 전에 대상 파일을 미리 깔아 두는 준비 단계로 씁니다. WriteAllText는 내부에서 스트림을 열고 닫아 주므로 usin…
C#
이름을 키로, 할인 계산 람다를 값으로 담은 사전을 만들고 percent 항목에 100을 넣어 90을 출력합니다. 규칙 이름이 설정 파일이나 DB에서 문자열로 들어올 때 이 표를 그대로 씁니다. (int) 캐스팅은 반올림이 아니라 소수부를 버리므로 금액 계산에는 dec…
C#
1 + 1 <= 1이 거짓이므로 예외 없이 지나가고 True가 출력됩니다. 테스트 프레임워크 없이 조건을 확인할 때는 이렇게 예외를 던지는 방식이 가장 단순합니다. 다만 Exception을 그대로 던지면 기대값과 실제값이 메시지에 남지 않아, 실패했을 때 무엇이 달랐는…
C#
StringBuilder에 접두사와 숫자 1을 이어 붙인 뒤 ToString으로 완성된 문자열을 얻습니다. 반복문 안에서 문자열을 계속 이어 붙일 때 이 방식이 필요합니다. Append(int)는 숫자를 버퍼에 바로 써 넣어 중간 문자열을 만들지 않지만, 붙일 조각이 …
C++
<iostream>을 포함하고 main에서 std::cout으로 문자열 한 줄을 내보내는, 실행 가능한 최소 프로그램입니다. 새 툴체인이나 빌드 설정이 제대로 동작하는지 확인할 때 첫 코드로 씁니다. main은 return 문이 없어도 0을 돌려주도록 규격에 정해져 있…
C++
int 변수 count에 1을 넣고 삼항 연산자로 5와 비교해 문자열을 고릅니다. 값을 담고 조건에 따라 분기하는 가장 기본적인 조합입니다. int는 표현 범위를 넘어서면 부호 있는 정수 오버플로가 되어 정의되지 않은 동작이 되므로, 큰 값을 다룰 때는 long lon…
C++
int add(int a, int b)를 파일 상단에 정의하고 main에서 add(1, 2)를 불러 3을 출력합니다. 반복되는 계산에 이름을 붙여 분리하는 가장 기본적인 단계입니다. C++ 컴파일러는 위에서 아래로 이름을 찾기 때문에, 정의를 main 아래로 옮기면 앞…
C++
User는 name과 level만 가진 집합체이고, User user{"Ada", 1}는 선언 순서대로 두 멤버를 채운 뒤 이름을 출력합니다. 설정값이나 좌표처럼 동작 없이 값만 묶을 때 이 형태를 씁니다. 사용자 정의 생성자를 하나라도 붙이면 집합체 자격을 잃어 이 …
C++
std::transform이 items의 각 원소에 람다를 적용하고, 출력 반복자로 같은 시작 위치를 넘겨 결과를 제자리에 덮어씁니다. 원본을 유지할 필요가 없을 때 메모리를 아끼는 방식입니다. 단항 형태의 transform은 입력과 출력 범위가 완전히 겹치는 경우를 …
C++
{1, 2, 3, 1}을 담은 벡터를 std::accumulate로 접어 7을 출력합니다. 입력만 받아 값을 돌려주는 계산을 부작용 없이 표현하려 할 때 이런 형태가 나옵니다. 결과 타입은 컨테이너가 아니라 세 번째 인자가 결정하므로, 초기값 0은 곧 int 누산을 뜻…
C++
std::launch::async를 명시해 람다를 별도 스레드에서 돌리고, get()으로 반환값 1을 받아 출력합니다. 계산을 백그라운드로 넘기고 결과는 나중에 한 번만 받으면 되는 자리에 맞습니다. 정책 인자를 생략하면 구현이 deferred를 선택해 get() 시점…
C++
try 블록에서 std::runtime_error를 던지고, catch가 기반 클래스인 std::exception을 const 참조로 받아 what() 메시지를 출력합니다. 실패할 수 있는 호출을 감싸는 기본 골격입니다. 예외를 값으로 받으면 파생 정보가 잘려 나가는 …
C++
std::ofstream으로 sample-1.txt를 열어 hello를 쓰고, close() 후 화면에 written을 남깁니다. 결과가 이미 확정된 데이터를 파일로 떨어뜨릴 때 쓰는 가장 짧은 형태입니다. 기본 열기 모드가 truncate라서 같은 이름의 파일이 있으…
C++
동일한 시그니처를 가진 percent와 flat 중 하나를 골라 strategy에 담고 100을 넘겨 90을 얻습니다. 할인 규칙처럼 값 몇 개로 동작이 갈릴 때 이렇게 함수를 값으로 다룹니다. auto가 추론한 타입은 int(*)(int)이므로 나중에 캡처가 있는 람…
C++
assert(1 + 1 > 1) 한 줄로 기대한 관계가 성립하는지 확인하고, 어긋나면 프로그램이 즉시 중단됩니다. 프레임워크를 붙이기 전 빠른 확인용으로 쓸 수 있습니다. NDEBUG가 정의된 릴리스 빌드에서는 이 매크로가 통째로 사라지므로, 검사에 기대는 로직을 안에…
C++
buffer.reserve(32)로 용량을 먼저 잡은 뒤 +=로 접두사와 숫자를 이어 붙입니다. 문자열을 조각조각 만들 때 중간 재할당을 줄이려는 목적입니다. 다만 대부분 구현이 15자 안팎까지는 힙 없이 객체 안에 담으므로, 32를 예약하는 순간 오히려 힙 할당이 앞…
Rust
main 안에서 println! 하나로 Hello, World 1! 문자열을 표준 출력에 내보냅니다. 새 프로젝트가 실제로 빌드되고 실행되는지 확인하는 첫 단계로 쓰입니다. println!은 함수가 아니라 매크로여서 포맷 문자열과 인자 개수가 컴파일 시점에 검사되고, …
Rust
let count = 1은 타입 표기 없이 기본 정수형 i32로 추론되고, 이어지는 if가 값을 만들어 label에 넣습니다. Rust에서 if는 문이 아니라 식이라 두 갈래가 같은 타입을 내놓아야 하며 여기서는 둘 다 &str입니다. 변수는 기본이 불변이라 값을 바꾸…
Rust
add는 i32 두 개를 받아 a + b를 돌려주고, main이 1과 2를 넘겨 3을 찍습니다. 함수 시그니처와 반환 타입을 익히는 출발점이 되는 형태입니다. 본문의 마지막 식에 세미콜론을 붙이는 순간 반환값이 ()가 되어 타입 불일치로 컴파일이 막히는 점이 초심자가 …
Rust
User 구조체를 name과 level 두 필드로 선언하고, 구조체 리터럴로 값을 채운 뒤 필드 하나를 출력합니다. 흩어진 데이터를 묶어 이름을 붙이는 첫 단계에서 이 형태를 씁니다. Rust에는 클래스가 없어서 데이터는 struct에, 동작은 분리된 impl 블록에 …
Rust
iter()로 벡터를 빌려 각 원소를 두 배로 만들고 collect로 새 Vec에 담습니다. 원본은 그대로 남아 뒤에서 다시 쓸 수 있고, 소유권째 넘겨 값을 소비하려면 into_iter()를 씁니다. map은 게으른 어댑터라 collect나 반복문이 없으면 클로저가 …
Rust
배열 [1, 2, 3, 1]을 iter()로 훑어 합계 7을 구해 출력합니다. 집계 로직을 반복문 없이 한 줄로 표현하고 싶을 때 쓰는 기본형입니다. let total: i32라는 타입 표기가 빠지면 컴파일되지 않는데, sum이 결과 타입에 대해 제네릭이라 컴파일러가 …
Rust
thread::spawn이 클로저를 새 OS 스레드에서 실행하고, join이 그 반환값 1을 받아 옵니다. 제목과 달리 async나 await는 등장하지 않으며, 작업 하나를 백그라운드로 떼어 놓고 결과를 기다릴 때 쓰는 형태입니다. join은 Result를 돌려주므로…
Rust
require_positive는 값이 0 이하면 Err, 아니면 Ok를 돌려주고 main은 1을 넣어 성공 쪽을 찍습니다. Rust에는 예외가 없어 실패 가능성이 반환 타입에 드러나고, 호출부는 그 값을 반드시 다뤄야 합니다. 오류를 String으로 두면 만들기는 쉽지…
Rust
제목은 읽기지만 실제 코드는 fs::write로 sample-1.txt에 hello를 저장한 뒤 written을 출력합니다. 열기·쓰기·닫기가 한 호출에 묶여 있어 작은 파일을 통째로 내보낼 때 적합합니다. 이 함수는 기존 내용을 잘라내고 덮어쓰므로, 뒤에 이어 붙이려…
Rust
Discount trait과 그것을 구현한 무필드 구조체 Percent가 있고, apply(100)이 정수 연산으로 90을 돌려줍니다. 할인율 같은 설정을 값이 아니라 타입으로 굳혀 둘 때 이 모양이 나옵니다. value * 9 / 10처럼 곱셈을 먼저 두어야 정수 나…
Rust
assert!(1 + 1 > 1)로 조건이 참인지만 확인하고, 거짓이면 패닉을 내며 멈춥니다. 값이 서로 같은지 보는 자리라면 assert_eq!가 더 낫습니다. 실패했을 때 좌우 값을 함께 찍어 주기 때문에, 조건이 깨졌다는 사실만 알려 주는 assert!보다 원인을…
Rust
String::with_capacity(32)로 버퍼를 미리 잡아 두고 push_str로 조각을 이어 붙입니다. 만들 문자열의 대략적인 길이를 아는 자리에서 이렇게 시작하면 중간 재할당이 줄어듭니다. 32는 상한이 아니라 초기 힌트라서, 넘어가면 오류가 아니라 더 큰 …
PHP
echo가 문자열 하나를 표준 출력으로 내보내고, 끝의 이스케이프가 줄바꿈으로 해석됩니다. 실행 환경과 파일이 제대로 연결됐는지 확인하는 첫 단계로 쓰입니다. 큰따옴표 안에서만 \n이 개행이 되고 작은따옴표로 감싸면 역슬래시와 n 두 글자가 그대로 나가며, 웹 응답에서…
PHP
문자열, 정수, 불리언을 각각 변수에 담고 var_dump로 타입과 값을 함께 출력합니다. 선언에 타입을 적지 않아도 대입한 값에 따라 타입이 정해집니다. echo는 true를 1로, false를 빈 문자열로 찍어 둘을 구분하기 어려우니 확인용으로는 var_dump를 …
PHP
두 정수를 더해 정수를 돌려주는 함수로, 파라미터와 반환 모두 타입이 선언돼 있습니다. 타입을 적어 두면 잘못된 인자가 함수 안까지 들어오지 못하고 호출 지점에서 걸립니다. 다만 기본 모드에서는 "3" 같은 숫자 문자열이 조용히 정수로 변환되며, 이를 막고 싶으면 파일…
PHP
생성자 파라미터 앞에 public을 붙여 title과 author를 선언과 대입 없이 한 번에 만듭니다. 필드가 곧 생성자 인자인 DTO나 값 객체에서 반복 코드를 걷어낼 때 씁니다. 승격된 프로퍼티의 기본값 자리에는 상수 표현식만 올 수 있고, 이 문법은 생성자에서만…
PHP
값만 나열해 만든 배열에는 0부터 시작하는 정수 키가 자동으로 붙고, print_r이 그 키까지 함께 보여 줍니다. 순서가 의미를 갖는 목록에 씁니다. PHP에는 별도의 리스트 타입이 없어 이것도 내부적으로는 키가 정수인 순서 있는 해시 맵이며, 중간 원소를 지우면 번…
PHP
기존 배열을 스프레드로 펼치고 뒤에 role을 다시 적어 새 배열을 만든 뒤, 원본과 사본을 나란히 출력해 원본이 그대로임을 보여 줍니다. 상태를 덮어쓰지 않고 변경본을 넘기는 방식이라 디버깅이 쉬워집니다. 문자열 키 스프레드는 PHP 8.1부터 가능하고, 같은 키가 …
PHP
여러 URL의 cURL 핸들을 하나의 멀티 핸들에 등록한 뒤 curl_multi_exec를 반복 호출해 전송을 겹쳐 실행합니다. 외부 API 두세 곳을 모아 와야 하는 화면에서 응답 시간이 합산되지 않고 가장 느린 요청 하나로 수렴합니다. 겹쳐 도는 것은 소켓 대기뿐이…
PHP
throw로 던진 RuntimeException을 같은 타입의 catch가 받아 메시지를 꺼냅니다. 잡을 타입을 좁게 적으면 예상한 실패만 처리하고 나머지는 위로 흘려보낼 수 있습니다. 내장 예외 대부분은 Exception을 상속하지만 TypeError 같은 Error…
PHP
file_get_contents()에 __FILE__을 넘겨 스크립트 자신을 읽고, 반환값이 false인지로 성공 여부만 출력합니다. 설정 파일처럼 크기가 뻔한 파일을 통째로 다룰 때 쓰는 방식입니다. 다만 내용 전체가 메모리에 올라가므로 로그처럼 큰 파일에는 fope…
PHP
요청 URI에서 경로만 뽑아 match로 응답을 고르는, 진입점 하나가 모든 요청을 받는 구조입니다. 파일마다 PHP를 두는 대신 index.php에서 분기할 때의 최소 형태입니다. 이 방식은 웹서버 rewrite 규칙이 존재하지 않는 경로까지 이 파일로 넘겨 줘야 비…
PHP
기대값과 실제값을 !==로 견주어 다르면 예외를 던지는 열 줄짜리 검증기입니다. 테스트 프레임워크를 붙이기 전 작은 스크립트를 확인할 때 쓸 수 있습니다. 언어 내장 assert()는 zend.assertions 설정에 따라 통째로 무시될 수 있지만, 이 함수는 언제나…
PHP
hrtime(true)로 나노초 정수를 두 번 찍어 그 사이 구간이 얼마나 걸렸는지 잽니다. 최적화 전후를 같은 조건에서 비교할 때 쓰는 최소 측정 틀입니다. microtime과 달리 단조 증가 시계라 시스템 시간이 조정돼도 값이 뒤로 가지 않고 부동소수 오차도 없습니…
AI 지식
AI에게 명확하고 구체적인 지시를 내리는 기술. 역할(Role), 맥락(Context), 작업(Task), 형식(Format)의 RCTF 구조로 프롬프트를 설계합니다. 모호한 요청보다 구체적 지시가 10배 나은 결과를 냅니다.
AI 지식
"단계별로 생각해보세요"(Let's think step by step)를 추가하면 복잡한 추론 정확도가 크게 향상됩니다. 특히 수학, 논리, 코딩 문제에 효과적. Few-shot CoT: 예시와 함께 추론 과정도 제공하면 더욱 강력합니다.
AI 지식
외부 지식을 검색해 LLM에게 제공하는 패턴. ①문서 → 청킹 → 임베딩 → 벡터 DB 저장 ②질문 임베딩 → 유사 문서 검색 ③검색 결과 + 질문 → LLM → 응답. 최신 정보, 도메인 특화, 검증 가능성이 장점입니다.
AI 지식
OpenAI: chat.completions.create, 스트리밍은 stream=True. Anthropic: messages.create, max_tokens 필수. 공통 패턴: 재시도 로직(tenacity), 타임아웃 설정, 비용 추적. 환경변수로 API 키 관리…
AI 지식
에이전트 루프: 계획(Plan) → 도구 선택(Act) → 관찰(Observe) → 반복. ReAct(Reasoning + Acting) 패턴. 메모리: Short-term(컨텍스트), Long-term(벡터 DB), Episodic(이전 경험). 에이전트는 목표 달성…
AI 지식
①모델 선택: 작은 작업은 GPT-4o-mini, Claude Haiku ②프롬프트 압축: LLMLingua로 30~50% 토큰 절감 ③캐싱: 동일 프롬프트 재사용 ④배치 처리: OpenAI Batch API로 50% 할인 ⑤결과 재사용: 이전 응답 캐시.
AI 지식
LLM 앱의 주요 보안 위협: ①Prompt Injection ②Jailbreak(안전 장치 우회) ③Training Data Extraction ④Model Inversion ⑤供给链 공격(악성 데이터셋). OWASP LLM Top 10을 기준으로 위협 모델링을 수행…
AI 지식
Transformers: 모델 로딩/추론/파인튜닝. Datasets: 표준 데이터셋 로드. Hub: 10만+ 모델, 데이터셋 공유. Spaces: 데모 앱 배포. Tokenizers: 고속 토크나이저. PEFT: LoRA 등 효율적 파인튜닝. Inference API:…
바이브 코딩
AI에게 코드를 요청할 때 현재 프로젝트 구조, 사용 중인 라이브러리, 목표, 제약사항을 함께 설명하세요. "Kotlin Spring Boot 프로젝트에서 PostgreSQL과 연동된 사용자 인증 REST API를 작성해줘"가 "인증 API 만들어줘"보다 10배 좋은 …
바이브 코딩
큰 기능을 한 번에 요청하기보다 작은 단위로 나눠 점진적으로 구현하세요. "전체 주문 시스템"보다 "주문 생성 API 엔드포인트 하나"를 먼저 구현하고 검토 후 확장하는 방식이 실수가 적습니다. AI 출력 결과를 항상 검증하고 다음 단계로 나아가세요.
바이브 코딩
기존 코드베이스의 스타일과 패턴을 AI에게 보여주면 일관된 코드가 생성됩니다. "이 파일의 스타일을 따라서 새로운 기능을 추가해줘"처럼 예시를 포함하면 팀 컨벤션에 맞는 코드를 받을 수 있습니다. Few-shot 프롬프팅 원리를 코드 생성에 적용한 것입니다.
바이브 코딩
디버깅 시 에러 메시지와 스택 트레이스를 가공 없이 그대로 AI에게 붙여넣으세요. 자신만의 해석을 추가하면 오히려 AI를 잘못된 방향으로 이끌 수 있습니다. 에러 전후의 코드 컨텍스트를 함께 제공하면 원인을 더 정확히 찾습니다.
바이브 코딩
"리팩터링해줘"는 너무 모호합니다. "이 코드를 Kotlin 코루틴을 사용해 비동기로 리팩터링해줘", "SOLID 원칙 중 단일 책임 원칙을 지키도록 분리해줘"처럼 구체적인 목표를 명시하면 원하는 방향의 리팩터링 결과를 받을 수 있습니다.
바이브 코딩
README, API 문서, 인라인 주석의 초안을 AI로 빠르게 작성하고 사람이 다듬는 워크플로우를 사용하세요. 코드를 AI에게 주고 "KDoc 형식으로 모든 public 함수에 문서 주석을 추가해줘"라고 하면 문서화 시간을 80% 단축할 수 있습니다.
바이브 코딩
설계한 시스템 구조를 AI에게 설명하고 "이 설계의 잠재적 문제점, SPOF(단일 장애점), 스케일링 병목은 무엇인가"를 질문하세요. AI는 경험 많은 리뷰어처럼 놓치기 쉬운 관점을 제시합니다. 아키텍처 결정 문서(ADR) 작성에도 활용하세요.
바이브 코딩
함수 시그니처와 비즈니스 로직을 AI에게 제공하고 "생각하지 못한 엣지 케이스와 경계값 조건을 모두 나열해줘"를 요청하세요. null 입력, 빈 컬렉션, 최대/최소값, 동시성, 타임아웃 등 놓치기 쉬운 케이스를 체계적으로 발견합니다.
바이브 코딩
느린 SQL 쿼리를 AI에게 보여주고 EXPLAIN 결과와 함께 최적화 제안을 받으세요. "이 쿼리가 느린 이유와 인덱스 전략, 쿼리 개선 방법을 알려줘"라고 요청하면 DBA 수준의 최적화 조언을 받을 수 있습니다.
바이브 코딩
AI는 빠르게 코드를 작성하지만 도메인 지식과 비즈니스 맥락이 없습니다. 시니어 개발자처럼 명확한 스펙을 주고, 결과를 검토하고, 피드백을 주는 역할을 해야 합니다. 아키텍처와 핵심 로직은 개발자가 책임지고 반복 작업은 AI에게 위임하세요.