자바는 컴퓨터 프로그래밍 언어로, 컴퓨터 프로그램을 만드는데 사용합니다.
누구나 웹 사이트에 접속하여 게시글을 읽거나, 작성하거나 수정 혹은 삭제하는 작업을 해본 경험이 있을것입니다. 이런 게시판이나 웹 사이트를 웹 프로그램 이라고 하는데, 자바는 이런 웹 프로그램 개발에 많이 사용되는 언어입니다. 과거에는 IT 웹 서비스 기업들이 서버 사이드 언어로 간혹 php를 사용했었지만, 기존 레거시를 자바 언어로 많이 옮겨갔습니다.
자바는 안드로이드 앱 개발할 때 사용하는 메인 언어입니다. 안드로이드 스튜디오와 함께 자바 언어를 사용하면 쉽게 모바일 앱 개발을 할 수 있습니다.

웹 페이지의 데이터를 저장/수정/삭제 하고 관리하는 데이터베이스 시스템 연결에도 자바 언어가 많이 사용됩니다.
자바는 대규모 데이터 분산처리에 필요한 도구와 오픈 프레임워크가 널리 보급되어있습니다. 하둡, 스파크 뿐만 아니라 카프카, 하이브 역시 대규모 데이터 처리에 유용하게 사용되는 프레임워크이죠. 이 모두 자바로 이루어진 프레임워크입니다.
이것은 프로그램을 개발하는 기법으로, 부품에 해당하는 “객체”들을 먼저 만들고 그 부품들을 조립하고 부품들끼리 연결하여 전체 프로그램을 완성하는 기법을 객체지향 프로그래밍(OOP)라고 합니다. 이때 사용하는 언어를 “객체 지향 언어” 라고 합니다.
C++의 경우, 메모리에 생성된 객체를 제거하기 위해 개발자가 직접 코드를 작성해야 합니다. 만약 이 작업을 성실하게 해주지 않는다면 프로그램은 불완전해지고 갑자기 다운되는 현상을 겪게 되죠. 이런 C++과는 달리, 자바는 개발자가 직접 메모리를 접근할 수 없게 설계되어있으며 메모리는 자바가 직접 관리합니다(Gabage Collector). 따라서 개발자는 메모리 관리의 수고스러움을 덜고, 핵심 기능 코드 작성에 집중할 수 있습니다.
자주 쓰이는 주요한 기능들을 라이브러리로 풍부하게 제공해주고 있어서, 원하는 프로그램을 적은 노력으로 개발하기 쉽습니다.
서로 다른 실행환경을 가진 시스템 간에 프로그램을 옮겨 실행할 수 있는 장점을 가지고 있습니다. 예를 들어 윈도우 환경에서 실행하는 프로그램을 리눅스 혹은 유닉스에서 실행할 수 있다면 운영체제에 독립적이라고 할 수 있습니다. 이는 자바를 실행하기 위한 가상의 운영체제 역할을 하는 Java Virtual Machine(JVM)이 있기 때문에 이러한 특징을 갖고 있다고 볼 수 있습니다.
자바를 실행하기 위한 가상 머신인 JVM이 있기 때문에 운영체제에 독립적인 특징이 있다고 했는데요, 그렇다면 JVM이 무엇인지 알아보겠습니다.

Java Virtual Machine은 자바를 실행하기 위한 가상 머신입니다. 실 운영체제를 대신해서 자바 프로그램을 실행하는 가상의 운영체제 역할을 하죠.
만약에 어떤 프로그램이 OS에 종속적인 프로그램이라고 가정해봅시다. 어떤 프로그램은 Mac OS에서만 동작하고, 또 다른 프로그램은 Window OS에서만 동작하겠죠. 이렇게 되면 운영체제에 따라서 프로그램의 구현이 달라지는 상황이 벌어집니다.
자바의 경우에는 자바를 실행하기 위한 가상머신인 JVM이 OS위에 있기 때문에 운영체제에 독립적인 특징을 갖게됩니다.
JVM의 구조는 다음과 같습니다. 개발자가 Java 코드를 작성하면 그 이후부터는 Java compiler, 가상머신이 동작하며 프로그램이 실행됩니다.


자바 프로그램은 확장자가 .java인 자바 소스 파일을 작성하는 것부터 시작됩니다. 이 소스파일을 컴파일러로 컴파일하면 확장자가 .class인 바이트 코드가(클래스 파일) 생성됩니다. 이 클래스 파일은 JVM 에 의해 JVM에서 해석되고 해당 운영체제에 맞게 기계어로 번역됩니다. 위쪽 JVM 그림에서 Class Loader가 이 번역 역할을 하는 ‘번역가’ 라고 할 수 있는 것이지요.

