여기의 내용을 번역하여 정리했습니다
nullpointerexception
의 굴레에서 살아간다.null
을 반환하기 보다는 Optional
을 사용하자public String getString(){
return null;
}
public Optional<String> getString(){
return Optional.empty();
}
+
연산자를 통하여 특정 자료형을 String
으로 변환할수도 있다double d = 3.141592;
String s = "" + d;
double d = 3.141592;
String s = String.valueOf(d);
int[] = sourceArray = {1, 2, 3, 4, 5};
int[] = targetArray = new int[sourceArray.length]; // 배열 길이 할당
for (int i = 0; i < sourceArray.length; i++){
targetArray[i] = sourceArray[i];
}
int[] originalArray = {1, 2, 3, 4, 5};
int[] copiedArray = Arrays.copyOf(originalArray, originalArray.length);
if(list.size() == 0)
와 같이 확인하기 보다는 해당 자료형에서 상태값을 확인할 수 있는 메서드가 있다String text = "Hello!";
if(text.length() == 0){
// do
}
List<Long> numbers = new ArrayList<>();
if(numbers.size() == 0){
// do
}
String text = "Hello!";
if(text.isEmpty()){
// do
}
List<Long> numbers = new ArrayList<>();
if(numbers.isEmpty()){
// do
}
ConcurrentModificationException
에러를 만날 수 있다List<String> words = new ArrayList<>();
words.add("A");
words.add("B");
words.add("C");
for(String word: words){
if(word.equals("A")){
words.remove(word);
}
}
ArrayList
객체 내부를 확인해보면 엘리먼트의 추가 및 삭제마다 modCount
가 1씩 증가하게 되는데, next()
를 호출할때마다 다음 checkForComodification
함수를 호출하게 된다.modCount
는 배열의 수정으로 인하여 expectedModCount
와 달라졌기 때문에 ConcurrentModificationException
에러가 발생하는것iterator
에서 지원하는 remove
함수의 사용을 권장!List<String> words = new ArrayList<>();
words.add("A");
words.add("B");
words.add("C");
Iterator<String> iterator = words.iterator();
while (iterator.hasNext()){
String word = iterator.next();
if(word.equals("A")){
iterator.remove();
}
}
removeIf
함수의 사용하는 법도 있겠다. (자바8 이상)List<String> words = new ArrayList<>();
words.add("A");
words.add("B");
words.add("C");
words.removeIf(word -> word.equals("A"));
String text = "Hello!";
if (text.matches("Hello.*")) {
System.out.println("Matched!");
}
String replaced = text.replaceAll("\\s", "");
final Pattern PATTERN1 = Pattern.compile("Hello.*");
final Pattern PATTERN2 = Pattern.compile("\\s");
String text = "Hello!";
if (PATTERN1.matcher(text).matches()){
System.out.println("Matched!");
}
String replaced = PATTERN2.matcher(text).replaceAll(""");
public static String findNameById(Map<Integer, String> idNameMap, int id){
if (idNameMap.containsKey(id)){
return idNameMap.get(id);
}
else {
return "Unknown";
}
}
Map
에서 내가 원하는 데이터가 있는지 존재여부 확인 후, 내가 원하는 데이터를 반환하는 로직으로 확인이 가능하다.public static String findNameById(Map<Integer, String> idNameMap, int id){
String name = idNameMap.get(id);
if (name != null){
return name;
}
else {
return "Unknown";
}
}
List<String> stringList = new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
String[] array = stringList.toArray(new String[stringList.size()]);
toArray
내부를 확인해보면 다음과 같이 선언되어 있어, 크기 조정을 직접 해줄 필요가 없다는걸 알 수 있다.List<String> stringList = new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
String[] array = stringList.toArray(new String[0]);
interface Logger {
void log(String message);
}
interface Logger {
void log(String message);
default void logError(String errorMessage){
System.err.println("Error: " + errorMessage);
}
}
LocalDate
, LocalDateTime
이 훨씬 직관적이다import java.util.Date;
public class DateUtil {
public static void main(String[] args){
Date currentDate = new Date();
System.out.println("Current date: " + currentDate);
}
}
import java.time.LocalDate;
public class DateUtil {
public static void main(String[] args){
LocalDate currentDate = LocalDate.now();
System.out.println("Current date: " + currentDate);
}
}
ArrayList list = new ArrayList();
list.add(10);
list.add("Hello"); // Runtime Error!
ArrayList<Integer> list = new ArrayList();
list.add(10);
list.add("Hello"); // Compile Error!
자바를 사용할때 생각할만한 것들을 정리한 블로그를 읽으면서, 사실상 당연한것들이라고 생각을 했던것들이 대부분이긴 하다.
그래도 생각만 하고있는것보다 한번 정리해보는 기회로 그래도 나쁘진 않은것 같다.