불공변 타입 매개변수화 타입은 불공변(invariant)이다. 즉, 서로 다른 타입 Type1, Type2 가 있을때 List은 List의 하위 타입도 상위 타입도 아니다. 예를들어, List 은 문자열만 넣을 수 있고, List는 어떤 객체도 넣을 수 있기 때문에 List은 List의 하위타입이 아니다. 이는 List이 List가 하는 일을 제대로 수행하지 못하므로 하위 타입이 될 수 없다는 결론이다. 와일드 카드 타입으로의 변경 Stack 의 public API 추린 코드 public class Stack { public Stack(); public void push (E e); public E pop(); public boolean isEmpty(); } 여기에 일련의 원소를 스택에 넣는 메서드를 ..
Read more문제 https://leetcode.com/problems/integer-to-roman/ Integer to Roman - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 풀이코드 package SITE03_leetcode.medium; import java.util.*; import java.util.stream.Collectors; /** * https://leetcode.com/problems/integer-to-roman/ */ public class M..
Read moreTreeMap TreeMap이란, 이진트리를 기반으로 한 Map 컬렉션이다. TreeMap 은 아래와 같이 Key 와 값이 저장된 Map, Entry를 저장한다. 이진 검색트리의 형태로 key-value 쌍으로 이루어진 데이터(Entry)를 저장하는데에 유용하다. HashMap 과 비교하자면, TreeMap 은 범위 검색 또는 정렬 사용에 더 유연하다. TreeMap 에 실행되는 자동 정렬은, 기본적으로 부모 키 값과 비교하여 키 값이 낮은 것은 왼쪽에, 키 값이 높은 것은 오른쪽에 Map.entry 를 저장한다. public static TreeMap map = new TreeMap(); static { map.put(1, "ABC"); map.put(2, "DEF"); } ... treeMap의 특정..
Read more제네릭 메서드 생성 클래스와 마찬가지로, 메서드도 제네릭으로 만들 수 있다. 매개변수화 타입을 받는 정적 유틸리티 메서드는 보통 제네릭이다. 경고 발생 코드 public static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } 타입 불안정한 코드를 제네릭 메서드로 변경해보자. 제네릭 메서드 public static Set unionNext(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } 타입 매개변수 목록은 이고, 반환 타입은 Set 이다. 이 메서드는 경고 없이 컴파일되며, 타입 ..
Read more배열 코드를 제네릭 코드로 변경 제네릭 타입과 메서드를 사용하는 일은 일반적으로 쉬운 편이지만, 제네릭 타입을 새로 만드는 일은 조금 더 어렵다. 제네릭을 사용하지 않은 기본 코드 package com.java.effective.item29; import java.util.Arrays; import java.util.EmptyStackException; public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } publi..
Read more배열과 제네릭 배열과 제네릭 타입에는 중요한 차이가 두가지 있다. 배열은 공변이다. 공변이란, 함께 변한다는 뜻이다. Sub 가 Super 의 하위타입일 경우, 배열 Sub[] 는 배열 Super[] 의 하위 타입이 된다. 제네릭은 불공변이다. 즉, 서로 다른 타입 Type1, Type2 가 있을때 List,은 List 의 하위 타입도 아니고 상위 타입도 아니다. 배열 vs 리스트 1) 배열의 경우 Object[] objectArray = new Long[1]; objectArray[0] = "sss"; // 런타임시에 에러가 발생 배열은 런타임 시점에 오류를 알 수 있다. 2) 리스트의 경우 List ol = new ArrayList(); ol.add("sss"); 리스트는 컴파일할 때 바로 알 수 있..
Read more비검사 경고 제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게 될 것이다. 비검사 형변환 경고 비검사 메서드 호출 경고 비검사 매개변수화 가변인수 타입 경고 비검사 변환 경고 오류 코드 (경고 발생) Set test = new HashSet(); /** [unckecked] unchecked conversion required : Set found : HashSet */ 수정 코드 Set test = new HashSet(); Java7 부터 지원하는 다이아몬드 연산자()로 해결하였다. 컴파일러가 올바른 실제 타입 매개변수를 추론한다. (Test) 비검사 경고 제거 및 무시 할수있는 한, 모든 비검사 경고를 제거하라. 모두 제거한다면 그 코드는 타입 안정성이 보장된다. 런타임에 ClassCastEx..
Read more페이징 처리 /* paging */ Page findByName(String name, Pageable pageable); 호출 System.out.println("findByName : " + userRepository.findByName("test1" , PageRequest.of(0, 1, Sort.by(Sort.Order.desc("id"))))); // getContent System.out.println("findByName : " + userRepository.findByName("test1" , PageRequest.of(0, 1, Sort.by(Sort.Order.desc("id")))).getContent()); findAll() 메서드 호출 Page users = userReposit..
Read moreOrder BY ID DESC List findTopByNameOrderByIdDesc(String name); Order BY ID DESC (Limit 3) List findTop3ByNameOrderByIdDesc(String name); // 역순 TopN 중 N을 생략하면 1이 default 값이다 List findTopByNameOrderByIdDesc(String name); Order BY ID ASC (Limit 1) List findTop1ByNameOrderByIdAsc(String name); // 정순 여러 컬럼의 정렬 (Id Desc, Email Asc) List findFirstByNameOrderByIdDescEmailAsc(String name); // id desc, em..
Read morelike 'TEXT%' List findByNameStartingWith(String name); like '%TEXT' List findByNameEndingWith(String name); like '%TEXT%' List findByNameLike(String name); 호출 코드 (파라미터에 직접 '%test%'를 넣어줘야한다.) userRepository.findByNameLike("%test%") Contains List findByNameContains(String name); 호출 코드 (파라미터에 직접 '%test%'를 넣어줄 필요가 없다.) userRepository.findByNameLike("test")
Read moreNotNull List findByIdIsNotNull(); // id is not null NotEmpty List findByAddressIsNotEmpty(); 주의해야할점 String 타입의 변수의 경우 (findByNameIsNotNull()) NAME IS NOT NULL AND NAME != '' 라고 생각할 수 있겠지만, 이게 아니다. User.java 에 아래 코드를 추가한다. private List address; Collection Type 의 not empty 를 체크한다. (address not empty)
Read moreBetween (LocalDate Type, Long Type 모두 가능) LocalDateTime 타입 변수 List findByCreatedAtBetween(LocalDateTime startDateTime, LocalDateTime endDateTime); long 타입 변수 List findByIdBetween(long startId, long endId); Between~And List findByIdGreaterThanEqualAndIdLessThanEqual(Long id1, Long id2); 실행쿼리 findByIdBetween 메서드와 동일하게 구현된다. between (id>=? AND id
Read moreDate After List findByCreatedAtAfter(LocalDateTime yesterday); Date GreaterThan List findByCreatedAtGreaterThan(LocalDateTime yesterday); 실행쿼리 created_at > ? Date GreaterThanEqual List findByCreatedAtGreaterThanEqual(LocalDateTime yesterday); 실행쿼리 created_at >= ? Date Before List findByCreatedAtBefore(LocalDateTime yesterday);
Read moreWHERE~AND절 /* WHERE AND */ List findByEmailAndName(String email, String name); WHERE~OR절 /* WHERE OR */ List findByEmailOrName(String email, String name);
Read more전체 리스트 조회 List userList = userRepository.findAll(); 전체 리스트 조회 + regDts 컬럼 역순 정렬 List userList = userRepository.findAll(Sort.by(Sort.Direction.DESC, "regDts")); 데이터 단건 조회 (1) Long Type Id : 1 Optional userOptional = userRepository.findById(1L); Optional 리턴 https://devfunny.tistory.com/330 자바 8의 Optional 등장 NullPointerException NullPointerException은 개발자가 한번이라도 만나봤을 에러이다. 그정도로 흔하게 일어나는 에러로, 이는 “자바의..
Read more