Java 9

[이펙티브 자바] 적시에 방어적 복사본을 만들라 (Item. 50)

방어적으로 프로그래밍하라 항상 우리는 클라이언트가 우리의 불변식을 깨뜨리려고 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍해야 한다. 아래와 같은 클래스를 불변식으로 만들려고 의도하고 코드를 작성하였다고 해보자. 위 클래스는 불변인가? 그렇지 않다. 기본적으로 final은 기본형인 int와 같은 타입은 변경이 불가능하도록 한다. 하지만 Date와 같은 가변 클래스는 변경이 가능하게 된다. 그 말인 즉슨 Date를 final로 선언하여도 Date 내부의 값을 변경할 수 있다는 뜻이다. 이러한 이유로 Date보다는 자바 8 이후에 등장한 Java.time.Instant나, LocalDateTIme과 같은 불변으로 정의된 클래스를 사용하는 것이 좋다. 하지만 현재 위 코드의 상태로 클라이언트로부터 Peri..

Java 2024.03.21

[이펙티브 자바] 매개변수가 유효한지 검사하라. (Item 49)

원칙 1. 오류는 가능한 한 빨리 잡아야 한다 메서드와 생성자의 매개변수는 대게 어떤 조건을 만족하기를 바란다. 예를 들면, 파라미터로 들어오는 인덱스의 값은 음수이면 안된다거나, 주민등록번호는 13자리인 것처럼 말이다. 이러한 제약은 문서화해야하며, 메서드 몸체가 시작되기 전에 검사해야한다. 만약 그러지 않고 오류를 발생한 즉시 잡지 못했다면, 오류를 감지하기 어려워지고, 발생 지점을 찾기 힘들어진다. 매개변수 검사를 제대로 하지 않았을 때 파라미터의 조건을 만족하지 못하게 되면 실패 원자성을 어기는 결과를 초래할 수 있다. 실패 원자성이란, 호출된 메서드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야하는 성질을 말한다. 이렇게 매개변수를 제대로 하지 못하면 아래와 같은 상황이 벌어질 수 ..

Java 2024.02.27

[Java/자바] 자바 프로젝트와 mysql을 docker-compose로 묶어보자

안녕하세요! 오늘은 제가 진행 중인 자바 프로젝트를 도커 이미지화 시킨 후에, docker compose로 묶어서 한번에 관리하는 과정을 기록해보려고 합니다. 모든 네이밍과 설정들이 제 프로젝트에 맞춰져있을 수 있지만, 참고만 한다고 생각하고 봐주시면 감사하겠습니다. 우선, 프로젝트를 도커 이미지화하기 위해서는 Dockerfile이 필요합니다. (Dockerfile 작성에 대한 간단한 글은 아래를 참고해주세요.) 2023.08.24 - [Python] - [파이썬/Python] 도커 이미지를 생성하고 배포해보자 Dockerfile의 가장 하단에 CMD나 ENTRYPOINT로 자바 파일을 실행하게 됩니다. 이 과정에서 우리는 .jar 파일이 필요하게 됩니다. 따라서 .jar를 먼저 만들어줍시다. gradl..

Java 2023.08.30

[Java/자바] 싱글톤 패턴? 싱글톤 컨테이너? 그게 뭔데!!

오늘은 싱글톤에 대해서 알아보겠습니다. 우선 싱글톤은 흔히 싱글톤 패턴이라고 알려진 디자인 패턴에서 나왔습니다. 싱글톤 패턴이란, 자바에서 어떤 클래스에 대한 인스턴스를 하나만 유지하도록 도와주는 디자인 패턴을 의미합니다. (디자인 패턴은 자세히 설명할 수는 없지만, 어떠한 용도나 문제점을 해결하는데 좋은 구조...?? 정도로 저는 이해했습니다) 1. 싱글톤 패턴 그럼 우리는 왜 싱글톤 패턴을 사용할까요??? 우리는 프로젝트를 통해서 많은 클라이언트의 요청을 받고 처리합니다. 그러면 이러한 상황을 가정해봅시다. 만약 1,000,000명의 클라이언트가 1초에 한번씩 요청을 하는 상황을 가정합니다. 이 클라이언트는 주문을 요청하며 주문을 요청할 때마다 주문 객체를 생성하여 관리합니다. 그렇다면 우리는 10초..

Java 2023.07.30

[Java/자바] 문자열을 "+"로 split 해보자(BOJ 1541 잃어버린 괄호)