자바의 가장 큰 장점 중 하나인 “Write Once, run anywhere” (한 번 작성하면 어디서든 실행된다)는 특징은 매력적이지만, 한 번의 컴파일링으로 실행 가능한 기계어가 만들어지지 않고 JVM에 의해 기계어로 번역되고 실행되기 때문에 C,C++ 컴파일 단계에서 만들어지는 완전한 기계어보다는 속도가 느리다는 단점을 가지고 있습니다. 그러나 기계어로 빠르게 변환해주는 JVM 내부의 최적화된 JIT 컴파일러를 통해 속도의 격차는 많이 줄어들고 있습니다.
앞서 자바 Compiler와 실행 머신(JVM)에 대해 이야기했었는데, IntelliJ를 사용하여 자바 프로그램을 작성한다면 사용할 기회조차 없는 java, javac에 대해서 알아보겠습니다. 로컬에 직접 JDK를 다운받았다면 환경변수(PATH) 설정 후 javac(컴파일), java(실행) 명령을 통해 자바 코드를 실행할 수 있습니다. 우리는 IntelliJ를 이용하기 때문에 IDE에서 이 작업을 수행해주고 있는 것이죠.
그러면 IntelliJ에서 컴파일을 하는것이 아닌, 우리가 직접 Terminal에서 javac를 이용한 컴파일을 해보도록 할게요. 먼저 jdk가 저장되어 있는 루트로 이동합니다.
cd C:\Users\사용자명.jdks\corretto-17.0.9\bin
Main.java 소스파일을 Main.class 클래스 파일로 컴파일 합니다. JVM이 인식할 수 있는 이진(binary) 파일로 만들어주는 것이죠.
Main.java파일과 같은 위치에 Main.class 파일이 생성 되었을겁니다. 
위 2, 3번에서 수행하는 컴파일, 실행 과정을 인텔리제이(IntelliJ)에서는 Run 버튼 하나만으로도 수행됩니다 🙂
IDE란 ‘통합 개발 환경’의 약자입니다. Java 코드 작성을 편리하게 하기 위해 통합 개발 환경을 제공해주는 툴 인데요, IDE종류는 IntelliJ, eclipse, vs code등 다양합니다.
이런 IDE를 이용하는 이유는 다음과 같은 이유가 있습니다.
1. 코드 작성시 문법 체크를 해주는 기능을 담고 있음
만약 IDE를 사용하지 않는다면, 메모장이나 편집 도구에서 작성한 java 파일을 직접 javac, java 명령어를 사용하여 컴파일하고 실행해야합니다.
우리는 그 중 실무에서 많이 사용하는 IntelliJ라는 툴을 사용해보도록 하겠습니다.
IntelliJ IDE 에서 Java 개발을 하기 위해서는 JDK 다운로드를 해야합니다. JDK란 Java Development Kit의 약자입니다. 말 그대로 자바 개발을 위한 개발kit 라고 생각하시면 됩니다.
다운받은 IntelliJ IDEA를 실행하시면 아래와 같은 화면이 나오고
**Projects > New Project를 눌러 새로운 프로젝트를 생성해보도록하겠습니다.**

새로운 프로젝트 정보를 입력해줍니다.
Name : java-project
JDK : corretto-17
Location은 코드를 저장하고자 하는 루트로 설정해주세요.
인텔리제이에서의 default(기본) Location은 ~\IdeaProjects 입니다.

참고로 select box 선택되어있는 Add sample code는, 프로젝트 생성 후 샘플 코드를 자동으로 추가할 것인지에 대한 선택입니다. 그 하단의 Generate code with onboarding tips를 선택하면 인텔리제이에서 팝업으로 제공해주는 onboarding tips를 볼 수 있습니다.
생성한 자바 프로젝트의 src에 마우스 오른쪽 버튼 클릭 > **New > Java Class** 를 선택해서 클래스를 생성합니다. HelloWorld라는 클래스 이름을 입력하고 엔터를 쳐서 생성해줄게요.

