KingSejong 언어 튜토리얼
문서 목적: 한 걸음씩 배우는 단계별 학습 경로 (처음부터 차근차근)
난이도: 초급 소요 시간: 약 1-2시간 사전 지식: 없음 (프로그래밍 경험 없어도 OK!)
💡 문서 선택 가이드:
목차
1. 시작하기
KingSejong이란?
KingSejong은 한글로 프로그래밍할 수 있는 언어입니다. 영어를 몰라도, 프로그래밍 경험이 없어도 쉽게 배울 수 있습니다!
설치하기
자동 설치 (권장)
macOS / Linux:
# 저장소 복제
git clone https://github.com/kingsejong-lang/kingsejong-lang.git
cd kingsejong-lang
# 자동 설치 스크립트 실행
./install.sh
# 실행
./build/kingsejongWindows:
# 저장소 복제
git clone https://github.com/kingsejong-lang/kingsejong-lang.git
cd kingsejong-lang
# 자동 설치 스크립트 실행 (PowerShell)
.\install.ps1
# 실행
.\build\Release\kingsejong.exe수동 설치
# 빌드 (CMake 필요)
mkdir build && cd build
cmake ..
make
# 실행
./kingsejong참고: 자세한 설치 가이드는 INSTALL.md를 참고하세요.
REPL 시작하기
REPL은 코드를 한 줄씩 실행해볼 수 있는 대화형 환경입니다:
./kingsejong종료하려면 .exit 명령어를 입력하세요.
2. 첫 번째 프로그램
Hello, World!
가장 간단한 프로그램부터 시작해봅시다:
출력("안녕, 세상!")설명:
출력()- 화면에 글자를 보여주는 명령"안녕, 세상!"- 출력할 문자열 (따옴표로 감쌈)
파일로 실행하기
hello.ksj 파일 생성:
출력("안녕, KingSejong!")
출력("첫 프로그램입니다.")실행:
./kingsejong hello.ksj출력:
안녕, KingSejong!
첫 프로그램입니다.3. 변수 다루기
변수란?
변수는 값을 저장하는 상자입니다.
중요: KingSejong은 변수 선언 시 타입을 명시하는 것을 권장합니다.
# 타입을 명시한 변수 선언 (권장)
문자열 이름 = "홍길동"
정수 나이 = 25
출력(이름)
출력(나이)여러 종류의 값
# 정수 (소수점 없는 숫자)
정수 점수 = 95
# 실수 (소수점 있는 숫자)
실수 키 = 175.5
# 문자열 (글자)
문자열 취미 = "독서"
# 불리언 (참/거짓)
논리 합격 = 참타입 키워드:
정수- 정수 (integer)실수- 실수 (float)문자열- 문자열 (string)논리- 참/거짓 (boolean)
타입 확인하기
출력(타입(100)) # "정수"
출력(타입(3.14)) # "실수"
출력(타입("안녕")) # "문자열"
출력(타입(참)) # "논리"4. 계산하기
기본 계산
# 더하기
출력(10 + 5) # 15
# 빼기
출력(10 - 5) # 5
# 곱하기
출력(10 * 5) # 50
# 나누기
출력(10 / 5) # 2
# 나머지
출력(10 % 3) # 1변수로 계산
정수 가격 = 5000
정수 개수 = 3
정수 총액 = 가격 * 개수
출력("총 금액: " + 문자열(총액) + "원") # 총 금액: 15000원문자열 연결
문자열 이름 = "홍길동"
정수 나이 = 25
문자열 소개 = "제 이름은 " + 이름 + "이고, " + 문자열(나이) + "살입니다."
출력(소개)5. 조건 판단하기
만약 (if)
점수 = 85
만약 (점수 >= 90) {
출력("A 학점입니다!")
}만약-아니면 (if-else)
나이 = 20
만약 (나이 >= 20) {
출력("성인입니다.")
} 아니면 {
출력("미성년자입니다.")
}여러 조건 (if-else if-else)
점수 = 85
만약 (점수 >= 90) {
출력("A 학점")
} 아니면 만약 (점수 >= 80) {
출력("B 학점")
} 아니면 만약 (점수 >= 70) {
출력("C 학점")
} 아니면 {
출력("D 학점")
}비교 연산자
a = 10
b = 20
출력(a == b) # 거짓 (같음)
출력(a != b) # 참 (다름)
출력(a < b) # 참 (작음)
출력(a > b) # 거짓 (큼)
출력(a <= b) # 참 (작거나 같음)
출력(a >= b) # 거짓 (크거나 같음)논리 연산자
나이 = 25
학생 = 참
# AND (그리고)
만약 (나이 >= 20 && 학생 == 참) {
출력("성인 학생입니다.")
}
# OR (또는)
만약 (나이 < 20 || 학생 == 참) {
출력("할인 대상입니다.")
}
# NOT (부정)
만약 (!학생) {
출력("학생이 아닙니다.")
}6. 반복하기
N번 반복
# 5번 반복
5번 반복한다 {
출력("안녕하세요!")
}출력:
안녕하세요!
안녕하세요!
안녕하세요!
안녕하세요!
안녕하세요!범위 반복
# 1부터 10까지
i가 1부터 10까지 {
출력(i)
}출력:
1
2
3
...
10반복 멈추기와 건너뛰기
중단 은 반복을 그 자리에서 끝내고, 계속 은 이번 회차를 건너뛰고 다음 회차로 갑니다.
i가 1부터 10까지 {
만약 (i % 3 == 0) {
계속 # 3의 배수는 건너뛴다
}
만약 (i > 7) {
중단 # 7 보다 크면 끝낸다
}
출력(i)
}
# 1 2 4 5 7실전 예제: 구구단
단 = 5
출력("=== " + 문자열(단) + "단 ===")
i가 1부터 9까지 {
결과 = 단 * i
출력(문자열(단) + " x " + 문자열(i) + " = " + 문자열(결과))
}7. 함수 만들기
함수란?
함수는 재사용 가능한 코드 덩어리입니다.
기본 함수
인사 = 함수() {
출력("안녕하세요!")
}
# 함수 호출
인사()
인사()매개변수가 있는 함수
인사하기 = 함수(이름) {
출력("안녕하세요, " + 이름 + "님!")
}
인사하기("홍길동")
인사하기("김철수")출력:
안녕하세요, 홍길동님!
안녕하세요, 김철수님!반환값이 있는 함수
더하기 = 함수(a, b) {
반환 a + b
}
결과 = 더하기(10, 20)
출력(결과) # 30실전 예제: 계산기
더하기 = 함수(a, b) { 반환 a + b }
빼기 = 함수(a, b) { 반환 a - b }
곱하기 = 함수(a, b) { 반환 a * b }
나누기 = 함수(a, b) { 반환 a / b }
출력(더하기(10, 5)) # 15
출력(빼기(10, 5)) # 5
출력(곱하기(10, 5)) # 50
출력(나누기(10, 5)) # 28. 배열 다루기
배열이란?
배열은 여러 값을 한 번에 저장하는 자료구조입니다.
배열 만들기
# 숫자 배열
점수들 = [90, 85, 95, 88, 92]
# 문자열 배열
과일들 = ["사과", "바나나", "포도"]
# 혼합 배열
혼합 = [1, "문자", 참]배열 요소 접근하기
과일들 = ["사과", "바나나", "포도"]
출력(과일들[0]) # "사과" (첫 번째)
출력(과일들[1]) # "바나나" (두 번째)
출력(과일들[2]) # "포도" (세 번째)배열 길이
숫자들 = [10, 20, 30, 40, 50]
출력(길이(숫자들)) # 5배열 반복
과일들 = ["사과", "바나나", "포도", "딸기"]
i가 0부터 길이(과일들) 미만 {
출력(과일들[i])
}배열 메서드
정렬하기
숫자들 = [5, 2, 8, 1, 9]
정렬된 = 숫자들을 정렬한다
출력(정렬된) # [1, 2, 5, 8, 9]걸러내기 (필터)
숫자들 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 짝수만 걸러내기
짝수들 = 숫자들을 걸러낸다(함수(x) {
반환 x % 2 == 0
})
출력(짝수들) # [2, 4, 6, 8, 10]변환하기 (맵)
숫자들 = [1, 2, 3, 4, 5]
# 모든 숫자를 제곱
제곱들 = 숫자들을 변환한다(함수(x) {
반환 x * x
})
출력(제곱들) # [1, 4, 9, 16, 25]9. 조사 활용하기 (한글 특화)
KingSejong만의 특별한 기능!
KingSejong은 한글 조사를 활용한 자연스러운 문법을 지원합니다. 이는 다른 프로그래밍 언어에서는 볼 수 없는 혁신적인 기능입니다!
조사란?
조사는 한글 문법에서 명사 뒤에 붙어 관계를 나타내는 말입니다. 예: "을/를", "이/가", "은/는", "의", "로/으로"
기본 사용법
# 배열 메서드에 조사 사용
숫자들 = [3, 1, 4, 1, 5, 9, 2, 6]
# "을/를" 조사: 대상을 나타냄
정렬된 = 숫자들을 정렬한다
출력(정렬된) # [1, 1, 2, 3, 4, 5, 6, 9]
# "을/를" 조사로 변환
짝수들 = 숫자들을 걸러낸다(함수(x) { 반환 x % 2 == 0 })
출력(짝수들) # [4, 2, 6]자동 받침 처리
KingSejong은 자동으로 받침을 감지하여 적절한 조사를 선택합니다!
# 받침 있는 단어 → "을"
목록 = [3, 1, 2]
출력(목록을 정렬한다) # "목록" + "을" → [1, 2, 3]
# 받침 없는 단어 → "를"
데이터 = [9, 7, 8]
출력(데이터를 정렬한다) # "데이터" + "를" → [7, 8, 9]
# ㄹ받침 특수 처리
점수 = 95
출력(점수를 문자열로 변환한다) # "문자열" + "로" (ㄹ받침 뒤에는 "으로" 대신 "로") → 95다양한 조사 활용
의 는 사전의 키나 객체의 필드를 읽고, 나머지 조사는 모두 앞의 값을 뒤 함수의 첫 인자로 넘깁니다 (값이 함수(인자) 는 함수(값, 인자)). 그래서 직접 만든 함수도 조사로 부를 수 있습니다.
# 의 - 소유/관계: 사전의 키나 객체의 필드를 읽는다
사용자 = {"이름": "홍길동", "나이": 25}
출력(사용자의 이름) # 홍길동
# 이/가, 은/는, 에서, 에 - 앞의 값을 뒤 함수의 첫 인자로 넘긴다
비어있다 = 함수(목록) { 반환 길이(목록) == 0 }
크다 = 함수(값, 기준) { 반환 값 > 기준 }
출발한다 = 함수(장소) { 반환 장소 + "에서 출발" }
도착한다 = 함수(장소) { 반환 장소 + "에 도착" }
출력([]이 비어있다) # 참
점수 = 95
출력(점수가 크다(90)) # 참
출력(점수는 크다(100)) # 거짓
출력("서울"에서 출발한다) # 서울에서 출발
출력("학교"에 도착한다) # 학교에 도착메서드 체이닝
조사를 사용하면 여러 메서드를 자연스럽게 연결할 수 있습니다:
조사는 바로 앞 단계의 결과에 붙으므로, 괄호 없이 이어 쓸 수 있습니다:
숫자들 = [5, 2, 8, 1, 9, 3, 7, 4, 6]
큰수들 = 숫자들을 걸러낸다(함수(x) {
반환 x > 3
})
결과 = 큰수들을 정렬한다를 역순으로_나열한다
출력(결과) # [9, 8, 7, 6, 5, 4]실전 예제: 데이터 처리
# 학생 점수 처리
점수들 = [85, 92, 78, 95, 88, 76, 90]
# 조사를 활용한 자연스러운 표현
우수 = 점수들을 걸러낸다(함수(점수) {
반환 점수 >= 90
})
우수학생 = 우수를 정렬한다를 역순으로_나열한다
출력("우수 학생 점수:")
출력(우수학생) # [95, 92, 90]
# 평균 이상 점수
가져오기 "stdlib/math"
평균값 = 평균(점수들)
평균_이상 = 점수들을 걸러낸다(함수(x) {
반환 x >= 평균값
})
출력("\n평균 점수: " + 문자열(평균값)) # 평균 점수: 86.2857
출력("평균 이상 개수: " + 문자열(길이(평균_이상)) + "명") # 평균 이상 개수: 4명이름 끝에
이상,이하,미만,까지,부터가 붙으면 범위 키워드로 읽히므로평균이상대신평균_이상처럼 띄운다.
왜 조사를 사용할까?
- 자연스러운 한글 문법 - 일상적인 한글 표현과 유사
- 읽기 쉬운 코드 - "배열을 정렬한다"는 직관적
- 한글 프로그래밍의 정체성 - KingSejong만의 독특한 특징
10. 클로저와 고차 함수
클로저란?
클로저(Closure)는 외부 변수를 기억하는 함수입니다. 함수가 만들어질 때의 환경을 기억합니다.
기본 클로저
만들기_카운터 = 함수() {
개수 = 0 # 외부 변수
반환 함수() {
개수 = 개수 + 1 # 외부 변수에 접근
반환 개수
}
}
카운터1 = 만들기_카운터()
출력(카운터1()) # 1
출력(카운터1()) # 2
출력(카운터1()) # 3
# 새로운 카운터 - 독립적인 환경
카운터2 = 만들기_카운터()
출력(카운터2()) # 1
출력(카운터2()) # 2고차 함수란?
고차 함수는 함수를 인자로 받거나 반환하는 함수입니다.
함수를 인자로 받기
두번_실행 = 함수(f) {
f()
f()
}
인사 = 함수() {
출력("안녕하세요!")
}
두번_실행(인사)
# 출력:
# 안녕하세요!
# 안녕하세요!함수를 반환하기
곱셈기_만들기 = 함수(배수) {
반환 함수(x) {
반환 x * 배수
}
}
두배 = 곱셈기_만들기(2)
세배 = 곱셈기_만들기(3)
출력(두배(5)) # 10
출력(세배(5)) # 15실전 예제: 필터 생성기
범위_필터_만들기 = 함수(최소, 최대) {
반환 함수(숫자) {
반환 숫자 >= 최소 && 숫자 <= 최대
}
}
# 10-20 범위 필터
범위10to20 = 범위_필터_만들기(10, 20)
숫자들 = [5, 12, 25, 18, 3, 15, 30, 11]
결과 = 숫자들을 걸러낸다(범위10to20)
출력(결과) # [12, 18, 15, 11]실전 예제: 로거 함수
로거_만들기 = 함수(접두사) {
반환 함수(메시지) {
출력("[" + 접두사 + "] " + 메시지)
}
}
정보 = 로거_만들기("정보")
경고 = 로거_만들기("경고")
치명 = 로거_만들기("치명")
정보("프로그램 시작")
경고("메모리 부족")
치명("파일을 찾을 수 없음")
# 출력:
# [정보] 프로그램 시작
# [경고] 메모리 부족
# [치명] 파일을 찾을 수 없음11. 모듈 사용하기
표준 라이브러리
KingSejong은 유용한 함수들을 제공합니다!
math 모듈
가져오기 "stdlib/math"
# 절댓값
출력(절댓값(-10)) # 10
# 거듭제곱
출력(거듭제곱(2, 10)) # 1024
# 제곱근
출력(제곱근(16)) # 4.0
# 팩토리얼
출력(계승(5)) # 120string 모듈
가져오기 "stdlib/string"
# 문자열 반복
출력(반복("*", 10)) # "**********"
# 배열 결합
과일들 = ["사과", "바나나", "포도"]
출력(결합(과일들, ", ")) # "사과, 바나나, 포도"
# 줄 그리기
출력(줄_만들기(30, "="))array 모듈
가져오기 "stdlib/array"
# 범위 생성
숫자들 = 범위(1, 10)
출력(숫자들) # [1, 2, 3, ..., 10]
# 중복 제거
중복배열 = [1, 2, 2, 3, 3, 3, 4]
고유값 = 중복_제거(중복배열)
출력(고유값) # [1, 2, 3, 4]12. 에러 처리
에러란?
에러는 프로그램이 잘못된 동작을 할 때 발생합니다. KingSejong은 한글로 된 친절한 에러 메시지를 제공합니다!
일반적인 에러 유형
1. 타입 에러
# 잘못된 타입 연산
숫자 = 10
결과 = 숫자 + "문자열" # 에러!
# 에러 메시지:
# ❌ 실행 오류: 지원되지 않는 연산: 10 + 문자열2. 정의되지 않은 변수
출력(존재하지_않는_변수)
# 에러 메시지 (실행 전 의미 분석 단계에서 잡힌다):
# Semantic Error: 파일.ksj:1:8: 정의되지 않은 식별자: 존재하지_않는_변수3. 인덱스 범위 초과
숫자들 = [1, 2, 3]
값 = 숫자들[10] # 에러!
# 에러 메시지:
# ❌ 인덱스 오류: 배열 인덱스 범위를 벗어났습니다: 인덱스 10, 배열 크기 3에러 예방하기
조건 검사
숫자들 = [1, 2, 3, 4, 5]
인덱스 = 10
# 범위 검사
만약 (인덱스 >= 0 && 인덱스 < 길이(숫자들)) {
출력(숫자들[인덱스])
} 아니면 {
출력("인덱스가 범위를 벗어났습니다.")
}타입 검사
값1 = 10
값2 = "20"
# 타입 확인
만약 (타입(값1) == "정수" && 타입(값2) == "정수") {
결과 = 값1 + 값2
출력(결과)
} 아니면 {
출력("두 값 모두 정수여야 합니다.")
출력("값1 타입: " + 타입(값1))
출력("값2 타입: " + 타입(값2))
}실전 예제: 안전한 나눗셈
안전한_나눗셈 = 함수(a, b) {
# 0으로 나누기 방지
만약 (b == 0) {
출력("에러: 0으로 나눌 수 없습니다!")
반환 없음
}
# 타입 검사
만약 (타입(a) != "정수" && 타입(a) != "실수") {
출력("에러: 첫 번째 인자는 숫자여야 합니다.")
반환 없음
}
만약 (타입(b) != "정수" && 타입(b) != "실수") {
출력("에러: 두 번째 인자는 숫자여야 합니다.")
반환 없음
}
반환 a / b
}
# 테스트
출력(안전한_나눗셈(10, 2)) # 5
출력(안전한_나눗셈(10, 0)) # 에러 메시지
출력(안전한_나눗셈(10, "문자")) # 에러 메시지실전 예제: 배열 접근 헬퍼
안전한_배열_접근 = 함수(배열, 인덱스) {
# 타입 검사
만약 (타입(인덱스) != "정수") {
출력("에러: 인덱스는 정수여야 합니다.")
반환 없음
}
# 범위 검사
만약 (인덱스 < 0 || 인덱스 >= 길이(배열)) {
출력("에러: 인덱스 범위 초과")
출력(" 배열 크기: " + 문자열(길이(배열)))
출력(" 요청 인덱스: " + 문자열(인덱스))
반환 없음
}
반환 배열[인덱스]
}
# 테스트
숫자들 = [10, 20, 30, 40, 50]
출력(안전한_배열_접근(숫자들, 2)) # 30
출력(안전한_배열_접근(숫자들, 10)) # 에러 메시지디버깅 팁
- 출력문 활용 - 변수 값을 확인
x = 42
출력("디버그: x = " + 문자열(x)) # 디버그: x = 42- 타입 확인 - 예상과 다른 타입인지 검사
값 = [1, 2]
출력("변수 타입: " + 타입(값)) # 변수 타입: 배열- 단계별 실행 - 복잡한 코드는 나눠서 실행
목록 = [9, 2, 5, 1, 8]
필터 = 함수(x) { 반환 x > 3 }
# 한 번에 실행하지 말고
결과 = 목록을 걸러낸다(필터)를 정렬한다
# 단계별로 실행
필터된 = 목록을 걸러낸다(필터)
출력("필터 결과: ")
출력(필터된)
정렬된 = 필터된을 정렬한다
출력("정렬 결과: ")
출력(정렬된)13. 실전 프로젝트
프로젝트 1: 숫자 맞추기 게임
가져오기 "stdlib/math"
출력("=== 숫자 맞추기 게임 ===")
출력("1부터 100 사이의 숫자를 맞춰보세요!")
# 정답 (실제로는 랜덤으로 생성해야 하지만 여기서는 고정)
정답 = 42
시도횟수 = 0
최대시도 = 10
i가 1부터 최대시도까지 {
시도횟수 = i
# 여기서는 간단히 몇 가지 추측을 테스트
추측 = 50 # 실제로는 사용자 입력을 받아야 함
만약 (추측 == 정답) {
출력("정답입니다! " + 문자열(시도횟수) + "번 만에 맞추셨습니다!")
i = 최대시도 + 1 # 반복 종료
} 아니면 만약 (추측 < 정답) {
출력("더 큰 숫자입니다!")
} 아니면 {
출력("더 작은 숫자입니다!")
}
}프로젝트 2: 성적 관리 프로그램
# 필요한 모듈 가져오기
가져오기 "stdlib/math"
가져오기 "stdlib/string"
출력(줄_만들기(50, "="))
출력("=== 성적 관리 프로그램 ===")
출력(줄_만들기(50, "="))
# 학생 점수
점수들 = [95, 88, 92, 76, 85, 90, 78, 94]
# 통계 계산
평균점수 = 평균(점수들)
최고점 = 배열_최댓값(점수들)
최저점 = 배열_최솟값(점수들)
출력("\n총 학생 수: " + 문자열(길이(점수들)) + "명")
출력("평균 점수: " + 문자열(평균점수))
출력("최고 점수: " + 문자열(최고점))
출력("최저 점수: " + 문자열(최저점))
# 합격자 수 (80점 이상)
합격자 = 점수들을 걸러낸다(함수(점수) {
반환 점수 >= 80
})
출력("\n합격자 수: " + 문자열(길이(합격자)) + "명")
출력("합격률: " + 문자열(길이(합격자) * 100 / 길이(점수들)) + "%")
출력("\n" + 줄_만들기(50, "="))프로젝트 3: 피보나치 수열 계산기
가져오기 "stdlib/array"
출력("=== 피보나치 수열 계산기 ===\n")
# 재귀 버전
피보나치_재귀 = 함수(n) {
만약 (n <= 1) {
반환 n
}
반환 피보나치_재귀(n - 1) + 피보나치_재귀(n - 2)
}
# 0부터 15까지 피보나치 수 계산
출력("처음 16개의 피보나치 수:")
숫자들 = 범위(0, 15)
피보나치들 = 숫자들을 변환한다(피보나치_재귀)
출력(피보나치들)프로젝트 4: 소수 찾기
# 필요한 모듈 가져오기
가져오기 "stdlib/math"
가져오기 "stdlib/array"
가져오기 "stdlib/string"
출력(줄_만들기(50, "="))
출력("=== 소수 찾기 프로그램 ===")
출력(줄_만들기(50, "="))
# 1부터 100까지 소수 찾기
범위숫자 = 범위(1, 100)
소수들 = 범위숫자를 걸러낸다(소수인가)
출력("\n1부터 100까지의 소수:")
출력(소수들)
출력("\n총 " + 문자열(길이(소수들)) + "개의 소수가 있습니다.")
출력("\n" + 줄_만들기(50, "="))참고:
소수인가,범위,줄_만들기함수는 표준 라이브러리에서 제공됩니다.
다음 단계
축하합니다! 🎉 KingSejong의 기본을 모두 배우셨습니다.
더 배우기
언어 레퍼런스 - 전체 문법 상세히 보기
예제 탐색 - 더 많은 예제 코드
examples/폴더 참고
표준 라이브러리 - 유용한 함수들
직접 만들어보기 - 자신만의 프로젝트 시작!
- 계산기, 게임, 데이터 분석 등
도움말
- 궁금한 점이 있으면 GitHub Issues에 질문해주세요
- 버그를 발견하면 리포트해주세요
- 개선 아이디어가 있으면 제안해주세요
즐거운 코딩 되세요! 🚀
© 2025 KingSejong Team