본문 바로가기

전체 글21

[스터디] 은행 애플리케이션 테이블 설계 시나리오 1. 요구사항 : 테이블 설계 1.1. account_tb Table account_tb { account_id integer [primary key] user_id integer account_password varchar(100) account_balance integer account_created_at timestamp } 1.2. transaction_tb Table transaction_tb { transaction_id integer [primary key] transaction_amount integer transaction_w_balance integer transaction_d_balance integer transaction_w_account_number integer transact.. 2023. 6. 12.
[Effective Java] 아이템 2 : 생성자에 매개변수가 많다면 빌더를 고려하라 이 아이템의 핵심 내용은 "생성자나 정적 팩토리가 처리해야 할 매개변수가 많다면 빌더 패턴을 선택하는 게 더 낫다"는 것이다. 인스턴스 하나를 초기화 하는 데 무슨 방법이 이렇게 많은걸까? 이 의문에서 출발하여 내용을 전개해 보겠다. 1. 인스턴스를 초기화하는 방법이 여러 가지로 분기하게 된 원인은 무엇인가? 각각의 상황과 필요성에 따라 더 효율적인 초기화 방법이 다르기 때문이다. 간단한 객체 생성에는 생성자 만으로도 충분하지만, 생성자를 이해하기 쉬워야 하는 상황에서는 정적 팩토리 메서드를 쓰고, 필드가 많아짐에 따라 많은 파라미터가 필요한 상황에서는 빌더 패턴이 유리하다. 2. 각 방법은 어떤 특징을 가지고, 어떤 상황에서 유리한가? 2.1. 생성자 너무 당연한 개념이기 때문에 내용은 생략하고 예시 .. 2023. 5. 23.
[Effective Java] 아이템 17 : 변경 가능성을 최소화하라 이번 아이템의 핵심 내용은 제목 그대로 클래스의 변경 가능성을 최소화 하는 것이 좋다는 원칙에 대한 것이다. 클래스를 불변으로 만드는 것이 해당 클래스의 디자인과 구현을 더 쉽게 하고, 사용도 더 편리하게 할 수 있다는 것이다. 이번 아이템을 읽어보며 몇 가지 의문점들이 생겼는데, 차례대로 탐구해 보겠다. 먼저, 불변 객체의 예시 코드는 다음과 같다. public final class Complex { private final double re; private final double im; public Complex(double re, double im) { this.re = re; this.im = im; } public double realPart() { return re; } public doubl.. 2023. 5. 21.
Effective Java - 아이템 11 : equals를 재정의하려거든 hashCode도 재정의하라 이번 Item의 핵심 내용은 제목 그대로 "equals()와 hashCode()를 동시에 오버라이딩 해야 한다"는 것이다. 예시에 나온 HashMap()을 직접 구현해 봄으로써 확인해 보았다. 1. 왜 equals()와 hashCode()를 동시에 오버라이딩 해줘야 하는걸까? 예시에 나온 HashMap()을 직접 구현해 봄으로써 왜 그런지 확인해 보자. class PhoneNumber { int number; public PhoneNumber(int number) { this.number = number; } } public class Main03 { public static void main(String[] args) { Map map = new HashMap(); map.put(new PhoneNum.. 2023. 5. 15.
Effective Java - 아이템 8 : finalizer와 cleaner 사용을 피하라 1. finalizer와 cleaner란 무엇인가 finalizer와 cleaner는자원 정리를 위한 방법을 제공한다. 이들은 다루기 어렵고, 알맞게 사용하지 않으면 예상치 못한 결과를 초래할 수 있으므로 주의해서 사용해야 한다. 1.1. finalizer 객체가 가비지 컬렉션에 의해 제거될 때 JVM에 의해 호출된다. 이 메서드를 오버라이드하여 객체의 정리 로직을 구현할 수 있습니다. 그러나 이 방법은 몇 가지 문제가 있다. finalize() 메서드의 호출 시점은 JVM에 따라 다르므로, 객체의 메모리 해제 시점을 예측하기 어렵다. finalize() 메서드가 실패하거나 중단되면, JVM은 그것을 무시하고 계속 진행한다. finalize() 메서드가 오래 실행되면, 가비지 컬렉션의 효율성이 떨어질 수.. 2023. 5. 11.
[Java] 직렬화(Serialization) 1. 개념 자바 객체를 바이트 스트림으로 변환하는 것을 말한다. 직렬화를 이용해서 객체를 파일에 저장하거나 네트워크를 통해 전송할 수 있다. 즉 객체를 출력하기 위해 객체의 데이터를 일렬로 늘어선 연속적인 바이트로 변경하는 것을 말한다. 위 그림처럼, 객체는 직렬화 되면서 바이트 단위로 스트림화 된다. package test; import java.io.*; class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public void print() { System.out.println("이름:.. 2023. 4. 13.
[Git] Git Reset과 Revert 1. Reset Reset은 커밋 이력을 변경하는 명령어다. 이 명령어를 사용하면 이전 커밋으로 이동하며, 해당 커밋 이후의 모든 변경사항을 제거할 수 있다. 1.1. Reset 옵션 Git reset 명령어는 세 가지 옵션이 있는데, 이전 커밋 이력에서 작업을 어떻게 되돌리느냐에 따라 다르다. 1.1.1. --soft 이전 커밋으로 HEAD를 이동시키면서, 해당 커밋 이후에 이루어진 모든 변경사항을 로컬 작업트리에서 유지한다. 이 옵션을 사용하면 커밋 이력을 되돌리는 것은 아니며, 이전 커밋에서 수정된 파일들을 그대로 유지하면서 변경 내용을 다시 커밋할 수 있다. 아래 코드는 HEAD 바로 이전 커밋으로 soft reset을 한 것이다. git reset --soft HEAD~1 1.1.2. --mix.. 2023. 4. 11.
[JAVA] JVM 구조 및 동작 원리 1. JVM, JRE, JDK란? 1.1. JVM(Java Virtual Machine) JVM이란 자바의 핵심 구성 요소로서, JVM과 호환 가능한 모든 하드웨어에서 OS 비종속적으로 자바 프로그램을 실행하게 해준다. 기능적인 측면에서 JVM은 자바 소스 코드 컴파일 결과인 바이트코드를 실행시켜 주는 역할을 한다. 1.2. JRE(Java Runtime Environment) JVM 동작 시 필요한 자바 라이브러리들을 가진다. 1.3. JDK(Java Development Kit) JVM, JRE, 컴파일러, 라이브러리 등의 요소들을 통합하여 자바로 개발할 수 있는 환경을 제공한다. 2. JVM의 실행 자바는 OS에 구애받지 않고 독립적인 실행이 가능하다. 자바 소스 코드 컴파일 후 생성된 파일은 JV.. 2023. 4. 4.
[JAVA] 상수 풀(Constant Pool) 1. 문자열 상수 풀 이란 문자열 상수 풀은 자바의 힙 영역에 존재하는 특수한 공간으로 문자열 리터럴을 저장하는 용도로 사용된다. 반면 자바의 기본타입(int, char, byte, ...)은 스택에 저장된다. 문자열 리터럴이 생성될 때마다 JVM은 그 리터럴이 문자열 상수 풀에 존재하는지 확인하고, 이 리터럴이 존재하면 그 리터럴은 저장되지 않으며, 존재하지 않으면 저장된다. 즉, String은 원시 타입과 다르게 문자열 상수 풀에서 리터럴을 참조하게 된다. 2. 문자열 비교 2.1. 리터럴로 비교 String a와 b를 만들고, Hash 값을 비교해서 둘의 주소값이 같은지 비교했다. "test"는 같은 리터럴 이므로 String a와 b는 동일한 리터럴을 문자열 상수 풀에서 참조하게 된다. 2.2. .. 2023. 3. 30.
[Git] fatal : couldn't find remote ref master 1. 문제 Git local repository와 remote repository 연동 후 # git pull origin master 커맨드를 입력했으나 다음과 같은 에러가 발생했다. fatal : couldn't find remote ref master 2. 원인 명령어에 입력한 master 브랜치와 remote repository의 기본 생성 브랜치 이름이 달라서 브랜치의 참조값을 찾지 못했기 때문이다. 깃허브 리포지토리의 브랜치명이 명령어의 브랜치명과 일치 하는지 확인해야 한다. 깃허브 리포지토리에서 branch를 클릭한다. 브랜치명이 명령어의 브랜치명과 일치 하는지 확인한다. 3. 해결 명령어를 깃허브 리포지토리의 브랜치명과 일치 시키거나, 깃허브 리포지토리의 브랜치명을 수정해야 한다. 깃허브의.. 2023. 3. 27.