Skip to content

2주차 · 변수와 연산자

  • 웹 실행 환경에서 코드를 넣고 결과를 확인하는 흐름을 이해한다.
  • 변수와 자료형의 역할을 정확히 구분한다.
  • int(), float(), str()를 이용한 기본 형변환을 직접 수행할 수 있다.
  • = 대입과 +, -, *, / 같은 기본 연산을 식 순서대로 읽을 수 있다.
  • 괄호와 중간 변수를 사용해 계산 의도를 분명하게 표현한다.
  • 단위 변환을 안전하게 수행하는 기본 패턴을 익힌다.
  • C와 Python의 변수/연산자 차이 중 초보자가 많이 헷갈리는 지점을 비교할 수 있다.

1) 변수: 값을 담는 이름표이자 계산의 기준점

Section titled “1) 변수: 값을 담는 이름표이자 계산의 기준점”

변수는 단순한 상자가 아니라 값의 의미를 고정하는 이름표입니다.

  • distance_m: 거리(m)
  • time_s: 시간(s)
  • speed_mps: 속도(m/s)
  • 공학 계산은 값 자체보다 무엇의 값인지가 더 중요합니다.
  • 단위가 빠진 이름은 나중에 다시 볼 때 큰 함정을 만듭니다.
  • 변수명 자체가 짧은 설명문 역할을 해 디버깅 시간을 줄여 줍니다.
  1. 물리적 의미가 드러난다.
  2. 단위를 포함한다.
  3. 다시 읽어도 혼동이 없다.

Good

radar_frequency_ghz = 24.0
c_m_per_s = 3.0e8
wavelength_m = c_m_per_s / (radar_frequency_ghz * 1e9)

Bad

x = 24.0
y = 3.0e8
z = y / (x * 1e9)

설명: x, y, z는 처음 작성한 사람도 며칠 뒤에는 의미를 잊기 쉽습니다.

2) 자료형: 값의 성격이 다르면 가능한 연산도 달라진다

Section titled “2) 자료형: 값의 성격이 다르면 가능한 연산도 달라진다”

자주 쓰는 자료형:

  • int: 정수 (예: 샘플 개수)
  • float: 실수 (예: 주파수, 전압)
  • str: 문자열 (예: 장비 이름)
  • bool: 참/거짓 (예: 측정 성공 여부)
sample_count = 128 # int
voltage_v = 3.3 # float
sensor_name = "RX-A1" # str
is_valid = True # bool

핵심 이해: 자료형이 다르면 할 수 있는 연산도 달라진다

Section titled “핵심 이해: 자료형이 다르면 할 수 있는 연산도 달라진다”
  • 숫자형(int, float)은 더하기, 빼기, 곱하기, 나누기 같은 계산이 중심입니다.
  • 문자열(str)은 이어 붙이기, 길이 확인, 일부 잘라내기가 중심입니다.
  • 불리언(bool)은 조건 판단이 중심입니다.

즉, 값과 자료형은 항상 함께 생각해야 합니다.

형변환은 값의 자료형을 계산 목적에 맞게 바꾸는 것입니다.

  • "12"12 : 문자열을 정수로
  • "3.14"3.14 : 문자열을 실수로
  • 24"24" : 숫자를 문자열로

초보자 관점에서 가장 중요한 상황은 입력값은 문자열인데 계산은 숫자로 해야 할 때입니다.

함수용도예시결과
int()정수로 변환int("12")12
float()실수로 변환float("3.14")3.14
str()문자열로 변환str(24)"24"

형변환 예시 1: 문자열 전압/전류를 계산용 숫자로 바꾸기

Section titled “형변환 예시 1: 문자열 전압/전류를 계산용 숫자로 바꾸기”

Bad

voltage_v = "12.5"
current_a = "0.8"
power_w = voltage_v * current_a

Good

voltage_v = float("12.5")
current_a = float("0.8")
power_w = voltage_v * current_a
print(power_w)

설명: 문자열끼리는 공학 계산이 되지 않습니다. float()로 바꾼 뒤 곱해야 전력 계산이 가능합니다.

형변환 예시 2: 계산 결과를 사람이 읽는 문자열로 바꾸기

Section titled “형변환 예시 2: 계산 결과를 사람이 읽는 문자열로 바꾸기”
frequency_ghz = 24
label = "Radar frequency = " + str(frequency_ghz) + " GHz"
print(label)

