TIL (ToDay I LearNEd)/Java

Java의 기본 개념

sooyeoneo 2024. 10. 14. 15:14

1. JVM

 

 

 

JVM의 구조

 

중점적으로 알아 둘 것.

Class loader : 클래스 파일들을 엮어서 JVM이 운영체제로부터 할당 받은 메모리 영역으로 적재하는 역할. 어떻게 동작할지...

EXecution Engine : 실행 시켜준다. 현재는 인터프리터 방식보다는 JIT 컴파일러를 이용하게 빠르게 동작하게 해줌.

Garbage Collector : JVM의 서비스를 깨끗하게 청소해줌, 컴퓨터에서도 잘 안쓰는 

Heap & Stack : 저장되는 공간.

                          New 키워드는 Heap에 저장

                          지역변수, 파라미터, 리턴 값 연산에 사용되는 임시 값 Stack에 저장

 

 

1. Class Loader : java 파일을 java Compiler로 complie하게 되면 .class 파일의 바이트 코드가 생기게 된다. 이렇게 생성도니 클래스 파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리 영역인 RunTime Data Area로 각각 적재하는 역할을 하는 부분이다.

2. Execution Engine : Class Loader에 의해 메모리에 각각 적재된 클래스들을 기계어로 변경해 명렁어 단위로 실행한다. 명령어를 하나하나 실행하는 인터프리터 방식이 있고, JIT 컴파일러를 이용하는 방식이 있다. JIT컴파일러는 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Execution Engine 이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식이다.

3. Garbage Collector : heap 메모리 영역에 생성된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다. GC는 언제 일어날 지 모르며, GC가 수행하는 동안 다른 모드 스레드가 일시정지하는 STW(Stopt the world)가 발생하게 된다.

4. Runtime Data Area : JVM의 메모리 영역으로 자바애플리케이션을 실행할때 사용되는 데이터들을 적재하는 영역.

5. Method Area : 클래스 멤버 변수의 이름, 데이터 타입, 접근제어자 정보같은 필드 정보와 메소드의 이름 리턴 타입, 파라미터, 접근 제어자 같은 메소드 정보 Type정보, Constant Pool, static 변수, final Class 변수 등이 생성되는 영역.

6. Heap Area : new 키워드로 생성된 객체와 배열이 생성되는 영역. 메소드 영역에 로드된 클래스만 생성이 가능 GC가 참조되지 않는 메모리를 확인하고 제거하는 영역.

7. Stack Area : 지역변수, 파라미터, 리턴 값 연산에 사용되는 임시 값 등이 생성되는 영역.

8. PC Register : Thread가 생성될 때마다 생성되는 영역으로 Program Counter이다. CPU에 있는 레지스터와 다르다.

9. Native Stack Area : 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역.

 

 

 

 

 

Stack 저장은 계속 쌓이는 것.

function이 끝날 때까지는 사라지지 않음. 변수를 살려 놓음.

 

2. 변수

변수는 변하는 수. 값을 정하고 담을 수 있는 메모리 공간. 상자. 

 

변수에 타입이 있는 이유?

chat GPT가 버전 업데이트 되면서.. GPT-3 -> GPT-3.5 & GPT-4 -> GPT-4o & GPT-4o mini

자연어는 동일한데 컴퓨터가 이해하는 변수의 범위가 확장됨.

같은 공간 안에 같은 값이라도 형태를 다르게 지정하면 다른 값이 나옴.

 

변수 선언하기!

다음 중 변수명이 만들어지 않는것을 모두 고르시오.

1. String abc_def;
2. String 123abc;
3. String _hello;
4. String long;
5. String bye$bye;

   

     - 변수 이름은 영문자, 숫자, $, _를 사용할 수 있다.

     - 변수 이름은 숫자로 시작할 수 없다.

     - 자바에서 사용되는 예약어는 변수로 사용할 수 없다.

 

 

초기화와 동시에 선언하기 때문에, 다른 값을 넣을 수 없다.

// 올바른 코드 1
int a= 10, b =20;

// 올바른 코드2 - 이게 더 좋은 코드. 사람이라 실수할 수 있음 
int a, b;
a = 10;
b = 20;


// 잘못된 코드 
int a, b;
a = 10, b 20;

 

3. 네이밍 컨벤션

자바, 파이썬, C언어가 쓰는 방법이 있다.

 

패키지 이름은 소문자로 구성

단어별 구별을 위해 언더스코어(_)나 대문자를 섞지 않는다.

 

// 나쁜 예
package com.navercorp.apiGateway
package com.navercorp.api_gateway

// 좋은 예
package com.navercorp.apigateway

 

 

클래스 이름에 명사 사용 

 

인터페이스 이름에 명사/형용사(형용사절) 사용

// 좋은 예
public interface RowMapper
public interface AutoClosable

 

메서드 이름은 동사/전치사로 시작

