디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

러스트 담론을 해체하다: 1. 러스트 언어 소개 및 주요 특징

나르시갤로그로 이동합니다. 2025.11.18 01:33:01
조회 36 추천 0 댓글 0

1. 러스트 언어 소개 및 주요 특징

이 장에서는 러스트(Rust) 언어의 설계 철학과 이를 구현하는 기술적 특징들을 분석합니다. 논의는 러스트가 대응하고자 한 시스템 프로그래밍 분야의 문제, 즉 '성능'과 '안전성'의 상충 관계를 살펴보는 것에서 시작합니다.

이어서, 이 목표를 달성하기 위해 러스트가 도입한 메모리 관리 모델(소유권, 빌림, 생명주기), C++의 계보를 잇는 '무비용 추상화' 원칙, 타입 시스템을 통한 안전성 확보 방식, 그리고 이를 뒷받침하는 표준화된 개발 도구 생태계 순으로 그 주요 특징을 검토합니다.

1.1 탄생 배경: '성능'과 '안전성'의 상충 관계

프로그래밍 언어는 각기 다른 이유를 가지고 개발되지만, 러스트(Rust)는 기존 패러다임에 새로운 방식으로 접근하여 주목을 받았습니다. 러스트의 개발 배경을 이해하기 위해서는, 시스템 프로그래밍 분야에서 오랫동안 논의되어 온 선택의 문제를 살펴볼 필요가 있습니다.

과거 저수준(low-level) 시스템 개발자들은 '성능'과 '안전성' 사이에서 선택을 해야 하는 상황에 놓였습니다. 한쪽에는 C/C++와 같은 언어가 있었습니다. 이들은 하드웨어를 직접 제어하여 높은 수준의 성능과 제어권을 제공했으나, 세그멘테이션 폴트(segmentation fault), 버퍼 오버플로(buffer overflow), 데이터 경쟁(data race)과 같은 메모리 오류의 처리 책임을 프로그래머에게 부여했습니다. 다른 한편에는 Ada처럼 언어 차원에서 높은 수준의 안전성과 예측 가능성을 추구하며 특정 고신뢰성 시스템 분야에서 사용되어 온 언어가 존재했습니다. 또 다른 사례로는 Java나 C#과 같은 가비지 컬렉터(GC) 기반의 언어들이 있었습니다. 이들은 자동 메모리 관리를 통해 메모리 안전성을 제공했지만, GC의 런타임 오버헤드와 동작의 예측 불가능성으로 인해 실시간 시스템이나 운영체제 커널과 같은 일부 시스템 영역에서는 사용이 제한되었습니다.

모질라(Mozilla)의 연구 프로젝트로 시작된 러스트는 '성능과 안전성'의 상충 관계를 해결하려는 목표를 가지고 개발되었습니다. 즉, C++ 수준의 성능을 가지면서도, GC 없이 메모리 안전성을 보장하는 언어를 만들고자 한 것입니다. 이 목표를 달성하기 위해, 러스트는 설계 초기부터 안전성, 성능, 동시성이라는 핵심 목표를 설정했습니다.

안전성 (safety)

러스트의 핵심 설계 원칙 중 하나는 메모리 안전성입니다. 컴파일 시점에 코드의 메모리 사용 규칙을 검사하여, 메모리 오류로 인해 발생할 수 있는 프로그램의 비정상적 종료, 데이터 오염, 시스템 제어권 탈취와 같은 문제들을 방지하는 것을 목표로 합니다. 이는 프로그래머의 실수 가능성을 줄이기 위해, 컴파일러가 오류가 발생할 수 있는 코드의 컴파일을 차단하는 접근법입니다.

성능 (performance)

러스트는 시스템 프로그래밍 언어를 지향하며, 성능을 핵심 목표 중 하나로 삼았습니다. GC와 같은 런타임에 의존하지 않고, 하드웨어의 성능을 효율적으로 사용할 수 있도록 설계되었습니다. '무비용 추상화(Zero-Cost Abstractions)' 원칙은, 개발자가 고수준의 추상화 기능을 사용하더라도 추가적인 런타임 비용이 발생하지 않도록 보장하는 러스트의 설계 원칙을 나타냅니다.

동시성 (concurrency)

