전체 글 260

해시(Hash)

1. 해싱을 이용한 탐색 다양한 방법으로 구현한 맵의 최고성능은 시간 복잡도 O(logn)이다.그러나, 이보다 더 빠른 탐색시간을 갖는 해싱으로 맵을 구현하면 탐색 연산의 이론적인 시간 복잡도가 O(1)이 된다.   1.1 해싱이란?  해싱은 하나의 문자열을 보다 빨리 찾을 수 있도록 해시 함수에 문자열 입력값을 넣어, 주소에 직접 접근할 수 있는 짧은 길이의 값이나 키 특정한 값으로 추출하는 것을 의미한다.    문자열을 찾을 때, 키값의 문자를 일일이 비교하는 것이 아니라, 문자열에 산술적인 연산으로 해시 키를 계산하여 인덱스(항목이 저장된 위치)에 직접 문자열을 저장해 둔다면, 찾을 때는 한 번의 해시 키 계산만으로 도 쉽게 찾을 수 있게된다.이렇게 키값의 연산에 의해 직접 접근이 가능한 구조를 H..

빅 오(Big O) : N개의 원소일 때, 몇 단계가 필요한가?

빅 오(Big O) Computer Scientist들은 서로간에 시간 복잡도를 쉽게 소통할 목적으로 자료구조와 알고리즘의 효율성을 간결하고 일관된 언어로 설명하기 위해 수학적 개념을 차용했다. 이러한 개념이 빅 오(Big O) 표기법이다. 빅 오(Big O)가 의미하는 것 - 데이터 원소가 N개일 때, 알고리즘에 몇 단계가 필요한가? [배열 읽기에 필요한 단계 수] : O(1) → (N과 무관하게) 배열에 원소가 몇 개든 배열에서 읽기는 항상 한 단계면 된다. [N개 배열의 선형 검색 단계 ] : O(N) → 배열의 선형 검색에는 N단계가 필요하다 [이중 배열의 선형 검색 단계] : O(N^2) → 이중 for문을 사용하므로 N의 2승 단계가 필요하다. 빅 오(Big O)가 나타내는 또다른 깊은 의미 ..

Linux System Programming : 링크 파일 생성

링크 파일 생성 링크(Link)는 같은 파일이나 디렉터리에 여러 이름으로 접근할 수 있게 하는 새로운 이름을 말한다. 링크 기능을 이용하면 이전 시스템과의 호환성을 유지하거나, 경로가 복잡한 파일에 간단한 경로를 제공하는 등 편의성을 높일 수 있다. 구체적인 예시로, 루트 디렉터리 (/) 아래의 lib 디렉터리는 예전 시스템과의 호환을 위해 필요한데, 현재는 실제 디렉터리가 있는게 아니라 /usr/lib 디렉터리에 대한 심벌릭 링크로 유지하고 있다. 링크는 하드 링크와 심벌릭 링크 두 가지가 있으며, 둘 다 ln명령으로 생성한다. 프로그램에서도 함수를 사용해 하드 링크와 심벌릭 링크를 생성할 수 있다. 1. 하드 링크 (Hard Link) - 하드 링크(Hard Link)는 파일에 접근할 수 있는 파일명..

Linux System Programming : 파일 접근 권한 제어

파일 접근 권한 제어 stat 구조체의 st_mode 항목에는 파일의 종류와 접근 권한 정보가 저장된다. st_mode 항목의 값을 해석하려면 sys/stat.h파일에 정의된 상수와 매크로를 이용해야 한다. st_mode의 구조 먼저, st_mode 항목에 저장되는 값의 구조를 알아야 상수와 매크로의 역할을 이해할 수 있다. (st_mode: 파일의 종류와 접근권한 정보) st_mode 항목의 데이터형인 mode_t는 unsigned int로 정의되어 실제로 16비트를 사용한다. buf - 파일의 상태 및 정보를 저장할 buf 구조체 struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ ..

Linux System Programming: 파일 정보 검색