설명: 숫자는 계산에 편하지만, 화면에 설명문과 함께 붙일 때는 str()로 문자열로 바꾸면 연결하기 쉽습니다. 실무에서는 f-string도 많이 쓰지만, 지금은 str()가 하는 일을 먼저 이해하는 것이 중요합니다.

2주차 미니 예제 · 형변환으로 계산 가능한 값 만들기 Runs in-browser with Pyodide
Ready
  • int(3.9)의 결과는 3입니다. 소수점 아래가 사라집니다.
  • "12.0"int("12.0")로 바로 바꿀 수 없습니다. 먼저 float("12.0")처럼 해석해야 합니다.
  • 입력이 숫자처럼 보여도 따옴표가 있으면 문자열입니다.

3) 대입과 연산자: 식을 차례대로 읽는 법

Section titled “3) 대입과 연산자: 식을 차례대로 읽는 법”

3-1) = : 오른쪽 값을 왼쪽 변수에 저장한다

Section titled “3-1) = : 오른쪽 값을 왼쪽 변수에 저장한다”

초보자가 가장 먼저 정확히 이해해야 할 기호는 =입니다.

distance_m = 120.0
time_s = 4.0
speed_mps = distance_m / time_s

이 코드는 아래 순서로 읽습니다.

  1. distance_m = 120.0
    • 오른쪽의 120.0 값을 왼쪽 변수 distance_m에 저장합니다.
  2. time_s = 4.0
    • 오른쪽의 4.0 값을 왼쪽 변수 time_s에 저장합니다.
  3. speed_mps = distance_m / time_s
    • 먼저 오른쪽 식 distance_m / time_s를 계산합니다.
    • 계산 결과를 왼쪽 변수 speed_mps에 저장합니다.

핵심은 오른쪽에서 값이나 식을 준비하고, 왼쪽 변수에 넣는다는 점입니다.

base_voltage_v = 5.0
extra_voltage_v = 1.2
total_voltage_v = base_voltage_v + extra_voltage_v
print(total_voltage_v)
  • +는 두 값을 합칩니다.
  • 위 코드는 5.0 + 1.2를 계산한 뒤 결과 6.2total_voltage_v에 저장합니다.
  • 공학 계산에서는 여러 기여분을 합쳐 전체 값을 만들 때 자주 씁니다.
target_temp_c = 80.0
measured_temp_c = 74.5
error_temp_c = target_temp_c - measured_temp_c
print(error_temp_c)
  • -는 앞의 값에서 뒤의 값을 뺍니다.
  • 위 코드는 목표 온도 target_temp_c에서 실제 측정 온도 measured_temp_c를 빼서 차이 5.5를 계산합니다.
  • 제어 오차, 거리 차이, 손실량 계산에서 자주 등장합니다.
power_w = 2.5
time_s = 8.0
energy_j = power_w * time_s
print(energy_j)
  • *는 두 값을 곱합니다.
  • 위 코드는 전력 × 시간으로 에너지 20.0 J를 계산합니다.
  • 비율 확대, 면적 계산, 전력·에너지 계산에서 기본적으로 사용합니다.
distance_m = 120.0
time_s = 4.0
speed_mps = distance_m / time_s
print(speed_mps)
  • /는 나눗셈입니다.
  • 위 코드는 거리 120 m를 시간 4 s로 나누어 속도 30.0 m/s를 계산합니다.
  • 평균, 속도, 밀도, 비율 계산에 매우 자주 쓰입니다.
voltage_v = 3.0
power_like_value = voltage_v ** 2
print(power_like_value)
  • **는 거듭제곱입니다.
  • 위 코드는 3.0 × 3.0과 같은 값인 9.0을 계산합니다.
  • 제곱거리, 분산, 에너지식처럼 같은 값을 여러 번 곱할 때 사용합니다.
total_samples = 10
group_size = 4
remain_samples = total_samples % group_size
print(remain_samples)
  • %는 나머지를 구합니다.
  • 위 코드는 10개를 4개씩 묶었을 때 2개가 남는다는 뜻입니다.
  • 짝수/홀수 판정, 블록 처리, 남은 데이터 수 확인에 유용합니다.

3-8) == : 같은지 비교한다 (=와 다름)

