Windows 와 macOS 의 개발 환경 차이
Windows 와 macOS 의 개발 환경 차이
같은 언어, 같은 코드라도 운영체제가 달라지면 경로·줄바꿈·셸·권한 같은 기초 항목이 달라집니다. Linux 는 macOS 와 가까운 쪽으로 분류됩니다 (둘 다 Unix 계열).
1. 두 OS 에 대한 이야기
Windows 는 1985 년 Microsoft 가 출시한 GUI 운영체제. NTFS · cmd.exe · PowerShell · WSL2 같은 자기 길을 따라왔습니다. macOS 는 2001 년 Mac OS X 로 시작 — Unix 계열 BSD 위에 자체 GUI. 같은 코드를 두 환경에서 돌리는 자리에서 둘의 차이가 드러납니다.
2. 경로 구분자
- Windows — 전통적으로 역슬래시 (
\).C:\Users\name\project. - macOS · Linux — 슬래시 (
/)./Users/name/project.
다만 Windows API 자체는 슬래시도 받아들입니다. C:/Users/name 형태도 대부분의 Win32 호출에서 동작. 다만 cmd.exe 는 슬래시를 옵션 도입자로 해석할 때가 있어 (dir /w) 조심. PowerShell 은 양쪽을 폭넓게 받음.
언어 표준 라이브러리는 보통 OS 별 구분자를 추상화합니다. Python 의 pathlib, Node 의 path.join, Java 의 Paths.get. 하드코딩한 \\ 보다 이 추상화를 쓰는 편이 이식성이 좋음.
3. 줄바꿈 (line endings)
- Windows — CRLF (
\r\n, 0x0D 0x0A). DOS 시절 텔레타이프 관습의 잔재. - macOS (현대) · Linux — LF (
\n, 0x0A). - macOS Classic (OS 9 이하) — CR (
\r). 현재는 사실상 등장하지 않음.
git 은 이 차이를 core.autocrlf 와 .gitattributes 로 다룹니다.
| 설정값 | 동작 |
|---|---|
true (Windows 기본 권장) |
체크아웃 시 LF→CRLF, 커밋 시 CRLF→LF. |
input (macOS · Linux 권장) |
커밋 시 CRLF→LF, 체크아웃은 그대로. |
false |
변환 없음. |
.gitattributes 에 * text=auto 또는 파일별 eol=lf 를 명시하는 편이 더 안전한 SSOT.
4. 파일 권한 모델
Unix (macOS · Linux) — mode bits 로 user/group/other 의 r/w/x 를 표현. chmod 755 · chmod +x. 실행 가능 비트가 따로.
Windows (NTFS) — ACL (Access Control List). 사용자·그룹별로 더 세분된 권한을 ACE 단위로 부여. 실행 여부는 확장자 (.exe · .bat · .ps1) 와 실행 정책으로 정해지며 별도 실행 비트는 없습니다.
git 은 Unix 실행 비트를 추적합니다 (100755 vs 100644). Windows 에서 chmod +x 를 실행해도 의미가 약하므로 git update-index --chmod=+x 로 직접 비트를 설정.
5. 패키지 매니저
| OS | 주요 매니저 | 특성 |
|---|---|---|
| macOS | Homebrew | 사실상 표준. brew install. |
| macOS | MacPorts | 더 오래된 대안. 의존성을 자체 격리해 빌드. |
| Windows | winget | Microsoft 공식. Windows 10 1809+ 기본 탑재. |
| Windows | Chocolatey | 가장 오래되고 패키지 수가 많음. |
| Windows | Scoop | 사용자 디렉터리 설치, 관리자 권한 불요. |
Linux 는 배포판별로 apt (Debian/Ubuntu), dnf (Fedora/RHEL), pacman (Arch).
6. 기본 셸
- macOS — 10.15 Catalina (2019) 부터 zsh 기본. 이전에는 bash (Apple 이 GPLv3 회피로 zsh 전환).
- Windows — PowerShell (현대), cmd.exe (레거시). Windows Terminal 이 기본 호스트.
- Linux — 배포판마다 다르나 bash 가 일반적이며 일부에서 dash 가
/bin/sh로 연결.
7. 대소문자 구분 파일시스템
- macOS APFS — 기본 비구분 (case-insensitive, case-preserving).
Foo.txt와foo.txt는 같은 파일. - Linux ext4 — 구분. 둘은 다른 파일.
- Windows NTFS — 기본 비구분. 다만 Windows 10 1803+ 부터 디렉터리별 구분 옵션.
git 은 파일명을 구분해서 추적합니다. macOS · Windows 에서 동작하던 코드가 Linux CI 에서 import 실패로 깨지는 사례가 흔히 이 차이에서.
8. WSL2 의 위치
WSL2 (Windows Subsystem for Linux 2) 는 Windows 위에서 진짜 Linux 커널을 가상화로 돌리는 구조. 2019 년부터 제공되었고 Hyper-V 기반의 경량 VM.
- 파일시스템 — 리눅스 측은 ext4, Windows 측은 NTFS. 교차 접근 시 I/O 가 느리므로 프로젝트 파일은 가급적 한쪽 (보통 WSL 내부
~/). - 셸·도구 — 진짜 bash, 진짜
apt. Docker Desktop 도 WSL2 백엔드를 사용. - VS Code — Remote-WSL 확장으로 Windows 에서 편집·디버깅이 매끄러움.
Windows 사용자가 Unix 환경을 원할 때 가장 통합도가 높은 선택지.
9. 같은 작업의 두 표기
| 작업 | macOS (zsh/bash) | Windows (PowerShell) |
|---|---|---|
| 환경변수 설정 | export FOO=bar |
$env:FOO = "bar" |
| 환경변수 읽기 | echo $FOO |
echo $env:FOO |
| 홈 디렉터리 | ~ |
~ 또는 $HOME |
| 명령 연결 (성공시) | a && b |
a; if ($?) { b } (5.1) / a && b (7+) |
| 파일 권한 부여 | chmod +x script.sh |
(NTFS ACL · 실행정책) |
10. 자주 걸리는 자리
.sh 스크립트가 Windows 체크아웃 시 CRLF 로 변환되어 ^M 에러로 실패하는 경우 — .gitattributes 에 *.sh text eol=lf 를 명시하면 막힘.
macOS 에서 동작하던 import 가 Linux CI 에서 실패 — 파일명 대소문자 차이.
Windows 에서 PATH 변경 후 셸 재시작을 안 해 명령을 못 찾는 경우.
WSL 안에서 /mnt/c/... 로 Windows 파일을 다룰 때 권한·속도 이슈.
하고픈 말
OS 차이는 줄바꿈 · 경로 · 권한 · 셸 네 자리에서 자주 사고가 납니다. .gitattributes 의 * text=auto eol=lf 한 줄 + 언어 표준 라이브러리의 경로 추상화 + 셸 명령은 OS 별 동등 스크립트 셋이 표준 모양.
Next
- shells-overview
- bash-and-sh
Microsoft Learn Windows 파일 경로 · git-scm gitattributes · Apple zsh as default · WSL 2 문서 · Homebrew · winget 을 참고합니다.