//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 ..
1. Interface의 기능 구현부가 없어서 인터페이스를 구현한 클래스에서 구현을 강제한다. Interface에 정의되어 있는 메소드들을 구현하지 않으면 에러가 난다. 다형성을 제공한다. // Login.java public interface Login { void login(); } // KakaoLogin.java public class KakaoLogin implements Login { @Override public void login() { System.out.println("카카오로 로그인 합니다."); } } // NaverLogin.java public class NaverLogin implements Login { @Override public void login() { System.o..
1. 객체지향 프로그래밍 Java는 객체지향 언어 등장 배경 : 프로그램의 규모가 커지면서 필요성이 대두됨 프로그램의 동작을 쪼개서 객체들이 나눠서 수행함 2. 객체지향의 특성 캡슐화 기능을 수행하는 단위로 완전함을 갖는다. 정보의 은닉이 가능하다. 객체의 정보를 객체 외부에서 접근하지 못 하게 할 수 있다. 접근 지정자 private : 객체 내부에서만 접근 가능 protected : 상속한 객체에서도 접근 가능 (friendly) : 같은 패키지 내에서 접근 가능 (기본 지정자이다) public : 모두 다 접근 가능 상속 부모 객체 -> super [추상] 자식 객체 -> this [구체] 상속은 공통된 기능을 여러 객체에 전달하고 싶을 때 사용하는 것이 아니라, 추상과 구체로 분리하기 위해 사용한..
과제로 나오기 전에는 StringBuilder와 StringBuffer의 차이에 대해 어렴풋이만 알고 있었다. 동기화 기능이 있는지의 차이, 그리고 해당 기능의 존재로 인한 속도 저하.. 과제로 나오면서 다시 한 번 정확히 짚고 넘어가기로 했다. String 먼저, Java에서 String은 불변객체입니다. //Main.java public class Main { public static void main(String[] args) { String s = "a"; s = s + "b"; } } 불변객체이지만 위와 같이 변경이 되는 이유는 뭘까? String은 객체이기 때문에, s+"b"의 값이 담긴 객체를 생성하고 해당 주소를 s에 담아주기 때문에 위의 방식이 가능한 것이다. 즉, 기존의 s와 이후의 s..