CodeGym /행동 /JAVA 25 SELF /컴파일러와 주석

컴파일러와 주석

JAVA 25 SELF
레벨 1, 레슨 5
사용 가능

1. Java 컴파일러

참고로, 앞으로 여러 번 듣게 될 Java의 부정할 수 없는 장점은 바로 멀티플랫폼성입니다. 그게 정확히 무엇이며 왜 중요한 걸까요? 먼저 배경부터 살펴봅시다.

사실 컴퓨터는 가장 단순한 명령만 실행할 수 있습니다.

개에게는 “이리 와”, “손” 같은 명령이 있고, 이 소리를 들으면 개는 중요한 행동을 합니다. 컴퓨터에게 이런 명령 역할을 하는 것은 숫자입니다: 각 명령은 어떤 숫자로 인코딩되어 있으며(이를 기계어 코드라고도 부릅니다).

프로그램을 숫자로만 작성하는 것은 매우 어렵기 때문에, 사람들은 프로그래밍 언어와 컴파일러를 고안했습니다. 이런 언어는 한편으로 사람에게 이해 가능하고, 다른 한편으로는 컴파일러가 이해할 수 있습니다. 컴파일러는 프로그래밍 언어로 작성된 프로그램의 텍스트를 기계어 코드의 집합으로 변환하는 특별한 프로그램입니다.

보통 프로그래머는 프로그래밍 언어로 프로그램을 작성한 다음, 컴파일러를 실행합니다. 그러면 컴파일러가 프로그래머가 작성한 코드 파일들을 바탕으로 하나의 기계어 코드 파일, 즉 최종(컴파일된) 프로그램을 만들어 냅니다.

  • 프로그램 언어 C++
  • 컴파일러
  • 기계어 코드로 구성된 프로그램
C++의 컴파일 단계

이렇게 만들어진 프로그램은 곧바로 컴퓨터에서 실행될 수 있습니다. 하지만 이런 방식의 단점은, 생성된 프로그램의 코드가 프로세서와 운영체제에 크게 의존한다는 점입니다. Windows용으로 컴파일된 프로그램은 Android 폰에서 실행되지 않습니다.

Android용으로 프로그램을 작성했다면, Windows 운영체제에서는 실행되지 않습니다!

하지만 Java는 훨씬 더 혁신적인 접근을 취합니다.

  • 프로그램 언어 Java
  • Java‑컴파일러
  • 프로그램, 특수한 코드로 구성됨 (바이트코드)
  • Java VM
  • 프로그램, 기계어 코드로 구성됨
Java의 컴파일 단계

Java 컴파일러는 모든 클래스를 하나의 기계어 프로그램으로 컴파일하지 않습니다. 대신 각 클래스를 따로, 기계어가 아닌 특별한 중간 코드(바이트코드)로 컴파일합니다. 기계어로의 컴파일은 프로그램이 실행될 때 수행됩니다.

그렇다면 실행 시 누가 프로그램을 기계어로 컴파일할까요?

이를 위해 JVM (Java Virtual Machine) — Java 가상 머신이라는 특별한 프로그램이 있습니다. 먼저 JVM을 실행하고, 그 다음 바이트코드로 이루어진 프로그램을 실행합니다. 그리고 JVM이 해당 프로그램을 실행하기 전에 그것을 기계어 코드로 컴파일합니다.

여러분의 프로세서가 강력하고 더 많은 기계어 명령 집합을 지원한다면, “두 번째 컴파일” 과정에서 여러분의 프로세서와 OS를 고려한 기계어 코드가 생성됩니다. 바로 이런 이유로, Java가 가끔은 곧바로 기계어로 컴파일되어 가장 널리 쓰이는 명령만 사용할 수 있는 C++보다 더 빠를 때도 있습니다.

2. 컴파일 시 발생하는 대표적인 오류

지금은 속도나 최적화가 그다지 중요하지 않지만, 중요한 점은 컴파일러가 여러분의 프로그램을 오류에 대해 검사한다는 것입니다. 컴파일러는 코드의 정합성을 검사하고, 아주 작은 오류 하나라도 발견하면 그 이상 진행을 허용하지 않습니다.

오류 예시:

문자열만 저장할 수 있는 변수에 숫자를 대입하려고 합니다.

String userName = 42; // 이런 식으로는 안 됩니다.

컴파일러는 곧바로 타입이 맞지 않는다고 오류를 표시할 것입니다: Cannot implicitly convert type 'int' to 'string'.

다른 예 — println 호출에서의 오타:

System.out.printline("안녕!"); // 메서드 이름에 오타

컴파일러가 말할 겁니다: "그런 메서드는 없습니다 — 문법을 확인하세요!"

오류를 읽는 방법

대부분의 컴파일러는 코드의 어느 위치에서 오류가 발생했는지 알려주고, 때로는 수정 제안도 제공합니다. 오류를 두려워하지 마세요. 각각의 오류는 깨달음으로 가는 한 걸음이며, 여러분 안의 “보스”를 격파하는 과정입니다.

3. 주석

이제 상상해 보세요. 여러분은 복잡한 프로그램을 작성하고 있습니다. 모든 게 잘 돌아가고, 여러분은 천재 같죠! 그런데 한 달 뒤 그 코드를 다시 열어 보니... 아무것도 이해가 되지 않습니다. 여기저기 몇 줄의 코드, 어딘가 수상한 변수. 머릿속에는 “이건 분명 내가 아니라 누가 쓴 거야!”라는 생각뿐. 바로 이럴 때 주석이 여러분을 구해줍니다.

