분류 전체보기 2528

[아이템 89] 인스턴스 수를 통제해야 한다면 readResolve보다는 열거 타입을 사용하라

싱글턴이란?클래스의 인스턴스가 오직 1개만 생성되는 것을 보장하는 디자인 패턴 싱글턴 객체를 직렬화할 때 발생하는 문제점클래스에 마커 인터페이스인 Serializable을 구현하는 순간 더 이상 싱글턴 객체가 아님아이템 87에서 언급한 커스텀 직렬화를 사용하더라도, 아이템 88에서 언급한 커스텀 readObject() 메서드를 사용하더라도 소용없음어떤 readObject() 메서드를 선언하든 해당 클래스가 초기화될 때 만들어진 인스턴스와는 별개인 인스턴스를 반환 readResolve() 기능을 이용할 때readObject()가 생성한 인스턴스를 다른 것으로 대체 가능역직렬화한 객체의 클래스가 readResolve() 메서드를 적절히 구현했다면 역직렬화 후 새로 생성된 객체를 인수로 해당 메서드가 호출되고..

JAVA/Effective Java 2024.05.18

[아이템 88] readObject 메서드는 방어적으로 작성하라

아이템 50에서 불변인 날짜 범위 클래스를 생성할 때 가변 객체인 Date 필드를 이용했습니다.이 때문에 불변식을 지키고 유지하기 위해 모든 생성자와 접근자에 Date 객체를 방어적으로 복사하느라 코드가 상당히 길어졌던 것을 기억할 것입니다.   아이템 87에서 언급했다시피 객체의 물리적 표현과 논리적 표현이 동일할 경우 기본 직렬화를 사용해도 됩니다.따라서 위 Period 클래스가 단순히 마커 인터페이스인 Serializable를 구현하도록 수정하면 완벽한 직렬화 적용이 완료되었을 것이라고 생각이 들 것입니다.하지만 위와 같이 적용해서는 주요한 Date 객체의 불변식을 보장하지 못합니다. Period 객체가 단순히 Serializable을 구현했을 때 발생하는 문제점readObject() 메서드가 실질..

JAVA/Effective Java 2024.05.18

[아이템 87] 커스텀 직렬화 형태를 고려해보라

개발 일정에 쫓기는 상황이라면 세부적인 구현에 집중하기보다는 이번 릴리즈에 대충 동작은 하도록 API 설계에 노력을 집중하는 편이 낫습니다.하지만 클래스가 Serializable 구현체이고 기본 직렬화 형태를 사용한다면 기본 직렬화 형태를 버릴 수 없게 되기 때문에 다음 릴리즈 때 버리려 한 대충 동작하는 현재의 구현에 영원히 발이 묶이게 됩니다. 먼저 고민해보고 괜찮다고 판단될 경우에만 기본 직렬화 형태를 사용하자기본 직렬화 형태는 유연성, 성능, 정확성 측면에서 신중히 고민한 후 합당할 때만 사용하는 것을 권장직접 설계하더라도 기본 직렬화 형태와 거의 같은 결과가 나올 경우에만 기본 형태를 사용기본 직렬화 형태는 해당 객체를 루트로 하는 객체 그래프의 물리적 모습을 나름 효율적으로 인코딩한 형태객체가..

JAVA/Effective Java 2024.05.14

[Cloud] AWS Cloud 기초 part 1

서론사내 온라인 강의 내용을 정리한 글입니다. 틀린 내용이 있을 수 있으니, 발견되면 댓글로 지적해 주시기 바랍니다! 1. AWS(Amazon Web Services)컴퓨팅, 스토리지, 데이터베이스, 분석 등등 광범위한 글로벌 클라우드 기반 제품 제공 업체클라우드 제공 업체 (Cloud Service Provider)2006년에 서비스를 시작했고 클라우드 컴퓨팅 시장에 초기에 진입해서 광범위한 경험을 쌓음200개 이상의 클라우드 서비스를 제공하고 있고 컴퓨팅, 스토리지, 데이터베이스, 인공지능, 머신러닝, IOT 등 다양한 영역에 걸쳐져 있음이 다양성은 사용자가 필요한 모든 IT 서비스를 하나의 플랫폼에서 이용할 수 있게 함 AWS는 전 세계에 분산된 데이터센터를 보유하고 있기 때문에 지리적으로 분산된 ..

Cloud 2024.05.13

[아이템 86] Serializable을 구현할지는 신중히 결정하라

