전체 글 784

[Effective Java : Item 12] toString을 항상 재정의하라

개요 Object 클래스에서 기본으로 작성된 toString 메서드는 PhoneNumber@adbbd 처럼 단순히 '클래스 이름@16진수 해시코드' 로 반환한다. // Object의 toString 기본 메서드 public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } 하지만 위에서 언급한 형태보다는 010-1234-5678 처럼 실제 그 클래스의 핵심적인 정보를 읽기 쉬운 형태로 제공하는 것이 좋을 것이다. 이는 toString의 일반 규약이고, 실제로 모든 Object의 하위 클래스는 toString을 재정의하라고 규약을 정의하고 있다. 개발자가 직접 toString을 사용하지 않더라도..

Dev/Java 2024.02.04

[Effective Java : Item 4] 인스턴스화를 막으려거든 private 생성자를 사용하라

개요 프로젝트 내에 정적 메서드와 정적 필드만을 담은, 예를 들면 java.lang.Math나 java.util.Arrays 같은 클래스를 생성하고 싶을 수 있다. 이러한 유틸리티 클래스는 인스턴스로 만들어 사용하고자 하는 것이 아니지만, 생성자를 명시하지 않으면 컴파일러가 자동으로 매개변수가 없는 기본 생성자를 만들어주기 때문에 인스턴스화될 여지가 있다. 따라서 생성자를 private으로 선언해줌으로써 인스턴스화를 방지할 수 있다. 아이템 1에서 소개되었던 내용이기도 하다. 만약 클래스를 추상 클래스로 만든다면 인스턴스화되지 않기는 하지만, 이는 완벽하게 인스턴스화를 막는 방법이 아니다. 클래스를 상속해서 인스턴스화 하면 되기 때문이다. 그리고 이런 방법은 명시적인 설명이 없다면 오히려 상속해서 사용하..

Dev/Java 2024.01.30

[Javascript] crypto.randomUUID is not a function 오류

개요 현재 진행하는 중인 프로젝트의 한 기능이 로컬 환경, 심지어 고객사에서도 문제 없이 작동하다가 Dev 서버에서는 갑자기 위같은 오류가 발생하며 작동하지 않는 이슈가 있었다. 따라서 코드 문제는 아닌 것 같고 환경 설정이나 버전 관련 문제인 줄 알았는데, crypto API는 https 환경에서만 작동하는 것이 원인이었다. localhost는 secure origin으로 판단되기 때문에 로컬 환경에선 문제없이 작동했고 고객사 홈페이지 또한 도메인을 따 https 연결을 사용하고 있었으니 정상 작동하였는데, dev 서버는 http 연결을 사용했기 때문에 위같은 오류를 뱉는 것이었다. 해결 uuid 를 생성하는 메서드가 있는 다른 라이브러리 사용 직접 uuid를 생성하는 메서드 작성 필자는 다행히 프로젝..

Dev/Javascript 2024.01.25

[Effective Java : Item 3] private 생성자나 열거 타입으로 싱글턴임을 보증하라

개요 싱글턴(singleton)이란 디자인 패턴 중 하나로, 인스턴스를 오직 하나만 가질 수 있도록 보장하는 클래스를 말한다. 싱글턴의 예로는 무상태(stateless) 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있다. @Service, @Controller 등으로 생성되는 스프링 빈 또한 싱글턴의 일종이다. 싱글턴을 생성하는 방법은 여러 가지가 있는데, 아래 3가지 방식에 대해 소개한다. public static final 필드 방식(Eager Initialization) 정적 팩터리 방식 열거 타입 방식(Enum Initialization) 1번과 2번 방식이 싱글턴을 만들 때 일반적으로 사용되지만, 이펙티브 자바의 저작자는 열거 타입 방식이 대부분의 상황에서 가장 좋은 방법이라 말한다. ..

Dev/Java 2024.01.24

[Effective Java : Item 2] 생성자에 매개변수가 많다면 빌더를 고려하라

개요 생성자와 정적 팩터리 메서드에는 공통적인 제약이 하나 있는데, 바로 매개변수가 많을 경우 적절히 대응하기 힘들다는 점이다. 식품 포장의 영양정보를 표현하는 클래스가 있다고 가정하자. 이 클래스에는 다양한 영양 정보를 표시하기 위해 수많은 필드들이 있을 것이다. 만약 특정 식품 포장에 영양정보를 표현하기 위해 이 클래스를 사용한다면 대부분의 제품은 필수 값을 제외하고 선택 항목들의 값이 0이 될 것이다. 위와 같은 문제를 해결하기 위해 다음과 같은 대안이 있다. 점층적 생성자 패턴(telescoping constructor pattern) 자바 빈즈 패턴(JavaBeans pattern) 빌더 패턴(Builder pattern) 빌더 패턴이 가장 권장되는 것처럼 제목에서부터 언급하지만, 그 이유를 알..