멀티코어 프로세서 환경에서, 여러 스레드가 충돌 없이 데이터를 공유하도록 작성하는 것은 복잡한 문제입니다. 러스트는 언어의 소유권 시스템을 통해, 컴파일 시점에 '데이터 경쟁'과 같은 동시성 관련 오류를 찾아내고 방지합니다. 이를 통해 개발자들은 '두려움 없는 동시성(fearless concurrency)'이라는 개념을 경험할 수 있습니다. 여기서 '두려움 없는'이란, 데이터 경쟁과 같은 특정 유형의 버그가 컴파일러에 의해 방지된다는 기술적 보장을 바탕으로, 개발자가 동시성 코드를 작성할 수 있음을 의미합니다.

결론적으로, '왜 러스트인가?'라는 질문은 이 세 가지 목표의 교차점에서 설명될 수 있습니다. 러스트는 성능, 안전성, 동시성이라는, 이전에는 동시에 달성하기 어려웠던 가치들을 하나의 언어 안에서 구현하려는 시도입니다. 이 목표를 달성하기 위해, 러스트는 '소유권'이라는 개념을 언어의 핵심 기능으로 도입했습니다.

1.2 소유권, 빌림, 생명주기를 통한 메모리 관리

러스트의 목표인 '가비지 컬렉터(GC) 없는 메모리 안전성'은 기존 방식과 구별됩니다. C/C++의 수동 관리는 오류 발생 가능성이 있으며, Java의 GC는 런타임 오버헤드를 수반합니다. 러스트는 이 문제를 해결하기 위해, 런타임이 아닌 컴파일 타임에 메모리 관리 규칙을 강제하는 시스템을 도입했습니다. 이는 소유권(ownership), 빌림(borrowing), 생명주기(lifetimes)라는 세 가지 개념으로 구성됩니다.

1. 소유권 (ownership): 모든 값에는 소유자가 있다

러스트의 메모리 관리는 '소유권' 규칙을 기반으로 합니다.

  • 모든 값(value)은 단 하나의 소유자(owner) 변수만을 가집니다.
  • 소유자가 스코프(scope, 유효 범위)를 벗어나면, 그 값은 자동으로 메모리에서 해제(drop)됩니다.
  • 소유권은 다른 변수로 '이동(move)'될 수 있으며, 이동 후 원래의 소유자는 더 이상 유효하지 않습니다.

이 규칙들은 '이중 해제(double free)' 오류를 방지합니다. 또한, 소유권이 이동하면 이전 변수는 사용할 수 없으므로 '해제 후 사용(use-after-free)' 오류가 컴파일 시점에 방지됩니다.

2. 빌림 (borrowing): 소유권 없이 접근하기

소유권 이동만이 유일한 데이터 전달 방식일 경우, 비효율이 발생할 수 있습니다. 이를 해결하기 위해 러스트는 '빌림' 개념을 제공합니다. 이는 데이터의 소유권을 넘기지 않고, 특정 스코프 내에서 데이터에 대한 접근 권한(참조, reference)을 일시적으로 허용하는 것입니다.

'빌림'에는 다음과 같은 규칙이 적용됩니다.

  • 특정 데이터에 대해, 여러 개의 '읽기 전용 빌림(immutable borrow, &T)'은 동시에 존재할 수 있습니다.
  • '수정 가능한 빌림(mutable borrow, &mut T)'은 단 하나만 존재할 수 있으며, 이 빌림이 유효한 기간에는 다른 빌림이 허용되지 않습니다.

컴파일러는 이 규칙을 통해, 하나의 데이터에 대해 동시 수정 시도나 읽기와 수정의 동시 시도를 컴파일 시점에 차단합니다. 이것이 러스트가 '데이터 경쟁(data race)'을 방지하는 원리입니다.

3. 생명주기 (lifetimes): 빌린 데이터의 유효 기간 보장

'생명주기'는 '빌림(참조)'이 유효한 스코프, 즉 '생존 기간'을 컴파일러에 명시하는 역할을 합니다.

컴파일러는 생명주기 분석을 통해, 빌려온 데이터가 소유자에 의해 먼저 해제되어 발생하는 '댕글링 포인터(dangling pointer)' 문제를 방지합니다. 즉, 데이터의 실제 생존 기간보다, 그것을 빌려온 참조의 생존 기간이 더 길어지는 상황을 허용하지 않습니다. 컴파일러가 생명주기를 자동으로 추론하는 경우가 많으나, 추론이 어려운 경우 개발자가 명시적으로 생명주기를 지정할 수 있습니다.

