어제부터 spring boot 가 시작되었다!

API

  •  👉 클라이언트 - 서버 간의 약속입니다.
  • 클라이언트가 정한대로 서버에게 요청(Request)을 보내면, 서버가 요구사항을 처리하여 응답(Response)을 반환합니다.

REST

  • 👉 REST란, 주소에 명사, 요청 방식에 동사를 사용함으로써 의도를 명확히 드러냄을 의미합니다.

 

[ Lombok의 장점 ]

  • 어노테이션 기반의 코드 자동 생성을 통한 생산성 향상
  • 반복되는 코드 다이어트를 통한 가독성 및 유지보수성 향상
  • Getter, Setter 외에 빌더 패턴이나 로그 생성 등 다양한 방면으로 활용 가능

Lombok을 사용하면 정말 많은 이점을 얻을 수 있다. 과거에는 IntelliJ에서 롬복 플러그인을 모든 팀원이 설치해주어야 한다는 단점도 있었지만 현재는 IntelliJ의 기본 플러그인이 되면서 바로 편리하게 이용가능하게 되었다.

@Getter @Setter ]

Lombok에서 가장 자주 활용하는 어노테이션이다. @Getter와 @Setter를 클래스 이름 위에 적용시키면 모든 변수들에 적용이 가능하고, 변수 이름 위에 적용시키면 해당 변수들만 적용 가능하다. 아래의 예제에서는 모든 변수들에 대해 Getter 메소드를 만들고 상호병 변수에 대해서만 Setter 메소드를 만들어보도록 하겠다.

@AllArgsConstructor ]

@AllArgsConstructor는 모든 변수를 사용하는 생성자를 자동완성 시켜주는 어노테이션이다.

[ @NoArgsConstructor ]

@NoArgsConstructor는 어떠한 변수도 사용하지 않는 기본 생성자를 자동완성 시켜주는 어노테이션이다.

[ @RequiredArgsConstructor ]

@RequiredArgsConstructor는 특정 변수만을 활용하는 생성자를 자동완성 시켜주는 어노테이션이다. 생성자의 인자로 추가할 변수에 @NonNull 어노테이션을 붙여서 해당 변수를 생성자의 인자로 추가할 수 있다. 아니면 해당 변수를 final로 선언해도 의존성을 주입받을 수 있다.

[ @EqualsAndHashCode ]

@EqualsAndHashCode 어노테이션을 활용하면 클래스에 대한 equals 함수와 hashCode 함수를 자동으로 생성해준다.

[ @ToString ]

@ToString 어노테이션을 활용하면 클래스의 변수들을 기반으로 ToString 메소드를 자동으로 완성시켜 준다. 출력을 원하지 않는 변수에 @ToString.Exclude 어노테이션을 붙여주면 출력을 제외할 수 있다. 또한 상위 클래스에 대해도 toString을 적용시키고자 한다면 상위 클래스에 @ToString(callSuper = true) 를 적용시키면 된다. 

\

[ @Data ]

@Data 어노테이션을 활용하면 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 자동완성 시켜준다. 실무에서는 너무 무겁고 객체의 안정성을 지키기 때문에 @Data의 활용을 지양한다.

[ @Builder ]

@Builder 어노테이션을 활용하면 해당 클래스의 객체의 생성에 Builder패턴을 적용시켜준다. 모든 변수들에 대해 build하기를 원한다면 클래스 위에 @Builder를 붙이면 되지만, 특정 변수만을 build하기 원한다면 생성자를 작성하고 그 위에 @Builder 어노테이션을 붙여주면 된다.

[ @Delegate ]

@Delegate 어노테이션은 한 객체의 메소드를 다른 객체로 위임시켜 준다.

[ @Log 관련 어노테이션 ]

@Log4j2와 같은 어노테이션을 활용하면 해당 클래스의 로그 클래스를 자동 완성 시켜준다. @Log 관련 어노테이션을 활용한 예제는 아래와 같다.

@RestController
@RequestMapping(value = "/store")
@Log4j2
public class StoreController {

    @GetMapping(value = "/log")
    private ResponseEntity log(){
        log.error("Error");
        return ResponseEntity.ok().build();
    }

}

출처: https://mangkyu.tistory.com/78 [MangKyu's Diary:티스토리]

 

Spring

 

  • Controller 는 제일 바깥 쪽에서 요청을 받고, 응답을 되돌려주는 역할을 합니다.
  • Service 는 중간에서 구체적인 작업 순서를 결정하고요.
  • Repository 는 DB와 직접 소통함으로써 자료를 생성하고, 조회하고, 변경하고, 삭제합니다.
  • 그리고 각 레이어 간에는 절대 Entity를 직접 사용하지 않고, DTO 라는 택배상자를 만들어 사용합니다.

'항해 99(9기) > 항해 일일' 카테고리의 다른 글

항해 99 16일차  (0) 2022.10.04
항해 99 15일차  (0) 2022.10.03
항해 12일 차  (0) 2022.09.30
항해 11일 차  (0) 2022.09.29
항해 10일차  (0) 2022.09.28

주특기 Spring 본격 시작

JVM, JRE, JDK의 차이

자바에서 사용하는 용어 중 혼동하기 쉬운 JVM, JRE, JDK에 대해서 정리해 보자.

JVM

JVM은 자바 가상머신(Java Virtual Machine)의 약자이다.

JVM은 자바 소스코드로부터 만들어지는 자바 바이너리 파일(.class)을 실행할 수 있다. 또한 JVM은 플랫폼에 의존적이다. 즉 리눅스의 JVM과 윈도우즈의 JVM은 다르다. 단, 컴파일된 바이너리 코드는 어떤 JVM에서도 동작시킬 수 있다.

JVM은 다음과 같은 역할을 한다.

  • 바이너리 코드를 읽는다.
  • 바이너리 코드를 검증한다.
  • 바이너리 코드를 실행한다.
  • 실행환경(Runtime Environment)의 규격을 제공한다. (필요한 라이브러리 및 기타파일)

JRE

JRE는 자바 실행환경(Java Runtime Environment)의 약자이다.

JRE는 JVM 이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있다. JRE는 JVM의 실행환경을 구현했다고 할 수 있다.

JDK

JDK는 자바 개발도구(Java Development Kit)의 약자이다.

JDK는 JRE + 개발을 위해 필요한 도구(javac, java등)들을 포함한다.

이상과 같이 jvm, jre, jdk 에 대해서 알아보았다.

A2 JVM, JRE, JDK의 차이 - 점프 투 자바 (wikidocs.net)

 

메모리

 

 

출처 : http://huelet.tistory.com/entry/JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0

 

메서드 영역

 

메소드 영역은 Class Area, Code Area, Static Area로 불려지며, 의미상 공유 메모리 영역이라고도 불린다. 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스 별로 런타임 상수 풀(runtime constant pool), 필드(field) 데이터, 메소드(method) 데이터, 메소드 코드, 생성자 코드 등을 분류해서 저장한다. 메소드 영역은 JVM이 동작해서 클래스가 로딩될때 생성되고, 모든 스레드가 공유하는 영역이다.

 

1. 클래스 내부에서는 직접 접근이 가능하다.(왜? 라고 생각 되면, 위의 내용을 다시 한번...)

public class StaticExample { 
  static int count = 0;

  StaticExample() {}

  public void increase() {
    count += 1;
  }
}

 

 

2. 클래스 이름으로 접근, 인스턴스 생성 후 접근(인스턴스 변수와의 구분이 어렵다. 권장하지 않는다.)

 

public class Main { 
  public static void main(String[] args) {
    StaticExample.count++; //클래스 이름으로 접근

    StaticExample staticExample = new StaticExample();
    staticExample.count++;  //인스턴스 생성 후 접근(권장하지 않음.)
}

 

스텍 영역

 

Stack