// 부터 라인 끝까지 주석으로 처리합니다. 라인수가 한 줄일 경우 행 주석을 사용합니다.
// 한줄짜리 주석
/와 / 사이에 있는 모든 범위를 주석으로 처리합니다. 라인수가 주로 두 줄 이상일 때는 범위주석을 사용합니다.
/*
* 한 줄 이상의 주석
*/
실행문은 변수 선언, 값 저장, 메소드 호출에 해당하는 코드를 말합니다.
컴파일러는 세미콜론(;)이 나올 때 까지 실행문이 계속해서 연결된 것으로 보기 때문에 한 실행문이 여러 줄에 걸쳐 있어도 되고, 한 줄에 여러 개의 실행문이 있어도 됩니다.
int index = 1;
int loop = 2;
int result = index + loop;
System.out.println(result);
예를 들어 앞의 코드를 다음과 같이 바꾸어 작성해도 전혀 문제가 없죠.
int index = 1; int loop = 2;
int result =
index + loop;
System.out.println(result);
Python 이나 Spock 을 사용할 경우, 세미콜론(;)을 붙이지 않아도, 줄바꾸기로 실행문 구분이 되지만 Java 언어의 경우에는 위와 같이 세미콜론(;)을 붙여주어야 실행문이 끝난다는 것을 알 수 있습니다.
일반적으로 자바 코드는 다음과 같은 형태로 작성합니다. 참고로 |로 분리된 항목들은 [ ] 안의 항목 중 하나를 사용할 수 있다는 뜻입니다.
/* 클래스 블록 */
public class 클래스명 {
/* 메서드 블록 */
**[public|private|protected]** [static] (리턴자료형|void) 메서드명1(입력자료형 매개변수, ...) {
명령문(statement);
...
}
/* 메서드 블록 */
**[public|private|protected]** [static] (리턴자료형|void) 메서드명2(입력자료형 매개변수, ...) {
명령문(statement);
...
}
...
}
첫 번째 줄에서 class 클래스명 으로 선언되어 있는, 코드의 가장 바깥쪽 부분이 바로 클래스 블록입니다. 클래스명은 마음대로 지을 수 있지만, 영문으로 지어야하고 첫 번째 철자는 대문자를 씁니다.
클래스명은 소스파일의 이름과 동일하게 사용해야 합니다. 그리고 클래스 블록은 여러 메서드 블록을 품고 있는 형태입니다.

먼저 [public|private|protected] 는 ‘접근제어자’라는 것으로, 이 중 ****에서 하나가 오거나, 아무것도 오지 않아도 된다는 의미입니다. 접근제어자는 뒷부분에서 또 다룰 예정입니다.
그 다음으로 오는 **[static]** 영역은 static 키워드가 있을 수도, 없을 수도 있다는 의미입니다. 해당 키워드가 붙으면 static 메서드가 됩니다. static(정적)메서드가 되면, 해당 클래스에 대한 인스턴스 선언 없이도 클래스명.메서드명 형태로 사용이 가능합니다. 주로 Util 클래스의 메서드에서 많이 사용합니다.
**리턴자료형** 부터는 필수로 존재해야 하는 부분입니다. 메소드가 실행된 다음 리턴되는 값의 자료형을 말합니다. 만약 리턴 자료형이 없다면 void를 사용하여 리턴값이 없다는 것을 표기해줘야 합니다. 자료형은 2장, 변수에서 다룰 예정입니다.
리턴자료형 다음으로 **메서드명**이 오게 되는데요, 메서드명도 클래스명처럼 자유롭게 지을 수 있습니다. 보통 영문으로 짓고, 해당 메서드가 하는 기능을 이름으로 짓게 됩니다. 예를 들어서, 회원정보를 저장하는 기능의 메서드라면 saveMembersProfile 와 같은 이름으로 짓게 되죠. 맨 앞에는 주로 동사가 옵니다. 예시에서도 ‘save’라는 동사로 되어있죠.
메서드명의 뒤에는 괄호안에 입력 자료형과, 매개변수가 오게됩니다. 괄호 안의 값들은 메서드의 입력 인자를 뜻하는데, 입력 인자는 ‘압력자료형 매개변수’ 형태로 이루어집니다. 클래스 안에서는 이러한 메서드를 여러개 만들 수 있죠.
아래 코드를 한줄씩 분석해보겠습니다.
public class HelloWorld {
**public static void main(String[] args) {
System.out.println("Hello World!");
}**
}
클래스명.메서드명 형태로 호출할 수 있습니다.위에 HelloWorld 클래스의 main메서드 안에 System.out.println(”Hello World!”); 라는 코드가 보이시나요? 메서드 안에는 이런식의 명령문이 들어갈 수 있습니다.
명령문의 맨 뒤에는 세미콜론(;)을 항상 표시하는데, 자바에서는 명령문 맨 뒤에 반드시 이것을 표기해서 문장이 끝났다는 것을 표기해야 합니다.
위의 내용을 정리해보면 자바 코드의 구조는 다음과 같습니다.
