다양한 표기법이 존재합니다.
이러한 표기법을 다른 표기법으로 수작업으로 변경은 개수가 적은 경우에는 문제가 없지만 많은 경우 시간도 많이 걸리고 오류가 날 수도 있습니다.
다음은 각 표기법을 비교한 표입니다.
| 표기법 | 형식 예시 | 설명 | 사용 예시 (언어/분야) |
| Camel Case | camelCase | 첫 단어 소문자, 이후 단어 대문자 | Java, JavaScript, C# 변수 및 함수명 |
| Pascal Case | PascalCase | 모든 단어 첫 글자 대문자 | C#, Java 클래스명 |
| Snake Case | snake_case | 단어 사이 _ 사용, 소문자 | Python 변수 및 함수명 |
| Screaming Snake Case | SCREAMING_SNAKE_CASE | Snake Case + 대문자 | 상수 값 (MAX_SIZE) |
| Kebab Case | kebab-case | 단어 사이 - 사용, 소문자 | URL, CSS 클래스명 (my-class-name) |
| Train Case | Train-Case | Kebab Case + 단어 첫 글자 대문자 | 문서 제목, UI 요소 (Menu-Item) |
| Dot Notation | dot.notation | 단어 사이 . 사용 | 설정 파일, 도메인 (config.file.path) |
| Hungarian Notation | strUserName | 변수 유형 접두사 (str, i, b) | 오래된 C, C++ 코드 (iCount, bIsValid) |
| MACRO Case | #DEFINE MAX_VALUE | C 스타일 매크로 | C/C++ 전처리기 (#DEFINE, #INCLUDE) |
이 표를 보면 어떤 표기법이 어떤 상황에서 적절한지 쉽게 비교할 수 있습니다
1) 코드 생성
코드 생성 시 사용한 ChatGPT 프롬프트입니다.
다음 기능을 수행하는 python 코드를 pyqt5 를 사용하여 작성해주세요.
작성 후 에러도 테스트해주세요.
1. window 타이틀은 JbDesk 로 표시
2. window 메뉴에 "줄단위", "표기법"을 추가합니다.
"줄단위" 하위에는 "줄 공백 제거" 를 추가합니다.
"표기법" 하위에는 "camelCase", "snake_case", "PascalCase", "SCREAMING_SNAKE_CASE", "kebab-case", "Train-Case", "dot.notation" 를 추가합니다.
3. Window 내부에는
첫째 라인에 선택한 Tool 기능 텍스트를 표시하고
둘째 라인에는 "입력" 이라는 GroupBox 와 내부에 TextEdit 를 표시
세번째 라인에는 "변환"이라는 버튼을 표시합니다.
"변환" 버튼은 "변환"이라는 글자크기 만큼 버튼을 표시합니다.
다섯째 라인에는 "출력" 이라는 GroupBox 와 내부에 TextEdit 를 표시
4.
"줄 공백 제거"를 선택하고 "변환" 버튼을 누르면 "입력" 의 text 의 줄 공백을 제거하여 "출력" text 에 표시합니다.
"camelCase" 를 선택하고 "변환" 버튼을 누르면 "입력" 의 text 의 camelCase로 변환하여 "출력" text 에 표시합니다.
"snake_case" 를 선택하고 "변환" 버튼을 누르면 "입력" 의 text 의 snake_case로 변환하여 "출력" text 에 표시합니다.
"PascalCase" 를 선택하고 "변환" 버튼을 누르면 "입력" 의 text 의 PascalCase로 변환하여 "출력" text 에 표시합니다.
"SCREAMING_SNAKE_CASE" 를 선택하고 "변환" 버튼을 누르면 "입력" 의 text 의 SCREAMING_SNAKE_CASE로 변환하여 "출력" text 에 표시합니다.
"Train-Case" 를 선택하고 "변환" 버튼을 누르면 "입력" 의 text 의 Train-Case로 변환하여 "출력" text 에 표시합니다.
"dot.notation" 를 선택하고 "변환" 버튼을 누르면 "입력" 의 text 의 dot.notation로 변환하여 "출력" text 에 표시합니다.
아래 코드는 다음과 같이 다운받을 수 있습니다.
git clone git@github.com:jbpark/jbDeskExample.git
cd jbDeskExample/jbDesk/ch1.2
import re
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QTextEdit, QPushButton, QLabel, QVBoxLayout, QWidget, \
QGroupBox, QHBoxLayout
def remove_line_spaces(text):
return '\n'.join([line for line in text.splitlines() if line.strip()])
def to_snake_case(text):
text = re.sub(r'([a-z])([A-Z])', r'\1_\2', text) # camelCase -> snake_case
text = re.sub(r'[-\s]', '_', text) # kebab-case, space -> snake_case
return text.lower()
def to_camel_case(text):
words = to_snake_case(text).split('_')
return words[0] + ''.join(word.capitalize() for word in words[1:])
def to_pascal_case(text):
words = to_snake_case(text).split('_')
return ''.join(word.capitalize() for word in words)
def to_kebab_case(text):
return to_snake_case(text).replace('_', '-')
def to_screaming_snake_case(text):
return to_snake_case(text).upper()
def to_train_case(text):
return '-'.join(word.capitalize() for word in to_snake_case(text).split('_'))
def to_dot_notation(text):
words = re.split(r'[\s_\-]+', text)
return ".".join(word.lower() for word in words)
class JbDesk(QMainWindow):
def __init__(self):
super().__init__()
self.selected_option = "줄 공백 제거" # 기본값
self.initUI()
def initUI(self):
self.setWindowTitle("JbDesk")
self.setGeometry(300, 300, 1200, 900)
# 메뉴바 생성
menubar = self.menuBar()
# "줄단위" 메뉴
line_menu = menubar.addMenu("줄단위")
strip_action = QAction("줄 공백 제거", self)
strip_action.triggered.connect(lambda: self.set_option("줄 공백 제거"))
line_menu.addAction(strip_action)
# "표기법" 메뉴
format_menu = menubar.addMenu("표기법")
formats = [
"camelCase", "snake_case", "PascalCase", "SCREAMING_SNAKE_CASE",
"kebab-case", "Train-Case", "dot.notation"
]
for fmt in formats:
action = QAction(fmt, self)
action.triggered.connect(lambda checked, f=fmt: self.set_option(f))
format_menu.addAction(action)
# 메인 위젯 설정
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QVBoxLayout()
# 선택된 기능 표시
self.option_label = QLabel(f"선택된 기능: {self.selected_option}")
layout.addWidget(self.option_label)
# 입력 GroupBox
input_group = QGroupBox("입력")
input_layout = QVBoxLayout()
self.input_text = QTextEdit()
input_layout.addWidget(self.input_text)
input_group.setLayout(input_layout)
layout.addWidget(input_group)
# 변환 버튼
button_layout = QHBoxLayout()
self.convert_button = QPushButton("변환")
self.convert_button.setFixedSize(50, 30)
self.convert_button.clicked.connect(self.convert_text)
button_layout.addWidget(self.convert_button)
layout.addLayout(button_layout)
# 출력 GroupBox
output_group = QGroupBox("출력")
output_layout = QVBoxLayout()
self.output_text = QTextEdit()
output_layout.addWidget(self.output_text)
output_group.setLayout(output_layout)
layout.addWidget(output_group)
central_widget.setLayout(layout)
def set_option(self, option):
"""메뉴에서 선택된 옵션을 설정"""
self.selected_option = option
self.option_label.setText(f"선택된 기능: {self.selected_option}")
def convert_text(self):
"""선택된 옵션에 따라 입력 텍스트를 변환"""
text = self.input_text.toPlainText()
if not text:
self.output_text.setPlainText("입력 값이 없습니다.")
return
if self.selected_option == "줄 공백 제거":
result = self.remove_line_spaces(text)
elif self.selected_option == "camelCase":
result = self.to_camel_case(text)
elif self.selected_option == "snake_case":
result = self.to_snake_case(text)
elif self.selected_option == "PascalCase":
result = self.to_pascal_case(text)
elif self.selected_option == "SCREAMING_SNAKE_CASE":
result = self.to_screaming_snake_case(text)
elif self.selected_option == "kebab-case":
result = self.to_kebab_case(text)
elif self.selected_option == "Train-Case":
result = self.to_train_case(text)
elif self.selected_option == "dot.notation":
result = self.to_dot_notation(text)
else:
result = "알 수 없는 변환 옵션입니다."
self.output_text.setPlainText(result)
@staticmethod
def remove_line_spaces(text):
"""줄 공백 제거"""
return remove_line_spaces(text)
@staticmethod
def to_camel_case(text):
"""camelCase 변환"""
lines = text.strip().split("\n") # 줄 단위로 분리
return "\n".join([to_camel_case(line) for line in lines])
@staticmethod
def to_snake_case(text):
"""snake_case 변환"""
lines = text.strip().split("\n") # 줄 단위로 분리
return "\n".join([to_snake_case(line) for line in lines])
@staticmethod
def to_pascal_case(text):
"""PascalCase 변환"""
lines = text.strip().split("\n") # 줄 단위로 분리
return "\n".join([to_pascal_case(line) for line in lines])
@staticmethod
def to_screaming_snake_case(text):
"""SCREAMING_SNAKE_CASE 변환"""
lines = text.strip().split("\n") # 줄 단위로 분리
return "\n".join([to_screaming_snake_case(line) for line in lines])
@staticmethod
def to_kebab_case(text):
"""kebab-case 변환"""
lines = text.strip().split("\n") # 줄 단위로 분리
return "\n".join([to_kebab_case(line) for line in lines])
@staticmethod
def to_train_case(text):
"""Train-Case 변환"""
lines = text.strip().split("\n") # 줄 단위로 분리
return "\n".join([to_train_case(line) for line in lines])
@staticmethod
def to_dot_notation(text):
"""dot.notation 변환"""
lines = text.strip().split("\n") # 줄 단위로 분리
return "\n".join([to_dot_notation(line) for line in lines])
if __name__ == '__main__':
app = QApplication(sys.argv)
window = JbDesk()
window.show()
sys.exit(app.exec_())
2) 코드 실행

'유틸리티 > JbDesk' 카테고리의 다른 글
| JbDesk 1.6편-코드 리팩터링 (1) | 2025.03.28 |
|---|---|
| JbDesk 1.5편-exe 만들기 (0) | 2025.03.28 |
| JbDesk 1.4편-tray 기능 추가 (0) | 2025.03.28 |
| JbDesk 1.3편-로그 timezone 변경 (0) | 2025.03.27 |
| JbDesk 1.1편-짜잘한 유틸리티 모음(빈줄 제거) (0) | 2025.03.26 |

