PHP에서 함수와 클래스의 차이 > 개발관련
개발관련

PHP에서 함수와 클래스의 차이

조회 343회 댓글 0건
  • 현재 페이지 주소 복사
  • 페이스북으로 공유
  • X 로  공유
  • 트위터로  공유
  • 네이버 블로그로 공유
  • 네이버 카페 공유하기
  • 네이버 라인 공유하기
  • 네이버 밴드 공유하기
  • 링크드인으로 공유하기
  • 핀터레스트에 공유하기

함수와 클래스의 사용에 대해서 결론부터 간단하게 정래하면 아래와 같으며 어떤것이 위에 있고 아래에 있지 않다고 학교 다닐때 부터 배웠지요. 

즉, 사용하는 용도에 따라서 적합한 방식을 사용하면 되는 것입니다.

- 작고 단순한 기능만 필요할 땐 → 함수

- 관련 기능 여러 개 묶고 확장/유지보수 고려할 땐 → 클래스



 


● 함수의 장점

- 한두 개의 기능만 필요할 때 바로 쓸 수 있음.

- 작은 프로젝트나 유틸리티 코드에 적합.

- 로직만 있으면 금방 작성 가능, 선언도 간단.

- 적은 메모리 사용: 클래스처럼 객체를 만들지 않아도 되니 호출이 가볍다.

- 직관적


● 함수의 단점

- 확장성 부족: 여러 함수가 생기면 이름 충돌이나 관리 어려움.

- 비슷한 기능 묶음 관리가 힘듦.

- 상태(state) 관리 어려움: 데이터(예: 초성/중성 테이블)를 계속 전역 변수나 매개변수로 넘겨야 함.

- 객체지향 패턴 적용 불가: 상속, 캡슐화, 다형성 같은 OOP 개념을 활용하기 힘듦.



● 클래스의 장점

- 구조적 관리: 관련된 기능과 데이터를 묶어서 관리 가능.

- 재사용성/확장성: 상속이나 인터페이스로 확장 가능 → 유지보수 용이.

- 캡슐화: 내부 로직은 private, 외부는 public으로 제공 가능 → 사용자는 내부 구조 몰라도 됨.

- 상태 관리 가능: 객체 인스턴스에 값을 저장해두고 여러 메소드에서 공유 가능.


● 클래스의 단점

- 복잡성 증가: 작은 기능 하나 쓰려는데 클래스 만들면 코드가 길어지고 무거워짐.

- 메모리/성능 부담: 객체 생성 비용이 추가됨. (큰 차이는 없지만, 단순 함수보다 무겁긴 함)

- 학습/이해 난이도: 초보자 입장에서는 함수보다 구조가 복잡해 보여서 진입장벽이 있음.


