728x90
package com.java.study.playround;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.*;
import java.util.stream.Collectors;


public class Test1 {

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Book {

        private String bookName;
        private String brand;
        private int price;
        private String writer;
        private boolean soldOut;

    }

    public static void main(String[] args) {

        List<Book> bookList = new ArrayList<>();

        bookList.add(new Book("자바1", "백엔드출판사", 4000, "백엔드개발자", false));
        bookList.add(new Book("자바2", "백엔드출판사", 1500, "백엔드개발자", true));
        bookList.add(new Book("자바3", "자바출판사", 5500, "자바개발자", false));
        bookList.add(new Book("이것이리액트다", "리액트출판사", 3000, "리액트개발자", false));
        bookList.add(new Book("이것이뷰다", "뷰출판사", 3000, "뷰개발자", true));
        bookList.add(new Book("리액트의정석", "프론트출판사", 4200, "프론트개발자", true));
        bookList.add(new Book("뷰의정석", "프론트출판사", 6000, "프론트개발자", true));
        bookList.add(new Book("타입스크립트", "프론트출판사", 5000, "프론트개발자", false));



        System.out.println("====== 정렬이 안된 모든책 책 ======");
        for (Book book : bookList) {
            System.out.println(book);
        }
        System.out.println();



        System.out.println("====== 가격 오름차순 정렬된 모든책 책 ======");
        Collections.sort(bookList, (o1, o2) -> o1.getPrice() - o2.getPrice());
        for (Book book : bookList) {
            System.out.println(book);
        }
        System.out.println();

        System.out.println("====== 가격 내림차순 정렬된 모든책 책 ======");
        Collections.sort(bookList, (o1, o2) -> o2.getPrice() - o1.getPrice());
        for (Book book : bookList) {
            System.out.println(book);
        }
        System.out.println();


        System.out.println("====== 가격 내림차순, 책 제목 오름차순 정렬된 모든책 책 ======");
        Collections.sort(bookList, (o1, o2) -> o2.getPrice() - o1.getPrice());
        // 마지막 정렬조건이 제일 우세
        Collections.sort(bookList, (o1, o2) -> o1.getBookName().length() - o2.getBookName().length());
        for (Book book : bookList) {
            System.out.println(book);
        }
        System.out.println();


        System.out.println("====== 제일 비싼 책 ======");
        Book maxBookV1 = bookList.stream()
                .collect(Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(Book::getPrice)), Optional::get));

        System.out.println("maxBookV1.getPrice() = " + maxBookV1.getPrice());
        System.out.println();


        Book maxBookV2 = bookList.stream()
                        .collect(Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(Book::getPrice)), bookOption -> bookOption.get()));

        System.out.println("maxBookV2.getPrice() = " + maxBookV2.getPrice());
        System.out.println();


        Map<Boolean, List<Book>> soldOutMap = bookList.stream()
                .collect(Collectors.partitioningBy(Book::isSoldOut));

        List<Book> soldOutBookList = soldOutMap.get(true);
        List<Book> notSoldOutBookList = soldOutMap.get(false);


        System.out.println("====== 품절 책 ======");
        for (Book book : soldOutBookList) {
            System.out.println(book);
        }
        System.out.println();

        System.out.println("====== 판매중인 책 ======");
        for (Book book : notSoldOutBookList) {
            System.out.println(book);
        }
        System.out.println();


        // 브랜드 별 Book 리스트
        System.out.println("====== 브랜드 별 책 ======");
        Map<String, List<Book>> brandBookMap = bookList.stream()
                .collect(Collectors.groupingBy(Book::getBrand));

        for (String brand : brandBookMap.keySet()) {

            List<Book> bookListByBrand = brandBookMap.get(brand);
            for (Book book : bookListByBrand) {
                System.out.println(book);
            }
            System.out.println();
        }



        // 브랜드 별 Book 별 판매중인 책
        Map<Boolean, Map<String, List<Book>>> soldoutAndBrandGroupMap = bookList.stream()
                .collect(Collectors.groupingBy(Book::isSoldOut, Collectors.groupingBy(Book::getBrand)));

        Map<String, List<Book>> soldOutBrandGroupMap = soldoutAndBrandGroupMap.get(true);
        Map<String, List<Book>> nonSoldOutBrandGroupMap = soldoutAndBrandGroupMap.get(false);

        System.out.println("====== 품절인 브랜드 별 책 ======");
        for (String soldOutBrand : soldOutBrandGroupMap.keySet()) {
            List<Book> targetBookList = soldOutBrandGroupMap.get(soldOutBrand);
            for (Book book : targetBookList) {
                System.out.println(book);
            }
            System.out.println();
        }

        System.out.println("====== 판매중인인 브랜드 별 책 ======");
        for (String soldOutBrand : nonSoldOutBrandGroupMap.keySet()) {
            List<Book> targetBookList = nonSoldOutBrandGroupMap.get(soldOutBrand);
            for (Book book : targetBookList) {
                System.out.println(book);
            }
            System.out.println();
        }




        Map<Boolean, Map<String, Book>> soldOutAndBrandAndMaxPrice = bookList.stream()
                .collect(Collectors.partitioningBy(Book::isSoldOut,
                        Collectors.groupingBy(Book::getBrand,
                                Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(Book::getPrice)), Optional::get))));


        Map<String, Book> soldOutMaxPricePerBrandMap = soldOutAndBrandAndMaxPrice.get(true);
        Map<String, Book> nonSoldOutMaxPricePerBrandMap = soldOutAndBrandAndMaxPrice.get(false);

        System.out.println("====== 품절 중인 브랜드 별 제일 비싼책 ======");
        for (String soldOutBrand : soldOutMaxPricePerBrandMap.keySet()) {
            Book book = soldOutMaxPricePerBrandMap.get(soldOutBrand);
            System.out.println(book);
        }
        System.out.println();

        System.out.println("====== 판매 중인 브랜드 별 제일 비싼책 ======");
        for (String soldOutBrand : nonSoldOutMaxPricePerBrandMap.keySet()) {
            Book book = nonSoldOutMaxPricePerBrandMap.get(soldOutBrand);
            System.out.println(book);
        }
        System.out.println();

    }


}
728x90

