$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal $ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install openjdk-17-jdk $ java -version openjdk version "17.0.8.1" 2023-08-24 OpenJDK Runtime Environment (build 17.0.8.1+1-Ubuntu-0ubuntu120.04) OpenJDK 64-Bit Server VM (build 17.0.8.1+1-Ubuntu-0ubuntu120.04, mixed mode, sharing) $ javac -version javac 17.0.8.1 $ sudo update-alternatives --config java There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-17-openjdk-amd64/bin/java Nothing to configure. $ vi ~/.zshrc ...
OS 버전 확인 및 업데이트 후 sudo apt-get install openjdk-${VERSION}-jdk로 JDK를 설치한다. 여기서 JDK는 Java Development Kit의 약자로 Java application을 개발하기 위한 software package다. JDK는 개발, compile, debug 및 실행하는 데 필요한 모든 도구와 library를 포함한다.
javac HelloWorld.java: HelloWorld.class라는 bytecode 파일 생성
java HelloWorld: bytecode를 JVM에서 실행
.class 파일이 디스크에 생성되므로, 필요한 경우 해당 bytecode를 다른 위치로 이동하거나 재사용 가능
이제 HelloWorld.java를 줄 마다 어떤 의미가 있는지 살펴보자.
1
publicclassHelloWorld {
public
접근 제한자
Class가 다른 package에서도 접근 가능함을 의미
class
Java에서 사용자 정의 데이터 타입을 생성하는 키워드
1
publicstaticvoidmain(String[] args) {
static
정적 method임을 나타내는 키워드
객체를 생성하지 않고 method 호출 가능
void
Method가 반환하는 자료형
(String[] args)
main method의 매개변수
Command line에서 전달되는 인자들을 배열로 입력
1
System.out.println("Hello, World!");
System.out
Java의 표준 출력 스트림
println
표준 출력 스트림에 문자열 출력 후 줄 바꿈 수행 method
Java Compilation Rules
Source File Structure
File Name
Java source 파일의 이름은 그 파일 내의 public class 이름과 동일해야 함
만약 public class가 없다면 파일 내의 주 class와 일치하는 이름을 사용하는 것을 권장
One Public Class per File
한 Java source 파일에는 단 하나의 public class만 있어야 함
Package Declaration
First Statement
package 선언은 source 파일의 첫 번째 문장이어야 함 (주석 및 공백 제외)
Directory Structure
Package 이름은 디렉토리 구조와 일치해야 함
Ex. package com.example.test;라는 선언이 있다면, source 파일은 com/example/test 디렉토리에 있어야 함
Import Statements
After Package
Import 문장은 package 선언 바로 다음에 나와야 함
No Duplicate Imports
동일한 package나 class를 여러 번 임포트 할 필요는 없음
Class Declaration
One Public Class
하나의 source 파일에는 단 하나의 public class만 있어야 함
Class Modifiers
class는 public, abstract, final 등의 수정자를 가질 수 있음
private 수정자는 최상위 class에는 사용할 수 없습니다.
Method and Field Declaration
Modifiers
method와 field는 다양한 접근 제어자와 수정자를 가질 수 있음
Ex. public, private, protected, static, final 등…
Order
Java 컴파일러는 method나 field의 선언 순서에 대해 특별한 요구사항을 가지고 있지 않음
하지만 일반적인 코딩 관례에 따라 변수나 초기화 블록은 class의 상단에, method는 그 아래에 위치시키는 것을 권장
Other Compilation Units
Interfaces, Enums, and Annotations
인터페이스, 열거형, 주석은 class와 유사한 규칙을 따름
Ex. public 인터페이스는 파일 이름과 동일한 이름을 가져야 함
예를 들어, 만약 public class의 이름과 파일 명이 다를 경우 아래와 같은 에러가 발생한다.
1 2 3 4 5
$ javac HelloWorld.java HelloWorld.java:1: error: class HelloWorld2 is public, should be declared in a file named HelloWorld2.java public class HelloWorld2 { ^ 1 error
이 외에 Java의 여러 keyword들은 아래와 같다.
키워드
설명
사용처 및 예시
(default)
아무 키워드도 없을 때. 같은 package 내에서만 접근 가능. (package-private)
class, method, field
public
어디서든 접근 가능
class, method, field
protected
같은 package나 상속받은 하위 class에서 접근 가능
method, field
private
같은 class 내에서만 접근 가능
method, field, 내부 class
abstract
구현되지 않은 class나 method. class는 인스턴스화될 수 없고, method는 하위 class에서 구현되어야 함
class, method
final
변경 불가능. class는 상속 불가, method는 오버라이드 불가, 변수/field는 한 번 할당 후 변경 불가
class, method, field/변수
static
인스턴스 없이 class 레벨에서 접근 가능. class 변수나 method는 모든 인스턴스가 공유
method, field, 내부 class
synchronized
여러 스레드가 동시에 접근할 때 해당 method나 블록의 코드 실행을 한 번에 하나의 스레드만 수행할 수 있게 동기화 함
method, 코드 블록
transient
객체 직렬화시, 해당 field의 값은 직렬화되지 않음
field
volatile
변수를 메인 메모리에서 읽고 쓰게 함. 여러 스레드가 동시에 사용할 때 변수의 일관성을 유지