GuguClass

1 개요

앙큼한 돌싱녀에서 나와 프로그래머들에게 화제와 비웃음을 사게 했던 명장면(?)중 하나이다.
생활코딩에서도 인기(?)를 끌었다.

차정우(배우 주상욱)가 폭풍간지나게 타자를 치고 있다.

차정우: 한 줄로 짤 코드를 누가 열 줄로 만들어놨어요? 에러 찾기 힘들게. (잠시 뒤) 코드가 길어서 프로그램만 무거워졌잖습니까? 이러니까 서비스가 버벅대지. 아니 프로그래머 양반 이게 무슨소리요!

드라마 앙큼한 돌싱녀에서 차정우 역을 맡은 주상욱이 천재 프로그래머의 실력을 보여주는 엄청난 타자 속도로 폭풍간지나게 서비스를 복구하는 장면이다...

물론 훼이크다.
여기서의 웃음포인트는 두 가지인데, 처음에는 열심히 다다닥 코드를 치면서 말한 주상욱의 대사이다. 이게 왜 말도 안되는 소리냐면, 단순히 코드가 길어진다고 프로그램이 버벅대는 건 정말 프로그래밍의 기초도 모른다는 소리인데, 저런 소릴 지금 속칭 천재 프로그래머이자 떠오르는 소프트웨어 회사의 사장이라는 사람이 하다니(..) 마치 판사가 되겠다는 사람이 법이 뭔지 모르는것과 똑같은 소리이다.
게다가, 동영상을 일시정지하고 모니터 화면에 띄워진 코드를 보면 고작 Java를 이용한 구구단 출력 예제다. 작가는 프로그래밍을 무슨 벽돌깨기 정도로 생각했나보다. 차라리 자바로 테트리스를 작성한 코드를 넣지 그러면 코드가 길어진다 주상욱 안습

참고로 저 코딩 화면은 Notepad++에 띄워진 소스 코드를 백스페이스 꾹 눌러 지우는 장면을 촬영하고 그걸 거꾸로 돌린 것이다. 그래도 한글 워드프로세서가 아닌 프로그래머용 에디터를 띄워놓은 건 칭찬할 만 하다. 비전공자는 저런 에디터가 있단 사실을 잘 모른다. 작가가 그래도 프로그래머가 어떻게 일하는지 조금은 공부했다는 반증. 아예 몰랐으면 cmd창 띄워놓고 dir /s 나 누르고 있었거나 더 심하게는 "명령을 찾을 수 없습니다" 에러메시지가 죽 내려가는 막장 화면을 보여줬을 수도 있다. PowerShell 스크립트 작성하고 테스트 중이었을 수도 있는데?

근데 Hex에디터를 띄워놨으면 이 항목 자체가 만들어지지도 않았다. 근데 Hex에디터로 디버깅하면 헬로월드조차 기본 천줄이 넘는다

파일:Attachment/GuguClass/GuguClass.jpg
엄청난 타자의 정체(...)

위의 주석에 '게임 로딩 부분'이라고 쓰여 있는 것으로 보아 게임 코드의 일부인 것 같다. 구구단 게임? 일부일까? 로딩시간동안 지루하지 않게 구구단이나 암기하라는 배려
자바 파일에는 public class 선언부가 딱 하나만 들어갈 수 있으므로(한 파일에 public class선언부가 두 개 이상되면 컴파일 에러가 난다) 174번째줄 위쪽은 같은 내용을 반복해서 복붙한 것일 가능성이 있다. 겨우 구구단 하나 출력하자고 private 클래스를 백 줄 넘게 작성했을 가능성은 거의 없다는 걸 생각해보면 그렇다. 코드 내부에서 다른 사용자 정의 객체를 생성하는 줄이 하나도 안 보이는 걸로 봐서 더더욱.

자바로 구구단만 구현 할 줄 알면 천재 프로그래머가 될 수 있다