  • Heap 영역에 생성된 Object 타입의 데이터의 참조값이 할당된다.
  • 원시타입의 데이터가 값과 함께 할당된다.
  • 지역변수들은 scope 에 따른 visibility 를 가진다.
  • 각 Thread 는 자신만의 stack 을 가진다.

Stack 에는 heap 영역에 생성된 Object 타입의 데이터들에 대한 참조를 위한 값들이 할당된다. 또한, 원시타입(primitive types) - byte, short, int, long, double, float, boolean, char 타입의 데이터들이 할당된다. 이때 원시타입의 데이터들에 대해서는 참조값을 저장하는 것이 아니라 실제 값을 stack 에 직접 저장하게 된다.

 

Heap area(힙 메모리 영역)

 

 인스턴스를 생성하는 방법은 "클래스 변수 =  new 클래스();" 라는 것을 기억하면서 밑에 내용을 확인해 보자.
 참조형(Reference Type)의 데이터 타입을 갖는 객체(인스턴스), 배열 등은 Heap 영역에 데이터가 저장된다. 이때 변수(객체, 객체변수, 참조변수)는 Stack 영역의 공간에서 실제 데이터가 저장된 Heap 영역의 참조값(reference value, 해시코드 / 메모리에 저장된 주소를 연결해주는 값) new 연산자를 통해 리턴 받는다. 다시 말하면 실제 데이터를 갖고 있는 Heap 영역의 참조 값을 Stack 영역의 객체가 갖고 있다이렇게 리턴 받은 참조 값을 갖고 있는 객체를 통해서만 해당 인스턴스를 핸들 할 수 있다.

 
public class HeapAreaEx01 {
    public static void main(String[] args) {
        int[] a = null; // int형 배열 선언 및 Stack 영역 공간 할당
        System.out.println(a); // 결과 : null
        a = new int[5]; // Heap 영역에 5개의 연속된 공간 할당 및 
        // 변수 a에 참조값 할당
        System.out.println(a); // 결과 : @15db9742 (참조값)
    }
}

 설명은 소스 코드의 주석 처리된 부분과 같다. 결국 a변수는 데이터가 저장된 Heap영역의 참조 값을 리턴 받아 갖고 있다는 것이다. 다른 예제도 확인해보자.

 

 
public class HeapAreaEx02 {
    public static void main(String[] args) {
        String str1 = new String("joker");
        String str2 = new String("joker");
        if(str1 == str2){
            System.out.println("같은 주소값 입니다.");
        }else{
            System.out.println("다른 주소값 입니다.");
        }
    }
}

 

 문자열을 저장하는 String도 참조형이다. new 연산자를 이용해서 생성하면 데이터는 Heap 영역에 저장되고 str1과 str2는 참조 값을 리턴 받는다. 저장된 주소가 다르기 때문에 "=="으로 비교 시 "다른 주소값 입니다."가 출력되는 것이다. 마지막으로 예제를 하나 더 살펴보자.

 

 

class A{}

public class HeapArea {
    public static void main(String[] args) {
        A a = null; // A타입의 a객체 선언 및 Stack 영역 공간 할당
        System.out.println(a); // 결과 : null
        a = new A(); // Heap 메모리에 공간 할당 및 객체(a)에 참조값 할당
        System.out.println(a); // 결과 : @15db9742
    }
}

 소스 코드에 주석 처리한 내용으로 설명은 대신하겠다. 결국 객체가 참조 값을 갖는다는 것이다.

 참고로 Heap에 저장된 데이터가 더 이상 사용이 불필요하다면 메모리 관리를 위해 JVM(자바 가상머신)에 의해 알아서 해제된다. 이러한 기능을 가비지컬렉션(GC, 쓰레기 수집)이라고 한다. 
 메모리 관련 내용은 여기서 마무리하겠다. 메모리는 중요한 부분이고 인스턴스 등을 정의할 때 왜 이렇게 사용하는지 이해하는 것이 코딩하는데 있어 많은 도움이 될 것이다. 

'항해 99(9기) > 항해 일일' 카테고리의 다른 글

항해 99 15일차  (0) 2022.10.03
항해 99 13일 차  (0) 2022.10.01
항해 11일 차  (0) 2022.09.29
항해 10일차  (0) 2022.09.28
항해 99 9일차  (0) 2022.09.27

오늘은 알고리즘 테스트가 있는 날!!

잘 할 수 있을 지 두려워 아침부터 알고리즘에 대해 더 공부하면서 여러가지 찾아보았다.

프로그래밍 문제 해결 과정, 전략

  ㅇ 문제 해결 과정

 

    1. 문제를 읽고 이해하기

      - 문제 설명을 공격적으로 읽으며 문제가 원하는 바를 완전히 이해하는 과정이 반드시 필요

 

    2. 문제를 익숙한 용어로 재정의하기 + 추상화

      - 자신이 다루기 쉬운 개념을 이용하여 문제를 자신의 언어로 풀어 쓰는 단계

      - 본질만 남겨두고 축약하여 다루기 쉽게 표현 -> 추상화

      - 어떤 부분을 추상화할 것인지를 선택하는 작업과 문제를 재정의하는 방법들에 대한 고찰은 좋은 프로그래머가 되기 위해 필수적인 과정

 

    3. 어떻게 해결할지 계획 세우기

      - 문제를 어떤 방식으로 해결할지 결정하고, 사용할 알고리즘과 자료구조를 선택

      - 문제 해결에서 가장 중요한 단계

 

    4. 계획 검증하기

      - 설계한 알고리즘이 모든 경우에 요구 조건을 정확히 수행하는지 증명

      - 수행에 걸리는 시간과 사용하는 메모리가 문제의 제한 내에 들어가는지 확인

 

    5. 계획 수행하기(프로그램으로 구현하기)

      - 프로그램을 작성하는 단계

 

    6. 어떻게 풀었는지 돌아보고, 개선할 방법이 있는지 찾아보기(회고하기)

      - 당장 직접적인 영향은 없지만 장기적으로 가장 큰 영향을 미치는 단계

      - 1. 문제를 풀 때마다 코드와 함께 자신의 경험을 기록으로 남기기(간단한 해법, 접근 방식, 결정적이었던 깨달음 등)

      - 한 번에 맞추지 못한 경우 오답 원인도 기록

      - 2. 같은 문제를 해결한 다른 사람의 코드를 보기

      - 다른 사람의 의견이나 답안을 통해 자극을 얻다보면 더 효율적으로 공부할 수 있음(그룹 스터디, 인터넷)

 

    +. 문제를 풀지 못했을 경우

      - 한 문제에 너무 매달려 있는 것도 좋지 않음

      - 일정 시간이 지나도록 고민해도 답을 찾지 못할 때는 다름 사람의 소스 코드나 풀이를 참조하는 것도 좋은 자세

      - 자신이 왜 이 풀이를 떠올리지 못했는지 돌아보기

 

 

#. 문제 해결 전략

 

 ㅇ 문제 해결 전략

    - 직관과 체계적인 접근 : 문제와 답의 구조에 대한 직관의 중요성

    - 체계적인 접근을 위한 질문 : 문제를 해결할 때 유용한 질문

 

    1. 비슷한 문제를 풀어본 적이 있었는지?

      - 문제의 목적을 보고 적절한 접근 방법을 선택하기 위해서는 어떤 문제가 최적화 문제인지, 경우의 수를 구하는 문제인지, 검색 문제인지 등을 분류하는 방법을 익히고, 각 알고리즘들이 어느 경우에 사용될 수 있는지 체계적으로 공부

 

