04. 네 번째 수업: 곱셈이 곧 회전이다 (Rotation in 2D)

지금까지 우리는 복소수 덧셈을 “좌표의 이동(벡터의 합)”으로 이해했습니다. 그렇다면 두 좌표 곱셈 안에는 어떠한 2차원 공간적 의미가 숨어 있을까요? 왜 1차원 수직선에는 존재할 수 없었던 복소 평면만이 곱셈을 극적으로 승화시킬 수 있었는지 밝혀냅니다.


1. i 를 하나 곱한다는 것의 소름 돋는 물리적 의미

허수 단위 $i$ 의 정의는 $i^2 = -1$ 이었습니다. 그렇다면 숫자 $1$(실수 축의 한 점)에 허수를 하나씩 집요하게 곱해 보겠습니다.

  1. 시작지점 (Real): $1$ (오른쪽 가로 $x$축 위)
  2. $\times i$: $1 \times i = \textbf{i}$ (점이 이륙하여 세로 허수축으로 펄쩍 뜀! 원점을 기준으로 정확히 좌회전 90도)
  3. $\times i$: $i \times i = i^2 = \textbf{-1}$ (현실 세계의 왼쪽 $x$축 반대편으로 자빠짐! 또 90도 꺾임)
  4. $\times i$: $-1 \times i = \textbf{-i}$ (다시 아래쪽 허수 지하세계로 쳐박힘! 또 90도 꺾임)
  5. $\times i$: $-i \times i = -i^2 = -(-1) = \textbf{1}$ (최초 시작 위치로 원상 복구! 한바퀴 완주 회전 완료!)
복소 평면에서 숫자 하나에 허수 i를 곱합으로써 십자가 축을 따라 원형으로 90도씩 계속해서 반시계 방향으로 회전하는 기하학적 굴절력을 보여주는 마법 애니메이션 다이어그램 SVG

[천재들의 깨달음]

“복소수 곱셈은 직선 위를 앞으로 뒤로만 달리는 것이 아니라… 기하학적으로 점의 위치를 각도만큼 비틀어버리는 ‘조이스틱(Rotation) 엔진’ 이구나!”

어떤 비디오 게임에서 전투기가 $90^\circ$ 로 급선회하는 로직을 프로그래밍해야 한다면, 각도 계산을 수십 줄씩 할 필요가 없습니다. 전투기 좌표에 그저 조용히 $\times i$ (파이썬에서는 * 1j) 연산표 하나 얹어주면 전투기는 완벽한 직각으로 대가리를 비틀어 버립니다!

2. 복소 평면 위 일반 곱셈의 진실 (길이 뻥튀기 + 각도 합체)

만약 단순한 $i$ (반경 1, 각도 90도)가 아니라 더 복잡한 두 복소수끼리 서로 곱한다면 무슨 일이 벌어질까요?

$z_1$ (반지름 $2$, 각도 $30^\circ$) 과 점 $z_2$ (반지름 $3$, 각도 $45^\circ$) 를 곱하면 이렇게 작동합니다!

  1. 길이 엔진: 복소수들의 원점으로부터의 사선 길이(반지름)끼리는 서로 뻥튀기(곱하기) 된다. $\rightarrow$ 2 * 3 = 6
  2. 회전 엔진: 서로가 갖고 있는 기울어진 고유 각도끼리는 조이스틱처럼 합체(더하기) 되어 날아간다. $\rightarrow$ 30도 + 45도 = 75도

결론 좌표: 원점에서 거리가 6 만큼 떨어져 있고, 각도는 75° 만큼 날아간 우주 공간의 점에 위치하게 됩니다! 삼각함수를 써야 할 길고 지루한 회전 행렬 공식이 곱셈 한 방에 종결됩니다.

3. 파이썬 조이스틱 시뮬레이션 (90도 폭격기)

오직 파이썬 코드만으로 이 신비로운 회전 마법을 추적해 봅시다. 점을 하나 지정하고 1j 를 계속 곱해 90도씩 팽이처럼 돌려보겠습니다!

# [Python] 1j 를 곱할 때마다 공간이 90도씩 꺾여나가는 마법의 조이스틱
print("[ 우주 폭격기 90도 틸팅 시퀀스 가동 ]\n")

# 폭격기의 현재 위치: 가로(실수) 2칸 전진, 높이(허수) 1칸 상승 지점
plane = 2 + 1j
print(f"스타트 지점 (0도) : {plane}")

# 조이스틱 발동: 1j 를 곱하면 왼쪽(반시계)으로 정확히 90도 회전합니다.
plane_90 = plane * 1j
print(f"1번 꺾기 (90도)   : {plane_90} -> x와 y의 위치가 바뀌고 부호가 틀어짐!")

# 조이스틱 또 발동: 180도 위치로 이동 (뒤로 돌기!)
plane_180 = plane_90 * 1j
print(f"2번 꺾기 (180도)  : {plane_180} -> 시작 지점(2+1j)의 완벽한 반대(마이너스) 지점!")

# 270도
plane_270 = plane_180 * 1j
print(f"3번 꺾기 (270도)  : {plane_270}")

# 360도 (원상 복구)
plane_360 = plane_270 * 1j
print(f"4번 꺾기 (360도)  : {plane_360} -> 1년 365, 우주를 한 바퀴 돌아 귀환 완료!")

[실행 결과]

[ 우주 폭격기 90도 틸팅 시퀀스 가동 ]

스타트 지점 (0도) : (2+1j)
1번 꺾기 (90도)   : (-1+2j) -> x와 y의 위치가 바뀌고 부호가 틀어짐!
2번 꺾기 (180도)  : (-2-1j) -> 시작 지점(2+1j)의 완벽한 반대(마이너스) 지점!
3번 꺾기 (270도)  : (1-2j)
4번 꺾기 (360도)  : (2+1j) -> 1년 365, 우주를 한 바퀴 돌아 귀환 완료!

이 코드를 볼 수 있다면 2D 게임 그래픽의 원리를 마스터한 것과 같습니다. $2+1j$ 였던 숫자가 눈 깜짝할 사이에 $-1+2j$ 로 변하면서 공간을 뒤틀어버리는 이 아름다운 엔진. 우리는 이 파티클들을 이용해 다음 마지막 장에서 우주의 거대한 복소수 프랙탈(Mandelbrot) 예술을 콘솔 창에 직접 스케치해 볼 것입니다.

서브목차