주석은 교과서의 여백에 적어 둔 메모나 냉장고 위의 메모처럼 (“맥주. 마시지 마. 내일 아침!”) 사용할 수 있습니다. 컴파일러는 주석을 무시하지만, 사람은 반대로 주석을 봅니다. 주석은 코드의 의도를 설명하고, 중요한 디테일에 표시를 달고, 심지어 삭제하지 않고도 코드 조각을 “꺼” 둘 수 있게 해줍니다.

중요: 어느 컴파일러도 여러분의 주석을 읽지 않습니다. 주석은 완전히 무시됩니다!

한 줄 주석

Java에는 두 가지 종류의 주석 — 한 줄과 여러 줄 주석 — 이 있습니다. 한 줄 주석은 이중 슬래시 //로 시작해서 라인 끝까지 이어집니다. // 이후의 모든 내용은 주석으로 간주되며 컴파일러에 의해 완전히 무시됩니다.

예시:

System.out.println("안녕, 세상!"); 	// 화면에 인사말을 출력합니다

여기서 // 화면에 인사말을 출력합니다는 주석입니다. 코드에서 어떤 줄이 왜 필요한지 모호하다면, 이렇게 써 두세요!

또 다른 예:

int x = 42; 	// 프로그래머의 나이 값

한 줄 주석은 독립된 줄에 쓸 수도 있습니다:

// 사용자 이름 변수 초기화
String userName = "Vasya";

거의 대본의 대사처럼, 주석이 무엇을 왜 하는지 설명해 줍니다.

여러 줄 주석

설명할 것이 많다면 어떻게 할까요? 진짜 이야기를 적고 싶다면요? 이럴 때는 여러 줄 주석을 사용합니다. /*로 시작해서 */로 끝나며, 이 사이에 있는 모든 내용은 몇 줄이든 컴파일러가 무시합니다.

예시:

/*
  여기서는 사용자 이름을 화면에 출력합니다.
  이름이 없으면 "손님"이라고 씁니다.
*/
System.out.println("이름을 입력하세요:");

또는 이렇게:

int age = 18; /* 새 사용자에 대한
                 초기 나이 값 */

주의: 여러 줄 주석을 서로 중첩할 수는 없습니다. 컴파일러를 교묘히 속이려 하지 마세요 — 통하지 않습니다.

도해:

종류 문법 예
한 줄
// 주석
int x = 1; // 설명
여러 줄
/* 여기에 여러 내용 */
/* 여기서 원하는 모든 것을 설명할 수 있습니다 */

4. 실전 예시

코드 줄 “비활성화”:

가끔은 어떤 코드 조각을 잠시 실행하지 않게 하고 싶을 때가 있습니다. 이럴 때 주석이 딱입니다:

// System.out.println("일시적으로 필요 없는 텍스트");

줄은 그대로 남아 있지만, 컴파일러는 그것을 “보지” 못합니다.

TODO와 FIXME 표시

프로그래머도 사람인지라, 아직 코드가 덜 완성되었거나 버그가 있음을 스스로에게 상기시켜야 할 때가 있습니다. 그래서 종종 이렇게 씁니다:

// TODO: 빈 입력 체크를 추가하기
// FIXME: 이 함수는 합계를 잘못 계산함

많은 에디터와 IDE는 이런 단어를 심지어 하이라이트해 줍니다!

프로그래머들의 농담

// 이 코드는 제 책임이 아닙니다. 저는 원치 않았지만 강요당해 작성했습니다.
// 얘야, 나는_미래에서_왔다! 제발, 이 코드에 대해 나를 용서해라.
// 이런 걸 또 보게 된다면, 나는 출근할 때 무기를 들고 다니기 시작해야 할지도 모른다.
// 이 조건이 언젠가 충족된다면, 보상과 함께 전화 xxx-xxx-xxx 로 알려주세요.
// 친애하는 프로그래머여:
//
// 이 서브루틴을 “최적화”하는 일을 끝내고
// 그게 얼마나 큰 실수였는지 깨닫게 되면,
// 다음 사람을 위한 경고로 아래의 카운터를 올려 주세요:
//
// kolichestvo_chasov_potrachennykh_zdes’ = 42
// 내가 이걸 쓰기 시작했을 때는 신과 나만 내가 무엇을 하는지 이해했다. 
// 지금은 신만 남았다
// 가끔은 컴파일러가 내 모든 주석을 무시하는 것처럼 느껴진다
// 내 모든 코드와 모든 작업을 아내 달린에게 바친다. 
// 이것이 프로덕션에 배포되면 
// 그녀가 나와 우리 세 아이와 강아지를 먹여 살려야 할 테니까.

맞아요, 주석은 아주 웃길 수도 있습니다. 결국 주석을 쓰는 것도 살아 있는 사람들이니까요.

1
과제
JAVA 25 SELF, 레벨 1, 레슨 5
잠금
자기 메모 📝
자기 메모 📝
1
과제
JAVA 25 SELF, 레벨 1, 레슨 5
잠금
테스트용 코드 블록 🛠️
테스트용 코드 블록 🛠️
1
과제
JAVA 25 SELF, 레벨 1, 레슨 5
잠금
버그 수정 🐛
버그 수정 🐛
1
설문조사/퀴즈
명령어와 첫 번째 프로그램, 레벨 1, 레슨 5
사용 불가능
명령어와 첫 번째 프로그램
명령어와 첫 번째 프로그램
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION