2장. Hello God Of Java

공부하는 감자·2023년 11월 26일
0

자바의 신 3판

목록 보기
2/30

들어가기 전

『자바의 신 3판』 을 읽고 내용 정리 및 공부한 내용을 정리한 글입니다.
서적: 자바의 신 3판 구입처

내용 정리

Java 설치

윈도우라면

대부분의 윈도우에는 자바가 설치되어 있지 않으므로 직접 설치해야만 사용할 수 있다.

리눅스라면

대부분의 리눅스에는 자바가 설치되어 있지만, 매우 오래된 버전이 설치되어 있을 수도 있으므로 최신 버전을 받아서 이 책을 공부하는 것이 좋다.

JDK를 설치 후(부록에서 확인), java와 javac 버전을 확인한다.

어떻게 cmd에서 java라는 프로그램이 실행되는 걸까?

자바를 설치한 디렉터리의 bin 디렉터리를 보면 각종 exe 파일이 존재할 것이다(맥이나 리눅스에서는 exe 파일이라는 것은 없다-해당 환경에선 확장자가 생략되어 보이나봄-).

윈도우의 cmd창에서 어떤 프로그램이 실행되려면 그 프로그램의 확장자는 exe, com, bat 중 하나로 끝나야만 실행할 수 있다. 그리고 뒤에 확장자들을 붙이지 않아도, 해당 확장자가 있는 파일을 Path 에서 찾아서 실행한다.

거꾸로 말하면, 어떤 프로그램이 cmd 창의 어떤 위치에서라도 실행할 수 있으려면 Path에 지정되어 있으면 된다.

현재 사용하는 윈도우에 지정되어 있는 Path를 확인하려면 cmd 창에서 “set %PATH%” 라고 쳐서 확인할 수 있다.

개발 툴

자바를 배우려면 자바 프로그램을 짜는 툴(이하 개발 툴)이 있어야 한다. 가장 유명한 툴로는 Eclips(이하 이클립스)와 InteliJ(이하 인텔리제이)라는 툴이 있다.

이클립스의 경우 여러 IT 회사들이 참여하여 개발되고 업그레이드 되고 있는 무료 툴이다.

그리고 인텔리제이는 기본적으로 상용버전을 제공하지만, 커뮤니티 에디션(Community Edition, CE)는 무료로 사용할 수 있다.

CMD 창에서 자바 컴파일 및 실행하기

자바 컴파일 명령어

javac {파일 명}.java

자바 실행 명령어

java {파일명}

// JDK를 많이 설치해서 설정이 꼬인건지, 나는 아래 명령어로 실행해야 동작했다.
java -classpath . {파일명}

컴파일 과정

대부분의 프로그래밍 언어들은, 텍스트 파일들을 컴파일이라는 단계를 거쳐야지만 프로그래밍 언어를 실행하는 프로그램이 실행할 수 있다.

java라는 확장자로 되어 있는 소스를 컴파일하면 .class라는 확장자를 가진 파일이 생성되어 디스크에 저장된다. 이 class 파일은 바이너리 파일로 되어 있기 때문에 에디터에서 열어도 제대로 보기가 어렵다.

컴파일을 하는 프로그램을 컴파일러라고 부르며, 자바에서는 javac.exe라는 프로그램이 그 역할을 수행한다.

컴파일을 할 때 프로그램이 규칙을 지키지 않았다면, 컴파일러는 오류를 반환하며 컴파일이 되지 않는다.

컴파일을 마친 클래스 파일은 JVM에서 읽어서 운영체제에서 실행된다.

💡 바이너리(binary) 파일이란?
바이너리는 우리나라 말로 0과 1로 구성되어 있는 2진법을 의미한다. 그래서 바이너리 파일은 2진수로 채워져 있는 파일을 말한다.
컴퓨터가 읽기 위한 파일들은 대부분 바이너리로 되어 있다.

main()

“실행을 목적으로 하는” 모든 자바 클래스는 main() 메소드가 반드시 있어야 한다. java 명령으로 실행하는 자바 프로그램의 진입점(시작점)은 main() 메소드이기 때문이다.

❗ (암기) main 메소드는 반드시 다음과 같이 선언되어야 한다.

public static void main(String[] args) {
}

주석

컴파일 시 무시되도록 하는 것을 말한다.

한줄 주석

// 디버그용으로, 사용하지 않는 코드를 감추려고 할 때 많이 사용된다.
// 혹은 소스에 대한 간단한 설명을 적어놓을 때 사용된다.

블록 주석

/*
 메소드 안의 여러 줄을 주석 처리하거나,
 메소드 자체를 주석 처리하고자 할 때 많은 도움이 된다.
*/

문서용 주석(docummentation comment)

/**
* 클래스 선언 바로 앞이나,
* 메소드 선언 바로 앞에 있으면 문서용 주석으로 인식되어 처리된다.
*/

메소드의 구성

{접근제어자} {리턴타입} {메소드 이름} ({매개변수 목록}) {예외목록} {
	메소드 내용
}