이 세 가지 개념, 즉 소유권으로 자원의 생애를 관리하고, 빌림으로 데이터 접근을 제어하며, 생명주기로 댕글링 포인터를 방지하는 시스템은 '빌림 검사기(borrow checker)'라는 컴파일러의 일부에 의해 강제됩니다. 이 검사기는 '성능 저하 없는 안전성'을 구현하는 메커니즘입니다.

1.3 무비용 추상화(Zero-Cost Abstractions)의 계보

고수준 추상화와 저수준 제어

프로그래밍 언어에서 '추상화 수준'과 '성능'은 상충 관계에 있는 것으로 인식되어 왔습니다. 파이썬(Python)이나 자바(Java) 같은 고수준 언어는 개발자에게 추상화 기능을 제공하지만, 고수준 기능을 사용할수록 런타임 비용(overhead)이 발생하는 경향이 있었습니다. 반대로 C언어와 같은 저수준 언어는 상대적으로 높은 성능을 제공했지만, 개발자는 수동으로 메모리 등을 제어해야 했으며, 이는 코드의 가독성 및 유지보수성에 영향을 미칠 수 있었습니다.

C++과 러스트는 이 상충 관계에 대해 사용하지 않는 것에 대해서는 비용을 지불하지 않는다는 철학을 제시합니다. 이것은 '무비용 추상화(Zero-Cost Abstractions, ZCA)' 원칙입니다. ZCA란, 개발자가 이터레이터(iterator), 제네릭(generics), 트레잇(trait) 등 고수준 추상화 기능을 사용해 코드를 작성하더라도, 컴파일된 최종 결과물은 저수준에서 수동으로 최적화한 코드와 동일하거나 유사한 성능을 내는 것을 목표로 하는 원칙입니다.

이 원칙의 기원은 C언어에서 찾을 수 있습니다. C는 struct를 통해 개발자가 메모리 레이아웃을 제어하게 하고, inline 함수나 매크로를 통해 함수 호출 비용을 줄이는 등, 프로그래머가 수동으로 비용 없는 코드를 작성할 수 있는 수단을 제공했습니다. 예를 들어, sizeof 연산자를 사용하여 자료구조의 메모리 크기를 컴파일 타임에 계산하거나, #define 매크로를 활용하여 코드를 컴파일 전에 확장시키는 방식은 런타임 오버헤드 없이 특정 기능을 구현하는 C의 초기 ZCA 형태라 할 수 있습니다.

C++은 이 기반 위에 언어 차원의 추상화를 구축했습니다. 핵심 요소는 템플릿(templates)과 RAII(자원 획득은 초기화다)였습니다.

  • 템플릿은 타입 검사를 수행하며 컴파일 시점에 여러 타입에 대한 코드를 생성합니다.
  • RAII는 소멸자를 통해 자원 관리를 자동화하는 패턴입니다.

러스트는 C/C++의 ZCA 철학을 계승하며, '소유권' 시스템을 도입했습니다. 즉, 추상화에 대한 비용을 런타임이 아닌 컴파일 타임에 처리하여 성능 저하를 최소화하는 동시에, 빌림 검사기를 통해 추상화가 메모리 안전 규칙을 준수하도록 강제하는 것입니다.

대표적인 예는 이터레이터입니다.

// 1부터 99까지의 숫자 중, 3의 배수만 골라 제곱한 값들의 합을 구하는 코드
let sum = (1..100).filter(|&x| x % 3 == 0).map(|x| x * x).sum::<u32>();

이 코드는 filter, map, sum과 같은 고수준 메서드를 연쇄적으로 사용하여 작업을 선언적으로 기술합니다. C언어에서는 for 루프와 if 조건문, 별도의 합계 변수를 사용하는 명령형 방식이 일반적입니다. 러스트 컴파일러는 이 고수준 이터레이터 코드를 최적화하여, 수동으로 작성한 for 루프와 유사한 성능의 기계 코드를 생성합니다. filter map과 같은 중간 단계의 호출 비용은 컴파일 과정에서 인라이닝 등을 통해 제거될 수 있으며, 또한 메모리 접근이 컴파일 시점에 안전한지 검사합니다.

