dev-miri
[혼공자] Chapter 01 자바 시작하기 본문

- 목차
- 01-1 프로그래밍 언어와 자바
- 01-2 이클립스 개발 환경 구축
- 01-3 자바 프로그램 개발 과정
01-1 프로그래밍 언어와 자바
-컴퓨터가 이해할 수 있는 기계어는 우리의 일상 언어와는 매우 다른 0과 1로 이루어진 이진 코드를 사용
-반대로 사람이 사용하는 언어는 컴퓨터 입장에서 보면 이해할 수 없는 문자의 집합
=> 사람과 컴퓨터가 대화하기 위해서는 사람의 언어와 기계어의 다리 역할을 하는 프로그래밍 언어가 필요
- 소스 파일 : 프로그래밍 언어로 작성한 파일
- 소스 파일은 컴퓨터가 바로 이해할 수 없음. 컴파일 과정을 통해 0과 1로 이루어진 기계어 파일로 번역한 후 컴퓨터에서 사용
자바의 특징
- 모든 운영체제에서 실행 가능
- 자바에서 작성된 프로그램은 모든 운영체제에서 실행 가능(윈도우에서 개발된 프로그램을 수정하지 않고 바로 리눅스에서도 실행할 수 있다는 장점)
- 객체 지향 프로그래밍
- 객체 지향 프로그램 : 객체(부품)를 만들고, 이 객체들을 서로 연결해서 더 큰 프로그램을 완성하는 기법
- 자바는 객체 지향 프로그래밍을 위한 최적의 언어
- 메모리 자동 정리
- 자바는 메모리(RAM)를 자동 관리 하므로, 개발자는 메모리를 관리하는 수고를 덜 수 있다
- 무료 라이브러리 풍부
자바 개발 도구(JDK : Java Development Kit)
자바 개발 도구의 줄임말로, 자바로 프로그램을 개발할 수 있는 실행 환경(JVM)과 개발 도구(컴파일러) 등을 제공한다.
JAVA SE 11.0.13(LTS)
- SE : Standard Edition
- 11 : 주 버전 - 자바 언어에 많은 변화가 있을 경우 증가된다
- 0 : 개선 버전 - 0부터 시작하고 주 버전에서 일부 사항이 개선될 때 증가. 보통은 모두 0
- 13 : 업데이터 버전 - 1~3개월 주기로 버그가 수정될 때마다 증가
- LTS(Long Term Support) : 장기 지원 서비스를 받을 수 있는 버전
*용어 정리
Java 8, Java 11 : 언어에 중점을 두고 부르는 이름
Java 11을 설치한다는 것은 Java SE 또는 JDK 11을 설치한다는 것과 동일한 의미
환경변수 설정
-운영체제가 실행하는 데 필요한 정보를 제공해주는 변수
- JDK가 설치된 폴더를 일반적으로 JAVA_HOME 이라고 한다.
어떤 프로그램은 설치된 JDK의 위치를 찾을 때 JAVA_HOME 환경 변수를 이용하기 때문에 JAVA_HOME 환경변수를 만들고, JDK 설치 폴더를 등록하는 것이 좋다
-PATH 환경 변수 수정
파일 탐색기에서 JDK 설치 폴더를 보면 bin 폴더가 있다.
bin 폴더 안에는 다양한 명령어들이 있는데, 대표적으로 자바 소스 파일을 컴파일해주는 javac 명령어와 컴파일된 파일을 실행해주는 java 명령어가 있다.
Q . 왜 PATH 환경 변수를 사용하여야 할까?
A. javac와 java 명령어는 cmd의 명령 라인에서 개발자가 직접 컴파일하고 실행할 때 사용된다. 문제는 bin 폴더 안에 있기 때문에 다른 폴더에서 실행할 수 없다. 다른 폴더에서 실행하려면 다음과 같이 환경 변수 Path에 bin 폴더를 등록해야 한다.
01-2 이클립스 개발 환경 구축
-IDE란?
프로젝트 생성, 자동 코드 완성, 디버깅 등과 같이 개발에 필요한 여러 가지 기능을 통합적으로 제공해주는 틀
-워크스페이스
이클립스 실행과 관련된 메타 데이터와 프로젝트 폴더가 저장되는 폴더
-뷰
이클립스 내부에서 사용되는 작은 창Console 뷰 띄우는 법 : [Window] - [Show View] - [Console] 메뉴 선택
-퍼스펙티브
프로젝트를 개발할 때 사용할 수 있는 뷰들을 미리 묶어 이름을 붙여 놓은 것
01-3 자바 프로그램 개발 과정
자바 프로그램을 개발하기 위해서는
- 파일 확장명이 .java인 텍스트 파일 생성
- 자바 언어로 코드를 작성
이렇게 만들어진 자바 소스 파일을
3. 컴파일러인 javac 명령어로 컴파일
컴파일이 성공하면 확장명이 .class 바이트 코드 파일이 생성
바이트 코드 파일은 완전한 기계어가 아니므로 바로 실행할 수 있는 파일이 아니다.
바이트 코드 파일을 완전한 기계어로 번역해서 실행하려면 java 명령어를 사용해야 한다.