아래는 같은 기능인데 함수와 클래스에 대한 프로그램 방식의 차이 입니다.


    // 유니코드 코드포인트 얻기 (mb_ord 대체)
    function uniOrd($ch) {
        $u = mb_convert_encoding($ch, 'UCS-4BE', 'UTF-8');
        $val = unpack('N', $u);
        return $val[1];
    }

    // mb_chr 호환
    function mb_chr_compat($code) {
        if (function_exists('mb_chr')) return mb_chr($code, 'UTF-8');
        return mb_convert_encoding(pack('N', $code), 'UTF-8', 'UCS-4BE');
    }

    // 한글 분해(완성형 글자 -> 초중종 인덱스), 한글이 아니면 null 반환
    function decomposeHangul($char) {
        $code = uniOrd($char);
        if ($code < 0xAC00 || $code > 0xD7A3) return null;
        $sIndex = $code - 0xAC00;
        $cho = intdiv($sIndex, 21*28);
        $jung = intdiv($sIndex % (21*28), 28);
        $jong = $sIndex % 28;
        return ['cho'=>$cho, 'jung'=>$jung, 'jong'=>$jong];
    }

    // 조합(인덱스 -> 완성형 글자)
    function composeHangul($cho, $jung, $jong) {
        $code = 0xAC00 + $cho * 21 * 28 + $jung * 28 + $jong;
        return mb_chr_compat($code);
    }

    function makeAutocompleteSteps($word) {
        // 초/중/종 문자 표 (표시용)
        $chosung = ["","","","","","","","","","","","","","","","","","",""];
        $jungsung = ["","","","","","","","","","","","","","","","","","","","",""];
        $jongsung = ["","","","","","","","","","","","","","","","",
                    "","","","","","","","","","","",""];

        $steps = [];
        $prefix = ""; // 이미 완성된 이전 음절들 누적

        $len = mb_strlen($word, 'UTF-8');
        for ($i = 0; $i < $len; $i++) {
            $ch = mb_substr($word, $i, 1, 'UTF-8');
            $d = decomposeHangul($ch);

            if ($d === null) {
                // 한글 완성형이 아니면 그냥 붙여서 한 단계로 추가
                $prefix .= $ch;
                $steps[] = $prefix;
                continue;
            }

            $cho = $d['cho'];
            $jung = $d['jung'];
            $jong = $d['jong'];

            // 1) 초성 입력 (접두사 + 초성자모)
            $steps[] = $prefix . $chosung[$cho];

            // 2) 중성 입력 -> 초성+중성(종성 없음)으로 보여줌
            $syll_no_jong = composeHangul($cho, $jung, 0);
            $steps[] = $prefix . $syll_no_jong;

            // 3) 종성 있으면 종성 입력 -> 초성+중성+종성
            if ($jong > 0) {
                $syll_with_jong = composeHangul($cho, $jung, $jong);
                $steps[] = $prefix . $syll_with_jong;
                $prefix .= $syll_with_jong; // 완성된 음절을 누적
            } else {
                $prefix .= $syll_no_jong;
            }
        }

        // 중복 제거(순서 보존)
        $uniq = [];
        $seen = [];
        foreach ($steps as $s) {
            if (!isset($seen[$s])) { $seen[$s] = true; $uniq[] = $s; }
        }
        return $uniq;
    }

    // 테스트
    print_r(makeAutocompleteSteps("닭다리"));
 


    class HangulAutocomplete {
        private static $chosung = ["","","","","","","","","","","","","","","","","","",""];
        private static $jungsung = ["","","","","","","","","","","","","","","","","","","","",""];
        private static $jongsung = ["","","","","","","","","","","","","","","","",
                                    "","","","","","","","","","","",""];

        /**
         * 유니코드 → 코드포인트
         */
        private static function uniOrd($ch) {
            $u = mb_convert_encoding($ch, 'UCS-4BE', 'UTF-8');
            $val = unpack('N', $u);
            return $val[1];
        }

        /**
         * 코드포인트 → 문자
         */
        private static function mb_chr_compat($code) {
            if (function_exists('mb_chr')) return mb_chr($code, 'UTF-8');
            return mb_convert_encoding(pack('N', $code), 'UTF-8', 'UCS-4BE');
        }

        /**
         * 한글 분해 (초/중/종 인덱스 반환), 아니면 null
         */
        private static function decompose($char) {
            $code = self::uniOrd($char);

            if ($code < 0xAC00 || $code > 0xD7A3) return null;
            $sIndex = $code - 0xAC00;
            $cho    = intdiv($sIndex, 21*28);
            $jung   = intdiv($sIndex % (21*28), 28);
            $jong   = $sIndex % 28;
            return ['cho'=>$cho, 'jung'=>$jung, 'jong'=>$jong];
        }

        /**
         * 한글 조합 (초/중/종 인덱스 -> 완성형)
         */
        private static function compose($cho, $jung, $jong) {
            $code = 0xAC00 + $cho * 21 * 28 + $jung * 28 + $jong;
            return self::mb_chr_compat($code);
        }

        /**
         * 자동완성 단계 생성
         */
        public static function makeSteps($word) {
            $steps = [];
            $prefix = "";

            $len = mb_strlen($word, 'UTF-8');
            for ($i = 0; $i < $len; $i++) {
                $ch = mb_substr($word, $i, 1, 'UTF-8');
                $d = self::decompose($ch);

                if ($d === null) {
                    $prefix .= $ch;
                    $steps[] = $prefix;
                    continue;
                }

                $cho  = $d['cho'];
                $jung = $d['jung'];
                $jong = $d['jong'];

                // 1단계: 초성
                $steps[] = $prefix . self::$chosung[$cho];

                // 2단계: 중성 입력 (완성된 글자, 종성 없음)
                $syll_no_jong = self::compose($cho, $jung, 0);
                $steps[] = $prefix . $syll_no_jong;

                // 3단계: 종성이 있으면 종성까지
                if ($jong > 0) {
                    $syll_with_jong = self::compose($cho, $jung, $jong);
                    $steps[] = $prefix . $syll_with_jong;
                    $prefix .= $syll_with_jong;
                } else {
                    $prefix .= $syll_no_jong;
                }
            }

            // 중복 제거
            $uniq = [];
            $seen = [];
            foreach ($steps as $s) {
                if (!isset($seen[$s])) {
                    $seen[$s] = true;
                    $uniq[] = $s;
                }
            }
            return $uniq;
        }
    }

    // 테스트
    $aResult = HangulAutocomplete::makeSteps("닭다리");
    print_r($aResult);
 