이러한 컴파일 시점 최적화는 러스트의 타입 시스템과 제네릭, 그리고 컴파일러의 인라이닝(inlining)과 모노모피제이션(monomorphization) 같은 기술을 통해 이루어집니다. 이는 런타임 비용을 줄이는 대신 컴파일 타임에 더 많은 처리를 수행하는 방식입니다.

1.4 타입 시스템과 패턴 매칭을 통한 안전성 확보

컴파일 시점의 오류 검사

러스트의 '안전성'은 메모리 관리 외의 영역을 포함합니다. 러스트는 정적 타입 시스템(static type system)을 통해, 프로그램이 처할 수 있는 다양한 상태와 오류 가능성을 코드 수준에서 명시적으로 표현하고, 컴파일러가 이를 강제하도록 설계되었습니다. 이는 잠재적인 런타임 오류를 컴파일 시점에 발견하여, 프로그램의 안정성을 높이는 방식입니다. 이 방식은 러스트의 타입 시스템과 패턴 매칭(pattern matching)을 기반으로 합니다.

러스트 타입 시스템의 특징 중 하나는 열거형(enum)입니다. 일부 언어의 enum이 상수를 나열하는 용도로 사용되는 것과 달리, 러스트의 enum은 각 변형(variant)이 서로 다른 타입과 개수의 데이터를 포함할 수 있는 데이터 구조입니다. 러스트는 이를 활용하여 프로그램의 불확실한 상태를 다룹니다.

대표적인 예는 Option<T> 타입이며, 이는 널 포인터(null pointer) 관련 문제를 처리하기 위해 사용됩니다. 러스트에는 null이 존재하지 않습니다. 대신, 값이 있을 수도 있고 없을 수도 있는 상황을 Some(value) 또는 None이라는 두 가지 상태를 가진 Option 열거형으로 표현합니다. 이를 통해 컴파일러는 개발자가 None일 경우를 처리하도록 요구하며, 'null 포인터 역참조'와 같은 런타임 오류 발생 가능성을 컴파일 시점에 검사합니다. 마찬가지로, 성공 또는 실패 가능성이 있는 연산은 Result<T, E> 타입을 통해 Ok(value) 또는 Err(error) 상태를 명시적으로 반환하도록 하여, 오류 처리가 누락되는 경우를 방지합니다.

이러한 타입들을 다루는 도구로 패턴 매칭이 사용됩니다. 러스트의 match 표현식은 Option이나 Result와 같은 열거형의 모든 가능한 경우를 남김없이 검사하도록 컴파일러가 강제합니다. 이를 소진 검사(exhaustiveness checking)라고 합니다.

let maybe_number: Option<i32> = Some(10);

// `match` 표현식은 모든 가능한 경우를 빠짐없이 검사하도록 강제하는데,
// 이를 '소진 검사(exhaustiveness checking)'라고 합니다.
// 따라서 `None` 경우를 처리하는 코드를 빠뜨리면 컴파일 에러가 발생합니다.
match maybe_number {
    Some(number) => println!("숫자: {}", number),
    None => println!("숫자가 없습니다."),
}

이처럼 프로그래머가 특정 상태나 오류 케이스 처리를 누락하는 경우, 컴파일러가 오류를 발생시켜 이를 방지합니다.

요컨대, 러스트의 타입 시스템은 프로그램의 상태를 명시적으로 모델링하게 하고, 패턴 매칭은 그 모든 상태가 처리되도록 강제합니다. 이는 런타임(runtime)에 발생할 수 있는 오류를 컴파일 시점에 발견하려는 러스트의 설계 원칙을 보여주는 예입니다.

1.5 생태계: 카고(Cargo)와 크레이트(Crates.io)

빌드 시스템과 패키지 매니저

프로그래밍 언어의 채택에는 언어 자체의 특징 외에 생태계와 도구가 영향을 미칩니다. C/C++와 같은 일부 시스템 프로그래밍 언어들은 공식 지정된 패키지 관리자나 빌드 시스템이 부재하여, 개발자들이 프로젝트마다 다른 도구(Makefile, CMake 등)를 사용하고 의존성을 관리하는 경우가 있었습니다.