바이트 코드 파일과 자바 가상 기계
- 자바 프로그램은 완전한 기계어가 아닌, 바이트 코드 파일(.class)로 구성된다
- 바이트 코드 파일은 운영체제에서 바로 실행할 수 없고, 자바 가상 기계(JVM)라는 번역기가 필요하다.
Q. 자바가 JVM을 사용하는 이유는?
A. 바이트 코드 파일을 다양한 운영체제에서 수정하지 않고 사용할 수 있도록 하기 위함.(자바의 첫 번째 특징)
이 특징이 자바 언어를 성공으로 이끌었다고 볼 수 있다.
예를 들면, 개발자는 윈도우 운영체제에서 편하게 프로그램(바이트 코드 파일)을 개발하고, 개발 완료된 프로그램은 리눅스로 옮겨 바로 실행할 수 있다.
즉, 소스 파일(*.java)를 javac 명령어로 컴파일 하면 생기는 바이트 코드 파일(*.class)는 개발 완료된 자바 프로그램 형태이다.
각 운영체제(윈도우, 리눅스 등)마다 JVM을 가지고 있고,
바이트 코드 파일은 JDK가 설치된 어떤 운영체제에서도 java 명령어로 동일하게 실행될 수 있다.
각 운영체제의 JVM은 바이트 코드 파일을 해당 운영체제에서 실행 가능한 기계어로 번역해서 실행하기 때문이다 .
(개발자는 운영체제와 상관없이 자바 프로그램을 개발할 수 있다.)
자바 프로젝트 생성부터 실행까지
[1단계] 프로젝트 생성
- [File] - [New] - [Java Project] 로 자바 프로젝트 생성
- Package Explorer 뷰를 보면, 프로젝트가 생성되고, module-info.java 편집 뷰가 자동으로 실행된다.
- 모듈 기술자(module-info.java)에서 module 키워드 다음에 있는 것이 모듈명이다. 모듈명을 꼭 프로젝트명으로 할 필요는 없다. JDK 11 버전 이후로부터는 명령 프롬프트와 같은 명령 라인에서 프로젝트를 실행할 때 모듈명이 필요하다.

