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,'없음'))
없음