러스트는 언어 설계 시점에 개발 환경 관련 도구를 제공하는 것을 목표 중 하나로 설정했습니다. 그 결과물은 공식 빌드 시스템 겸 패키지 매니저인 카고(Cargo)와 공식 패키지 저장소인 크레이트(Crates.io)입니다.

카고는 코드 컴파일을 포함하여 프로젝트 생명주기를 관리하는 커맨드 라인 도구입니다. 개발자는 명령어를 통해 다음 작업을 수행할 수 있습니다.

  • 프로젝트 생성 (cargo new): 표준화된 디렉터리 구조를 가진 새로운 프로젝트를 생성합니다.
  • 의존성 관리: cargo.toml 설정 파일에 필요한 라이브러리(러스트에서는 '크레이트'로 지칭)의 이름과 버전을 명시하면, 카고가 해당 라이브러리와 그 하위 의존성을 다운로드하고 관리합니다.
  • 빌드 및 실행 (cargo build, cargo run): 명령어를 통해 프로젝트를 컴파일하고 실행합니다.
  • 테스트 및 문서화 (cargo test, cargo doc): 프로젝트에 포함된 테스트 코드를 실행하고, 소스코드 주석을 바탕으로 HTML 문서를 생성합니다.

크레이트(Crates.io) Node.js NPM이나 파이썬의 PyPI와 유사한 중앙 집중형 패키지 저장소입니다. 이곳은 러스트 개발자들이 라이브러리를 공유하고 사용할 수 있는 플랫폼 역할을 합니다.