3. module-info.java 편집 뷰에서 중괄호 { } 블록 안에 requires java.se; 를 작성한다.
1. Java SE(JDK)가 제공하는 모든 모듈이 필요함을 의미한다.
[2단계] 소스 파일 생성과 작성
- Package Explorer 뷰에서 chap01 프로젝트의 src 폴더를 선택하고, [New]-[Package]를 선택한다.
- 패키지란? : 자바는 소스 파일 및 컴파일된 바이트 코드 파일들을 기능별로 쉽게 관리하기 위해 패키지를 사용한다. 패키지는 마치 파일 시스템의 폴더(디렉토리)와 비슷하다.
- JDK 11 이후 버전부터는 직접 생성하는 프로젝트도 모듈로 활용할 수 있기 때문에 반드시 패키지를 요구한다.
- Package Explorer 뷰에서 패키지를 선택하고 마우스 오른쪽 버튼을 클릭한 후 [New] - [Class]를 선택한다
- Package Explorer 뷰를 보면 패키지 안에 .java 소스 파일이 생성된 것을 볼 수 있다.
- Hello.java 편집 뷰에서 다음과 같이 작성한다. 작성을 완료한 후 소스 파일을 저장하면 자동으로 컴파일된다. 이클립스는 컴파일을 위한 메뉴가 따로 없다.
package sec03.exam01; //패키지 명
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, Java");
}
}
- 3라인에서 Hello의 H가 대문자로 작성되어야 한다.(파일명과 대소문자가 동일)
- 4라인에서 String의 S가 대문자로 작성되어야 한다.
- 5라인에서 System의 S가 대문자로 작성되어야 한다.
- 5라인 끝에 세미콜론(;)을 붙여준다.
* 바이트 코드 파일 위치
자동 컴파일된 바이트 코드 파일은 파일 디렉토리 bin 폴더 내부에 패키지 폴더(sec03\exam01)와 함께 Hello.class로 생성된다