다른 타입으로 전환하는 메서드나 빌더 패턴을 구현한 클래스의 메서드에는 전치사를 쓸 수 있음.

좋은 예
동사 사용 : renderHtml()
전환메서드의 전치사 : toString()
Builder 패턴 적용한 클래스의 메서드의 전치사 : withUserId(String id)

 

클래스/인터페이스 이름에 대문자 카멜표기법 적용

카멜표기법 : Upper camel case = Pascal case

단어와 단어를 구별하기 위해 대문자로 쓴다. 

// 나쁜 예
public class reservation
public class Accesstoken

// 좋은 예
public class Reservation
public class AccessToken

 

메서드 이름에는 소문자 카멜표기법 적용

메서드의 이름에는 첫 번째 단어를 소문자로 작성, 이어지는 단어의 첫 글자를 대문자로 작성.

테스트 클래스의 메서드 이름에서는 언더스코어를 허용함.

 

상수(변하지 않는 수)는 대문자와 언더스코어로 구성

상태를 가지지 않는 자료형이면서 static final`로 선언되어 있느 필드일 때를 상수로 간주. 상수 이름은 대문자로 작성하며, 복합어는 언더스코어(`_`)를 사용하여 단어를 구분한다.

// 좋은 예
public final int UNLIMITIED = -1;
public final String POSTAL_CODE_EXPRESSion = "POST";

 

변수에 소문자 카멜표기법 적용

클래스는 명사, 메서드는 동사!!! 

상수가 아닌 클래스의 멤버 변수 / 지역변수 / 메서드 파라미터에는 소문자 카멜표기법을 사용

// 나쁜 예
private boolean Authorized;
private int AccessToken;

// 좋은 예
private boolean authorized;
private int accessToken;

 

임시 변수 외에는 1 글자 이름 사용 금지

메서드 블럭 범위 이상의 생명 주기를 가지는 변수에는 1글자로 된 이름을 쓰지 않는다.

반복문의 인덱스나 람다 표현식의 파라미터 등 짧은 범위의 임시 변수에는 관례적으로 1글자 변수명을 사용할 수 있다.

// 나쁜 예 - 이런 식으로 별명 짓지말자.
HtmlParser hp = new HtmlParser();

// 좋은 예 - 풀 네임으로.
 hp = htmlParser

 

한 줄에 한 문장

생략한다고 좋은 거 아니고

길게 쓴다고 나쁜거 아니다.

 

문장이 끝나는 ; 뒤에는 새줄을 삽입할 것. 한 줄에 여러 문장을 쓰지 않는다. 코드가 길어져도 겁내지 말자.

// 나쁜 예
int base = 0; int weight = 2;

// 좋은 예
int base = 0;
int weight = 2;

 

K&R 스타일로 중괄호 선언

클래스 선언, 메서드 선언, 조건/반복문 등 코드 블럭을 감싸는 중괄호에 적용되는 규칙

 -> K&R 스타일(Kernighan and Ritchie style)

줄 마지막에서 시작 중괄호 `{`를 쓰고 열고 새 줄을 삽입한다. 블럭을 마치고 새 줄 삽입 후 에 중괄호 닫기.

개행을 하지 않는다.

// 나쁜 예
public class SearchConditionParser
{
       public boolean isValidExpression(String exp)
      {
              if (exp == null){
                   return false;
                 }
             for (char ch : exp.toCharArray())
             {
                    ....
             }
             return true;
      }
}
// 좋은 예
public class SearchConditionParser {
       public boolean isValidExpression(String exp) {
              if (exp == null) {
                  return false;
               }
              for (char ch : exp.toCharArray()) {
                     ....
              }
             
              return true;
       }
}

 

조건/반복문에 중괄호 필수 사용

조건, 반복문이 한 줄로 끝나더라도 중괄호를 활용할 것. 중괄호의 전후의 공백, 제어문 앞 뒤의 새 줄 규칙도 함께 고려한다.

// 나쁜 예
if (exp == null) return false;

for (char ch : exp.toCharArray()) if (ch == 0) return false;


// 좋은 예
if (exp == null) {
    return false;
}
for (char ch : exp.toCharArray()) {
      if (ch == 0) {
          return false;
      }
}

삼항연산자 쓰지말고.. 클린 코드에 있는 내용 일부 발췌

 

 

 

다음 강의

1. Class, 객체, 상속 -> 목요일 

overriding이랑 super랑 추상클래스 / 객체에 생성자 this

2. Collection (Hash, List)

- enum안에 추상메서드 만들어서 클래스 처럼 활용하는 부분

3. 제네릭, 예외처리

-

객체지향, 절차지향, 함수형 - 나중에 베이직 반에서! Spring 할 때

 

 

 

 

 

*자바 강의의 완벽한 숙지를 위해 강의 자료를 정리한 내용

TIL 10월 14일