'개발 > java' 카테고리의 다른 글

Stream 람다식을 이용한 정렬  (0) 2024.02.27
배포시 환경설정 하기  (1) 2023.12.03
Java - 정규표현식  (0) 2022.12.30
자바의 어노테이션  (0) 2021.09.15
람다식 사용법에 대해서 알아보자  (1) 2021.04.12
728x90

 

stream API를 사용하다보면 정렬을 하게되는데

 

 

// 오름 차순 정렬
studentList.stream()
        .distinct()
        .sorted((o1, o2) -> o1.getScore() - o2.getScore())
        .forEach(System.out::println);

 

// 내림 차순 정렬
studentList.stream()
        .distinct()
        .sorted((o1, o2) -> o2.getScore() - o1.getScore())
        .forEach(System.out::println);

 

 

# 오름차순

this(o1) < obj(o2)

this.getXXX - obj.getXXX


# 내림차순

this (o1)  > obj (o2)

obj.getXXX - this.getXXX

 

를 람다 식으로 표현해서 쓰는거다

728x90

'개발 > java' 카테고리의 다른 글

Stream 의 유용한 API 정리  (0) 2024.02.27
배포시 환경설정 하기  (1) 2023.12.03
Java - 정규표현식  (0) 2022.12.30
자바의 어노테이션  (0) 2021.09.15
람다식 사용법에 대해서 알아보자  (1) 2021.04.12
728x90

java -Dspring.profiles.active=dev -jar 특정경로.jar

 

 