차정우의 코드를 분석하고 한 줄로 만든 사람이 있다. 차정우: 열 줄로 짤 코드를 누가 한 줄로 만들어놨어요?
위에 링크가 깨졌는데 이 코드다.

main = mapM_ putStrLn [show x ++ " x " ++ show y ++ " = " ++ show (x*y) | x <- [2..9], y <- [1..9]] 

2 제가 직접 한 번 해보겠습니다

위 코드의 174번째줄 위쪽이 뭔진 알 수 없지만 일단 화면에 나온 코드만 복원(?)해보면 이렇게 된다.

public class GuguClass {
public static void main(String[] args) {
System.out.format("%n                      < gugu>%n");
for(int j=1; j<=9; j++) {
System.out.println();
for(int i=2; i<=5; i++) { // 2~ 5
System.out.format("%d X %d = %2d    ", i, j, i * j);
}
}
System.out.println(); // 줄바꿈
for(int j=1; j<=9; j++) {
System.out.println();
for(int i=6; i<=9; i++) { // 6~ 9
System.out.format("%d X %d = %2d    ", i, j, i * j);
}
}
System.out.println(); // 줄바꿈
}
}

위 파일을 GuguClass.java 파일로 저장하고(대소문자 주의) javac GuguClass.java 해서 컴파일한 뒤에(JDK를 설치해야 함. 이거 설치하는거도 한 스트레스 하니까 정말 관심있는 사람만 해봅시다) java GuguClass 하면 결과를 볼 수 있다.

결과:

                      < gugu>

2 X 1 =  2    3 X 1 =  3    4 X 1 =  4    5 X 1 =  5    
2 X 2 =  4    3 X 2 =  6    4 X 2 =  8    5 X 2 = 10    
2 X 3 =  6    3 X 3 =  9    4 X 3 = 12    5 X 3 = 15    
2 X 4 =  8    3 X 4 = 12    4 X 4 = 16    5 X 4 = 20    
2 X 5 = 10    3 X 5 = 15    4 X 5 = 20    5 X 5 = 25    
2 X 6 = 12    3 X 6 = 18    4 X 6 = 24    5 X 6 = 30    
2 X 7 = 14    3 X 7 = 21    4 X 7 = 28    5 X 7 = 35    
2 X 8 = 16    3 X 8 = 24    4 X 8 = 32    5 X 8 = 40    
2 X 9 = 18    3 X 9 = 27    4 X 9 = 36    5 X 9 = 45    

6 X 1 =  6    7 X 1 =  7    8 X 1 =  8    9 X 1 =  9    
6 X 2 = 12    7 X 2 = 14    8 X 2 = 16    9 X 2 = 18    
6 X 3 = 18    7 X 3 = 21    8 X 3 = 24    9 X 3 = 27    
6 X 4 = 24    7 X 4 = 28    8 X 4 = 32    9 X 4 = 36    
6 X 5 = 30    7 X 5 = 35    8 X 5 = 40    9 X 5 = 45    
6 X 6 = 36    7 X 6 = 42    8 X 6 = 48    9 X 6 = 54    
6 X 7 = 42    7 X 7 = 49    8 X 7 = 56    9 X 7 = 63    
6 X 8 = 48    7 X 8 = 56    8 X 8 = 64    9 X 8 = 72    
6 X 9 = 54    7 X 9 = 63    8 X 9 = 72    9 X 9 = 81    

근데 이 코드에는 중복이 있으므로 더 줄일 수 있다.
차정우씨, 중복 코드가 있어서 프로그램만 무거워졌잖습니까? 이러니까 서비스가 버벅대지.
근데 3회 이하의 중복 코드는 중복해서 써놓는게 프로그램 수행 속도가 더 빠르다는 건 함정.
그냥 컴파일러한테 빠른 실행에 최적화하라고 시키면 알아서 코드를 손봐주신다. 고건 몰랐지?

