본문 바로가기

Language

(33)
완전탐색 재귀호출에서 전역필드에 값 추가 아래 코드를 간단하게 설명하면 프로그래머스의 피로도 문제로 완전탐색을 통해 체크해야될 리스트를 구하고 전체를 테스트해서 해결하는 문제이다. 문제를 해결 중 한가지 발견한게 있어서 기록을 하고자 한다. find 메서드에서 전역필드 final_list에 result를 추가하는 부분이 있다. 이때, 만약 final_list.add(result)를 하게 되면 참조 변수를 더하는 꼴이 되는 것이다. 즉, 삽입 시점에는 원하는 값을 넣을 수 있겠지만 프로그램이 돌면서 result의 값이 변하게 되고 해당 알고리즘은 result를 결과적으로는 비우기 때문에 빈 List가 저장된다. 따라서, 삽입시 마다 새로운 객체를 만들어서 삽입을 해야한다. final_result.add(new ArrayList(result)); ..
Effective JAVA - Item3 : private 생성자나 열거 타입으로 싱클턴임을 보증하라. 결론 : " 싱글턴 사용시 여러가지 방식중 장단점을 고려해 사용을 하되, 열거타입을 가장 추천한다. 하지만 다른 방법들 또한 단점을 보완하는 해결책이 있으니 그 점을 유의해서 사용하자 " 싱글턴 정리 정의 : 인스턴스를 오직 하나만 만들 수 있는 클래스를 의미한다. 예시 : 함수와 같은 무상태 객체, 설계상 유일해야 하는 시스템 컴포넌트(자바에서 빈을 생각) 문제점 : 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기 어려워질 수 있다. -> 타입을 인터페이스로 정의하고 그 인터페이스를 구현하여 만든 클래스가 아니라면 싱글턴 인스턴스를 가짜 구현으로 대체하기 어렵기 때문이다. 예를 들어, Spring에서 테스트시 클래스들을 가짜 객체로 만들어 테스팅한다. 하지만 인터페이스로 구현되지 않은 ..
Effective JAVA - Item2 : 생성자에 매개변수가 많다면 빌더를 고려하라. 이펙티브 자바 2장. 객체 생성과 파괴 아이템 2 : 생성자에 매개변수가 많다면 빌더를 고려하라. 결론 : "인스턴스를 한번에 생성하기 때문에 유효성 검사도 가능하고 객체의 불변성을 준다면 스레드 안정성을 가져오며 또한 세터 개념을 사용하기에 가독성도 좋다. 따라서 매개변수가 많고 복잡하여 생성자 생성이 복잡하다면 빌더를 고려하자" 점층적 생성자 패턴의 문제 - 점층적 생성자 패턴이란 여러개의 필드 중에 필수필드를 기준으로 설정을 해두고 선택필드에 대해서 점진적으로 늘려 생성자를 만드는 방식이다. - 예를 들어, 총 20개의 필드가 있고 이 중에 필수 필드가 10개라면 나머지 10개의 필드에 대해서 1개를 받는 생성자 10개, 즉, 모든 경우의 수를 고려해 생성자를 만드는 경우이다. - 이는 수많은 생성..
JAVA - BASIC 1. JAVA 기본 개념 JDK(Java kit) = Library + JRE(Java Runtime Environment, 자바 실행 환경) JAVA 5.0 : Generics, Annotations, Enumerations 추가 JAVA 8.0 : Lamda, Stream, Optional 추가 LTS : 8년동안 업데이트, 버그 수정 해주는 버전 특징 - 객체 지향 언어 (현실세계의 객체를 그대로 가져와 프로그램 작성) 절차 지향(절차를 따져 프로그램 작성) - 멀티 스레드 지원 - OS 플랫폼 독립성 (JVM을 통해 운영체제에 맞는 바이너리 코드(네이티브 코드)로 변경) - 가비지 컬렉터 지원 (사용 안되는 인스턴스 청소해 메모리 정리) - 강한 타입의 언어이기에 데이터 타입을 명확히하여 메모리 ..
Effective JAVA - Item1 : 생성자 대신 정적 팩토리 메서드를 고려하라. 이펙티브 자바 2장. 객체 생성과 파괴 아이템 1 : 생성자 대신 정적 팩토리 메서드를 고려하라. 결론 : "아래의 장단점을 고려해 생성자 대신 static 키워드를 사용해 메서드를 만들고 이를 활용해 인스턴스를 생성하여 사용하자. " 클라이언트가 클래스의 인스턴스를 얻는 수단 - public 생성자 -> static factory method static factory method 예시 boolean 기본 타입의 boxed class -> Boolean Boolean의 메서드 valueOf()는 static을 사용해 생성자를 통한 인스턴스 생성없이 Boolean클래스를 참조할 수 있게 한다. 기본적인 예를 들어 Boolean 클래스의 메서드를 사용하고 싶은데 Boolean a = new Boolean(..
Effective JAVA - 1. Introduction 컴포넌트 규칙 - 명료성과 단순성이 포함되어야 한다. - 컴포넌트는 사용자를 놀라게해선 안되고 예측이 가능해야 한다. - 컴포넌트는 가능한 작되, 너무 작아서는 안된다. - 코드는 복사되는게 아닌 재사용되어야 한다. - 컴포넌트 사이의 의존성은 최소로 해야한다. - 오류는 발견하자마자 가능한 빨리, 되도록이면 컴파일시 잡아야 한다. "규칙을 배운 후 언제 그 규칙을 깨도 되느냐를 익혀야 한다." "이 책은 성능보다는 프로그램을 명확하고 정확하고 견고하고 유연하고 관리하기 쉽게 작성하는데 목적을 둔다" 용어 개념 정리 타입 - 인터페이스 - 클래스 - 배열 - 기본타입 - 애너테이션(인터페이스의 일종) - 열거 타입(클래스의 일종) - 인터페이스, 클래스, 배열은 참조 타입 -> 즉, 인터페이스, 클래스의..
JAVA - Grammar 이 블로그는 기본 적인 자바 문법이자 자주 사용되는 문법들을 정리해보았다. // (클래스의 전역 변수) private static int resultAll1 = 0; // (무한대) int inf1 = (int)1e9; int inf2 = (int)-1e9; // (숫자 - 알파벳) int test = 65; System.out.println((char) test); // A // (형변환) int -> char int num = 6; char ch = (char)(num + '0'); // (형변환) char -> int char c1 = '1'; int new_int1 = (int)c1 - 48; // 진짜 문자 int new_int2 = Character.getNumericValue(c1); // ..
JAVA - Loop(for, iterator, stream) 자바로 웹프로그래밍을 하다 보면 Map에 값 저장 후 그 값들을 반복문을 통해 읽어오는 경우가 많을 것이다. 이는 여러가지 방법이 존재하는데 한번 정리해보고자 한다. Map maps = new HashMap(); maps.put("key1", "value1"); maps.put("key2", "value2"); maps.put("key3", "value3"); // 1. For 문 사용 // key들을 불러와 key와 value 출력 for ( String key : maps.keySet() ) { System.out.println("key : " + key + " value : " + maps.get(key)); } // 2. Iterator 사용 // key들을 불러와 key와 value 출력 Ite..