
자바를 처음 배운다면 JDK를 설치해본 경험이 누구나 있을 것이라 생각된다.
오늘은 JDK, JRE, JVM에 대한 내용을 다뤄보고자한다.

JDK는 Java Development Kit 의 약자이고, Software Development Kit(SDK)의 한 종류이다. 이는 개발 단계에서 필요한 라이브러리들, 개발도구를 포함하고, JRE(Java Runtime Environment)도 포함한다.
개발도구
용도별 JDK
Java는 용도별로 JDK가 분리되어 있다.
1. JDK SE(Standard Edition)
JDK의 종류
JDK의 종류는 다양하며, 대표적인 것은 아래와 같다.
JRE는 Java Runtime Environment의 약자로, JVM과 라이브러리를 함꼐 묶어서 배포되는 패키지이다. 기본적으로 JDK가 JRE를 포함하고 있다.
JVM은 Java Virtual Machine의 약자로, 자바를 사용하기 위한 격리된 환경을 구성해준다. 따라서 JVM이 있는 환경이라면 공통된 동작을 기대할 수 있다.
다음은 빌드 결과물에 대한 설명이다. 강의에서는 다루진 않았지만, 알고 있으면 도움될 것같아 짧은 지식으로 정리해본다.
일단 나는 학부 플젝,교외 플젝, 개인 플젝 모두 gradle기반의 빌드 도구를 사용하여 jar형태로 배포를 해본입장이었고, 인턴으로 일하면서 war형태의 배포를 해보았었다.
먼저 jar에 대해 설명하자면, 일단 java에서 사용되는 컴파일된 파일들을 압축한 아카이브의 한 형태이다. 기본적으로 구동할 수 있는 서버를 내장하고 있다.
그래서 직접 서버에서 실행할 경우,
nohup java -jar myapp-0.0.1-SNAPSHOT.jar > app.log 2>&1 &
같은 명령어로 쉽게 배포가능하다.
톰캣을 내장하고 있기에 Java어플리케이션에서 라이브러리 형태로 배포도 가능하고, 독립적인 서비스로 활용가능하다.
jar형태로 빌드하는 경우, docker에서의 배포가 유리하다.
다음으로 war에 대해 설명하자면, 웹 어플리케이션을 패키징하기 위한 파일 포맷이다. 주로 서블릿 컨테이너에서 실행되는 웹 애플리케이션에 사용된다.
회사에서 톰캣서버를 다뤄봤던 짧은 지식으로는, 단일 tomcat하나로 여러개의 war를 배포할 수 있기에 만약 여러 서비스를 배포해야된다하면 war가 유리하다고 생각이 된다. 다만 러닝커브가 높다고 생각된다. tomcat의 다양한 configuration을 숙지해야되고, web과 was를 분리해야된다 하면 더더욱 숙지해야될 점이 많아진다.
(mod_jk와 mod_proxy같은 설정을 알아야됨)
하지만 tomcat manager같은 기능을 지원해주기에 Jenkins와의 통합이 매우 간단하다는 장점이 있었다.
/** *////* *//**
* 문서화 주석
*
* @author 홍길동
*/
public class Test {
/**
* main 메서드
* @param args 실행 시 전달되는 매개변수를 배열 형태로 전달
*/
public static void main(String[] args) {
// 인라인 주소 => 주석 기호 이후의 내용을 해석하지 않음 (Ctrl + /)
/*
주석 기호 내의 모든 내용을 해석하지 않음 (Ctrl + Shift + /)
*/
System.out.println("Hello, Java!!!");
}
}
문서화 주석은 이후 javadoc을 이용해 문서로 생성된다.
Java 파일명과 동일한 클래스명에만 public 접근 지정자를 붙일 수 있다.
public class MyTest { // MyTest.class
}
변수 이름의 규칙은 상수 및 메서드 이름 규칙과 동일하다.
_ 및 $ 사용 가능_로 연결변수는 선언된 시점에 생성되고, 생성된 변수는 자신이 선언된 열린 중괄호 쌍을 만나면 메모리에서 삭제

자바에는 8개 타입의 기본 자료형이 존재한다.
그 외에 배열, 클래스, 인터페이스의 경우에는 참조자료형에 해당된다.

int a = (int)3.2; //3
double b = (double)a; //3.0
byte c = (byte)5.3; //5
short d = (short)10; //10
long a = (long)10; //10
long b = 10L; //10
float c = (float)5.8; //5.8
float d = 5.8F; //5.8
float a = 3;
long b = 7;
double c = 5.3F;
int a = (int)3.5;
float b = (float)7.5;
byte c= (byte)128;
연산을 수행하는 과정에서 결과가 이미 확정되었을 때 나머지 연산 과정을 생략한다.
|,& : 모든 연산을 수행 후 결과를 비교하는 연산자
||,&& : 결과가 확정되면 연산을 생략하므로 에외가 발생하지 않는다.
배열
동일한 자료형을 묶어 저장하는 참조 자료형
생성할 때 크기를 지정해야 하고, 한 번 크기를 지정하면 절대 변경할 수 없는 특징이 있다.
// 선언과 동시에 객체를 생성
int[] a = new int[3];
~~~~~ ~ ~~~ ~~~~~~
| | | |
| | | +-- int 자료형 3개를 저장할 수 있는 공간
| | +-- 힙 메모리에 넣어라
| +-- 참조 변수
+-- int 배열 자료형

