[Java] 인트로
JVM(Java Virtual Machine)
자바는 컴파일러(Compiler)를 통해 기계어(Machine Language)로 변환되는 언어입니다.
컴파일이란 특정 프로그래밍 언어를 기계가 이해할 수 있는 언어로 옮기는 번역 과정으로,
여기에서는 자바 언어를 JVM(Java Virtual Machine)이 이해할 수 있는 코드(바이트코드, Bytecode)로 변환하는 것을 의미합니다.
JVM은 바이트코드를 운영체제에 맞는 기계어로 변환해줍니다.
JVM은 자바 프로그램을 실행시키는 도구입니다.
자바가 운영체제에 독립적인 것은 JVM이 있기 때문에 가능합니다.
JVM은 자바 코드로 작성한 프로그램을 해석해 실행하는 별도의 프로그램입니다. 즉, 프로그램을 실행하는 프로그램입니다.
프로그램이 제대로 실행되기 위해서는 컴퓨터의 다양한 자원(CPU, RAM, 각종 입출력 장치 등)을 활용해야 합니다.
이런 자원을 관리하는 것은 운영체제이므로, 프로그램은 운영체제가 정한 규칙을 따라야 합니다.
서로 다른 운영체제(Linux, Windows, MacOS 등)에서 프로그램을 실행하기 위해서는 운영체제별 규칙을 따르는 별도의 절차가 필요합니다.
JVM은 이 문제를 해결해줄 수 있습니다.
VM의 경우 JDK나 JRE를 설치하면 자동으로 설치됩니다.
자바는 JVM을 거치기 때문에 C나 C++에 비해 속도는 느린 편입니다.
하지만 JVM 내부의 최적화된 JIT 컴파일러를 통해 속도를 크게 개선해나가고 있습니다.
JDK(Java Development Kit)
자바 설치와 관련하여, JDK와 JRE의 차이에 대해 먼저 알 필요가 있습니다. JDK와 JRE는 다음의 내용을 포함합니다.
- JRE(Java Runtime Environment) : JVM + 표준 클래스 라이브러리
- JDK(Java Development Kit) : JRE + 개발에 필요한 도구
만약 자바 프로그램을 실행만 할 것이라면 JRE만 설치해도 상관없습니다.
그러나 우리는 자바 프로그램을 개발할 것이기 때문에 JDK를 설치해야 합니다.
JDK는 OracleJDK와 OpenJDK가 있습니다.
이 둘은 여러 차이가 있지만 지금은 OracleJDK는 오라클이라는 회사에서 관리하는 버전이고
OpenJDK는 오픈소스라는 것만 알아두어도 코드를 작성하는 데에는 문제가 없습니다.
JDK 8 vs 11 vs 17
LTS 버전에는 8, 11, 17 버전이 있는데, 17 버전은 비교적 최근에 출시된 버전이며,
8 버전과 11 버전의 사용자가 다른 버전에 비해 압도적으로 많습니다.
JDK 8
- 람다식 및 메서드 참조 도입
- 컬렉션에 Stream API 사용 가능
- 인터페이스 내부에 default 메서드 선언 가능
- Optional 클래스 도입 등
JDK 11
- String 클래스에 strip, isBlack, lines 메서드 추가
- Files 메서드에 readString 메서드 추가
- 람다식의 인수 선언 시 var 키워드 사용 가능
- 소스 파일을 javac을 통한 컴파일 없이 스크립트로 실행 가능
- 차세대 가비지 콜렉터 도입 등
JDK 17
- 텍스트 블록 추가
- 의사 난수 생성기 기능 향상
- switch 문 기능 향상
- 봉인 클래스 추가 등
인텔리제이 프로젝트 생성하기
먼저, 인텔리제이를 실행한 다음, 이후에 나타나는 창에서 New Project를 클릭합니다.
이후에 나타나는 창에서 아래의 내용을 입력해준 다음 Create를 누릅니다.
- Name : 프로젝트의 이름을 입력하는 곳으로 여기에서는 ExampleProject라고 명명하겠습니다.
- Location : 프로젝트가 저장될 위치를 설정하는 항목으로, 여기에서는 Mac 기준 바탕화면으로 설정하겠습니다.
- Language : Java를 선택합니다.
- Build System : IntelliJ를 선택합니다.
- JDK : zulu-11 Azul Zulu version 11.x.xx를 선택합니다.
여기에서는 이후에 자바 문법을 학습하면서 예제 코드를 입력할 때,
아래의 main() 메서드의 바디에 코드를 작성하면 된다는 점만 기억해주세요!
Hello, World!
이어지는 컨텐츠에서부터는 인텔리제이를 열고 직접 예제를 따라서 작성해가며 학습을 진행해야 합니다.
public class Main {
public static void main(String[] args) {
}
}
위의 코드를 통해 이번 유닛을 학습하기에 앞서 필요한 내용들만 간단하게 설명해보도록 하겠습니다.
public class Main { … }
클래스는 객체지향 프로그래밍에 있어 핵심이 되는 문법 개념이지만, 이번 유닛에서 클래스는 중요하지 않습니다.
프로그래밍을 공부하면서 클래스에 대해 중점적으로 학습합니다.
위의 코드에서 등장한 public class Main { … }은 다음을 의미합니다.
접근 허용 범위가 public인 Main이라는 이름의 클래스를 정의하겠다.
public static void main(String[] args) { … }
먼저 public static 소거하겠습니다.
- void main(String[] args) { … }
이를 좀 더 간단하게 표현해보겠습니다. - A main(B C) { D }
A, B, C, D가 각각 무엇인지 이해해봅시다.
먼저, A main(B C) { D }는 메서드를 정의하는 문법입니다.
메서드란, 어떤 기능을 하는 코드를 묶음으로 묶은 것을 의미합니다. 즉, 메서드는 어떠한 기능을 수행하기 위한 일련의 코드들의 집합체입니다.
엄밀히 말하면, 이 설명은 ‘함수’의 개념에 가깝습니다. 함수와 메서드의 관계는 다음과 같습니다. - 함수 : 특정 기능을 수행하는 코드들을 묶은 것
- 메서드 : 클래스 내에 포함되어 있는 함수
함수와 메서드의 의미를 구분하자면 위와 같이 구분할 수 있습니다.
하지만, 자바는 객체지향 언어이며, 모든 코드를 클래스 내에 작성하기 때문에 보통 함수라는 용어보다는 메서드라는 용어를 사용합니다.
메서드 정의
메서드는 아래와 같은 형태로 정의할 수 있습니다.
A main(B C) {
D
}
이제 A, B, C 각 요소가 무엇인지 설명하겠습니다. 각 요소는 아래와 같습니다.
반환_타입 메서드_이름(매개변수_타입 매개변수_이름) {
메서드_바디
}
- A는 반환 타입을 의미합니다.
- 위의 ‘메서드란’에서 메서드는 처리 결과값을 반환한다고 했습니다. 즉, 처리 결과는 일종의 ‘값’의 형태로 반환되며, 이를 반환값이라고 합니다.
- 값에는 종류가 나뉘어져 있습니다. 예를 들면, 정수를 나타내는 정수형, 한 개의 문자를 나타내는 문자형 등과 같이 말이죠.
- 이러한 값의 유형 및 종류를 프로그래밍에서는 ‘데이터 타입’ 또는 그냥 ‘타입’이라고 합니다. 타입은 오늘 여러분들이 학습하게 될 주요 내용 중 하나입니다.
- 다시 말해, 반환 타입은 메서드가 반환할 반환값의 종류 및 유형을 의미하며, 메서드를 정의할 때 메서드 이름 앞에 반환 타입을 명시해주어야 합니다.
- B = 매개변수의 타입, C = 매개변수의 이름
- ‘메서드란’의 설명에서 메서드는 어떤 데이터를 입력받는다고 했습니다. 즉, 메서드 외부에서 메서드 내부로 전달되어진 값이죠.
- 이 값은 어딘가에 저장되지 않고서는 사용할 수 없습니다. 이 때, 이 값을 ‘변수’라는 것에 저장할 수 있습니다.
- 변수에 어떤 값을 저장하는 것을 ‘할당한다’고 합니다.
- 이처럼 외부로부터 전달받은 값을 저장하고 있는 변수를 매개변수라고 합니다.
- 즉, 매개변수는 메서드 외부에서 메서드 내부로 전달한 값을 할당받아 저장함으로써, 메서드 내부에서 사용할 수 있게 해줍니다.
- 메서드를 정의할 때에는 메서드 이름 옆에 소괄호를 열고, 그 안에 매개변수의 타입과 매개변수의 이름을 공백으로 구분하여 명시해야 합니다.
- 매개변수의 타입은 어떤 유형의 값을 메서드가 입력받을 것인지를 명시하는 것을 의미하며, 매개변수의 이름은 입력받은 값에 어떤 이름을 붙여 사용할 것인지를 명시하는 것을 의미합니다.
- D = 메서드 바디
- 메서드 바디는 구체적으로 메서드가 어떤 기능을 수행할지에 대한 코드를 작성하는 부분입니다.
- return 키워드를 사용해 어떤 값을 반환할 수 있습니다.
int add(int number1, int number2) {
return number1 + number2;
}
위의 예시는 더하기를 수행하는 기능을 가진 메서드이며, 정수형 값 2개를 입력받습니다.
입력받은 값 2개는 매개변수 number1과 number2에 각각 할당됩니다.
메서드 몸체에서는 return 키워드를 통해 number1과 number2에 저장되어 있는 값을 더한 값을 결과값으로 반환합니다.
메서드 호출
메서드를 실행시키려면 메서드를 아래처럼 호출을 해주어야 합니다.
add(1, 2);
메서드 이름에 호출 연산자 ()를 붙여서 호출할 수 있습니다.
그리고, () 안에는 앞서 언급한 매개변수에 넣어줄 값을 입력하면 됩니다. 즉, add(1, 2);와 같이 1과 2를 전달하면서
add() 메서드를 호출하면 add() 메서드 내에서 number1에는 1이, number2에는 2가 저장됩니다.
main 메서드
public static void main(String[] args) { }
이제 대략적으로 main 메서드의 구조를 파악할 수 있습니다.
- void : “정확히 무엇인지는 모르겠지만, 반환 타입을 의미하는구나!”
- main : “메서드의 이름이 main이구나!”
- String[] : “정확히 무엇인지는 모르겠지만 매개변수의 타입이 String[] 타입이구나!”
- args : “입력 데이터로 들어오는 값을 args라는 이름의 매개변수에 할당하는구나!”
- “그리고 중괄호 블록 {} 안에 코드를 작성하면 되는구나!”
참고로, main 메서드는 자바로 작성한 소스 코드 파일을 실행하면 가장 먼저 실행되는 메서드입니다.
즉, 자바 애플리케이션을 실행하면 main 메서드 내부의 코드부터 코드의 흐름이 시작됩니다.
이처럼 프로그램이 실행될 때 가장 먼저 실행되는 메서드 또는 함수를 진입점 함수라고 합니다.
정리하자면, 자바에서 main 메서드는 진입점 함수이며, 자바로 어떤 소스 코드를 작성할 때 반드시 main 메서드가 있어야 하고, main 메서드로부터 코드의 흐름이 시작됩니다.
마지막으로, main 메서드 안에 Hello, World!를 출력하는 코드를 작성하고 실행해봅시다.
ain 메서드 옆의 ▶️ 버튼을 통해 main 메서드를 실행할 수 있습니다.
public static void main(String[] args) {
System.out.print("Hello, World!");
}
참고로, System.out.print();는 () 안의 내용을 출력하는 메서드를 호출하는 코드입니다.
댓글남기기