    2. 단순한 방법에서 시작할 수 있을지?

      - 좀 더 효율적인 자료 구조를 사용하거나 계산 과정에서 같은 정보를 두 번 중복으로 계산하지 않는 등의 최적화

      - ex) 3명의 아이에게 20개 사탕을 배분할 때 사탕 총 량의 순서는 상관 없음

 

    3. 내가 문제를 푸는 과정을 수식화 할 수 있을지?

 

    4. 문제를 단순화할 수 없을지?

      - 주어진 문제의 좀더 쉬운 변형판을 먼저 풀어보기

      - ex) 문제의 제약 조건 없애기, 계산해야 하는 변수의 수 줄이기, 다차원의 문제를 1차원으로 줄여 표현해보기 등)

 

    5. 그림으로 그려볼 수 있을지?

      - 문제에 관련된 그림을 그려 보는 것

 

    6. 수식으로 표현할 수 있는지?

      - 평문으로 쓰여 있는 문제를 수식으로 표현하는 것도 도움이 되는 경우가 있음

 

    7. 문제를 분해할 수 있을지?

      - 더 다루기 쉬운 형태로 문제를 변형

 

    8. 뒤에서부터 생각해서 문제를 풀 수 있을지?

      - 문제에 내재된 순서를 바꿔 보는 것

      - ex) 사다리 게임에서 A에서 B로 가는 방법을 찿기란 어렵지만 B에서 A로 가는 방법을 찾기는 쉬움

 

    9. 순서를 강제할 수 있을지?

      - 순서가 없는 문제에 순서를 강제해서 문제를 풀어보기

      - ex) 2차원 격자를 이용한 문제, 경우의 수

 

    10. 특정 형태의 답만을 고려할 수 있을지?

출처: https://data-make.tistory.com/220 [Data Makes Our Future:티스토리]

 

'항해 99(9기) > 항해 일일' 카테고리의 다른 글

항해 99 13일 차  (0) 2022.10.01
항해 12일 차  (0) 2022.09.30
항해 10일차  (0) 2022.09.28
항해 99 9일차  (0) 2022.09.27
항해 99 8일차  (0) 2022.09.26

오늘도 코딩테스트 연습

 

진수

int i = 127;
 
String binaryString = Integer.toBinaryString(i); //2진수
String octalString = Integer.toOctalString(i);   //8진수
String hexString = Integer.toHexString(i);       //16진수
 
System.out.println(binaryString); //1111111
System.out.println(octalString);  //177
System.out.println(hexString);    //7f
cs

 

 

반대로 2진수,8진수,16진수를 10진수로 변환하기 위해선 Integer 클래스의 parseInt를 사용하여 쉽게 변환이 가능하다.

 

비트 연산자(bitwise operator)

비트 연산자는 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자입니다.

또한, 비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용합니다.

비트 연산자설명

& 대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산)
| 대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산)
^ 대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산)
~ 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산)
<< 지정한 수만큼 비트들을 전부 왼쪽으로 이동시킴. (left shift 연산)
>> 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산)

 

다음 그림은 비트 AND 연산자(&)의 동작을 나타냅니다.

이처럼 비트 AND 연산자는 대응되는 두 비트가 모두 1일 때만 1을 반환하며, 다른 경우는 모두 0을 반환합니다.

 

다음 그림은 비트 OR 연산자(|)의 동작을 나타냅니다.

이처럼 비트 OR 연산자는 대응되는 두 비트 중 하나라도 1이면 1을 반환하며, 두 비트가 모두 0일 때만 0을 반환합니다.

String.format을 사용하여

자리수 원하는데로 지정을 하면서 연산 가능

String.format("%0"+n+"d",Long.parseLong(Integer.toBinaryString(arr1[i]|arr2[i])));

 

'항해 99(9기) > 항해 일일' 카테고리의 다른 글

