Java 67

우아한테크코스 - 프리코스 1주차 회고

저번주 수요일에 시작한 프리코스 1주차가 마무리되었습니다. 엠바고 느낌으로 글을 안쓰고있다가 1차 미션 제출시간이 지나서 리뷰를 작성해봤습니다. 1주차 미션은 요구사항에 맞게 값을 출력하는 코딩테스트 형식의 문제였습니다. 느낀 바로는 특정 알고리즘 구현보다 데이터를 어떤 자료구조를 이용하여 취급하는지를 확인하는 미션처럼 느꼈습니다. 문제는 총 7문제이며, 특출나게 어려웠던 문제는 없었습니다. 작성했던 코드를 리뷰해보겠습니다. 작성한 코드는 여기서 확인할 수 있습니다. https://github.com/Voyager003/java-onboarding/tree/Voyager003 GitHub - Voyager003/java-onboarding: 온보딩 미션을 진행하는 저장소 온보딩 미션을 진행하는 저장소. ..

Java - Comparable & Comparator

우테코 프리코스 1주차 미션 중, 다중정렬조건을 적용하던 중 Comparator에 대한 이해가 부족하여 정리하고자 작성한 글입니다. 1. Comparable java.lang.Comparable의 인터페이스인 Comparable는 compareTo라는 메서드가 선언되어 있습니다. 이는 인터페이스이기 때문에 Comparable을 사용하려면 compareTo 메서드를 override해줘야 합니다. 하지만! Java 8부터는 인터페이스에서도 일반 메서드를 구현할 수 있도록 변경되었습니다. Comparable은 정렬 수행시 기본적으로 적용되는 정렬 기준이 되는 메서드를 정의해 놓은 인터페이스로 Java에서 제공되는 정렬이 가능한 클래스(Integer, Double, Long 등 내림차순, String 클래스의 ..

Skills/Java 2022.11.01

Java - 인스턴스화를 막으려면 private 생성자를 사용하라

Java로 코드 작성 시, 정적 메서드와 정적 필드만을 담은 클래스를 만드는 경우가 종종 있습니다. 예를 들어, java.lang.Math와 같이 기본 타입 값이나 java.util.Array처럼 배열 관련 메서드를 모아놓을 수 있습니다. 또한 java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성하는 정적 메서드를 모아놓을 수 있고, final 클래스와 관련된 메서드를 모아놓을 때 사용합니다. (final 클래스를 상속하여 하위 클래스에 메서드를 넣는 것은 불가능) 하지만 위에서 나열한 정적 멤버만을 담은 utility class는 인스턴스로 만들어 쓰려고 설계한 것이 아닙니다. 정적 멤버만 담은 uility class에 생성자를 명시하지 않으면 JVM이 기본 생성자를 자동으..

Skills/Java 2022.10.30

Java - private 생성자나 열거 타입으로 싱글턴임을 보증하라.

Singleton은 애플리케이션이 실행될 때, 어떤 클래스에 최초 한번만 메모리를 할당하고, 그 메모리에 인스턴스를 만들어 사용하는 패턴입니다. 최초로 한번만 할당했기 때문에 여러번 호출되어도 실제로 생성되는 객체는 하나이며, 최초로 생성된 이후에 호출된 생성자는 이미 생성한 객체를 반환하도록 만듭니다. 1. 장점과 단점 장점이자 사용 이유는 DB에서 커넥션, 스레드풀, 캐시, 로그 등 공통된 객체를 생성해서 사용하는 상황에 최초 한번만 메모리를 할당하기 때문에 메모리 낭비를 방지할 수 있고, 싱글톤으로 구현한 인스턴스는 '전역'이므로 다른 클래스의 인스턴스들이 데이터를 공유하는 것이 가능합니다. 다만 이러한 싱글톤 패턴으로 인스턴스를 생성하게 되면, 싱글톤 인스턴스가 너무 많은 역할을 하게되고 이러한 ..

Skills/Java 2022.10.25

Java - 생성자에 매개변수가 많다면 Builder를 고려하라

이펙티브 Java의 2장은 제목과 같이 Builder 패턴에 대해 설명합니다. item 1에서 설명한 생성자와 정적 팩토리 메서드에서는 공통적으로 매개변수가 많다면 대응하기 힘들다는 포인트가 있었습니다. 이를 Builder를 통해 어떻게 개선하는지 패러미터를 어떻게 깔끔하게 처리하는지 알아보겠습니다. 1. 생성자 패턴 Buidler 설명에 앞서, 생성자 패턴의 맹점을 알아보겠습니다. public class Nutrition { private final int calroies; private servings; private final fat; private final int sodium; public Nutrition(int calroies, int servings) { this(calroies, serv..

Skills/Java 2022.10.19

Java - JDBC Transaction

1. Transaction과 Lock 트랜잭션은 DB 상태를 변화시키기 위해 수행하는 작업의 단위로 이전에 작성한 글에서 용어를 정리했었습니다. 간단하게 정리하자면 DB의 상태를 변화(SQL 질의)시키기 위해 수행하는 작업의 완전성을 위해, 작업을 완벽하게 처리하거나 혹은 처리하지 못할 경우에 원 상태로 복구하여 작업의 일부만 적용되지 않도록 해주는 기능을 말합니다. 사용자가 DB에 접근하기 위해서는 Spring의 WAS 서버나 DB 접근 툴(H2 console)과 같은 클라이언트를 통해 DB에 접근할 수 있습니다. 이 때, 클라이언트는 DB 서버에 연결을 요청하고 커넥션을 맺게되는데 DB 서버는 내부에 세션이라는 것을 만들어 모든 요청을 세션을 통해 실행하게 됩니다. 한 세션에서 트랜잭션 처리를 하는 ..

Skills/Java 2022.10.18

Java - 커넥션 풀과 데이터소스

1. JDBC DriverManager Java에서는 JDBC 인터페이스를 각 DB벤더에 맞도록 구현해서, 개발자가 사용하는 벤더의 DB에 맞도록 구현하여 JDBC 드라이버를 제공합니다. 그 중, JDBC 인터페이스의 DriverManager는 각 벤더에 맞는 DB의 드라이버들을 관리하여 커넥션을 획득하는 기능을 제공을 합니다. DriverManager의 getConnection() 메서드를 통해 벤더의 드라이버에 커넥션을 요청하고, 라이브러리에 등록된 드라이버의 목록을 자동 인식하여 정보를 넘겨서 커넥션을 획득할 수 있는지 확인합니다. API를 살펴보면, url(jdbc:Driver 종류://IP:포트번호/DB명), user(DB의 ID), password(DB의 비밀번호)를 받도록 되어있습니다. 각 ..

Skills/Java 2022.10.13

Java - static 키워드의 사용

얼마전 스터디에서 제가 Static 키워드에 대해 설명하던 도중 잘못알고 있던 부분이 있어 바로 잡으려고 글을 작성했습니다. 1. Static Java의 static keyword는 주로 메모리 관리에 사용되는 키워드로 주어진 클래스의 동일 변수나 메서드를 공유하는데 사용이 됩니다. 멤버(블록, 변수, 메서드, 클래스)가 정적으로 선언되면 해당 클래스의 개체가 생성되기 전(컴파일 타임)에 개체에 대한 참조없이 접근할 수 있습니다. Java에서 일반적으로 만든 Class는 Static 영역에 생성되고, new 연산자를 통한 객체 생성은 Heap 영역에 저장이 됩니다. 객체 생성 시 Heap 영역의 메모리는 GC의 관리를 받게 되는데, Static 영역에 할당된 메모리는 모든 객체가 공유하는 메로리로 GC의..

Skills/Java 2022.10.11

Java - 정적 팩토리 메서드를 고려하는 상황

조슈아 블로치의 Effective Java는 1장에 나오는 '생성자대신 정적 팩토리 메서드를 고려하라'는 주제로 시작됩니다. 생성자대신 사용하라는 것은 두 개 모두 클래스의 인스턴스를 얻는 수단이기 때문이죠. 둘을 비교하면서 살펴보겠습니다. 1. 정적 팩토리 메서드 (Static Factory Method) 먼저 정적 팩토리 메서드는 해당 클래스의 인스턴스를 반환하는 클래스 메서드입니다. 설명보다는 코드로 한번 보는 것이 좋을 것 같습니다. // 생성자 방식 public class Constructor{ String cons; public cons(String name){ this.name=name; } public static void main(String[] arts){ Constructor cons..

Skills/Java 2022.10.08

Java - JDBC

1. JDBC JDBC는 Java DataBase Connectivity의 약자로 Java 프로그램과 DB와 연결되어 주고 받을 수 있게 돕는 Java API로 DB에서 데이터를 쿼리하거나 업데이트 하는 방법을 제공합니다. 소개에 앞서 JDBC가 등장하게 된 배경부터 살펴봐야 될 것 같습니다. 애플리케이션을 개발시 중요 데이터는 DB에 보관하게 됩니다. 이 때 클라이언트가(App 혹은 브라우저에서) 애플리케이션 서버에 요청을 보내게 되면 비즈니스 로직을 수행하여 필요 데이터를 SQL로 전달하여 DB에 전달하게 됩니다. 위의 설명을 그림으로 요악하면 그림과 같습니다. 여기서 문제가 있습니다. DB의 종류에는 여러가지가 있어(MySQL, Oracle, Maria 등등.. ) DB마다 커넥션 연결하는 법, S..

Skills/Java 2022.10.04