https://edu.nextstep.camp/c/8fWRxNWU/ 클린코드를 위한 TDD, 리팩토링 with Java edu.nextstep.camp 일급컬렉션 피드백에 이어, 많이 하는 피드백이 불변객체를 작성하라는 것이다. Effective Java에서는 '변경 가능성을 최소화하라'는 챕터를 통해 불변 객체를 소개한다. '불변 객체'는 인스턴스 생성 이후 내부 인스턴스 변수들을 수정할 수 없어야 한다. 이에 근본적으로 Thread-safe하므로 동기화 작업을 할 필요 없어 오류 가능성이 적고 실패 원자성을 제공한다. 불변 객체를 작성하기 위해 Effective Java에서는 아래의 규칙을 소개한다. - 객체의 상태를 변경하는 메서드를 제공하지 않는다. 즉, setter 메서드 등을 통해 인스턴스 변..
https://edu.nextstep.camp/c/8fWRxNWU/ 클린코드를 위한 TDD, 리팩토링 with Java edu.nextstep.camp TDD, 클린코드 코드리뷰를 하다보면 '원시값과 문자열을 포장하라', '일급콜렉션을 쓴다'와 같은 피드백을 주곤한다. Wrapper Class를 작성하는 데에는 어려움이 없지만, 일급콜렉션을 학습하는 과정에서 보통 동욱님의 블로그를 접하는데 두번째 특징인 '불변성'으로 인해 혼란을 겪는다. 객체지향 생활체조에 제시된 일급콜렉션(First Class Collection)은 일급 시민(First Class Citizen)을 연상시킨다. 그리고 일급시민은 함수형 프로그래밍과 더불어 불변객체를 연상시킨다. 우선 일급시민은 무엇이고, 불변객체는 무엇일까? 일급시민..
앞에서는 클라이언트의 요청 처리를 서블릿 홀로 담당하는 All-in-One 방식에 대해 살펴보았다. All-in-One 방식은 규모가 크거나 업무 변경이 많은 경우에는 유지보수가 어려워 운영 비용이 증가하게 된다. 시스템 변경이 잦은 상황에서 유지보수를 보다 쉽게하려면, 중복 코드의 작성을 최소화하고, 코드 변경이 쉬워야 한다. 이를 위해서는 객체 지향의 특성을 활용하여 좀 더 역할을 세분화하고 역할 간 의존성을 최소화하여야 한다. 그리하여 제안된 것이 MVC(Model-View-Controller) 아키텍처이다. MVC 구조에서는 클라이언트의 요청 처리를 서블릿 혼자서 담당하지 않고 세 개의 컴포넌트가 나누어 처리한다. 컨트롤러 컴포넌트의 역할은, 클라이언트의 요청을 받았을 때 그 요청에 대해 실제 업..
요즘 프로젝트들은 대부분 프레임워크 기반으로 개발을 진행한다. 프레임워크 사용법만 익히면 웬만한 기능들을 큰 오류없이, 성능의 큰 손실 없이, 빠르게 개발할 수 있기 때문이다. 그런데, 프레임워크란 무엇인가? 라이브러리가 개발에 필요한 도구들을 단순히 나열해 놓은 것이라면, 프레임워크는 동작에 필요한 구조를 어느정도 완성해 놓은 반제품 형태의 도구라고 할 수 있다. (스프링 프레임워크는 단순히 빈 관리를 위한 IoC 컨테이너를 넘어서 웹 MVC 아키텍처와 보안, 모바일 등 다양한 분야의 기반 기술을 제공한다고 하는데, 지금은 일단 넘어가자) 따라서 프레임워크를 제대로 사용하기 위해서(그리고 프레임워크로 해결할 수 없는 요구사항들을 해결하기 위해서는) ‘동작’에 대해 알아야 하고, 이를 구현하는 ‘구조’ ..
Collection 인터페이스 구성 인터페이스 Hash Table Resizable Array Balanced Tree Linked List List+Hash Set HashSet TreeSet LinkedHashSet List ArrayList LinkedList Deque ArrayDeque LinkedList Map HashMap TreeMap LinkedHashMap 일반적으로 사용되는 클래스- 데이터 읽기/쓰기 등 평균 응답시간이 가장 좋다- 필요한 목적에 부합하는 클래스를 선택해서 사용하는 것이 바람직하다. (TreeSet은 느리지만, 데이터를 저장하면서 정렬하기때문에 순서에 따라 탐색할때 유용하다) 인터페이스 클래스 Set HashSet List ArrayList Map HashMap Que..
String은 immutable 하고, StringBuffer는 mutable하다. String은 한번 생성되면 불변한다? 문자열을 더할 경우("Hello" + "World"), 새로운 String객체를 생성한 후 값("Hello World")을 담아 리턴한다는 말이다. (기존의 객체들 에 담긴 값("Hello", "World")이 변하지 않음) 따라서, String은 짧은 문자열을 더할 경우에나 사용하는 것이 좋다고 한다. (새로운 객체를 생성하여 리턴하므로..) StringBuilder는 스레드에 안전한지의 여부와 전혀 관계없는 프로그램을 개발할 때 사용하면 좋다. 만약 메서드 내에 변수를 선언했다면, 해당 변수는 그 메서드 내에서만 살아있으므로, StringBuilder를 사용하면 된다. Strin..
이동 Alt + ) 이전(다음) 작업 화면 Ctrl + PageUp , Ctrl + PageDown Edit 창 좌우 이동 Ctrl + L 특정 라인으로 이동 Ctrl + , or . 다음 annotation(에러, 워닝, 북마크 가능)으로 점프 Ctrl + Shift + K 역으로 찾고자 하는 문자열을 찾아감. Ctrl + Shift + R파일 찾기 Ctrl + K 블럭으로 설정된 문자열 찾기 Ctrl + Shift + Down 클래스 내에서 다음 멤버로 이동 F3 선언 위치로 이동 F12 Editor 창으로 이동 편집 및 교정 단축키 동작Ctrl + N 새로운 파일 / 프로젝트 생성 Ctrl + / 한 라인/블록에 대해 주석 추가 및 제거 Alt + Shift + J 주석 템플릿을 생성 Ctrl + ..
배열 랜덤으로 값 추출 import java.util.Arrays; import java.util.Collections; import java.util.List; public class xx { ... String[] Pool = {"1", "2", "3"}; List Shuffle = Arrays.asList(Pool); Shuffle.get(리스트순서번호).toString() 문자열 문자열 길이 sentence.length(); 문자열 출력 System.out.printf("%d, %s, %c",1,"문장을 입력",'a'); System.out.println("문장"); 문자열 입력받기 .next() 공백을 기준으로 문자, 문자열을 입력받음 .nextLine() 문자, 문자열 한 줄을 입력받음 .ne..