LG CNS AM CAMP - Java

광부·2025년 1월 14일

LG CNS AM INSPIRE 1기

목록 보기
5/16
post-thumbnail

JAVA 개념정리

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

1. JDK, JRE, JVM

1.1. JDK란?

JDK는 Java Development Kit 의 약자이고, Software Development Kit(SDK)의 한 종류이다. 이는 개발 단계에서 필요한 라이브러리들, 개발도구를 포함하고, JRE(Java Runtime Environment)도 포함한다.
개발도구

  • javac(java compiler): java 파일(소스코드)을 class파일(바이트 코드)로 컴파일하는 도구
  • java(java runtime launcher): 컴파일된 class파일을 JVM에서 실행하는 도구.
  • javadoc(java documentation Generator): 자바 소스 코드의 주석을 기반으로 HTML 형식의 API 문서를 생성하는 도구.
  • jheap(JVM Heap Dump Tool): 힙 덤프를 생성하여 JVM의 메모리 사용 현황을 분석할 수 있게 해주는 도구이다. 주로 메모리 분석과 리소스 누수를 확인할 수 있다.
    * MAT 또는 JVisualVM을 사용하여 시각적으로 분석가능하다.
  • jconsole: JVM과 자바 어플리케이션을 실시간으로 모니터링하고, 성능 및 리소스 사용을 추적하는 GUI 툴이다.
  • jdeprscan(JDK Deprecated API scanner): 코드에서 Deprecated된 API를 찾아내는 도구이다.

용도별 JDK
Java는 용도별로 JDK가 분리되어 있다.
1. JDK SE(Standard Edition)

  • 목적: 기본이 되는 표준의 자바 플랫폼으로 자바 언어의 기본 개발 환경을 제공
  • 주로 데스크탑 애플리케이션 및 서버 애플리케이션 개발에 사용된다.
  1. JDK EE(Enterprise Edition)
  • 목적: 대규모 기업 애플리케이션 및 분산 시스템 개발에 필요한 기능을 제공
  • 분산 시스템, 웹 애플리케이션, 엔터프라이즈 애플리케이션 개발을 위해 다양한 API와 서버 측 기술을 포함한다.
  • J2EE에서 Java EE로 이름이 변경되었고, 이후 Jakarta EE라는 이름으로 발전했다.
  • JMS, JPA, EJB(분산 애플리케이션을 지원하는 객체) 같은 기술을 제공한다.
  1. JDK ME(Micro Edition)
  • 목적: 임베디드 시스템과 모바일 기기에서 실행되는 애플리케이션 개발을 위한 플랫폼.
  • 제한된 리소스를 가진 디바이스에서 실행될 수 있는 활경을 제공한다.
  • 주로 모바일 기기, 임베디드, IoT 등에서 사용됨.

JDK의 종류
JDK의 종류는 다양하며, 대표적인 것은 아래와 같다.

  • Oracle JDK: Oracle에서 제공하는 JDK, 구독을 통해 유로 라이센스를 구매할 수 있다.
  • OpenJDK: 무료 JDK
  • Azul Zulu: Mac등에서 사용할 수 있는 바이너리를 제공한다.
  • Amazon Corretto: AWS에서 제공하는 JDK. AWS와의 통합에서 유리하고, 다른 환경에서도 사용가능하다.
  • ...

1.2. JRE란?

JRE는 Java Runtime Environment의 약자로, JVM과 라이브러리를 함꼐 묶어서 배포되는 패키지이다. 기본적으로 JDK가 JRE를 포함하고 있다.

1.3. JVM이란?

JVM은 Java Virtual Machine의 약자로, 자바를 사용하기 위한 격리된 환경을 구성해준다. 따라서 JVM이 있는 환경이라면 공통된 동작을 기대할 수 있다.

2. jar, war?

다음은 빌드 결과물에 대한 설명이다. 강의에서는 다루진 않았지만, 알고 있으면 도움될 것같아 짧은 지식으로 정리해본다.
일단 나는 학부 플젝,교외 플젝, 개인 플젝 모두 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와의 통합이 매우 간단하다는 장점이 있었다.

3. Java 상식

3.1. 주석

  • 문서화 주석: /** */
  • 단일 주석: //
  • 다중 주석: /* */
/**
 * 문서화 주석
 * 
 * @author 홍길동
 */
public class Test {
	/**
	 * main 메서드
	 * @param args 실행 시 전달되는 매개변수를 배열 형태로 전달
	 */
	public static void main(String[] args) {
		// 인라인 주소 => 주석 기호 이후의 내용을 해석하지 않음 (Ctrl + /)
		
		/*
		   주석 기호 내의 모든 내용을 해석하지 않음 (Ctrl + Shift + /)
		 */
		System.out.println("Hello, Java!!!");
	}
}