메소드의 예

// 예외목록은 지정하지 않아도 문제가 발생하지 않는다.
// 반드시 있어야 하는 것은 리턴타입, 메소드 이름, 메소드 내용이다.
public static void main(String[] args) {
	// 메소드 내용
}

정리해 봅시다.

Q. main() 메소드의 메소드 이름 앞에는 어떤 예약어들이 들어 가나요? (순서대로 쓰세요)

Me: public static void

Q. main() 메소드의 매개변수에는 어떤 값이 들어가나요?

Me: String[] args

Q. 만약 여러분들이 만든 클래스에 main() 메소드가 없다면, java 명령어로 그 클래스를 수행할 수 있나요?

Me: 아니오

Q. System.out.println() 메소드는 어떤 용도로 사용하나요?

Me: 화면에 내용을 출력하고자 할 때 사용합니다.

Q. System.out.print() 메소드는 System.out.println() 메소드와 어떤 차이가 있나요?

Me: print는 입력한 값을 그대로 출력하고, println은 값을 출력한 후 줄바꿈을 시켜줍니다.

Q. // 는 무엇을 하는데 사용하는 기호인가요?

Me: 한 줄 주석 처리할 때 사용합니다.

Q. / 로 시작하고, /로 끝나는 사이에 있는 소스들을 어떻게 되나요?내 답변

Me: 전체 주석 처리되며, 컴파일 시 무시됩니다.

Q. 메소드를 선언할 때 반드시 꼭 있어야 하는 세가지는 무엇인가요?

Me: 리턴 타입, 메소드 명, 메소드 내용

질문

💡 책에 있는 내용이 아닙니다.

책을 읽으며 설명이 더 필요하거나, 추가로 궁금한 점에 대해 질문 형식으로 작성 후, 답을 구해보고 있습니다.
참고한 사이트나 영상은 [출처]로 달아두었으며, 오류 지적은 언제나 환영합니다.

Q. 확장자 .exe, .com, .bat의 차이

셋 모두 프로그램을 실행한다.

exe와 com은 프로그램의 크기에 따라 차이가 나는 것 같다.

bat 파일은 명령어들을 모아두고 한 번에 실행시킬 때 사용한다. 배치 파일이라고 한다.

Q. main() 메소드가 없는 자바 프로그램이 있는가?

자바 언어 자체에서 main 메소드를 먼저 호출하도록 만들어졌다. 그러므로 “없다”고 보면 될 것 같다.

Java 프로그램이 실행되는 절차
1. Java classloader가 Class들을 JVM으로 load한다.(≒ 등록한다.)
2.
class 내에 작성된 static block을 실행한다.
3. main method를 찾은 뒤, 이를 invoke 한다.

찾아보니 JVM 에서 진입점에 들어가기 전 과정에서 소스를 수정하여 없어도 동작하도록 만든 사람이 있기는 했다.

메인 메소드 없이 자바 프로그램 실행

Q. main 메소드에서 String[] args의 용도는 무엇인가?

자바 프로그램 실행 시 주어진 “옵션”들이 담기는 곳이다. java {자바파일명} {옵션1 옵션2 …} 이런 식으로 사용할 수 있다. 각 옵션은 콤마 없이 스페이스로 구분한다.

이러한 옵션들을 명령행 인자(command-line arguments)라고 하는데, 반드시 자바 프로그램 외부에서 들어오는 값들이다. main 메소드는 가장 처음에 실행되는 메소드이고, CMD 에서 입력하는 값들은 모두 String이기 때문에 String 배열로 선언했다고 한다.

[Java] 왜 main()에 들어가는 인자는 오직 String 배열 뿐일까?

테스트

Java 클래스로 프로그램을 실행할 때, JVM은 길이가 0인 String 배열을 먼저 생성한 다음 main() 메소드를 호출할 때 매개값으로 이 배열을 전달한다.

//입력받은 옵션(인수, 매개변수)를 출력한다.
public class Profile {
    public static void main(String[] args) {
        System.out.println("args length: " + args.length);
        for (int i=0; i < args.length; i++) {
            System.out.println("arguments : " + args[i]);      
        }
    }
}

결과

  1. 인수없이 실행
  2. 인수 2개를 넣고 실행
  3. 인수 사이에 콤파를 넣고 실행
  4. 인수 사이에 스페이스를 2개 넣고 실행

Q. 저급 언어와 고급 언어

아래 내용들은 '참고 사이트'에 기재한 사이트들을 보며 각 글을 발췌 및 정리한 내용입니다. 따라서, 해당 사이트들을 직접 들어가 확인하는 것을 추천드립니다.

저급 언어(low-level language)

컴퓨터에 가까운 언어를 저급 언어라고 한다. 종류로는 기계어와 어셈블리어가 있다.

기계어

컴퓨터(CPU)가 별다른 해석(컴파일) 없이 직접 해독하고 실행할 수 있는 비트 단위로 쓰인 컴퓨터 언어를 통틀어 일컫는다.