클래스 인스턴스를 직렬화하기 위해서는 단순히 마커 인터페이스인 Serializable을 구현하면 됩니다.이처럼 너무 쉽게 적용할 수 있기 때문에 프로그래머가 특별히 신경 쓸 것이 없다는 오해가 생길 수 있지만 실제로는 직렬화를 적용하는 것은 아주 값비싼 일입니다. Serializable을 구현할 경우 릴리즈한 뒤에는 수정하기 어려움클래스가 Serializable 구현체일 경우 직렬화 형태인 바이트 스트림 인코딩도 하나의 공개 API가 됨자바는 하위 호환성을 지원하는 것을 추구하기 때문에 직렬화된 클래스가 널리 쓰이는 라이브러리에 포함될 경우 릴리즈 이후에는 직렬화 형태도 영원히 지원해야 함클래스의 private과 package-private 인스턴스 필드마저 API로 공개하는 꼴이 되어 객체지향의 핵심인..

JAVA/Effective Java 2024.05.12

[아이템 85] 자바 직렬화의 대안을 찾으라

자바 직렬화란?자바 객체를 바이트 스트림으로 변환하는 메커니즘객체를 파일에 저장하거나 네트워크를 통해 DB 혹은 메모리로 전송할 때 유용직렬화된 객체는 나중에 다시 역직렬화될 수 있어 객체의 상태를 보존하고 복원할 수 있음직렬화를 사용하기 위해서는 클래스가 Serializable 인터페이스 구현체여야 함직렬화된 객체는 ObjectOutputStream을 사용하여 생성된 출력 스트림으로 쓰이며 이를 통해 객체를 스트림에 쓰면 자동으로 필드 값들이 바이트로 변환되어 출력역직렬화는 직렬화된 객체를 읽어와서 자바 객체로 변환하는 것이며 이를 위해 ObjectInputStream을 사용직렬화를 통해 생성된 바이트 스트림은 플랫폼에 독립적이기 때문에 타 플랫폼에서도 역직렬화가 가능 자바 직렬화의 취약점앞선 설명만 ..

JAVA/Effective Java 2024.05.12

[Java] CompletableFuture

동시성 프레임워크 정리 글에서 언급했다시피 Future는 작업의 결과를 가져올 때까지 blocking 되고, 작업을 조합하거나 예외 처리하는 것이 어려웠습니다.이 문제를 해결하기 위해 자바 8에서 CompletableFuture가 등장했고 이번 게시글에서는 다음 내용을 간단히 정리해 보겠습니다.동기 vs 비동기CompletableFuture 개요CompletableFuture APIForkJoinPool 1. 동기 vs 비동기 1.1 동기(Synchronous)작업이 순차적으로 실행되며 한 작업의 시작과 완료가 다른 작업의 시작과 완료와 밀접하게 연결된 방식하나의 작업이 실행 중인 동안 다른 작업은 대기해야 함작업의 결과를 기다린 후 다음 작업이 진행작업은 한 번에 하나씩 진행하며 작업을 건너뛰거나 빠뜨..

[Programmers] 상담원 인원

문제 링크입니다: https://school.programmers.co.kr/learn/courses/30/lessons/214288 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr reqs의 크기가 최대 300이고 상담원 배치 조합이 최대 15C5이기 때문에 브루트포스로 접근해도 되는 문제였습니다. 알고리즘은 다음과 같습니다. 1. 상담원을 배치할 수 있는 모든 조합을 구해줍니다. 2. 각각의 상담원 배치에 대해 기다린 시간의 합산을 구해줍니다. 2.1 자료구조는 시간을 기준으로 최소힙 배열을 선언하였고 각 유형의 상담원 인원수만큼 우선순위큐에 0을 넣어줬습..

[Programmers] 표현 가능한 이진트리

문제 링크입니다: https://school.programmers.co.kr/learn/courses/30/lessons/150367 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 해당 문제의 핵심은 서브 트리 내 루트가 반드시 1이어야 한다는 점입니다. 알고리즘은 다음과 같습니다.1. 주어진 십진수를 이진수로 변환한 뒤 포화이진트리 형태가 아니라면 포화이진트리 형태가 되도록 0을 추가해 줍니다.2. 1번에서 구한 이진수의 가운데를 시작으로 모든 서브 트리 내 루트 노드가 존재하는지 확인합니다.2.1 2번 조건이 성립하면 1, 성립하지 않으면 0을 answe..

[Programmers] 미로 탈출 명령어

문제 링크입니다: https://school.programmers.co.kr/learn/courses/30/lessons/150365 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 사전순으로 가장 빠른 경로를 구해야 하므로 그리디 하게 [d, l, r, u] 순으로 백트래킹하면 되는 문제였습니다.시간을 단축시키기 위해 현재 지점과 탈출 지점 사이의 맨해튼 거리를 구해 거리가 안될 경우 가지치기를 진행했습니다.  개발환경: Programmers IDE   지적, 조언, 질문 환영합니다! 질문 남겨주세요~