[3단계] 바이트 코드 실행
- Package Explorer 뷰에서 소스 파일 Hello.java를 선택하고 툴 바에서 Run 아이콘을 클릭하거나, 마우스 오른쪽 버튼 클릭 후 [Run As] - [Java Application]을 선택해서 바이트 코드 파일을 실행
- Console 뷰에서 "Hello.Java"가 출력된다
명령 라인에서 컴파일하고 실행하기
이클립스 개발 환경이 아니라 명령 프롬프트 또는 터미널과 같은 명령 라인에서 javac와 java 명령어로 소스 파일을 직접 컴파일하고 실행해야 하는 경우도 있다.
- 파일 탐색기에서 프로젝트 폴더를 열면 src 폴더와 bin 폴더를 확인할 수 있다.
- src 폴더에는 소스파일(Hello.java)이 저장되어 있고
- bin 폴더에는 바이트 코드 파일(Hello.class)이 저장되어 있다.
- JDK 11 이후 버전을 사용한다면 src 폴더에 module-info.java가 있고, bin 폴더에는 module-info.class가 있을 것이다.
- cmd에서 프로젝트 폴더로 이동한다
- src 폴더에 있는 소스 파일을 javac 명령어로 컴파일해서 바이트 코드 파일을 bin 폴더에 생성한다.
- JDK 8 이전 버전
- JDK 11 이후 버전
- JDK 11 이후 버전부터는 모듈 기술자(module-info.java)도 컴파일 대상에 반드시 포함시켜야 한다. 그 이유는 모듈 기술자에 requires 키워드로 의존성 모듈이 기술되어 있기 때문이다.
- 컴파일러는 소스 파일을 컴파일하기 위해 모듈 기술자에 기술된 의존성 모듈을 참고한다.
의존성 모듈
- JDK 8 이전 버전까지는 표준 API 전체가 제공되었기 때문에 문제가 없었지만, JDK 11 이후 버전부터 JDK가 제공하는 표준 API를 모듈별로 쪼개어서 제공한다.
- 기본적으로 java.base 모듈을 사용할 수 있지만, 다른 모듈에 있는 API를 사용하고 싶다면 반드시 모듈 기술자에 의존성 모듈로 등록해야 한다.
module chap01 {
requires java.se; //Java SE가 제공하는 모든 모듈이 필요함
}
- JAVA SE(JDK)가 제공하는 모든 표준 모듈이 필요하다고 했기 때문에 Java SE 전체에 의존성을 가진다.
- JDK 8처럼 표준 API 전체를 제공받는 것과 동일한 효과가 난다.
//JDK 8 이전 버전
javac -d bin src/sec03/exam01/*.java
javac -d [바이트 코드 파일 저장 위치][소스경로/*.java]
//JDK 11 이후 버전
javac -d bin src/module-info.java src/sec03/exam01/*.java
javac -d [바이트 코드 파일 저장 위치][소스 경로/module-info.java 소스경로 /*.java]
tree /f /a 명령어를 실행하면 bin 폴더에 바이트 코드 파일(sec03/exam01/Hello.class)이 생성된 것을 확인할 수 있다.
4. java 명령어로 바이트 코드 파일을 실행
- JDK 8 이전 버전
- JDK 11 이후 버전
- 실행 방식이 이전 버전과 달라진 이유는 역시 모듈 기술자(module-info.class)를 읽기 위해서이다.
- -m 옵션 뒤의 chap01이 모듈명인데, 모듈 기술자의 모듈명과 동일할 경우 JVM은 모듈 기술자의 내용을 읽고 바이트 코드 파일(/sec03.exam01.Hello)을 실행할 때 의존성 모듈을 참고한다.
- 바이트 코드 파일은 Hello.class 이지만 java 명령어로 실행할 때는 .class를 생략한다.
//JDK 8 이전 버전
java -cp bin sec03.exam.01.Hello
java -cp [바이트 코드 파일 저장 위치][패키지이름...클래스이름]
//JDK 11 이후 버전
javac -p bin -m chap01/sec.exam01.Hello
javac -p [바이트 코드 파일 저장 위치] -m 모듈/패키지이름..클래스이름
프로그램 소스 분석
- Hello.java 소스 파일을 보면 최상단에 package 키워드와 sec03이 명시되어 있다.
- Hello.java는 sec03.exam01 패키지에서 생성되었기 때문에 이와 같은 패키지 선언이 반드시 있어야 한다.

package sec03.exam01;
- 중괄호 { } 블록의 앞부분인 public class Hello를 클래스 선언부라고 한다.
- public class는 공개 클래스라는 뜻이고
- Hello는 클래스 이름이다.
- 클래스 이름은 소스 파일명과 동일해야 하며, 대소문자도 일치해야 한다.
- javac 명령어로 컴파일하면 클래스 이름에 .class가 붙어 바이트 코드 파일이 생성된다.
- 일반적으로 Hello.class를 Hello 바이트 코드 파일이라고 부르지 않고 Hello 클래스라고 간단하게 부른다
- java 명령어로 바이트 코드 파일을 실행하려면 클래스 블록 내부에 다음과 같은 main() 메소드 블록을 가지고 있어야 한다.
- 중괄호 { } 블록의 앞부분인 public static void main(String[ ] args)를 메소드 선언부라고 한다.
- 괄호 ( ) 바로 앞의 main은 메소드 이름이다.
- java 명령어로 바이트 코드 파일을 실행하면 제일 먼저 main() 메소드를 찾아 블록 내부를 실행한다.
- 그래서 main() 메소드를 프로그램 실행 진입점(entry point)라고 부른다.

실행문과 세미콜론(;)
- main() 메소드 블록 내부에는 다양한 실행문들이 작성된다.
- 실행문 끝에는 반드시 세미콜론(;)을 붙여서 실행문이 끝났음을 표시해주어야 하며, 그렇지 않으면 컴파일 에러가 발생한다.
- 컴파일러는 세미콜론(;)까지 하나의 실행문으로 해석하기 때문에 하나의 실행문을 여러 줄에 걸쳐서 작성하고 맨 마지막에 세미콜론(;)을 붙여도 된다.
실행문의 종류
실행문은 변수 선언, 값 저장, 메소드 호출에 해당하는 코드를 말한다.