Section titled “3-8) == : 같은지 비교한다 (=와 다름)”
score = 90
print(score == 90)
  • ==는 “왼쪽 값과 오른쪽 값이 같은가?”를 묻는 비교 연산자입니다.
  • 결과는 True 또는 False입니다.
  • =는 저장, ==는 비교입니다. 둘은 역할이 완전히 다릅니다.

3-9) 정수의 다른 표현: 2진수, 16진수

Section titled “3-9) 정수의 다른 표현: 2진수, 16진수”

Python은 숫자 앞에 접두어를 붙여 2진수, 8진수, 16진수 리터럴을 바로 쓸 수 있습니다.

접두어진법예시10진수 값
0b2진수0b101010
0o8진수0o1715
0x16진수0xFF255

변환 함수도 함께 알아 두세요.

함수역할예시결과
bin(n)정수 → 2진수 문자열bin(10)'0b1010'
oct(n)정수 → 8진수 문자열oct(15)'0o17'
hex(n)정수 → 16진수 문자열hex(255)'0xff'
reg_value = 0b11010110 # 2진수 리터럴
addr = 0x1F4 # 16진수 리터럴
color = 0xFF8800 # 16진수 색상 코드
print(reg_value) # 214
print(bin(reg_value)) # 0b11010110
print(hex(addr)) # 0x1f4

비트 연산자는 정수를 비트(0/1) 단위로 직접 다룹니다.

연산자이름예시 (4비트 기준)결과
&AND0b1100 & 0b10100b1000 (8)
|OR0b1100 | 0b10100b1110 (14)
^XOR0b1100 ^ 0b10100b0110 (6)
~NOT~0b0000_1111비트 전체 반전
<<왼쪽 시프트0b0001 << 20b0100 (4)
>>오른쪽 시프트0b1000 >> 20b0010 (2)

EE 응용: 레지스터의 특정 비트를 추출할 때 마스킹과 시프트를 조합합니다.

# 상태 레지스터에서 팬 비트(bit 2) 추출
status_reg = 0b11010110
fan_bit = (status_reg >> 2) & 1
print("fan_bit:", fan_bit) # 1 또는 0
  • status_reg >> 2: 오른쪽으로 2비트 밀어 bit 2를 최하위 자리로 가져옵니다.
  • & 1: 최하위 비트만 남기고 나머지는 0으로 만듭니다.
비트 연산 시각화 · 직접 값을 바꿔보세요
A 218 0xDA
B 15 0x0F
&
Result 10 0x0A

3-11) 부동소수점 오차 (float precision)

Section titled “3-11) 부동소수점 오차 (float precision)”

Python의 float는 IEEE 754 표준을 따르며, 10진수 소수를 2진수로 표현하는 과정에서 미세한 오차가 생깁니다.

print(0.1 + 0.2) # 0.30000000000000004
print(0.1 + 0.2 == 0.3) # False

0.10.2는 2진수로 정확히 표현할 수 없어 내부적으로 아주 작은 오차를 가집니다. 두 값을 더하면 오차가 누적돼 0.3과 완전히 같지 않습니다.

두 실수가 “충분히 같은지” 비교할 때는 == 대신 오차 허용 범위를 사용합니다.

a = 0.1 + 0.2
b = 0.3
print(abs(a - b) < 1e-9) # True

4) 연산자 우선순위: 괄호로 의도를 드러내기

Section titled “4) 연산자 우선순위: 괄호로 의도를 드러내기”

기본적으로 *, /+, -보다 먼저 계산됩니다.

result1 = 10 + 2 * 3 # 16
result2 = (10 + 2) * 3 # 36

핵심 규칙: 헷갈리면 괄호로 계산 순서를 고정하세요.

Good

import math
signal_power_w = 0.08
noise_power_w = 0.002
snr_linear = signal_power_w / noise_power_w
snr_db = 10 * math.log10(snr_linear)

Bad

import math
signal_power_w = 0.08
noise_power_w = 0.002
snr_db = 10 * math.log10(signal_power_w / noise_power_w + 1)

설명: Bad 코드는 + 1이 왜 필요한지 드러나지 않아 해석 오류를 부르기 쉽습니다.

5) 단위 변환: 계산 전에 표준 단위로 먼저 통일

Section titled “5) 단위 변환: 계산 전에 표준 단위로 먼저 통일”

단위 실수는 결과를 10배에서 10억배까지 틀리게 만들 수 있습니다.

자주 쓰는 변환:

  • GHz → Hz: f_hz = f_ghz * 1e9
  • ms → s: t_s = t_ms / 1000
  • cm → m: d_m = d_cm / 100
  • mW → W: p_w = p_mw / 1000