이렇게하면 dev 프로파일을 읽어 초기화시킨다 ( 개발디비 , 운영디비 ... )

728x90

'개발 > java' 카테고리의 다른 글

Stream 의 유용한 API 정리  (0) 2024.02.27
Stream 람다식을 이용한 정렬  (0) 2024.02.27
Java - 정규표현식  (0) 2022.12.30
자바의 어노테이션  (0) 2021.09.15
람다식 사용법에 대해서 알아보자  (1) 2021.04.12
728x90

 

메타문자
\d 숫자
\D 숫자가 아니다
\w 문자 또는 숫자
\W 문자 또는 숫자가 아니다
\s 공백
\S 공백이 아닌 것
a-z a ~ z 사이에 있는 모든 소문자 알파벳
A-Z A ~ Z 사이에 있는 모든 대문자 알파벳
가-힣 한글 문자
0-9 0부터 9까지의 모든 숫자
[] []로 감싼 메타문자에 일치하는 한개의 문자
[abc] : a,b,c 중 하나의 문자 
[^abcabc] : a,b,c 가 아닌 문자 하나
() 그룹 지정
.* 모든 문자열
c. c로 시작하는 두자리 문자열
c.* c로 시작하는 모든 문자열
c\. c.와 일치하는 문자열 (문자열 이스케이프 \)
[b|c].*
[bc].*
[b-c].*
b 또는 c로 시작하는 문자열
c\w c로 시작하는 문자 또는 숫자
^ 문자열의 시작
$ 문자열의 마지막
[^0-9] 숫자가 아닌 글자
메타문자 횟수
* 0번 이상
+ 1번 이상
? 0번이거나 1번
{n} n번
{n,} n번 이상
{n, m} n번 이상 m번 이하
. 1번
.{2} 문자2개
   
   

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.java.study.first.reg;
 
import java.util.regex.Pattern;
 
public class Reg01 {
    public static void main(String[] args) {
 
 
        // * 첫문자는 A ~ Z 사이의 한글자
        // * 두번째 문자부터 a~z ㄸ는 A~Z사이의 문자가 0개이상
        boolean test1 = Pattern.matches("[A-Z][a-zA-Z]*""Apple");
        System.out.println("test1 = " + test1);
 
 
 
 
        // * 시작하는 문자는 알파벳 1개 이상
        // * 다음에는 '나 -가 한번 나오고, 알파벳은 1번이상오는  <- 이게 하나의 그륩으로 0번이상 나온다
        boolean test2 = Pattern.matches("[a-zA-Z]+(['-][a-zA-Z]+)*""Apple's");
        System.out.println("test2 = " + test2);
 
        boolean test3 = Pattern.matches("[a-zA-Z]+(['-][a-zA-Z]+)*""Apple-Tea");
        System.out.println("test3 = " + test3);
 
 
 
        // * 첫문자는 ' 또는 - 가 나올수 있고
        // * 두번째 문자부터는 알파벳이 1개이상 올수 있다
        boolean test4 = Pattern.matches("['-][a-zA-Z]+""-Hello");
        System.out.println("test4 = " + test4);
 
        boolean test5 = Pattern.matches("['-][a-zA-Z]+""'this");
        System.out.println("test5 = " + test5);
 
 
 
        // * 핸드폰
        boolean test6 = Pattern.matches("01[0-9]-\\d{3,4}-\\d{4}""010-1234-5678");
        System.out.println("test6 = " + test6);
 
 
        // * 이메일
        boolean test7 = Pattern.matches("^\\w+@\\w+(\\.\\w+){1,2}$""blatrem@naver.com");
        System.out.println("test7 = " + test7);
 
        boolean test8 = Pattern.matches("\\w+@\\w+(\\.\\w+){1,2}""smathj@natae.co.kr");
        System.out.println("test8 = " + test8);
 
 
        // * 주민등록번호 123456-1234567 6자리, 7자리
        boolean test9 = Pattern.matches("\\d{2}[0-1][0-9][0-3][0-9]-[1-4]\\d{6}""123456-1234567");
        System.out.println("test9 = " + test9);
 
        boolean test10 = Pattern.matches("\\d{6}-[1-4]\\d{6}""123456-1234567");
        System.out.println("test10 = " + test10);
    }
}
 