문서화 주석은 이후 javadoc을 이용해 문서로 생성된다.

3.2. 클래스 이름과 자바 파일간의 관계

Java 파일명과 동일한 클래스명에만 public 접근 지정자를 붙일 수 있다.

public class MyTest {	// MyTest.class
	
}

3.3. 변수 이름 규칙(네이밍 컨벤션?)

변수 이름의 규칙은 상수 및 메서드 이름 규칙과 동일하다.

  • 영문대소문자 및 한글 사용 가능
  • 특수문자는 _$ 사용 가능
  • 숫자 사용이 가능하나, 첫번째로는 올 수 없음
  • 자바에서 사용중인 키워드는 사용할 수 없음
  • 변수, 메서드 이름 규칙
    * 카멜케이스를 적용
  • 상수 이름 권고 사항
    * 상수 이름의 모든 문자를 대문자로 표기
    • 두 개 이상의 단어가 결합된 경우, _로 연결

3.4. 변수의 생존기간(scope)

변수는 선언된 시점에 생성되고, 생성된 변수는 자신이 선언된 열린 중괄호 쌍을 만나면 메모리에서 삭제

3.5. 자료형


자바에는 8개 타입의 기본 자료형이 존재한다.

  • 일반적으로 소문자로 시작한다.
  • 크기가 고정이고 값이 스택에 저장된다.

그 외에 배열, 클래스, 인터페이스의 경우에는 참조자료형에 해당된다.

  • 일반적으로 대문자로 시작한다.
  • 크기가 가변적이고 값이 힙 영역에 저장된다.

3.5.1 자료형 간 타입 변환

  1. 타입변환 대상 앞에 명시적 자료형 표기
int a = (int)3.2; //3
double b = (double)a; //3.0
byte c = (byte)5.3; //5
short d = (short)10; //10
  1. 특정 표기 추가
long a = (long)10; //10
long b = 10L; //10
float c = (float)5.8; //5.8
float d = 5.8F; //5.8
  1. 자동타입변환
    값의 표현 범위가 넓은 쪽으로 저장되는 경우 컴파일러가 자동으로 타입변환을 수행한다.
float a = 3;
long b = 7;
double c = 5.3F;
  1. 수동타입변환
    값의 손실이 발생하는 경우(값의 표현 범위가 좁은 쪽으로 저장되는 경우) 직접 변환을 수행해야됨.
int a = (int)3.5;
float b = (float)7.5;
byte c= (byte)128;

3.6. 쇼트 서킷 연산

연산을 수행하는 과정에서 결과가 이미 확정되었을 때 나머지 연산 과정을 생략한다.
|,& : 모든 연산을 수행 후 결과를 비교하는 연산자
||,&& : 결과가 확정되면 연산을 생략하므로 에외가 발생하지 않는다.

3.7. 참조 자료형

배열
동일한 자료형을 묶어 저장하는 참조 자료형
생성할 때 크기를 지정해야 하고, 한 번 크기를 지정하면 절대 변경할 수 없는 특징이 있다.

// 선언과 동시에 객체를 생성
int[] a = new int[3];		
~~~~~ ~   ~~~ ~~~~~~
|     |   |   |
|     |   |   +-- int 자료형 3개를 저장할 수 있는 공간 
|     |   +-- 힙 메모리에 넣어라
|     +-- 참조 변수  
+-- int 배열 자료형 


변수의 초기화 단계에서 스택 메모리와 힙 메모리는 초기화 방식이 다르다
스택 메모리

  • 초기값을 부여하지 않는 경우 빈칸으로 존재
  • 읽기 불가능
    힙 메모리
  • 빈 칸으로 존재할 수 없으며, 디폴트 초기값이 강제로 설정됨.
  • 기본 자료형 => 숫자 : 0, boolean : false
  • 참조 자료형 => null
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]
	}	
}

3.8. 클래스

객체는 실제 사용할 수 있는 값(메모리에 올라간 값)을 의미함
클래스는 객체를 만들기 위한 설계도이다.

3.8.1. 내부 구성 요소-생성자

객체 생성에 사용되고 필드 초기화를 목적으로 사용됨.
클래스 이름과 동일한 이름을 가지고, 리턴 타입이 없음

this 키워드 => 자신이 포함된 클래스의 객체를 가리키는 참조 변수
this() 메서드 => 자신이 속한 클래스 내부의 다른 생성자를 호출, 첫 줄에만 위치해야됨.

super 키워드 => 장속받은 부모 객체(필드,메서드)를 호출하기 위해 사용됨
super() => 부모의 생성자를 호출, 반드시 첫 줄에 위치해야됨.
-> 첫 줄에 반드시 super또는 this가 있어야함. 없다면 컴파일러가 기본적으로 super를 삽입함.