예제 1 · 주파수에서 파장 구하기

Section titled “예제 1 · 주파수에서 파장 구하기”
2주차 예제 1 · 주파수에서 파장 구하기 Runs in-browser with Pyodide
Ready
  1. c_m_per_s = 3.0e8
    • 빛의 속도를 표준 단위(m/s)로 저장합니다.
  2. frequency_ghz = 24.0
    • 입력 주파수를 GHz 단위로 저장합니다.
  3. frequency_hz = frequency_ghz * 1e9
    • 계산 전에 GHz를 Hz로 바꿉니다.
  4. wavelength_m = c_m_per_s / frequency_hz
    • \(\lambda = c / f\) 식으로 파장을 계산합니다.
  5. print(...)
    • 입력값과 결과값을 각각 출력해 사람이 바로 검산할 수 있게 합니다.
  • frequency_hz = frequency_ghz * 1e9 줄을 지우면 결과가 얼마나 이상해지는지 확인해 보세요.
  • print(type(frequency_ghz), type(frequency_hz), type(wavelength_m))로 자료형도 직접 확인해 보세요.

예제 2 · 옴의 법칙으로 전류와 전력 구하기

Section titled “예제 2 · 옴의 법칙으로 전류와 전력 구하기”
2주차 예제 2 · 옴의 법칙으로 전류와 전력 구하기 Runs in-browser with Pyodide
Ready
  1. voltage_v = 12.0
    • 전압 값을 V 단위로 저장합니다.
  2. resistance_ohm = 6.0
    • 저항 값을 ohm 단위로 저장합니다.
  3. current_a = voltage_v / resistance_ohm
    • 옴의 법칙 I = V / R을 그대로 코드로 적습니다.
  4. power_w = voltage_v * current_a
    • 전력 식 P = V × I를 계산합니다.
  5. print(...)
    • 최종 결과를 값과 단위까지 붙여 출력합니다.

자주 하는 실수 5가지: 표 내용을 코드로 보기

Section titled “자주 하는 실수 5가지: 표 내용을 코드로 보기”

실수 1) 문자열로 입력받고 바로 계산

Section titled “실수 1) 문자열로 입력받고 바로 계산”

Bad

voltage_v = "12.0"
resistance_ohm = "6"
current_a = voltage_v / resistance_ohm

Good

voltage_v = float("12.0")
resistance_ohm = float("6")
current_a = voltage_v / resistance_ohm

설명: 문자열은 계산용 숫자가 아닙니다. 입력이 문자열이라면 float() 또는 int()로 먼저 바꿔야 합니다.

실수 2) 단위 변환을 빼먹고 계산

Section titled “실수 2) 단위 변환을 빼먹고 계산”

Bad

c_m_per_s = 3.0e8
frequency_ghz = 24.0
wavelength_m = c_m_per_s / frequency_ghz

Good

c_m_per_s = 3.0e8
frequency_ghz = 24.0
frequency_hz = frequency_ghz * 1e9
wavelength_m = c_m_per_s / frequency_hz

설명: 24.0 GHz24.0 Hz처럼 취급하면 결과가 완전히 틀어집니다. 계산에 들어가기 전에 표준 단위로 먼저 바꾸세요.

Bad

score = 90
print(score = 90)

Good

score = 90
print(score == 90)

설명: =는 값을 저장하는 기호이고, ==는 두 값이 같은지 비교하는 기호입니다. 저장과 비교는 완전히 다른 동작입니다.

실수 4) 괄호 없이 긴 식을 한 줄에 몰아 쓰기

Section titled “실수 4) 괄호 없이 긴 식을 한 줄에 몰아 쓰기”

Bad

value = 10 + 2 * 3 - 4 / 2

Good

value = (10 + (2 * 3)) - (4 / 2)

설명: 파이썬은 규칙대로 계산하지만, 사람은 긴 식을 읽다가 쉽게 실수합니다. 괄호를 쓰면 계산 순서와 의도가 바로 드러납니다.

실수 5) 의미 없는 축약 변수명을 쓰기

Section titled “실수 5) 의미 없는 축약 변수명을 쓰기”

Bad

a = 120.0
b = 4.0
c = a / b

Good

distance_m = 120.0
time_s = 4.0
speed_mps = distance_m / time_s