기계어는 프로그램을 나타내는 가장 낮은 단계의 개념이다. 전류가 흐른다(1) 흐르지 않는다(0)로 구성되어있다.

어셈블리어(assembly language)

기계어와 명령어가 일대일로 대응되는 단어들로 구성되어 있다. 기계어를 좀 더 이해하기 쉬운 기호 코드로 나타낸 것으로, 심볼릭 언어라고도 한다. 컴퓨터 구조에 따라 사용하는 기계어가 달라지기 때문에 그에 대응하는 어셈블리어도 달라진다(이를 이식성이 낮다고 말한다).

저급 언어는 컴퓨터와 가까운 언어이기 때문에 간단한 명령으로 실행돼서 실행 속도가 굉장히 빠르다. 하지만 저급 언어는 배우기가 어렵고 유지보수가 힘들다.

임베디드 시스템이나 커널 프로그래밍, 컴퓨터 보안 등은 어셈블리어를 알아야 한다.

임베디드(embedded)는 보통 임베디드 시스템의 줄임말로 쓰인다. 사전에서는 ‘내장된’ 혹은 ‘안에 달려있는’ 정도의 뜻이라고 나온다. 어떤 기계 안에 ‘제어’를 목적으로 하는 아주 작은 컴퓨터가 달려있다면 그게 바로 임베디드 시스템이다.

고급 언어

저급 언어와 반대로 사람과 친숙한 언어를 고급 언어라고 한다. C언어, Java, Python 등이 있겠다.

Q. 인터프리터와 컴파일러의 차이

고급 언어로 프로그램을 짠 다음, 컴퓨터가 알아들을 수 있게 번역해줘야 한다. 그 방법으로는 인터프리트 방식과 컴파일 방식이 있다.

인터프리트(Interpret) 방식은 한 번에 한 줄씩 번역하는 것을, 컴파일(Compile) 방식은 전체 코드를 한 번에 번역하는 것을 말한다.

컴파일러는 전체 코드를 검사한 후 오류 메시지를 생성하므로, 실행 전에 오류를 발견할 수 있다. 대표 언어로는 C, C++, Java 등이 있다.

반면 인터프리터는 프로그램을 실행해 봐야지만 오류 발견이 가능하며, 오류를 만나면 바로 프로그램을 중지한다. Python, Ruby, JavaScript 등이 있다.

Q. 인터프리터와 컴파일의 장단점

컴파일은 프로그램 전체를 스캔하여 이를 모두 기계어로 번역한다. 전체를 스캔하기 때문에 대개 초기 스캔 시간(컴파일)이 오래 걸린다.

컴파일러는 고급 언어로 작성된 소스를 기계어로 번역하는 과정에서 목적 코드(Object Code)라는 파일을 만드는데, 이 오브젝트 코드를 묶어서 하나의 실행 파일로 다시 만드는 링킹(Linking)이라는 작업을 해야 한다. 이 때문에 통상적으로 인터프리터보다 많은 메모리를 사용해야 한다.

하지만, 한 번 초기 스캔을 마치면 실행 파일을 만들어 놓고 다음에 실행할 때 이전에 만들어 놓았던 실행파일을 실행하기 때문에 전체 실행 시간만 따지고 보면 인터프리트보다 빠르다.

인터프리트는 프로그램 실행 시 한 번에 한 문장씩 번역하므로 컴파일보다 실행시간이 더 걸린다. 하지만 오브젝트 코드를 만들거나 링킹 과정을 거치지 않기 때문에 컴파일보다 메모리 효율이 좋다.

Q. 자바는 컴파일러 언어인가 인터프리터 언어인가?

자바는 컴파일러 언어이기도 하고 인터프리터 언어이기도 하다.

위에서 설명했듯이, 자바 컴파일러가 .java 파일을 .class 파일(=목적 파일, 바이트 파일)로 변역하고, JVM 이 .class 파일을 읽어서 운영체제에 실행시킨다.

자바 컴파일러가 class 파일을 만드는 과정을 진행하고, 자바 인터프리터가 class 파일 내의 바이트 코드를 한 줄씩 읽으면서 기계어로 변환해주는 것이다.

이 내용은 추후 다른 포스트로 정리할 예정이다.

참고 사이트

[JAVA] 메인 메소드 public static void main(String[] args) 알아보기

[Java] main 메소드 뽀개기

# (Java) Junit은 어떻게 Main method 없이 실행될까?

COM과 EXE의 차이점

Exe와 Com의 차이

기계어(Machine Code)의 이해 | BJcoding

[Libasm] 2. 어셈블리어란?, 개념 및 특징 정리, 명령어 정리

어셈블리어(Assembly) 기초

임베디드란 무엇인가

컴파일러(compiler)와 인터프리터(interpreter)의 차이

[Java] 자바의 동작과정 Java Compiler와 JVM

profile
책을 읽거나 강의를 들으며 공부한 내용을 정리합니다. 가끔 개발하는데 있었던 이슈도 올립니다.

0개의 댓글