3. Java 언어의 구조
3. Java 언어의 구조 본문
이번 강의에서 배우고자 하는 목표:
1. Bytecode와 JVM의 관계
2. Java 프로젝트의 구조
3. main() 메서드
4. 주석문
5. 자바 어플리케이션을 Compile하고 실행하는 방법
6. Java Code Conventions (자바 코드 규율)
Bytecode - 바이트코드란?
바이트코드는 자바 가상 머신에서 사용되는 기계어입니다. 자바 가상 머신의 특징으로 앞선 강의에서 알아보았듯이 OS와 CPU에 독립적으로 실행 가능하다는 특징이 있습니다.
JIT Compiler가 어떻게 자바 어플리케이션의 속도를 향상시키는가?
JIT Compiler는 바이트코드를 JVM에서 실행하기 직전 기계어로 Compile 시켜줍니다. 이렇게 되면 초기 실행이 지연됩니다만, 성능이 향상됩니다. 참고로 안드로이드는 2.2 Froyo 때 부터 JIT Compiler를 지원합니다.
+ 여기서 잠깐, 컴파일과 인터프리트의 차이는 무엇일까?
Compile: 소스 코드를 기계어로 변환하여 실행 파일을 만들어놓는 작업. 프로그래머가 컴파일하는 동안 시간이 좀 더 오래 걸리지만 실행속도는 Interpret보다 월등히 빠릅니다.
Interpret: 소스 코드를 실행 시 즉석으로 해석하는 작업. 프로그래머가 소스코드를 작성하고 실행까지가 용이하기 때문에 프로그래밍 하는 동안은 Interpret이 비교할 수 없으리만큼 더욱 편리합니다.
참고로 Java는 기본으로는 (JIT Compiler의 사용 없이는) Interpret 되는 언어입니다.
Java Virtual Machine - 소프트웨어로 이루어진 가상 CPU
어플리케이션을 실행시키면 일어나는 프로세스 순서:
1. Class Loader (클래스 로더)
a. Bootstrap Classloader (가장 기본)
b. Extensions Classloader (JAVA_HOME/lib/ext 로딩)
c. System Classloader (classpath 로딩)
여기에서 stack overflow나 stack underflow 등의 오류가 발생하지 않으면 다음 단계로 통과
2. Bytecode Verifier
3. Interpreter
4. Runtime
5. Hardware
자바 소스코드는 "block"이라는 단위로 구성되어 있습니다. 블락이란 하나의 class 혹은 method의 시작과 종료의 사이를 지칭하는 말입니다. 특수문자 {가 블락의 시작을 가리키고 특수문자 }가 블락의 끝을 가리킵니다.
ex:
public class ClassName { // 블락의 시작 //블락 내용 } // 블락의 끝
자바 소스코드에서 하나의 문장을 끝 마치는 방법은 그 줄 끝에 ; 를 붙여야합니다.
자바 프로젝트에서 전체 소스코드는 .java 파일로 저장이 되고 클래스들은 전부 .class 파일들로 저장됩니다.
모든 자바 어플리케이션들은 하나 혹은 그 이상의 클래스로 이루어져있으며 클래스는 하나 혹은 이상의 코드로 만들어져있습니다.
클래스를 선언하는 방법:
class ClassName { }
자바 어플리케이션은 main() 메서드를 호출함으로써 시작하며 main () 메서드의 마지막 줄을 실행하고나서 종료됩니다.
main () 메서드의 형식:
public static void main (String args[]) 혹은 public static void main (String[] args)
여기서 public, static, void 등이 어떤 역활을 하는 지는 추후에 더 자세히 들여다 보겠습니다.
주석문 (Comment) 기능은 자바 소스파일을 개발자 본인이 아닌 다른 사람이 보고 작성된 한 부분의 이유를 알아볼 수 있도록 개발자가 설명을 적는 기능입니다. 주석문은 두가지 형태로 있습니다.
1. /* 와 */ 사이에 있는 모든 글 들은 주석문입니다.
2. // 부터 줄이 끝날 때 까지 모든 글 들은 주석문입니다.
참고로 주석문은 컴파일될 때 혹은 인터프릿 될 때 포함되지 않습니다.
자바 소스파일 컴파일 하는 방법:
1. 윈도우에서는 cmd 창을, 맥에서는 terminal 창을 켭니다.
2. javac 명령을 사용합니다. 여기에서 javac에 지정하는 소스명은 확장자까지 지정합니다.
명령문: javac 소스명
3. .java파일을 javac 명령에다 입력하면 .class 파일이 나오며 클래스파일의 명칭은 소스 안에 구현된 클래스의 명칭입니다.
주요 옵션으로는 classpath - 추가로 참조할 클래스들이 있는 디렉토리 혹은 압축명 설정, 그리고 deprecation - 경보메시지의 원인 점검이 있습니다.
자바 어플리케이션 실행하는 방법:
1. java 명령어로 interpretter를 실행합니다.
명령문: java 클래스명
주요옵션으로는 classpath - 같은 내용, 그리고 verbose:class - 메모리에 호출되는 것을 점검하는 것들이 있습니다.
Java Code Conventions
소스 파일은 공백라인으로 분리된 여러개의 섹션들로 이루어져있습니다.
소스 파일에는 하나의 public class를 포함합니다.
소스 파일 가장 처음에 그 public class가 와야합니다.
인덴트의 경우 프로그래머들끼리의 약속은 공백 4개입니다.
탭의 경우는 공백 8개입니다.
Line의 길이는 80 컬럼 이하입니다.
Line 래핑, 즉 한 수식 혹은 문장을 다음 라인으로 넘겨야 할때, 는 comma다음 끊어주거나 연산자 이전에 끊어줍니다
Java에서는 입출력을 위해 기본으로 Class Library를 제공하는데요, 표준 출력 문장은 아직 Class Library에 대한 이해를 쌓기 전에 다른 내용을 배우고 실제로 예습을 해볼 때 결과를 출력해서 볼 수 있기 때문에 스스로가 이해를 제대로 하고 있는지, 프로그래밍을 하면 원하는 결과가 나오는 지 를 직접 확인 할 수 있습니다.
표준 출력 문장 =
System.out.println ("매개변수")
식별자 (identifier) - 변수, 상수, 메서드, 그리고 클래스등을 구분할 수 있게 해주는 각 객체의 이름입니다. 자바에서 식별자에 관해서는 자바 코딩과 같이 규칙과 관례들로 이루어져 있습니다. 마찬가지로 규칙은 지키지 않으면 오류가 일어나고, 관례는 다른 프로그래머들이 코드를 보고 이해하기 쉽도록 돕는 서로를 위한 배려입니다.
생성규칙:
1. 알파벳이나 특수문자 ( _ 와 $)로 시작해야하며 숫자로 시작할 수 없습니다.
2. 중간에는 특수문자 ( _ 와 $)와 숫자들을 포함해도 괜찮습니다.
3. 자바 예약어를 식별자로 쓸 수 없습니다.
4. 대소문자가 구분됩니다. (Name과 name은 두개의 다른 객체입니다)
5. 길이에 대한 제한은 없습니다.
6. 공백을 포함할 수 없습니다.
관례:
1. 클래스의 식별자 = 대문자로 시작하는 명사
2. 메서드의 식별자 = 소문자로 시작하는 동사
3. 변수의 식별자 = 소문자로만 이루어진 명사
4. 상수의 식별자 = 대문자로만 이루어진 명사
이전 강의 (2. Java 언어의 배경, 역사와 특징)