설명: a, b, c는 지금은 알아도 나중에는 거의 기억나지 않습니다. 변수명에 물리량과 단위를 넣으면 코드가 곧 설명문이 됩니다.

실수증상원인해결
문자열로 입력받고 바로 계산TypeError/문자열 결합형변환 누락float() 또는 int()로 즉시 변환
단위 변환 누락물리적으로 비정상 값GHz→Hz 등 변환 생략입력 직후 표준 단위 변수 생성
=== 혼동조건식 문법 오류/오동작대입/비교 개념 혼동대입은 =, 비교는 ==로 구분
괄호 없이 긴 식 작성예상과 다른 결과우선순위 착각괄호 + 중간 변수로 분리
변수명 축약(a,b,c)디버깅 시간 증가의미/단위 정보 부재quantity_unit 패턴 사용

6) C와 Python의 변수·연산자 차이 정리

Section titled “6) C와 Python의 변수·연산자 차이 정리”

학생들이 다른 수업에서 C를 배우면, 같은 “변수”와 “연산자”라도 쓰는 방식이 조금 다릅니다. 여기서는 2주차 기준으로 가장 자주 헷갈리는 차이만 정리합니다.

항목CPython초보자 체크 포인트
변수 선언int count = 10;처럼 자료형을 먼저 씀count = 10처럼 값부터 넣음Python도 의미와 단위가 드러나는 이름을 써야 함
변수 타입 변경같은 변수의 타입을 함부로 바꾸기 어려움x = 10x = "ten"도 가능가능하더라도 수업에서는 한 변수에 한 역할 유지
나눗셈5 / 2가 정수 나눗셈이면 25 / 22.5, 5 // 22C 감각으로 /를 읽으면 실수함
거듭제곱pow(a, b) 또는 반복 곱셈a ** b^는 거듭제곱이 아님
조건 비교if (score == 90)if score == 90:=는 대입, ==는 비교

C

int sample_count = 128;
float voltage_v = 3.3f;

Python

sample_count = 128
voltage_v = 3.3

설명: C는 자료형을 먼저 선언하고 세미콜론으로 문장을 끝냅니다. Python은 값이 들어가면서 자료형이 정해집니다. 대신 Python에서도 변수명은 더 명확하게 써야 합니다.

차이 2) 같은 이름의 자료형이 바뀔 수 있다

Section titled “차이 2) 같은 이름의 자료형이 바뀔 수 있다”

C

int value = 10;
/* value = "ten"; // 오류 */

Python

value = 10
value = "ten"
print(value)

설명: Python에서는 문법상 가능하지만, 초보자 코드에서는 한 변수에 숫자 역할과 문자열 역할을 섞지 않는 것이 좋습니다. 이름은 같아도 의미가 바뀌면 디버깅이 훨씬 어려워집니다.

차이 3) 나눗셈 결과 해석이 다르다

Section titled “차이 3) 나눗셈 결과 해석이 다르다”

C

int a = 5;
int b = 2;
/* a / b 의 결과는 2 */

Python

a = 5
b = 2
print(a / b) # 2.5
print(a // b) # 2

설명: Python의 /는 실수 결과를 주고, //는 몫만 남깁니다. C를 먼저 배운 학생은 이 차이를 특히 주의해야 합니다.

차이 4) 거듭제곱 표기가 다르다

Section titled “차이 4) 거듭제곱 표기가 다르다”

C

/* pow(x, 2) 사용 또는 x * x */

Python

x = 3
print(x ** 2) # 9

설명: ^는 C와 Python 모두 거듭제곱이 아니라 비트 XOR입니다. “제곱”을 쓰고 싶을 때 ^를 쓰지 않도록 주의하세요.

차이 5) 문자열과 숫자를 다루는 방식이 더 직접적이다

Section titled “차이 5) 문자열과 숫자를 다루는 방식이 더 직접적이다”

C

/* printf("frequency = %d GHz\n", frequency_ghz); */

Python

frequency_ghz = 24
print("frequency =", frequency_ghz, "GHz")
print("frequency = " + str(frequency_ghz) + " GHz")

설명: Python은 출력이 훨씬 간단하지만, 문자열 연결을 할 때는 str() 같은 형변환이 여전히 필요합니다.

문제: 24 GHz 전파의 파장을 계산하세요.

학생 실습 1 · 주파수에서 파장 구하기 Runs in-browser with Pyodide
Ready