백준 1541 문제를 풀던 도중, 제가 생각해낸 해법에 대해서 문자열을 +로 split해야하는 상황이 발생했습니다. 여느 때와 같이 string뒤에 참조로 split 함수를 호출하여 구분자를 +로 지정하지 아래와 같은 에러가 나타났습니다. 여기서 쓰이는 +는 뒤에 어떤 것이 더 오기를 기대하기 때문에, +라는 quantifier가 기다리는 행동을 한다는 것을 알려주고 있습니다. 사실 +는 정규식을 사용할 때 종종 찾아볼 수 있습니다. 정규식으로 사용될 때 +는 뒤에 어떤 문자가 적어도 1번 이상 진행되는 것을 의미하는 것입니다. 따라서 우리가 사용하려는 + 문자 자체를 split하기 위해서는 위와 같이 진행할 수 없습니다. 따라서 + 대신 \\+로 수정하여 적용해주면 올바르게 나타낼 수 있습니다. 실제로..

Java 2023.07.26

[자바/Java] 추상 클래스(Abstract Class)

추상 클래스란? : 공통적인 기능을 부모 클래스에로 정의해서 상속받되 일부 공통 기능은 자식 클래스에서 구현하도록 강제하는 것. 추상 클래스의 특징 - 구체적이지 않고 일반화된 클래스 - 객체들 간의 공통적인 기능을 정의한 클래스 - 기능의 구체적인 내용 구현은 자식 클래스에게 일임 - 추상 클래스는 단독으로 인스턴스를 만들 수 없음 - 상속을 통해 자식클래스에서 인스턴스를 생성 추상 클래스 선언하기 - 클래스 선언 부에 abstract 키워드 사용 - 추상 클래스의 멤버 : 필드, 생성자, 메소드 아래는 추상 클래스의 대표적인 예이다. public abstract class Student { private final String name; Student(String name){ this.name = n..

Java 2023.07.10

[자바/Java] 오버라이딩과 오버로딩(OverRiding and OverLoading)

오늘은 오버라이딩과 오버로딩에 대한 설명 및 차이점에 대해 소개한다. 오버라이딩(OverRiding)이란? 오버라이딩은 상속 관계에 있는 부모 클래스에서 정의된 메소드를 자식 클래스에서 재정의하여 사용하는 것을 의미한다. 하지만 이 오버라이딩을 하기 위해서는 몇가지 규칙을 지켜야한다. 1. 부모 메서드의 이름, 파라미터, return 타입이 같아야 한다. 2. 부모 메서드의 접근제어자의 범위보다 더 좁아질 수 없다. 접근제어자에 대해서는 다음 포스팅에서 소개하겠지만, public > protected > (default) > private 순서로 범위가 작아진다는 것만 우선 알아두자. 3. 부모 메서드가 가지고 있는 예외의 개수보다 자식 클래스의 메서드의 예외 개수가 더 많아질 수 없다. 부모 클래스 :..

Java 2023.07.04

[Java/자바] 자바와 인텔리제이 설치하기(Window/Mac)

오늘은 자바에 대한 설치를 진행하고, 자바 프로그래밍은 하는 환경 중 하나인 인텔리제이에 대한 설치에 대해 진행해보겠습니다. 우선 자바를 설치하기 위해 JDK가 설치되어 있어야한다. JDK란? Java Development Kit의 줄임말로 자바 개발에 필요한 라이브러리를 제공한다. 자바 개발 환경에는 반드시 설치해야한다. 1. JDK 설치 그럼 이제 JDK를 설치하자. JDK 설치를 위해 아래의 오라클 사이트로 접속한다. https://www.oracle.com/java/technologies/downloads/ Download the Latest Java LTS Free Subscribe to Java SE and get the most comprehensive Java support availabl..

Java 2023.07.03

[Java/자바] 자바란?

오늘은 자바에 대해서 간단하게 소개한다. 그에 따라 자바의 특징 네 가지에 대해서 구체적으로 설명한다. 1. 자바란? 자바는 프로그래밍 언어이다. 여러가지 프로그래밍 언어(JS, Python, C++, PHP 등) 중에서 대표적인 객체지향 프로그래밍 언어이다. (객체 지향에 대해서는 나중에 설명한다.) 아래는 프로그래밍, 프로그래밍 언어와 관련된 기초적인 용어에 대한 설명 및 특징을 나열한다. -> 프로그래밍 : 컴퓨터로 프로그램을 만드는 일 -> 프로그램 : 컴퓨터에서 특정 작업을 수행하는 명령어들의 모음 -> 프로그래밍 언어 명령어를 만들기 위해 프로그래밍 언어를 사용 사람이 컴퓨터와 의사소통할 수 있는 도구 특정 작업의 흐름대로 컴퓨터가 수행할 수 있도록 프로그래밍 언어를 작성 -> 소스 코드 : ..

Java 2023.07.03