다양한 표기법이 존재합니다.

이러한 표기법을 다른 표기법으로 수작업으로 변경은 개수가 적은 경우에는 문제가 없지만 많은 경우 시간도 많이 걸리고 오류가 날 수도 있습니다.

다음은 각 표기법을 비교한 표입니다.


표기법 형식 예시 설명 사용 예시 (언어/분야)
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) 코드 실행

Posted by 제이브레인
,