inode로부터 검색할 수 있는 정보는 파일의 종류, 접근 권한, 하드 링크 개수, 소유자의 UID와 GID, 파일의 크기, 파일 접근 시각, 파일 수정 시각, 파일의 inode 변경 시각 등이다. inode 정보를 검색하면 sys/stat.h 파일에 정의되어 있는 stat 구조체에 저장된다. 파일 정보 검색 함수 기능 함수 파일 정보 검색 함수 int stat(const char * pathname, struct stat *statbuf); int fstat(int fd, struct stat *statbuf); 파일 접근 권한 함수 기능 함수 파일 접근 권한 확인 int access(const char *pathname, int mode); 파일 접근 권한 변경 int chmod(const char ..

리눅스(유닉스)의 파일 시스템

리눅스(유닉스)의  파일 시스템 살펴보고자 하는 파일시스템은 전통적인 유닉스의 파일시스템으로 리눅스에서도 이 파일시스템을 선택적으로 사용할 수 있다. 유닉스 시스템의 디스크를 논리적인 구조로 나타내면 아래 그림 과 같이 부트 블록, 수퍼 블록, inode 리스트 그리고 데이터 블록들로 나눌 수 있다.  - 부트 블록 : 운영체제를 주기억장치에 올리는 역할을 하는 프로그램이 들어 있는 영역으로, 윈도우의 부트 레코드와 유사하다.  - 수퍼 블록 : 디스크에 대한 다양한 정보를 저장하고 있는 곳으로, 전체 블록의 수, 블록의 크기, 사용 중인 블록의 수, 사용할 수 있는 블록의 번호, inode 리스트의 크기, 사용할 수 있는 inode의 번호 등의 정보를 저장한다.  - inode 리스트 :..

디렉터리 내용 읽기

디렉터리 내용 읽기 디렉터리의 내용을 읽으려면 해당 디렉터리를 열고 정보를 읽을 수 있어야 한다. 디렉터리 열기 : opendir() - opendir() 함수는 인자로 지정된 디렉터리를 열고 해당 디렉터리에 대한 디렉터리 스트림을 생성, 이 스트림의 포인터를 리턴한다. #include #include DIR *opendir(const char *name); name : 열고자 하는 디렉터리 명 DIR 객체(opendir() 함수가 디렉터리 열기에 성공하면 반환하는)에는 열린 디렉터리에 정보가 있으며, dirent.h 파일에 typedef struct__dirstream DIR로 정의되어있다. opendir() 함수는 실패하면 NULL을 반환한다. 디렉터리 닫기 : closedir() - 인자로 지정한 ..

안드로이드(Android) 4대 컴포넌트(구성요소)

안드로이드(Android) 4개의 컴포넌트(구성요소) 컴포넌트(Component)란? - 프로그래밍에 있어 재사용이 가능한 각각의 독립된 모듈 ​ 안드로이드의 4대 컴포넌트 1. Activity (액티비티) 2. Service (서비스) 3. Broadcast Receiver (방송 수신자) 4. Content Provider (콘텐츠 제공자) 이 네 가지 컴포넌트들은 각각 독립적인 형태로 존재하며, 고유의 기능을 수행한다. 또한 각 컴포넌트들은 아래와 같이 Intent를 통해서 서로 상호작용 한다. 그렇다면 Intent가 무엇이길래 넷 사이에 존재할까? - 애플리케이션 컴포넌트 간에 작업 수행을 위한 정보 전달 역할을 한다. (통신수단) 달리 표현하면, "하나의 액티비티가 다른 액티비티를 실행할 수 있..

: : Kotlin 2023.11.09

디렉터리 관리하기 (위치 검색, 이름 변경, 이동)

현재 작업 디렉터리의 위치 검색 : getcwd(), get_current_dir_name() 현재 작업 디렉터리의 위치를 파악할 때 사용하는 함수는 getcwd(), get_current_dir_name(), getwd()이다. 이 중, getcwd(), get_current_dir_name() 함수에 대해 알아보자. (※ 현재 디렉터리의 위치를 검색할 때 쓰는 명령어는 pwd이다.) 현재 작업 디렉터리 위치 검색 (1) : getcwd() getcwd() 함수는 현재 디렉터리의 절대 경로를 리턴한다. #include char *getcwd(char *buf, size_t size); buf : 현재 디렉터리의 절대 경로를 저장할 버퍼 주소, size : 버퍼의 크기 함수 인자를 지정하는 방법은 아래 ..

SSH (Secure Shell)

SSH란? SSH는 네트워크 상 다른 컴퓨터의 쉘에 접속하기 위해 사용하는 프로토콜이다. 기존 유닉스 시스템 셸에 원격 접속하기 위해 사용하던 텔넷은 암호화가 이루어지지 않아 계정 정보 노출 위험이 높으므로, 여기에 암호화 기능을 추가하여 1995년에 나온 프로토콜이다. 기본 포트는 22번으로, 셸로 원격 접속하는 것이므로 기본적으로 CLI상에서 작업을 하게 된다. 사용처 서버 관리자가 원격으로 서버를 관리할 때, RaspberryPI 등에 원격으로 접속하여 설정할 때 등. 내부 동작을 간단하게 알아보자면 SSH 서버인 데몬(daemon)이 있고, SSH 클라이언트가 접속을 시도하면 다음과 같은 순서가 진행된다. 서버와 클라이언트는 서로의 공개키(Public key)를 알고있다. 클라이언트가 서버에 연결..