본문 바로가기
Programing/Java

P를 출력하는 프로그램 P

by Tomining 2016. 11. 10.
누워서 읽는 알고리즘” 책 4번째 이야기에 보면 “P를 출력하는 프로그램 P”라는 주제가 소개됩니다.
이는 프로그램 자신의 코드를 출력하는 프로그램이라는 의미인데요.

책 48 페이지에 아래와 같은 코드 예제가 있습니다.
char* me; void main(void) {printf(me); putchar(13); putchar(34); printf(me); putchar(34); putchar(‘;’);} char* me = 
“char* me; void main(void) {printf(me); putchar(13); puchar(34); printf(me); putchar(34); putchar(‘;’);} char* me=“;

C 언어로 작성되어 있어 보기에는 복잡한 듯 보이나 결과는 코드 자체와 같습니다.
이를 Java로 구현해 보면 아래와 같습니다.

 public class SelfPrintProgram {

    public static void main(String[] args) {

        char q = 34;

        String[] codeLines = {

            "public class SelfPrintProgram {",

            "    public static void main(String[] args) {",

            "        char q = 34;",

            "        String[] codeLines = {",

            "            ",

            "        };",

            "",

            "        for (int i = 0; i < 4; i++) {",

            "            System.out.println(codeLines[i]);",

            "        }",

            "        for (int i = 0; i < codeLines.length; i++) {",

            "            System.out.println(codeLines[4] + q + codeLines[i] + q + ',');",

            "        }",

            "        for (int i = 5; i< codeLines.length; i++) {",

            "            System.out.println(codeLines[i]);",

            "        }",

            "    }",

            "}",

        };


        for (int i = 0; i < 4; i++) {

            System.out.println(codeLines[i]);

        }

        for (int i = 0; i < codeLines.length; i++) {

            System.out.println(codeLines[4] + q + codeLines[i] + q + ',');

        }

        for (int i = 5; i< codeLines.length; i++) {

            System.out.println(codeLines[i]);

        }

    }

}


위 코드를 수행하면 코드 자체가 노출됩니다.
단순히 코드 자체를 출력하는 프로그램으로 보이나 재귀 호출을 이용하여 코드 양을 줄여보면 알고리즘이 복잡해 질 것 같습니다.
이를 어떤 곳에 활용할 수 있을지는 모르겠으나, 책을 읽으며 나름 재미있는 발상이라 생각되어 따라 해 보게 되었습니다.

참고