클라우드 엔지니어링 week1 정리본

seulg1004·2025년 1월 3일

💡 1주차 총평
금주는 Java Spring 백엔드 기본 수업들을 위주로 들었고, 알고 있었던 개념들을 다시 한 번 훑어보는 식으로 진행이 되었다.
수업 중, Java의 기본 문법들과 동작과정, Lombok 등을 다시 한번 정리해보았다.
진도가 빠르고 양이 정말 많아서, 주관적으로 중요하고 휘발성이 강하다고 생각하는 것만 기재했다.

✏️ java 기본 문법 복습

1. 기본형 & Wrapper Class

int, short, char, boolean, float 와 같은 타입들은 모두 기본형 타입으로, null값을 갖지 못하기 때문에 선언과 함께 초기화가 된다.
=> 모든 값들이 Stack에 저장이 되고, 저장공간에 실제 자료 값을 가진다.

반면에, Wrapper Class는 참조형 타입으로, Integer, Short, Char, Boolean 타입들은 참조형 타입으로, null값을 가질 수 있다.
=> 실제값이 heap에 저장이 되고, Stack에 주소 값들이 저장된다.

Integer i = new Integer(3); // Integer 객체로 만들면 비효율적.. 객체화하는 데 비용이 많이 소모되기 때문
int num = Integer.parseInt("5"); // int 로 변환하기 위해

의미 없는 객체 생성은 메모리 자원 낭비이기 때문에, 메모리 절약을 생각하며 코드를 작성하는 것이 좋다.

2. 형변환하기

8개의 기본 타입 중, boolean 타입을 제외한 모든 타입들은 다른 타입으로 형변환이 가능하다.

메모리를 더 크게 가질 수 있는 자료형으로 형변환하는 것을 Up Casting(묵시적 형변환)이라고 하며, 반대로 작게 가질 수 있는 자료형으로 형변환하는 것을 Down Casting(명시적 형변환)이라고 한다. 명시적 형변환을 할 때는 자료가 잘릴 수 있으므로 주의해야한다.

Up Casting 은 Promotion이라고도 한다.

char charvalue = v.charAt(2); // 16비트 메모리에 저장
System.out.println((int) charvalue); // 32비트, up casting

float v = 32; // up casting
float v2 = 32.5F;
float v3 = (float) 32.5; // down casting(명시적인 형변환)

3. JVM 컴포넌트 & 메모리 구조

몇 번이고 정리했지만, 운영체제 메모리 구조와 가끔.. 헷갈리는 JVM 메모리 구조.. 😅 운영체제는 Cache가 있고, JVM은 없다.
실행 중 JVM의 영역은 다음과 같다.

  • Method Area : static, 상수 변수들이 저장되는 공간
    - 실행 시 적재된다.
  • Heap : runtime에 동적으로 할당되는 데이터가 저장되는 영역 / 참조 객체의 값, 배열, instance의 값들이 저장되는 공간
    - GC가 구동되는 영역으로, GC 버전과 종류마다 청소하는 방식이 조금씩 다르다.
  • Stack : 지역 변수와 매개 변수 값이 저장되는 공간
    - 자동으로 초기화가 되며, 초기화를 안해줘도 됨

4. Exception Handling

예외 같은 경우, Compile 할 때 체크하는 Checked Exception과 프로그램 실행 시 발생할 수 있는 Unchecked Exception 이 있다.

두 가지 방법으로 예외 핸들링이 가능한데, 첫번째로는 try ~ catch문이 있다.

try {
	Class.forName("step01.A");
} catch (ClassNotFoundException e) {
	e.printStackTrace();
}

Class.forName() 과 같은 메서드를 호출하는 경우, throws로 예외 처리를 진행한다. 자세한 코드는 아래와 같다.

따라서, try ~ catch 문을 사용해주어야 한다. 사용하지 않을 시, 에러가 발생한다.

두번째로는 throw 키워드를 사용하는 방법이 있다. 해당 방법을 사용하게 되면 return 값이 예외처리 값이 된다.

public boolean save(CustomerVO customer) throws Exception {
	if (customer == null) {
		throw new Exception("<예외 처리..>");
	}
	
	allCusts[2] = customer;
	return true;
}

위와 같은 코드의 경우, throw new 문을 타게 되면 해당 메서드 진행은 끝나게 된다.

👑 Lombok

1. 생성자 관련 Annotation

1) @NoArgsConstructor
파라미터가 없는 생성자를 만들어주는 Annotation

2) @AllArgsConstructor
모든 필드 값을 파라미터로 갖는 생성자를 만들어주는 Annotation

2. Builder 패턴

카뱅 면접에서 정말 많이 탈탈..털렸던 Builder 패턴..ㅠㅠ
필요에 의해서 멤버 변수 초기화 편집이 매우 용이하다는 특징이 있고, 동적인 메서드를 자동으로 구성할 수 있다는 점이 큰 장점이다.
다만, 많은 메서드가 추상화되어있기에 가독성이 떨어질 수 있고 너무 많이 남발해서 사용하면 오히려 좋지 않은 코드가 될 수 있다.
Builder 어노테이션을 활용할 수 있고, 이 Annotation은 @AllArgsConstructor를 함축하고 있다.

import lombok.*;

// @Data -> 필요없는 @Setter 사용 지양
@Getter
@Builder // 추가
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE) // 추가
public class TransferForm {
    @Min(1)
    private int accountId;

    @Min(1)
    private int remitterId;

    @Min(1)
    private int receiverId;

    @Min(1)
    private Long amount;
}

@Builder 를 추가하기 이전엔, getter와 생성자들만 볼 수 있다.

@Builder 를 추가한 이후에는 builder() 메서드와 내부 클래스가 생긴 것을 확인할 수 있다.

이 때, @Builder 와 @NoArgsConstructor 를 함께 사용해주기 위해서는 무조건 @AllArgsConstructor 를 사용해주어야 한다. Builder 패턴 특성 상, 내부 클래스를 만들어주어야 하기 때문에@AllArgsConstructor 를 함축하고 있는데 @NoArgsConstructor를 사용하게 되면 모든 필드값을 갖는 생성자를 만들지 않아서 Builder 패턴이 무효하다. 그래서 무조건 명시해주어야 한다.

위 코드는 클래스에서 호출 시 Builder 패턴으로만 set을 하도록 만들었기 때문에, @AllArgsConstructor 는 private 접근 제어자를 명시해주었다.

추가 참고 자료

자바 가상 머신
JVM 내부 구조 메모리 영역 심화편
Builder Design Pattern in Java: A Practical Guide

0개의 댓글