public class GuguClass {
public static void gugu(int c) {
for(int j=1; j<=9; j++) {
System.out.println();
for(int i=c; i<=c+3; i++) {
System.out.format("%d X %d = %2d    ", i, j, i * j);
}
}
System.out.println(); // LF
}
public static void main(String[] args) {
System.out.format("%n                      < gugu>%n");
gugu(2); gugu(6);
}
}

결과는 같음.

더 줄일 수도 있다. 한 줄을 한 번에 찍는 방법이다. 줄 수는 줄었지만 글자수는 늘었다.

public class GuguClass {
public static void gugu(int c) {
for(int j=1; j<=9; j++) {
System.out.format("%d X %d = %2d    %d X %d = %2d    %d X %d = %2d    %d X %d = %2d\n", c, j, c++ * j, c, j, c++ * j, c, j, c++ * j, c, j, c * j);
c-=3;
}
System.out.println();
}
public static void main(String[] args) {
System.out.format("%n                      < gugu>%n");
gugu(2); gugu(6);
}
}

더 줄일수도 있다 한줄이긴 한줄이다.

public class GuguClass {public static void main(String[] args) {System.out.format("%n                      < gugu>%n");for(int j=1; j<=9; j++) {System.out.println();for(int i=2; i<=5; i++) { /* 2~ 5*/System.out.format("%d X %d = %2d    ", i, j, i * j);}} System.out.println(); /* 줄바꿈*/ for(int j=1; j<=9; j++) {System.out.println(); for(int i=6; i<=9; i++) { /* 6~ 9*/System.out.format("%d X %d = %2d    ", i, j, i * j);}}System.out.println(); /* 줄바꿈*/}}

자바로는 이 이상 줄이긴 어려워 보인다. 위에 한 줄로 만들었다는 사람은 Haskell을 사용한 듯 한데 언어를 바꿔치기하는 건 반칙.[1]

왜 반칙이냐면, 소스코드는 줄어들겠지만 두 언어를 모듈 수준에서 통합하기 위한 링커 스크립트가 무지막지하게 들어가기 때문이다. scala, clojure 등의 언어는 클래스 수준 호환성을 보장해서 링커 스크립트가 따로 필요없지만 이것도 빌드 스크립트가 길어지는 건 막을 수 없다. 그럼 그것도 글자수 계산에 포함해야겠지?

언어 바꿔치기 해도 되고 모양 똑같이 안 맞춰도 되고 그냥 구구단만 나오게 할 거면 자바스크립트로 한 줄에 가능하다. 지금 당장 F12눌러서 자바스크립트 콘솔 띄우고 아래 코드를 복붙하면 구구단이 출력된다.

for(i=2;i<=9;i++)for(j=1;j<=9;j++)console.log(i+"X"+j+"="+i*j)

참고로 이 코드의 출력 결과는 위에 1번 항목 마지막에 한 줄로 만들었다는 그 사람의 출력 결과와 같다.

Ruby언어로 더 짧게 된다.

2.upto(9){|i| 1.upto(9){|j| puts "#{i}X#{j}=#{i*j}"}}

출처는 프로그래밍 언어/코드 예제#s-2.11.

위의 한줄짜리 코드의 출력에 상응하는 Java코드는 아래와 같다. 출처는 역시 프로그래밍 언어/코드 예제.

public class Gugu {
public static void main(String[] args) {
for(int i=2;i<=9;i++) {
for (int j=1;j<=9;j++) {
System.out.println(i+"X"+j+"="+(i*j));
}
}
}
}

이 이상 프로그래밍 언어를 나열하면 위의 출처의 코드 예제들과 중복되므로 여기까지만 적는다.

웃자고 시작한 일에 죽자고 달려들다.

3 관련 문서

  1. ghci에서 바로 입력할 때는 main = ...으로 하지 말고 let main = ...으로 임시 선언한 후 다음줄에서 다시 main을 실행하면 제대로 출력 될 것이다.