어떤가요? 이경우는 클래스를 사용해서 묶어주는것이 훨씬 좋지요.


  • 현재 페이지 주소 복사
  • 페이스북으로 공유
  • X 로  공유
  • 트위터로  공유
  • 네이버 블로그로 공유
  • 네이버 카페 공유하기
  • 네이버 라인 공유하기
  • 네이버 밴드 공유하기
  • 링크드인으로 공유하기
  • 핀터레스트에 공유하기
전체 231건 1 페이지
  • profile_image 코드자동완성 테스트한 vscode용 확장 프로그램 continue 다운로드 사용자가 엄청나게 많은데 ... 결론 부터 말하면 실패입니다. 아래 설정이 약간 잘못 되었을수 있겠지만.채팅은 잘 되는데 코드 자동완성이 잘 안됩니다.하지만 테스트 하고 싶은분 그리고 제가 나중에 다시 테스트 해볼 경우 필요할 수 있어 올리는 글입니다. 위 이미지에서 Main Config 라고 마우스 올리면 그 옆에 톱니가 나오는데 그걸 클릭해야 합니다.잘못 만들어져서 화면이 겹치는 문제가 있습니다.제 설정은 위 이미지에 대한것은 아래와 같습니다.name: lmstudioversion: 1.0.0schema: v1models:&…
  • profile_image 내가 준 먹이를 소화해서 다른 사용자에게 주면 곤란한 문제가 생길것 같아 직접 이용해 보기로 했습니다.결론 부터 말하면 잘하는 인공두뇌에 먹이 주면서 사용하는것이 낳으니 테스트 해보고 싶으신 분들을 위해서 남기는 글 입니다.사용한 확장 프로그램    twinny - AI Code Completion and Chat    Identifier: rjmacarthy.twinny 위처럼 설정하고 자신에 맞게 모델이나 IP주소 같은것만 변경해주면 됩니다.전 UI가 좋은 LM스튜디오 사용.이걸 빠르게 사용하려면 애플 실리콘 M5 Max 노트북 16인치 추천합니다.램은 최소 64G 가능하…
  • profile_image 무슨일인지 업그레이드 실패까지 생겼는데.... 왠지 모르지만 안되는게 참 많습니다.이런 경우 다시 설치하면 되긴 합니다.아마도 추측은 초기 설치 할 때 전체 사용자 선택을 해서 설치 했는데 업그레이드는 현재 유저 기준으로 해서 그런것이 아닌가 싶습니다. old 라고 된것 삭제 삭제하고new_ 이렇게된것 new_ 삭제하고 다시 실행하고 vscode에서 Help > Check for Updates 해주고 다시 시작하면 됩니다.이때 작업표시줄에 고정한게 있으면 그것 클릭하지 말고(삭제하고) 새로 설치된 아이콘 클릭해서 실행 하면됩니다.
  • profile_image vscode 사용하면 안되는것이 참 많지요.잘 되던것도 안되고 무료가 이런게 문제인데... 유료로 갈아 타려 했는데 매달 비용발생 때문에 ...어떤 것은 그것을 또 배워야 되서 할일도 못하는데 공부해야 되고 ...우선 그때 그때 수정해서 사용합니다.▷ 파일이 열리지 않는 원인은?natizyskunk SFTP 확장(1.16.3)에 내장된 구버전 ssh2 라이브러리가 Node.js의 util 모듈에서 isDate 함수를 가져다 쓰는데최신 VS Code 1.123.0이 이전에 제공되던 'isDate' 함수를 제거하면서 잘 작동하던 프로그램에 문제가 발생그래서 SFTP 연결(목록 조회)은 되지만 실제로 파일을 열거나 다운로드할…
  • profile_image 기본적인 특징은 아래와 같으며 사용 가능한지 어떤지 테스트 하면서 정리(테스트) 한것을 다음에 필요 할 수 있어 기록해 둡니다.이 파일 디비는 동시 처리하는데 문제가 있어 동시 처리 사용하고 싶으면 MySQL 같은 것 사용해야 됩니다.이게 MySQL과 명령이 비슷한것인가요? ANSI SQL 이라서 그런가요? 후자 인데요.SQL 문법은 ANSI SQL 나머지 CLI 도구 명령들은 각 DBMS에 따라 다른 경우라고 보면 됨.  - 파일 하나가 곧 데이터베이스 (.db, .sqlite). 그렇기 때문에 DBMS서버 필요 없는 경우 유용함.- 서버 없이 동작하는 경량 임베디드 RDBMS- Android, iO…
  • profile_image 하네스 엔지니어링 결론부터 말하면 개발 기획자는 별도로 할것 없이 기존에 하던데로 그냥 하면 됩니다.이것, 저것, 문제가많네~ 이런식으로 특정하지 않는 형태로 이쁘게 만들어줘 하는 방식이 문제가 있는것으로 이렇게 언급하는 방식은 현재 사람도 의도 파악을 정확히 모르기 때문에 원하는 결과가 나오지 않습니다.문제가 많아 - 어떤 문제가 많은지 구첵적으로 알려 줘야 해결 가능.이렇게 해석해도 큰 무리가 없는것으로 어떤 문제가 있는지 명확하게 알려줘야 개선이 되고 같은 문제가 생기지 않습니다. 예를 들면.1) 상태값 기록을 위해서 테이블에 시간과 현재 상태 기록해서 체크하는것을 만들어 달라고 했더니 만들긴 잘 만들었습…
  • profile_image 이건 백엔드는 데이터베이스등 서버개발이 유용한 측면들이 많죠.테스트 서버에서 작업하고 git으로 올리는 방법도 있고 git은 백업용도로만 사용하고 다중서버에 직접 올리는 방법도 있습니다.로컬의 편리한 UI + 서버의 강력한 자원 및 환경이 두 가지 토끼를 모두 잡을 수 있는 기능으로 저사양 노트북을 사용하더라도 강력한 클라우드 서버에 연결만 되어 있다면 그 서버의 성능을 내 것처럼 활용할 수 있게 됩니다.사용해 보시면 이런 좋은것을 이제 알았다니 할것입니다. 1. 로컬 환경과의 완벽한 분리 (Clean Local Machine)가장 큰 장점은 내 컴퓨터에 아무것도 설치할 필요가 없다는 것입니다.- 의존성 관리:…

상업적 이용 금지. 컨텐츠는 개인 용도로만 사용이 가능 합니다.