cs
728x90

'개발 > java' 카테고리의 다른 글

Stream 람다식을 이용한 정렬  (0) 2024.02.27
배포시 환경설정 하기  (1) 2023.12.03
자바의 어노테이션  (0) 2021.09.15
람다식 사용법에 대해서 알아보자  (1) 2021.04.12
기본입출력으로 파일 복사하기  (0) 2021.04.04
728x90

자바의 어노테이션을 알아보자

Servlet이나 Spring에서 어노테이션을 접해봤을것이다!

 

다음코드는 5 - 10번 라일 내용은 어노테이션을 정의하는 부분이고

이때에 인터페이스로 선언해야한다

 

그리고 5번라인의  @Retention(RetentionPolicy.RUNTIME) 이라고있는데

이것은 어노테이션의 유지정책을 나타내며

 

RUNTIME : 컴파일된 바이트코드에서 유지되고, 실행시에 JVM이 사용한다

SOURCE   : 소스 파일에서만 유지하고 , 컴파일때 삭제한다

CLASS     : 컴파일된 바이트코드에서 유지되고, 실행시에 JVM이 사용할 수 없다

 

RUNTIME을 사용하자-

 

Check라는 어노테이션에

String name();

int val();라고 선언했는데 이는 메서드처럼 생긴 변수라고 생각하면된다.

 

Servlet이나 Spring을 공부해봣다면 14번 라인의 내용을보면 이해가 될것이다.

값을 꺼낼때에는 18~22번 라인처럼 하면된다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
 
@Retention(RetentionPolicy.RUNTIME)
@interface Check {
    String name();
 
    int val();
}
 
public class AnnoTest {
 