3.8.2. 외부 구성 요소-패키지

동일한 목적으로 만들어진 클래스들을 묶어 관리하는 것 => 클래스 명의 충돌을 방지함.
클래스의 풀네임은 패키지명.클래스명의 형태로 표현됨.

3.9. 접근 지정자

자바 제어자의 한 종류로, 클래스, 메서드, 멤버, 새엇ㅇ자 앞에 위치하여 사용 범위를 정의할 수 있다.

클래스의 접근 지정자 => public, default(같은 패키지 내에서만 접근 가능)

3.10. 제어자

3.10.1 static 제어자

클래스 멤버에 사용하는 제어자
static이 붙어 있는 멤버 => 정적 멤버 => 객체 생성없이 클래스명.멤버명으로 사용가능하다.
static 필드는 객체에서 고유 변수의 성격을 가진다.

3.10.2 final 제어자

필드, 지역 변수, 메서드, 클래스 앞에 올 수 있음.
final 제어자가 선언된 항목은 값을 수정할 수 없음(불변).
final 변수는 선언과 동시에 초기화하거나, 생성자에서 초기화해야된다(DI).

3.10.3 abstract 제어자

하나 이상의 추상 메서드를 포함하고 있는 클래스이다.
객체를 직접 생성할 수 없고, 생성자를 호출할 수 없다.
자식 메서드에서 추상메서드를 오버라이딩하여 구현해야된다.

3.10.4 Interface 키워드

모든 필드가 public static final로 정의됨.
static 메서드와 default 메서드를 제외한 모든 메서드는 public abstract로 정의됨.

class 대신 interface 키워드를 사용해서 선언. 필드와 메서드에 제어자를 생략하면 컴파일러가 자동으로 제어자를 삽입해준다.

implements 키워드로 상속을 하고, 다중 상속이 가능하다.

3.10.5 default 키워드

하위 호환성을 보장하기 위해 추가된 키워드
인터페이스에서 해당 키워드를 메서드에 추가하면 상속한 클래스에서 구현하지 않아도되는 문법 로직을 interface에서 정의할 수 있음.

객체에서 고유한 성격을 가지게 된다.(스택, 힙영역이 아닌 메서드 영역에 저장되고, 이를 공유한다.)

3.11. 최상위 클래스 Object

자바의 모든 클래스는 Object 클래스를 상속함 => 아무런 클래스를 상속받지 않으면 컴파일러가 자동으로 extends Object 코드를 삽입한다.

3.12. 다형성

다형성(Polymorphism) 이란?

📖객체지향 프로그래밍 언어의 핵심 개념 중 하나로 하나의 변수나 객체가 여러 가지 형태를 가질 수 있는 것을 의미

같은 코드에서 하나의 메소드나 변수가 다양한 타입의 객체에 대해 동작할 수 있도록 하는 것을 의미한다.

3.12.1 overloading

오버로딩(overloading) 이란?

📖같은 클래스 내에서 동일한 이름의 메소드를 매개변수의 개수나 자료형이 다른 여러 개의 메소드로 정의할 수 있는 메소드 정의 기법

오버로딩을 하나의 클래스 내에서 같은 이름으로 다양한 기능을 수행하는 메소드를 여거래 정의하는 기능이다. 이때, 메서드명은 동일하고 매개변수 타입, 개수, 순서가 달라야한다. 단, 리턴 타입을 오버로딩 기준이 아니다(리턴 타입이 달라도 매개변수가 동일하면 오류가 발생한다).

3.12.2 overriding

오버라이딩(overriding) 이란?

📖상속 또는 구현 관계에 있는 상위 객체의 메소드를 하위 객체 또는 구현 객체가 재정의하여 사용하는 메소드 정의 기법

상위 클래스에서 상속받은 메서드와 동일한 이름(+매개변수)의 메서드를 재정의하는 것을 의미한다. 즉, 부모에서 정의한 메서드에서 스켈레톤코드(메서드명, 리턴타입, 매개변수)를 제외하고 로직을 덮어쓰게된다.
이때, 상위 클래스의 메서드보다 접근 지정자의 범위가 같거나 넓어야 함을 주의하자.
private < default < protected < public

주로 출력을 할 때 Object 객체의 toString()메서드를 상속하는 형태에서 사용된다.

3.13. 자바 제네릭

제너릭 같은 경우는 개인적으로 매우매우 중요하다 생각되는 개념이기에 다음 포스팅에서 따로 정리하겠다

참고한 블로그
Inpa Dev 👨‍💻
inung_92.log

profile
백엔드 주니어 개발자

0개의 댓글