Null Pointer Exception. 아마 자바를 사용하면서 많이 보게 되는 에러중에 하나일 것이다. 자바에서는 거의 모든 것들이 레퍼런스이기 때문에, 거의 모든 것들이 null이 될 가능성이 있다. 따라서 항상 null을 확인할 필요가 있다. (기존에는) //User.java public class User { public static User EMPTY = new USER(0, ""); private int age; private String name; public User(int age, String name) { this.age = age; this.name = name; } } //Main.java public class Main { public static void main(String[..
Iterator는 여러 데이터의 묶음을 풀어서 하나씩 처리할 수 있는 수단을 제공한다. iterator.next()를 통해서 다음 데이터를 조회할 수 있다. 다음 데이터를 읽을 수 있지만, 이전 데이터를 읽을 수는 없다. Iterator를 사용하면서 데이터들에 대해 map이나 filter를 적용할 수는 없다. //Main.java public class Main { public static void main(String[] args) { List list = Arrays.asList("A", "AB", "ABC", "ABCD", "ABCDE"); Iterator iter = list.iterator(); while (iter.hasNext()) System.out.println(iter.next()); ..
여러 데이터의 묶음을 컬렉션이라고 한다. Collection List LinkedList ArrayList Set HashSet SortedSet TreeSet Map은 Collection Interface에 포함되지 않는다. Map Hashtable HashMap LinkedHashMap SortedMap TreeMap 메소드 체이닝 예제 //MyCollection.java public class MyCollection { private List list; public MyCollection(List list) { this.list = list; } public MyCollection map(Function function) { // T타입으로부터 U타입을 만드는 function을 인자로 받는다. //..
//MyConsumer.java @FunctionalInterface public interface MyConsumer { void consume(T t); } //MyMapper.java @FunctionalInterface public interface MyMapper { OUT map(IN s); } //MySupplier.java @FunctionalInterface public interface MySupplier { T supply(); } //Main.java public class Main { public static void main(String[] args) { MySupplier s = () -> "Hello World!"; MyMapper m = String::length; //제네..
//MyConsumer.java @FunctionalInterface public interface MyConsumer { void consume(int i); } //Main.java public class Main { public static void main(String[] args) { MySupplier s = new MySupplier() { @Override public String supply() { return "Hello World";} }; } } 위의 Main 클래스를 익명 메소드를 활용하여 간결하게 표현할 수 있다. //Main.java public class Main { public static void main(String[] args) { MySupplier s = () ->..
익명 클래스를 만들어서 처리할 수 있다면, 메소드도 익명으로 만들 수 없을까? 라는 생각을 할 수 있다. //MyRunnable.java @FunctionalInterface public interface MyRunnable { void run(); } //Main.java public class Main { public static void main(String[] args) { MyRunnable r = new MyRunnable() { //new MyRunnable() 이라는 익명 클래스를 만들 것이 뻔하므로 생략 @Override //@Override는 뻔하므로 생략 public void run() { //MyRunnable 인터페이스 안에 public void run이 있는 것은 뻔하므로 생략 ..
추상메소드가 하나만 존재하는 인터페이스를 함수형 인터페이스 라고 한다. defualt method, static method 가 있어도 괜찮다. (default / static method는 추상 메소드가 아니다) 추상메소드가 하나만 존재할 때 @FunctionalInterface 어노테이션을 달아준다. FunctionalInterface에 있는 추상메소드를 함수 라고 부른다. //Main.java @FunctionalInterface public interface MyRunnable { void run(); } @FunctionalInterface public interface MyMap { void map(); default void sayHello() { System.out.println("Hell..
Java 8 이상부터 큰 기능 개선이 있었다. 그 중 하나는 인터페이스가 구현체를 가질 수 있게 된 것이다. 바로 Interface의 Default Method 기능이다. 인터페이스에 들어있는 구현 메서드를 클래스에서 바로 사용할 수 있다. 물론 오버라이드 해서 다른 기능을 하게 할 수도 있다. //Main.java interface MyInterface { void method(); //추상 메서드 (구현이 없다) default void sayHello() { //interface가 default 키워드를 사용하면 구현 메서드를 가질 수 있다. System.out.println("Hello World"); } } public class Main implements Myinterface { public ..