    @Check(name = "first", val = 123)
    public static void test() {
        AnnoTest obj = new AnnoTest();
        try {
            Class<?> c = obj.getClass();
            Method m = c.getMethod("test");
 
            Check check = m.getAnnotation(Check.class);
            System.out.println(check.name() + " : " + check.val());
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public static void main(String[] args) {
        test();
    }
}
cs

 

사용한 JDK 1.8

 

 

 

 

 

728x90

'개발 > java' 카테고리의 다른 글

배포시 환경설정 하기  (1) 2023.12.03
Java - 정규표현식  (0) 2022.12.30
람다식 사용법에 대해서 알아보자  (1) 2021.04.12
기본입출력으로 파일 복사하기  (0) 2021.04.04
HTTP 프로토콜  (0) 2021.04.03
728x90

어제 하루 람다식에대해서 공부해보았는데

기억이 사라지기전에 포스팅하려한다 ㅋ.ㅋ

 

우선 람다식의 특징을 좀 멀리서보면

(      )      ->    (      )   이런 괄호과 화살표가 보인다

 

그리고 좀더 자세히 보았을 때 특징은

람다식으로 추상메서드를 구현하는건데

 

이렇게 말하면 또 현타가 오기에 바로 다음의 사진을 보자.

<콘솔에 나타난 결과>

우선 interface 를 하나만들었고

check라는 추상 메서드를 만들었다, 그리고 매개변수로는 정수값 2개를 받는다. 

 

다음 Test04 클래스는

14번줄에 평소와 다른 문구가나오는데 

인터페이스 타입으로 참조변수를 선언하고 아까말했듯이 (     )   ->  (     ) 구조가있다

보기쉽게 괄호를 이름붙이겠다 (  1번괄호   )   ->  (  2번괄호   )

 

1번괄호에는 매개변수를 입력하는것이며 타입을 생략해도된다.

2번괄호에는 인터페이스에있는 추상메서드를 구현하는 로직부분이다

즉, 매개변수를 1번에서 n,d를 받아서(정수) n/d 를 계산하고 값이 0이면 

리턴 타입이 boolean이니 true 아니면  false를 리턴하라는것이다.

 

그리고 15번줄에서 참조변수 vf로 메서드를 호출하며 매개변수로 24와 3을 보냈으니

8이 출력된다

 


#Point#

그렇다면 추상메서드가 여러개있을때는 어떻게될까?

-> 추상메서드가 반드시 1개있을때만 사용할 수 있다.

그렇지않으면,

(  ) -> (  ) 로 특정 추상메서드를 정할수 없기때문이다.

 

728x90

'개발 > java' 카테고리의 다른 글

Java - 정규표현식  (0) 2022.12.30
자바의 어노테이션  (0) 2021.09.15
기본입출력으로 파일 복사하기  (0) 2021.04.04
HTTP 프로토콜  (0) 2021.04.03
String 클래스의 메소드를 몇가지 알아보자  (0) 2021.03.27
728x90

프로그램에서 입력/출력을 Input/Output 이라하여 I/O 라고한다

 

자바에서 간단한 파일 복사를 설명하려한다

 

우선 그림으로 보여주기전에 몇가지 개념을 잡자

 

무작정 코드보기전에 우리가 평소에 "복사"를 수 해본적이 있을것이다.

당연한 행동에 대해서 관찰을 해보자.

 

자바 프로그램입장에서 보면 이정도 특징이 있는 것 같다

- 읽어오는 대상이 있다.

- 읽은 결과로 새로운 파일을 복사한다.

 

그런데 평소와는 다르게 자바에서는 스트림이란 걸로 

자바프로그램과 파일간의 연결통로를 형성해 줘야하는데 이게 바로 스트림이다

스트림은 맨첨에 언급한 부분처럼 입력/출력 스트림이 각각 존재한다

동시에 처리할순 없고 단방향성이다 ( 고속 도로라고 생각하면 편할것 같다)

 

그림으로 표현 해보겠다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package IO;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
 
public class Test01 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        try(FileInputStream fi = new FileInputStream("Rollin.txt");
            FileOutputStream fo = new FileOutputStream("Rollin가사.txt");)    
        {
            int c = 0
            while((c = fi.read()) != -1) {    // 1바이트를 입력스트림에서 읽고 그 코드값을 c에 저장
                fo.write(c);                // 읽은 코드값을 출력스트림에 출력 즉, 파일에 기록한다
            }                                // 더이상 읽을게 없다면 -1 상태에 while문이 종료된다
            
            
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}
 
cs

#11번 행

입력 스트림을 생성한다. 매개변수로 Rollin.txt 을 입력하였다.

자바프로그램 <--------- Rollin.txt 의 입력 스트림을 형성하였다.

(Rollin.txt 라는 파일이 현재 존재해야한다.)

 

#12번 행

출력 스트림을 생성한다. 매개변수로 Rollin가사.txt 을 입력하였다.

자바프로그램 ----------> Rollin가사.txt 의 출력 스트림을 형성하였다.

 

하지만 아직 각각 스트림으로 부터 읽거나 쓰여진것은 없다.

 

#14번 행

14번에 int c = 0 이라고 선언 및 초기화를 하였는데 쓰임이 따로있다.

 

#15번 행

15번에 While문이 중요한데 ,

입력스트림(fi)로 부터 read() 메서드로 파일에 쓰여진 내용을 1바이트 만큼 읽는다. 

해당 메서드의 리턴값은 int이기 때문에 그를 담을 변수로 14번행에서 int c 를 선언 하였던 것이다.

(이해가 안될수도있는데 예를들어 Rollin.txt에 A 라고 적혀있었다면 65라는 값이 저장된다  (아스키코드값))

 

#16번 행

c에 저장된 즉, 1바이트 만큼 읽어서 얻은 아스키 코드값을

출력스트림(fo)의 write메서드에 매개변수로 c를 넣어서 

Rollin가사.txt 파일에 작성한다! 

이 행위를 while문으로 반복하는것이다. 

1바이트씩 읽으면서 , 더이상 읽을게 없으면 -1을 리턴하는데 그전까지 반복하는 조건이다.

 

 

 

이렇게 저장하고 실행해보자!

실행후에 F5를 눌러 프로젝트를 새로고침 하면

 

 

 

 

다음처럼 복사된것을 확인할 수 있다.

 

이 기초를 근간하여 업로드 다운로드 개념이 출발하는것 같다.

728x90

'개발 > java' 카테고리의 다른 글

자바의 어노테이션  (0) 2021.09.15
람다식 사용법에 대해서 알아보자  (1) 2021.04.12
HTTP 프로토콜  (0) 2021.04.03
String 클래스의 메소드를 몇가지 알아보자  (0) 2021.03.27
컬렉션 프레임 워크  (0) 2021.03.18
728x90

주로 웹! 하면 가장먼저 생각나는 프로토콜이다

 

TCP/IP 4계층에서 애플리케이션 계층에 해당하는 프로토콜이다 

 

통신구조는 다음과 같다

그렇다면 이 프로토콜이 갖는 특징 세가지를 간략하게 알아보자.

 

1. 무연결

간단하게 말해서 클라이언트의 요청에대해서 응답을 하면 연결이 종료된다.

즉 클라이언트의 하나의 요청마다 통신하는 방법이다 

 

2. 무상태

기본적으로 상태정보가 유지되지 않는 특성으로 이것을 무상태라고 합니다.

첫번째 요청에서 얻은 결과를 

두번째 요청에 당연히 갖고있지 않는다것이다.

그렇다면 이를 위해서 상태정보를 저장하는 기술이 있다. (쿠키&세션 등)

 

 

3. 요청 & 응답

위의 사진이 표현하는바이다.

 


 

HTTP 요청정보란? (HttpRequest)

 

Http 요청정보는 간단하게 요청하면 바로 만들어진다(?)

즉, 클라이언트가 서버에 서비스를 요청하면 HTTP프로토콜에 의하여 자동으로 만들어져

서버에 전달된다

 

C ----- HTTP ------ S 

 

이때 요청은 클라이언트가 URL에 주소를 입력하여 엔터를 치거나

링크를 누르던가 다양하게있다.

 

힘들게 그림으로 설명해보자면.

다음과 같은 구조이다.

 

위에서 설명안한 URI는

 

http://1.1.1.1:80/abc  이렇게 나올수도있고 도메인이있다면,

http://www.abc.com:80/abc이렇게 나올수도 있다.

abc는 서버의 자원정보로 웹프로젝트를 생성하고 배포할때 그녀석이다

(단 ,브라우저상에서는 80번포트는 생략해도 입력이된다)

(http 포트번호가 80번이다 ㅇㅅㅇ;)

 


 

HTTP 응답정보란? (HttpResponse)

 

 

헤더에는  클라이언트의 요청에대한 실행 결과를 

클라이언트가 올바르게 처리할 수 있게 하기위한 정보들로 구성되어있는데 

 

내기억으론 아마 HttpResponse의 몸체(바디)에 

html의 태그들이 있는데 이는 클라이언트의 브라우저가 읽어들인다

<table>

..

</table>

이런것들이 말이다.

 

 

크롬 개발자모드로  아무사이트에서 확인할수도있는데

 

여기서 상태 코드값이 200인데

 

간단하게

200 : 요청 성공

403 : 권한 문제

404 : 요청에 대한 것이 존재하지 않음

500 : 서버에러

이정도만 알아두고 모르는건 구글해보자

 

끝.

 

728x90

+ Recent posts