카고는 프로젝트 설정, 의존성 관리, 빌드, 테스트 과정을 표준화된 도구로 통합하여, 개발 환경 설정 및 의존성 관리의 부담을 줄이는 것을 목표로 합니다.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 대박 날 것 같아서 내 꿈에 나와줬으면 하는 스타는? 운영자 25/11/17 - -
AD 겨울가전 SALE! 쿨한 겨울 HOT세일 운영자 25/11/12 - -
공지 프로그래밍 갤러리 이용 안내 [97] 운영자 20.09.28 48714 65
2903349 창업아이템 구현까지 얼마나 걸린다고봄? 프갤러(220.118) 20:07 18 0
2903348 알고 있다는 착각 [6] ♥KiTTY냥덩♥갤로그로 이동합니다. 19:31 39 0
2903343 국회 방송 보고 심란한 사람 손 미치겠음 어지러움. 넥도리아(220.74) 19:15 20 0
2903342 이 케이스 디자인 좋다 [1] 발명도둑잡기(39.7) 19:07 21 0
2903341 냥덩이 미래 신부감 이미지 [1] 발명도둑잡기(39.7) 19:05 24 0
2903340 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ [9] ♥KiTTY냥덩♥갤로그로 이동합니다. 19:01 38 0
2903339 아무것도 안하고 뇌빼고 게임만 하면서 살고싶다 [1] ㅇㅇ(118.235) 19:00 15 0
2903337 채권 주식 달러 [7] ♥KiTTY냥덩♥갤로그로 이동합니다. 18:19 52 0
2903335 방화벽싸개새끼들 [11] 개멍청한유라갤로그로 이동합니다. 17:46 72 0
2903334 자녀 출산 보조금의 문제는 가난한 청년은 연예, 결혼 포기란거 [1] 발명도둑잡기(39.7) 17:45 22 1
2903333 감동란씨라는 여캠 요즘 내란옹호방송 하는것같더라 [1] 헬마스터갤로그로 이동합니다. 17:40 41 0
2903332 배고파서 버거킹 사먹을까 하다가 그냥 집 가는중 [2] 프갤러(211.235) 17:22 26 0
2903331 “시체팔이 족속은 민주당 향한 것” 발명도둑잡기(39.7) 17:19 19 0
2903330 뉴욕 시장 빨갱이 당선. 인류가 진보하기 시작 [2] 프갤러(211.234) 17:07 71 0
2903329 아내 몸에 욕창 생겼는데…육군 부사관, 유기 혐의로 체포 발명도둑잡기(39.7) 16:57 25 0
2903328 이준석 의원 비서관, '성비위 혐의'로 검찰에 송치 발명도둑잡기(39.7) 16:55 17 0
2903327 부품 다시 구해서 1월부터 서버 재가동 예정 [1] 나르시갤로그로 이동합니다. 16:46 20 0
2903326 개발자라면 사랑하는사람 감시하는 서버정도는 있어야됨 [6] 따당갤로그로 이동합니다. 16:44 72 0
2903325 러빨러 결국 회사 그만 두었나보네 ㅎㅎ [2] 나르시갤로그로 이동합니다. 16:43 35 0
2903324 러스트 담론을 해체하다: 8. '만능 해결책 서사'와 집단 방어 기제.. 나르시갤로그로 이동합니다. 16:18 27 0
2903323 모든 개발자 말고 러스트 프로그래머 화이팅 [1] 프갤러(211.234) 16:14 38 0
2903322 시발 거주지 관할 센터에 가야 구직급여 신청 가능하네 [4] 프갤러(211.234) 15:55 36 0
2903321 모든 개발자들 화이팅이얌 [3] 프갤러(118.235) 15:36 46 0
2903319 러스트 담론을 해체하다: 7. 산업 적용의 제약 조건 [2] 나르시갤로그로 이동합니다. 15:32 19 0
2903318 파이썬 홍정모 강의로 입문하는거 괜찮나여? [3] 프갤러(106.245) 15:26 45 0
2903317 어제 오퍼레터 받았는데 안간다해도댐? [1] 프갤러(211.234) 14:53 26 0
2903316 지금 듣는 이 노래 어때? ㅁㅁㅅ갤로그로 이동합니다. 14:49 14 0
2903315 파이썬 공부부터 시작할려고 하는데 추천 좀 [1] 프갤러(106.245) 14:44 26 1
2903314 일단 구직급여를 한번 받아놔야 재취업 수당 있으니까 프갤러(211.234) 14:37 24 0
2903313 30억 받는 대신에 이거 할거냐? [3] 프갤러(119.207) 14:27 45 0
2903312 정규직 -> 프리랜서 전환하면 기대출어캐되나요?? [1] 프갤러(211.235) 14:26 25 0
2903310 진지하게 진로상담 부탁드립니다 형님들.. 프갤러(211.42) 14:13 27 0
2903307 [애니뉴스] YxD Labs유튜브 링크 공유 프로그램 디자인 프갤러(121.172) 13:55 22 0
2903306 러스트 담론을 해체하다: 6. '무비용 추상화'의 실제 비용 분석 나르시갤로그로 이동합니다. 13:46 17 0
2903305 러스트 담론을 해체하다: 5. '개발자 경험(DX)'의 성과와 비용 나르시갤로그로 이동합니다. 13:17 25 0
2903304 근데 cgv는 ㄹㅇ 뭐냐 [6] 공기역학갤로그로 이동합니다. 13:11 67 0
2903303 요번주 금요일에 10시에 이사갈지 결정된다니까요. 넥도리아(220.74) 13:09 19 0
2903302 클린 갤 차단 목록에 그 보석도 있어야지 [10] 프갤러(110.8) 13:04 64 0
2903301 냥덩이하고 발도잡 이 두명만없으면 클린프갤인데 갤관리 안하냐 [2] 프갤러(182.231) 12:30 48 2
2903300 비발디 브라우저 오픈소스 된이유 [4] 타이밍뒷.통수한방(1.213) 12:13 62 0
2903299 개씨발 애새끼번식한게 뭐 잘했다고 혜택 더 주는지 씨발 ㅋㅋㅋㅋㅋ [4] 타이밍뒷.통수한방(1.213) 12:04 44 0
2903298 [대한민국] 암탉이 울면 나라가 망한다 프갤러(121.172) 12:01 15 0
2903297 중국어 단어 외우기 [20] 재현갤로그로 이동합니다. 11:51 79 0
2903296 음란물 올리면 차단당함 이갤은. [3] 넥도리아(220.74) 11:46 29 0
2903295 데탑 ip 차단 먹어서 글이랑 댓글 컴으로 못씀 [6] chironpractor갤로그로 이동합니다. 11:42 55 0
2903294 인지과학조져라 손발이시립디다갤로그로 이동합니다. 11:39 37 0
2903293 러스트 담론을 해체하다: 4. '소유권' 모델의 재평가와 설계 철학 나르시갤로그로 이동합니다. 11:29 15 0
2903292 노트북 바이오스 업데이트 완료 ㅇㅇ(119.56) 11:25 13 0
2903291 최원종 이 새끼 진짜 개새네 프갤러(39.7) 11:16 42 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2