Dev/Java 2024.01.19

[Effective Java : Item 1] 생성자 대신 정적 팩터리 메서드를 고려하라

개요 클래스의 새로운 인스턴스를 얻으려고 할 때 보통은 생성자를 이용한다. 하지만 특정 상황에 따라 생성자 대신 '정적 팩터리 메서드'를 통해 인스턴스를 반환하는 것을 고려해볼 수 있다(디자인 패턴의 팩터리 메서드 패턴과는 관계가 없다). 정적 팩터리 메서드가 생성자보다 무조건 좋은 것은 아니며, 경우에 따라 둘 중 하나 또는 두 가지 모두 제공할 수 있다. 정적 팩터리 메서드를 사용할 경우 아래와 같은 장단점이 존재한다. 장점 1. 메서드명, 즉 이름을 가질 수 있다. 2. 호출될 때마다 새로운 객체를 생성할 필요가 없다. 3. 반환 타입의 하위 타입 객체를 반환할 수 있다. 4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다. 5. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체..

Dev/Java 2024.01.18

[🥈5 / 백준 4108 / 파이썬] 지뢰찾기

4108번: 지뢰찾기 C개의 문자들이 포함된 R개의 줄을 출력한다. 단, 모든 '.' 대신 인접한 칸에 위치한 지뢰의 수로 변경해 출력한다. '*' 칸은 그대로 출력한다. 문자 사이에 공백이나 줄 사이에 공백 줄이 있어선 www.acmicpc.net 문제 07년 개봉한 영화 '지뢰찾기'는 지뢰의 수를 조사해야하는 요원 예슬의 이야기를 다룬 영화다. 정보기관의 요원이었던 예슬은 심심해서 컴퓨터로 지뢰찾기를 켰다가 인사팀에 걸려 지뢰제거팀으로 좌천된다. 좌천된 예슬에게 처음 부여된 임무는 지뢰 제거도 아닌 지뢰 수 조사! 예슬의 첫 임무에서 교육요원으로 배정된 다민은 "처음 건 무조건 안 터져." 라고 말하며 거침없이 땅을 팠지만 지뢰가 터져 얄짤없이 사망하고 만다. 지뢰 밭에 혼자 남겨진 예슬! 과연 임무..

[🥈4 / 백준 4134 / 파이썬] 다음 소수

4134번: 다음 소수 정수 n(0 ≤ n ≤ 4*109)가 주어졌을 때, n보다 크거나 같은 소수 중 가장 작은 소수 찾는 프로그램을 작성하시오. www.acmicpc.net 문제 정수 n(0 ≤ n ≤ 4*109)가 주어졌을 때, n보다 크거나 같은 소수 중 가장 작은 소수 찾는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. 출력 각각의 테스트 케이스에 대해서 n보다 크거나 같은 소수 중 가장 작은 소수를 한 줄에 하나씩 출력한다. 예제 입력 3 6 20 100 예제 출력 7 23 101 풀이 정확히 몇 개의 테스트 케이스가 필요한 지 주어지지 않아서 시간 복잡도를 얼마나 고려해야 싶었는데, 그냥 일반적인 소..

[Lv.2 / 프로그래머스 / 파이썬] 석유 시추 (PCCP 기출문제 2번)

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 BFS로 석유 덩어리의 크기를 구한 뒤 m 만큼 순회하며 세로로 시추관을 설치했을 때 최대의 석유량을 구해야 한다. 시추관을 설치할 때마다 해당 부분에 위치한 석유 덩어리의 사이즈를 BFS로 순회한다면 불필요한 연산이 많이 발생할 것이다. 따라서 land를 순회하며 각 석유 덩어리의 사이즈를 측정하고 해당 석유 덩어리에 번호를 붙여주도록 하자. 사이즈를 구했다면 이를 딕셔너리에 담아 번호를 키값으로 조회가 가능하도록 한다. def solution(land): n, m = len(land), len(lan..

[Lv.1 / 프로그래머스 / 파이썬] 붕대 감기 (PCCP 기출문제 1번)

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 주어진 조건대로 시뮬레이션하여 결과를 return 하는 문제이다. 마지막 공격 시간을 배열에서 구해 for문으로 초 단위로 순회하며 시뮬레이션 하며 해결했다. attacks 배열을 딕셔너리 형태로 변형하여 시간 복잡도를 확보하도록 하자. def solution(bandage, health, attacks): t, x, y = bandage max_health = health end_time = attacks[-1][0] attacks = {attack[0]:attack[1] for attack in at..

반응형