자바 8부터 인터페이스의 변화로 기본 메서드와 스태틱 메서드가 추가 되었다. 인터페이스를 구현할때 공통적으로 제공해줬으면 하는 특정한 기능들이 필요되면서 추가된 것이다. 인터페이스를 상속받으면 인터페이스에 정의된 메서드들은 모두 구현이 돼야 한다. 하지만 구현이 안되어도 괜찮고, 그냥 특정한 기능만 있게 할수있도록 변화되었다. 기본 메서드(default method) 사용예제와 제약사항 public interface InterfaceChangeStudy { void printName(); //인터페이스에 정의된 메서드는 모두 public //기본 메서드 default void printNameUpperCase() { System.out.println(getName().toUpperCase()); } St..
콜론 두개(::)가 있으면 메서드 레퍼런스를 사용하는 것이다. 예제에 사용될 Greeting 클래스 public class Greeting { private String name; public Greeting() { } public Greeting(String name) { this.name = name; } public String hello(String name) { return "hello " + name; } public static String hi(String name) { return "hi " + name; } } 1. 스태틱 메서드 참조 Greeting 클래스에 있는 static 메서드 참조 방법 UnaryOperator hi = Greeting::hi; //UnaryOperator hi..
람다 기본 문법 람다 - (인자 리스트) -> {바디} (바디가 한줄일때는 {} 생략 가능) 인자 리스트 - 인자가 없을때 : () - 인자가 한개일때 : (one) 또는 one - 인자가 여러개 일때 : (one, two) - 인자의 타입은 생략가능, 변수선언부에 있는 인자타입으로 컴파일러가 추론하지만 명시할 수도 있다 (Integer one, Integer two) 바디 - 화살표 오른쪽에 함수 본문을 정의한다. - 여러 줄인 경우에 {}를 사용해서 묶는다. - 한 줄인 경우에 생략 가능, return도 생략 가능 함수형 인터페이스로 람다 사용방법 //Supplier 인자값 없이 T타입의 값을 제공하는 함수형 인터페이스 Supplier get10 = () -> 10; System.out.println..
큐(Queue) 구조 큐 구조는 줄을 서는 행위와 유사하며 가장 먼저 넣은 데이터를 가장 먼저 꺼낼수 있는 구조이다. FIFO(First-In, First-Out) 또는 LILO(Last-in, Last-Out) 방식으로 스택과 꺼내는 순서가 반대이다. Java 에서 큐 자료구조 사용방법 Java에서는 기본적으로 java.util 패키지에 있는 Queue 클래스를 제공하고 Enqueue(큐에 데이터를 넣는 기능)은 Queue 클래스에서 add(value) 또는 offer(value) 메서드로 하고, Dequeue(큐에서 데이터를 꺼내는 기능)는 poll() 또는 remove() 메서드로 한다. Java에서 Queue 클래스는 인터페이스 이므로 객체 생성할때는 LinkedList 클래스를 사용해야 한다. ..
스프링 시큐리티(Spring Security)를 사용하는 이유는 웹 애플리케이션 사용시 사용자 아이디와 비밀번호를 인증을 할 수 있게 하여 URL마다 특정 권한이 있는 사용자만 접속이 가능하게 할수도 있게 하고 사용자 비밀번호를 편하게 암호화 할 수 있다. 스프링 시큐리티 연동 스프링 시큐리티 사용하려면 아래 스프링 시큐리티 dependency 추가(test는 의존성은 추가 안해도됨) org.springframework.boot spring-boot-starter-security org.springframework.security spring-security-test test 스프링 시큐리티 의존성을 추가하고 나면 모든 요청은 인증을 필요로 하고, 기본 유저가 생성된다. Username : user Pa..
배열 배열은 같은 자료형의 데이터를 효율적으로 관리하기 위해서 사용되며, 같은 자료형의 데이터를 순차적으로 저장하는 기본적인 자료구조 이다. 배열을 사용하는 이유는 배열의 인덱번호로 빠른접근이 가능하다. 하지만 단점으로는 미리 최대 길이를 지정해야 해서 데이터의 추가 삭제가 어렵다. 배열 사용예제 //배열 생성방법 int[] a = new int[5]; //길이가 5인 int형 배열 생성 String b[] = new String[5]; //길이가 5인 String형 배열 생성 //구성요소 참조 System.out.println(a[0]); //0 출력 System.out.println(b[0]); //null 출력 //구성요소의 개수 알수있는 length System.out.println(a.lengt..
자바로 알고리즘 문제를 풀 때 Scanner 클래스를 사용하면 편리하나 속도가 느리다는 단점이 있다. 그래서 Scanner 대신에 버퍼를 사용하는 BufferedReader 클래스를 사용하여 알고리즘 문제를 풀면 시간복잡도 효율성에서 유리하다. BufferedReader, StringTokenizer 클래스 사용예제 public class StringRepeat { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); /..
함수형 인터페이스는 추상메서드가 하나만 있는 인터페이스 이다. 자바에서는 이 함수형 인터페이스를 여러개 제공하는데 대표적인 함수형 인터페이스들을 사용해보자 Function Function은 자바에서 제공하는 함수형 인터페이스 이다. T타입을 받아서 R타입을 리턴한다. 만약 이면 Integer 형 매개변수를 받아서 Integer형을 반환한다는 뜻이다. 람다식을 사용하지 않고 사용하려면 클래스에서 Function을 상속받아 사용해야 한다. //Function T 타입을 받아서 R 타입을 리턴하는 함수 인터페이스 public class Plus10 implements Function { @Override public Integer apply(Integer integer) { return integer + 10..
함수형 인터페이스 정의 //추상메서드가 하나만 있으면 함수형 인터페이스다. //@FunctionalInterface 애노테이션을 붙여서 함수형 인터페이스를 정의 할 수 있다. public interface RunSomethinig { //인터페이스는 필드 앞에 abstract 생략 가능 void doIt(); //void doAgain(); @FuctionalInterface 애노테이션이 있으면 에러 발생 //다른 형태의 메서드가 있어도 함수형 인터페이스 이다. static void printName() { System.out.println("kang"); } default void printAge() { System.out.println("31"); } } 함수형 인터페이스는 추상메서드가 하나만 있는 ..
스프링부트 2.3 부터 Validation Starter 가 Spring Boot Web과 분리가 되면서 동작을 하지 않는다. 그래서 따로 넣어줘야 한다. 에러 해결 방법 pom.xml의 dependency에 추가 후 org.springframework.boot spring-boot-starter-validation 오른쪽 Maven 탭에서 새로고침 버튼을 클릭하면 spring-boot-starter-validation:2.6.0 이 추가 된다. 그리고 @Vaild에서 import 하면 javax.validation.Valid가 import 되면서 해결된다. import javax.validation.Valid; 참고 : https://www.youtube.com/watch?v=cP8TwMV4LjE
DevTools는 코드가 변경될 때 자동으로 애플리케이션을 다시 시작시킨다. 즉, 소스를 변경할때 마다 프로젝트를 중지시키고 다시 시작 시킬 필요가 없다는 뜻이다. 인텔리제이(IntelliJ) 에서 사용방법 DevTools를 처음 스프링부트 프로젝트를 만들면서의존성을 지정할때 Spring Boot DevTools를 선택하면 아래처럼 pom.xml파일의 요소에 지정되어 있다. Preferences - Advanced Settings - Compiler에서 Allow auto-make to start even if developed application is currently running을 체크해준다. Perference에서 Compiler를 검색후 Compiler 설정창에서 Build project ..
스트림 정의 자바에서 데이터를 외부에서 읽고 다시 외부로 출력하는 작업을 할때 이 데이터는 스트림(Stream)을 통해 입출력된다. 스트림은 단일방향으로 연속적으로 흘러가는 것으로 수도꼭지를 생각하면 된다. 물은 계속 흘러나오는데 수도꼭지를 잠그면 물이 안나오고 풀면 물이 나온다. 스트림은 InputStream(입력 스트림), OutputStream(출력 스트림)이 있는데 프로그램이 데이터를 입력받을때는 InputStream, 보낼때에는 OutputStream 이다. 스트림의 특성이 단방향이여서 입력과 출력을 모두 할 수 없어 스트림이 입력, 출력 따로 있는것이다. 스트림 클래스는 크게 두 종류로 구분되는데 하나는 바이트(byte) 기반, 하나는 문자(character) 기반이다. 바이트 기반은 그림, ..