항해 12일 차  (0) 2022.09.30
항해 11일 차  (0) 2022.09.29
항해 99 9일차  (0) 2022.09.27
항해 99 8일차  (0) 2022.09.26
항해6일차  (0) 2022.09.24

오늘도 코딩 테스트 연습

 

언어 스터디

 

배열

 배열 변수를 미리 선언한 후 값 목록들이 나중에 결정되는 상황이라면 다음과 같이 new 연산자를 사용해서 값 목록을 지정해주면 된다. new 연산자 바로 뒤에는 배열 변수 선언에 사용한 "타입[]"를 붙여주고 중괄호 {}에는 값들을 나열

 이방식으로 하지않으면 컴파일 에러가 난다.

String [] name;
name = new String[] {"jossi","ssijo"};

copyOfRange(arr,startidx,endidx)
이 메소드는 첫 번째 매개변수로 복사할 원본 배열을 받고, 두 번째 매개변수로 시작 인덱스, 세 번째 매개변수로 마지막 복사될 배열 인덱스+1을 받아서 원본 배열과 같은 타입의 복사된 새로운 배열을 반환해준다.

 

선택 정렬(Selection Sort)

import java.util.Arrays;
//오름차순 정렬
public class SelectionSort {
    public static void main(String[] args) {

        int []arr = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};
//데이터가 무작위로 여러 개 있다고 가정하자. 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸고, 
// 그 다음 작은 데이터를 선택해 앞에서 두 번째 데이터와 바꾸는 과정을 반복한다.
//다음은 선택 정렬을 사용하여 데이터를 오름차순으로 정렬한 코드다.
        int minIndex = 0; //가장 적은 원소의 인덱스

        for(int i=0; i < arr.length; i++){
            for(int j=i+1 ; j < arr.length; j++){
                if(arr[minIndex] > arr[j])
                    minIndex = j;
            }

            //스와프
            int tmp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = tmp;
        }
        System.out.println(Arrays.toString(arr));
    }
}

 

[Algorithm] 정렬 알고리즘 (with 자바코드) (tistory.com)

'항해 99(9기) > 항해 일일' 카테고리의 다른 글

항해 11일 차  (0) 2022.09.29
항해 10일차  (0) 2022.09.28
항해 99 8일차  (0) 2022.09.26
항해6일차  (0) 2022.09.24
항해 5일차  (0) 2022.09.23

오들도 코딩테스트 연습!

 

toString 과 String.valueOf 차이

두 메소드 모두 Object의 값을 String으로 변환하지만 변경하고자 하는Object가 null인 경우 다르다.
toString()과 같은 경우 Null PointerException(NPE)을 발생시키지만 valueOf는 "null"이라는 문자열로 처리한다.
 
즉 비교해서 정리하자면
  • String.valueOf() - 파라미터가 null이면 문자열 "null"을 만들어서 반환한다.
  • toString() - 대상 값이 null이면 NPE를 발생시키고 Object에 담긴 값이 String이 아니여도 출력한다.

 

문자열 내림차순 방법

       char[] arr = s.toCharArray();
        Arrays.sort(arr);
        return new StringBuilder(new String(arr)).reverse().toString();

 

toCharArray()

toCharArray() 메소드는 문자열을 char형 배열로 바꿔준다. 반환되는 배열의 길이는 문자열의 길이와 같다.

 

public char[] toCharArray()
public class Test {
  public static void main(String[] args) {
    String str = "hello world";

    char[] arr = str.toCharArray();

    for(int i = 0; i < arr.length; i++) {
      System.out.print(arr[i] + " ");
    }
  }
}

출력

h e l l o   w o r l d

'항해 99(9기) > 항해 일일' 카테고리의 다른 글

항해 10일차  (0) 2022.09.28
항해 99 9일차  (0) 2022.09.27
항해6일차  (0) 2022.09.24
항해 5일차  (0) 2022.09.23
스파르타 99항해 4일차  (0) 2022.09.22

+ Recent posts