변수의 초기화 단계에서 스택 메모리와 힙 메모리는 초기화 방식이 다르다
스택 메모리
public class MyTest {
public static void main(String[] args) {
int[] a = new int[3];
System.out.println(Arrays.toString(a)); // [0, 0, 0]
boolean[] b = new boolean[3];
System.out.println(Arrays.toString(b)); // [false, false, false]
String[] c = new String[3];
System.out.println(Arrays.toString(c)); // [null, null, null]
}
}
객체는 실제 사용할 수 있는 값(메모리에 올라간 값)을 의미함
클래스는 객체를 만들기 위한 설계도이다.

객체 생성에 사용되고 필드 초기화를 목적으로 사용됨.
클래스 이름과 동일한 이름을 가지고, 리턴 타입이 없음
this 키워드 => 자신이 포함된 클래스의 객체를 가리키는 참조 변수
this() 메서드 => 자신이 속한 클래스 내부의 다른 생성자를 호출, 첫 줄에만 위치해야됨.
super 키워드 => 장속받은 부모 객체(필드,메서드)를 호출하기 위해 사용됨
super() => 부모의 생성자를 호출, 반드시 첫 줄에 위치해야됨.
-> 첫 줄에 반드시 super또는 this가 있어야함. 없다면 컴파일러가 기본적으로 super를 삽입함.
동일한 목적으로 만들어진 클래스들을 묶어 관리하는 것 => 클래스 명의 충돌을 방지함.
클래스의 풀네임은 패키지명.클래스명의 형태로 표현됨.
자바 제어자의 한 종류로, 클래스, 메서드, 멤버, 새엇ㅇ자 앞에 위치하여 사용 범위를 정의할 수 있다.

클래스의 접근 지정자 => public, default(같은 패키지 내에서만 접근 가능)
클래스 멤버에 사용하는 제어자
static이 붙어 있는 멤버 => 정적 멤버 => 객체 생성없이 클래스명.멤버명으로 사용가능하다.
static 필드는 객체에서 고유 변수의 성격을 가진다.
필드, 지역 변수, 메서드, 클래스 앞에 올 수 있음.
final 제어자가 선언된 항목은 값을 수정할 수 없음(불변).
final 변수는 선언과 동시에 초기화하거나, 생성자에서 초기화해야된다(DI).
하나 이상의 추상 메서드를 포함하고 있는 클래스이다.
객체를 직접 생성할 수 없고, 생성자를 호출할 수 없다.
자식 메서드에서 추상메서드를 오버라이딩하여 구현해야된다.
모든 필드가 public static final로 정의됨.
static 메서드와 default 메서드를 제외한 모든 메서드는 public abstract로 정의됨.
class 대신 interface 키워드를 사용해서 선언. 필드와 메서드에 제어자를 생략하면 컴파일러가 자동으로 제어자를 삽입해준다.
implements 키워드로 상속을 하고, 다중 상속이 가능하다.
하위 호환성을 보장하기 위해 추가된 키워드
인터페이스에서 해당 키워드를 메서드에 추가하면 상속한 클래스에서 구현하지 않아도되는 문법 로직을 interface에서 정의할 수 있음.
객체에서 고유한 성격을 가지게 된다.(스택, 힙영역이 아닌 메서드 영역에 저장되고, 이를 공유한다.)
자바의 모든 클래스는 Object 클래스를 상속함 => 아무런 클래스를 상속받지 않으면 컴파일러가 자동으로 extends Object 코드를 삽입한다.
다형성(Polymorphism) 이란?
📖객체지향 프로그래밍 언어의 핵심 개념 중 하나로 하나의 변수나 객체가 여러 가지 형태를 가질 수 있는 것을 의미
같은 코드에서 하나의 메소드나 변수가 다양한 타입의 객체에 대해 동작할 수 있도록 하는 것을 의미한다.
오버로딩(overloading) 이란?
📖같은 클래스 내에서 동일한 이름의 메소드를 매개변수의 개수나 자료형이 다른 여러 개의 메소드로 정의할 수 있는 메소드 정의 기법
오버로딩을 하나의 클래스 내에서 같은 이름으로 다양한 기능을 수행하는 메소드를 여거래 정의하는 기능이다. 이때, 메서드명은 동일하고 매개변수 타입, 개수, 순서가 달라야한다. 단, 리턴 타입을 오버로딩 기준이 아니다(리턴 타입이 달라도 매개변수가 동일하면 오류가 발생한다).
오버라이딩(overriding) 이란?
📖상속 또는 구현 관계에 있는 상위 객체의 메소드를 하위 객체 또는 구현 객체가 재정의하여 사용하는 메소드 정의 기법
상위 클래스에서 상속받은 메서드와 동일한 이름(+매개변수)의 메서드를 재정의하는 것을 의미한다. 즉, 부모에서 정의한 메서드에서 스켈레톤코드(메서드명, 리턴타입, 매개변수)를 제외하고 로직을 덮어쓰게된다.
이때, 상위 클래스의 메서드보다 접근 지정자의 범위가 같거나 넓어야 함을 주의하자.
private < default < protected < public
주로 출력을 할 때 Object 객체의 toString()메서드를 상속하는 형태에서 사용된다.
제너릭 같은 경우는 개인적으로 매우매우 중요하다 생각되는 개념이기에 다음 포스팅에서 따로 정리하겠다
참고한 블로그
Inpa Dev 👨💻
inung_92.log