Bourne Shell (sh): 유닉스에서 가장 초기의 쉘로, 많은 리눅스 배포판에서 기본적으로 설치됩니다.
C Shell (csh): C언어의 문법을 모방하여 사용성을 향상시킨 쉘입니다. 다양한 편리 기능을 제공하지만, 처리 속도가 느린 단점이 있습니다.
Korn Shell (ksh): Bourne Shell을 확장한 쉘로, C Shell의 기능을 포함하며 빠른 처리 속도를 자랑합니다.
Bash (Bourne Again Shell): 현재 가장 널리 사용되는 쉘로, Bourne Shell의 기능을 기반으로 하여 Korn Shell과 C Shell의 장점을 결합했습니다. sh 셸을 기반으로 만들어졌으며 리눅스에서 사용자 계정을 생성할때 특별한 셀을 지정하지 않으면 기본적으로 사용되는 셸입니다. bash는 sh를 기반으로 korn shell(ksh) + C shell(csh)의 장점을 모아 만들었으며 무로료 배포되어 빠르게 시장을 점유했습니다.
Z Shell (zsh): Bash의 기능을 확장하고 사용성을 더욱 향상시킨 쉘로, macOS Catalina 버전부터 기본 쉘로 사용됩니다.
tcsh Shell:csh의 기능을 강화한 쉘입니다.
내가 원하는 셸을 사용해 보자
내가 사용 중인 셸 확인하기
# echo $SHELL
# env|grep SHELL
변경 가능한 셸 확인하고, 일시적으로 변경하기
# cat /etc/shells
# /bin/sh
변경 가능한 셸 확인하고 , 셸 변경하기
# cat /etc/shells
# chsh -l
(방법1)
# chsh ubuntu -s /bin/dash <- 예시로 우분트 셸을 dash셸로 변경해보기
(방법2)
# vi /etc/passwd <- vi 편집기로도 변경 가능
정상에 오를 때까지는 힘들고 도전적이지만, 정상에 서면 전에 보지 못했던 경치와 가능성을 볼 수 있다."
조건문
조건문은 주어진 조건에 따라 다른 코드를 실행하게 하는 구조입니다.
C언어에서는 주로 if, else, else if, switch 문을 사용합니다.
if문
if 문은 마치 도로의 분기점과 같습니다. 어떤 조건을 만족하면 한 길로 가고, 그렇지 않으면 다른 길로 갑니다. 조건의 복잡성에 따라 여러 개의 분기로 나뉠 수 있습니다.
#include <stdio.h>
int main() {
int score = 85;
if (score >= 90) {
printf("A학점입니다.\n");
} else if (score >= 80) {
printf("B학점입니다.\n");
} else {
printf("C학점 이하입니다.\n");
}
return 0;
}
위 내용을 응용하여 나이에 따른 입장료 계산을 해보도록 하겠습니다.
#include <stdio.h>
int main() {
int age;
printf("나이를 입력하세요: ");
scanf("%d", &age);
if (age < 13) {
printf("어린이 입장료는 2000원입니다.\n");
} else if (age <= 19) {
printf("청소년 입장료는 3000원입니다.\n");
} else {
printf("성인 입장료는 5000원입니다.\n");
}
return 0;
}
switch 문
switch 문은 마치 기차역의 스위치처럼 특정 변수의 값에 따라 다른 트랙으로 기차를 보내는 역할을 합니다. 각 케이스는 특정한 역에 해당하며, 해당 역에 정차할 때만 실행됩니다.
#include <stdio.h>
int main() {
char grade = 'B';
switch (grade) {
case 'A':
printf("우수한 성적입니다.\n");
break;
case 'B':
printf("좋은 성적입니다.\n");
break;
default:
printf("노력이 필요합니다.\n");
break;
}
return 0;
}
위 내용을 응용하여요일에 따른 스케줄 출력을 해보도록 하겠습니다.
#include <stdio.h>
int main() {
int day;
printf("요일을 입력하세요 (1=월요일, ..., 7=일요일): ");
scanf("%d", &day);
switch(day) {
case 1:
printf("월요일: 팀 회의가 있습니다.\n");
break;
case 2:
printf("화요일: 프로젝트 작업의 날입니다.\n");
break;
case 3:
printf("수요일: 영어 학습 시간입니다.\n");
break;
case 4:
printf("목요일: 체육활동이 있습니다.\n");
break;
case 5:
printf("금요일: 자유 연구 시간입니다.\n");
break;
case 6:
printf("토요일: 휴식일입니다.\n");
break;
case 7:
printf("일요일: 가족과 시간을 보냅니다.\n");
break;
default:
printf("잘못된 입력입니다.\n");
break;
}
return 0;
}
반복문
반복문은 특정 조건이 만족하는 동안 코드 블럭을 반복 실행합니다.
C언어에서는 for, while, do-while 문을 사용합니다.
for 문
for 문은 마치 달력의 날짜를 하나씩 넘기는 것과 같습니다. 시작점, 종료점, 그리고 얼마나 빠르게 넘길지(증가량)를 정해놓고 반복합니다.
#include <stdio.h>
int main() {
for (int i = 1; i <= 5; i++) {
printf("%d ", i);
}
printf("\n");
return 0;
}
위 내용을 응용하여1부터 10까지의 합 계산을 해보도록 하겠습니다.
#include <stdio.h>
int main() {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
}
printf("1부터 10까지의 합은 %d입니다.\n", sum);
return 0;
}
while 문
while 문은 마치 조건을 충족하는 동안 무한 루프 도로를 도는 자동차와 같습니다. 주어진 조건이 참인 동안 계속해서 루프를 돕니다.
#include <stdio.h>
int main() {
int i = 1;
while (i <= 5) {
printf("%d ", i);
i++;
}
printf("\n");
return 0;
}
위 내용을 응용하여사용자로부터 0이 입력될 때까지 숫자 입력 받기를 해보도록 하겠습니다.
#include <stdio.h>
int main() {
int number;
printf("숫자를 입력하세요 (0으로 종료): ");
scanf("%d", &number);
while (number != 0) {
printf("입력한 숫자: %d\n", number);
printf("다시 숫자를 입력하세요 (0으로 종료): ");
scanf("%d", &number);
}
printf("프로그램을 종료합니다.\n");
return 0;
}
이제 위 내용을 모두 포함한 실습 예제를 하나 만들어보겠습니다.
조건문과 반복문을 모두 활용하여 하나의 통합된 프로그램을 구성할 것이며, 아래 기능을 포함할 것입니다
사용자로부터 날짜(요일)와 나이를 입력받습니다.
요일에 따른 스케줄을 출력합니다 (switch 문 사용).
나이에 따른 입장료를 계산합니다 (if 문 사용).
1부터 입력받은 날짜까지의 합을 계산합니다 (for 문 사용).
사용자로부터 0이 입력될 때까지 추가 숫자를 입력받아 출력합니다 (while 문 사용)
C코드 구현
#include <stdio.h>
int main() {
int day, age, number, sum = 0;
// 요일 입력받기
printf("요일을 입력하세요 (1=월요일, ..., 7=일요일): ");
scanf("%d", &day);
// 스케줄 출력 (switch 문)
switch(day) {
case 1: printf("월요일: 팀 회의가 있습니다.\n"); break;
case 2: printf("화요일: 프로젝트 작업의 날입니다.\n"); break;
case 3: printf("수요일: 영어 학습 시간입니다.\n"); break;
case 4: printf("목요일: 체육활동이 있습니다.\n"); break;
case 5: printf("금요일: 자유 연구 시간입니다.\n"); break;
case 6: printf("토요일: 휴식일입니다.\n"); break;
case 7: printf("일요일: 가족과 시간을 보냅니다.\n"); break;
default: printf("잘못된 입력입니다. 프로그램을 종료합니다.\n"); return 1;
}
// 나이 입력받기
printf("나이를 입력하세요: ");
scanf("%d", &age);
// 입장료 계산 (if 문)
if (age < 13) {
printf("어린이 입장료는 2000원입니다.\n");
} else if (age <= 19) {
printf("청소년 입장료는 3000원입니다.\n");
} else {
printf("성인 입장료는 5000원입니다.\n");
}
// 1부터 day까지의 합 계산 (for 문)
for (int i = 1; i <= day; i++) {
sum += i;
}
printf("1부터 %d까지의 합은 %d입니다.\n", day, sum);
// 0이 입력될 때까지 숫자 입력받기 (while 문)
printf("숫자를 입력하세요 (0으로 종료): ");
scanf("%d", &number);
while (number != 0) {
printf("입력한 숫자: %d\n", number);
printf("다시 숫자를 입력하세요 (0으로 종료): ");
scanf("%d", &number);
}
printf("프로그램을 종료합니다.\n");
return 0;
}
우리는 위 예제를 통해 아래와 같은 c언어 구현 스킬을 배워봤습니다.
1. 요일에 따른 스케줄 출력 (switch 문 활용)
조건 분기 처리: switch 문을 통해 특정 변수의 값(요일)에 따라 다른 동작을 수행하도록 프로그램을 제어합니다. 이를 통해 여러 조건에 대해 각각의 로직을 구현하는 방법을 연습할 수 있습니다.
값에 따른 특정 케이스 처리: 각 요일마다 다른 메시지를 출력하며, switch 문의 case 레이블을 사용하는 방법을 실습합니다.
디폴트 케이스 처리: default 레이블을 사용하여 입력 값이 유효 범위를 벗어났을 때의 예외 처리를 구현합니다.
2. 나이에 따른 입장료 계산 (if 문 활용)
조건 로직 구현: 다중 if-else if-else 구조를 사용하여 복잡한 조건 로직을 구현합니다. 이는 프로그램에서 다양한 조건에 따라 다른 행동을 취해야 할 때 매우 유용합니다.
조건 표현식: 다양한 비교 연산자(<, <=, else)를 사용하여 특정 조건을 평가하고 그에 따라 다른 동작을 수행합니다.
3. 1부터 day까지의 합 계산 (for 문 활용)
반복문 사용: for 문을 사용하여 특정 범위의 값에 대해 반복 작업을 수행합니다. 이는 데이터의 집합이나 범위에 대해 일련의 연산을 반복적으로 적용할 때 필수적입니다.
변수 증가와 누적 계산: 반복문 내에서 변수를 하나씩 증가시키면서, 누적 합계를 계산하는 방법을 연습합니다.
4. 0이 입력될 때까지 숫자 입력받기 (while 문 활용)
조건 반복 처리: while 문을 사용하여 사용자로부터 계속해서 입력을 받고, 특정 조건(number != 0)이 만족될 때까지 반복합니다.
사용자 입력 처리와 조건 평가: 사용자로부터 입력받은 값을 즉시 처리하고, 프로그램의 흐름을 사용자 입력에 따라 조절하는 방법을 연습합니다.
오늘 배운 조건문과 반복문을 통해 프로그램의 흐름을 자유자재로 제어할 수 있는 기초를 마련했습니다.
#key와 value를 나눠서 처리해야할 때
a = {1: 'jd', 2: 'alice', 3: 'jason'}
for k, v in a.items():
print("키는: " + str(k))
print("벨류는: " + v)
키는: 1
벨류는: jd
키는: 2
벨류는: alice
키는: 3
벨류는: jason
실생활 예제
딕셔너리를 사용하는 것은 주소록을 사용하는 것과 비슷합니다.
사람의 이름(키)과 그 사람의 전화번호(값)를 연결하여,
이름을 알면 전화번호를 쉽게 찾을 수 있습니다.
딕셔너리는 데이터베이스의 간단한 형태로 사용될 수 있습니다.
예를 들어,
상품의 ID와 그에 대한 정보를 저장하고 관리하는 용도로 사용할 수 있습니다.
# 상품 ID를 키로, 상품 정보를 값으로 가지는 딕셔너리
products = {
101: {'name': '사과', 'price': 1000, 'stock': 25},
102: {'name': '바나나', 'price': 500, 'stock': 50}
}
# 상품 ID 101의 정보 출력
product_info = products[101]
print(f"상품 이름: {product_info['name']}, 가격: {product_info['price']}원, 재고: {product_info['stock']}개")
a.get을 활용하기
개인적으로 중요하다고 생각하는 내용이기에
a.get 내용은 지금 언급하고 가겠습니다.
아래 예시를 먼저 보시죠
a = {1: 'jd', 2: 'alice', 3: 'jason'}
print(4 in a)
False
a = {1: 'jd', 2: 'alice', 3: 'jason'}
print(a[4])
keyError: 4
a = {1: 'jd', 2: 'alice', 3: 'jason'}
print(a.get(4))
None
a = {1: 'jd', 2: 'alice', 3: 'jason'}
print(a.get(4,'없음'))
없음
전체 가상화(Full Virtualization) 전체 가상화에서는 하이퍼바이저가 모든 하드웨어 호출을 포착하고 중재하여, 게스트 운영체제가 자신이 물리적 하드웨어 위에서 직접 실행되고 있는 것처럼 착각하게 만듭니다. 이 방식은 하드웨어 자원을 완전히 가상화하며, 게스트 OS는 하이퍼바이저를 통해서만 하드웨어 자원을 요청할 수 있습니다. 다시 말해, CPU 차원의 가상화는 하드웨어를 완전히 가상화하는 방식이므로 반드시 하이퍼바이저가 중간에서 중재하게 됩니다. 조금 더 세부적으로 살펴본다면, DOM0이 그 역할을 하게 되는데 각 가상머신은 DOM0에게 명령을 전달하고, DOM0에서 이를 해석하여 하이퍼바이저에게 알려주게 됩니다. (Vmware, ESX server, Hyper V, KVM)
반가상화(Paravirtualization) 반가상화는 게스트 OS가 하이퍼바이저 존재를 인식하고, 하이퍼바이저와 직접 상호작용하는 것을 특징으로 합니다. 이 모델에서는 DOM0(도메인 제로)가 하이퍼바이저와 게스트 OS 사이의 중개자 역할을 하지 않고, 게스트 OS는 하이퍼 콜(Hyper-Call)이라는 특수한 API를 통해 하이퍼바이저에 직접 요청을 보냅니다. 이는 전체 가상화에 비해 성능 향상을 제공할 수 있습니다.
DOM0 이 무엇인지 알고 싶으신 분들은 아래 글을 참고해 주세요!
(작성 중)
Hyper-Cell이 무엇인지 알고 싶으신 분들은 아래 글을 참고해 주세요!
(작성 중)
하이퍼바이저의 구분
하이퍼바이저는 크게 두 가지 유형으로 나뉩니다
Type 1 하이퍼바이저(Native or Bare-Metal Hypervisors): 이 유형의 하이퍼바이저는 직접 하드웨어 위에 설치되며, 하드웨어와 가상 머신을 관리하는 데 필요한 모든 기능을 갖추고 있습니다. 운영체제 없이 처음부터 하이퍼바이저를 설치해야 하며, 이는 보다 높은 성능과 보안을 제공합니다.
Type 2 하이퍼바이저(Hosted Hypervisors): 호스트 운영체제 위에 설치되는 이 하이퍼바이저는 일반적인 소프트웨어 응용 프로그램처럼 작동합니다. 게스트 운영체제는 호스트 OS를 통해 간접적으로 하드웨어 자원을 접근하며, 이는 설치 및 관리가 상대적으로 쉽지만, Type 1 하이퍼바이저에 비해 성능 면에서 뒤떨어질 수 있습니다.
현대 IT 산업에서 프로그래밍 언어의 역할은 중요하며, 다양한 언어가 각자의 특성과 용도로 활용됩니다. 개발자가 되려는 초보자든, 경력을 확장하고자 하는 전문가든, 적절한 프로그래밍 언어 선택은 경력의 방향을 결정짓는 핵심 요소입니다. 이 글에서는 주요 프로그래밍 언어의 특성과 각 언어가 어울리는 사용 환경에 대해 자세히 탐구하고, 독자의 필요와 목표에 맞는 언어를 선택할 수 있는 방법을 제공하겠습니다.
프로그래밍 언어의 역할과 중요성
프로그래밍 언어는 소프트웨어 개발의 기반입니다. 각 언어는 특정 도메인이나 작업에 적합한 독특한 특성과 기능을 가지고 있습니다. 예를 들어, 웹 개발, 시스템 프로그래밍, 모바일 애플리케이션 개발 등 각 분야에서 선호되는 언어가 다릅니다.
주요 프로그래밍 언어의 특징 및 적용 분야
Python: 직관적인 문법과 높은 가독성으로 초보자에게 추천됩니다. 데이터 과학, 웹 개발, 자동화 등 다양한 분야에서 널리 사용됩니다.
Java: 플랫폼 독립적이며, 대규모 시스템 개발에 적합합니다. 안드로이드 앱 개발과 엔터프라이즈 급 애플리케이션에 주로 사용됩니다.
JavaScript: 웹 프론트엔드 개발에 필수적이며, Node.js를 통해 백엔드에서도 활용됩니다.
C 언어: 시스템 프로그래밍과 임베디드 시스템 개발에 이상적입니다. 고성능이 요구되는 어플리케이션에 주로 사용됩니다.
C++: C의 직접적인 확장으로, 게임 개발, 실시간 시스템, 고성능 서버 등에서 사용됩니다.
C#: 주로 마이크로소프트의 .NET 프레임워크에서 사용되며, 게임 개발(Unity 엔진 사용)에도 인기가 있습니다.
PHP: 서버 측 웹 개발에 강력하며, WordPress와 같은 CMS 개발에 자주 사용됩니다.
HTML/CSS: 웹 페이지의 구조와 스타일을 정의하는 데 필수적입니다.
Swift: iOS 및 macOS 애플리케이션 개발에 사용되며, Apple 생태계에서 매우 중요합니다.
Kotlin: Android 개발에 최적화된 언어로, Java의 대안으로 빠르게 자리잡고 있습니다.
언어 선택 시 고려해야 할 요소
목적 및 프로젝트 요구 사항: 개발하고자 하는 애플리케이션의 유형에 따라 적합한 언어를 선택해야 합니다.
학습 곡선: 언어의 복잡성과 학습 자원의 가용성을 고려하세요.
커뮤니티 및 지원: 강력한 개발자 커뮤니티와 충분한 학습 자료가 있는 언어는 시작하기에 좋습니다.
경력 전망 및 시장 수요: 직업 시장에서의 수요와 경력 전망도 중요한 선택 요소입니다.
Github Push 순위 (22년 1분기)
Github에서 Push는 자신이 작업한 내용을 깃허브 서버에 올리는 기능입니다. 2022년 1분기 Push 기능에서 자주 사용된 개발 언어 순위 1~10위는 아래와 같습니다.
1
Python
2
Java
3
JavaScript
4
C++
5
PHP
6
TypeScript
7
C
8
Go
9
Shell
10
Ruby
Tiobe 프로그래밍 언어 순위 (22년)
TIOBE는 소프트웨어 사용성과 소스 코드의 품질을 검사하고 관리하는 회사로 TIOBE Index를 통해 개발 언어의 인기 순위를 알려줍니다. 프로그래밍 언어 순위는 한 달에 한 번씩 업데이트되며 산정 기준은 구글, Bing, 야후, 위키피디아, 아마존, 유튜브와 같은 인기 검색 엔진 검색 빈도수에 더해 소프트웨어의 프로그래밍 언어 사용량을 기반으로 합니다. 2022년 9월 Tiobe index 프로그래밍 언어 순위는 아래와 같습니다.
1
Python
2
C
3
Java
4
C++
5
C#
6
Visual Basic
7
JavaScript
8
Assembly language
9
SQL
10
PHP
파이썬과 자바가 항상 높은 순위에 있네요!
그렇다면 나는 어떤 언어를 공부해야 할까요?
어느 한 곳에서 완벽한 프로그래밍 언어는 없습니다. 특정 분야에서 강점을 가지면, 다른 분야에서 약점을 가지기 마련입니다.
C나 C++ 같은 언어는 속도가 빠르지만, 배우기 어렵고 개발하는데 시간이 다른 언어들에 비해 오래 걸립니다. Python 같은 언어는 개발 속도가 빠르고 가독성이 높다는 장점은 있지만 실행 속도가 다른 언어들에 비해 느립니다. 이와 같이 목적과 하고자 하는 일의 특성에 따라 선호되는 언어가 다릅니다. 그래서 우리는 하고자 하는 일을 명확히 파악하고 가중치를 두어 언어를 선택해야 합니다.
여러분은 프로세스와 관련된 서버(server-side)와 데이터베이스를 관리해 주는 백엔드를 하고 싶으신가요? 사용자와 직접 만나 부딪히는 레이아웃을 고민하고 짜는 프론트앤드를 하고 싶으신가요? 데이터를 분석하고 솔루션을 내주는 데이터 분석가가 되고 싶으신가요?
프로그래밍 언어를 선택하는 것은 당신의 경력 목표, 관심 있는 기술 영역, 그리고 학습할 준비가 되어 있는 어려움의 수준에 따라 달라집니다. 여기서는 프론트엔드와 백엔드 개발에 필요한 주요 프로그래밍 언어와 그 사용 목적을 명확하게 구분하여 표로 정리해 보겠습니다. 아래 표는 각 언어가 어떻게 활용되는지, 어떤 분야에 적합한지에 대한 간략한 가이드를 제공해 보겠습니다.
프론트엔드 개발
언어/기술
목적
추가 공부 추천
HTML
웹 페이지의 구조 설계
-
CSS
웹 페이지의 스타일링과 레이아웃 디자인
-
JavaScript
동적인 웹 페이지 기능 구현
AngularJS, ReactJS, Bootstrap
프론트엔드 개발자는 사용자 인터페이스를 생성하고 개선하는 역할을 담당합니다. 이를 위해 웹 표준 기술인 HTML과 CSS를 통해 웹의 구조와 스타일을 정의하고, JavaScript로 웹 페이지에 상호작용을 추가합니다. 또한, AngularJS나 ReactJS 같은 모던 자바스크립트 프레임워크를 학습하여 더 복잡하고 동적인 웹 애플리케이션을 구축할 수 있습니다.
백엔드 개발
언어
목적
추가 정보
PHP
웹 서버 스크립트 및 콘텐츠 관리 시스템 개발
-
Node.js
서버 사이드 스크립트 구현
JavaScript 기반
C++
고성능 백엔드 서비스 개발
-
Java
대규모 엔터프라이즈 시스템 및 안드로이드 앱
-
Python
데이터 처리 및 백엔드 로직 개발
빅 데이터, 인공지능 분야 선호
백엔드 개발자는 클라이언트(사용자)가 볼 수 없는 서버, 애플리케이션, 데이터베이스 관리 등을 담당합니다. 이들은 사용자 요청을 처리하고 적절한 출력을 제공하는 로직을 구현합니다. PHP, Node.js, Java, Python 등 다양한 언어가 백엔드 개발에 활용되며, 선택은 프로젝트 요구 사항과 개인의 기술 선호도에 따라 달라질 수 있습니다.
개발 분야별 언어 추천
관심 분야
추천 언어
웹 개발
HTML, CSS, JavaScript, PHP, Ruby
안드로이드 앱 개발
Kotlin
iOS 앱 개발
Swift
데이터 분석
Python
시스템 프로그래밍
C, C++
범용 프로그래밍
Java, C
어떤 언어를 선택하여 공부하기로 마음먹는 계획보다 가장 중요한 것은 오늘부터 시작하세요 언어를 선택하여 시작했지만 굉장히 지루할 수도 재미있을 수 도 있습니다. 각자의 성향은 다양하니까요 그래서 우선 시작하고 맞지 않는 것 같다면 과감하게 다른 언어로 다시 시도해 보는 경험이 굉장히 중요할 것 같습니다. 계획을 잡고 어떻게 공부해야 하는지 어려움이 있으시다면 아래 글을 참고해 보세요!