개인 과제를 제출했다. 피드백이 오기 전까지 시간이 좀 있어서 문법에 대해서 간략하게 한번 다 훑어 보기로 했다.
수요일부터는 팀 프로젝트니 지금보다 엄청 더 바빠질 거 같으니 미리미리 공부를 많이 해놔야 한다.
Lombok 이란?
Lombok(이하 롬복)은, 자바 프로젝트를 진행하는데 거의 필수적으로 필요한 메서드/생성자 등을 자동 생성해 줌으로써 코드를 절약할 수 있도록 도와주는 라이브러리이다.
예를 들어
lombok을 사용하지 않은 코드 엄청 길다..
public class User {
private String name;
private String email;
// No-argument constructor
public User() {
}
// All-argument constructor
public User(String name, String email) {
this.name = name;
this.email = email;
}
// Getter for name
public String getName() {
return name;
}
// Getter for email
public String getEmail() {
return email;
}
}
하지만 lombok을 사용한다면?
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
@Getter
@NoArgsConstructor // 매개변수 없는 기본 생성자를 생성
@AllArgsConstructor // 모든 필드를 매개변수로 갖는 생성자를 생성
public class User {
private String name;
private String email;
}
Lombok을 사용하면 코드가 훨씬 간결해지고, 반복적인 코드를 줄여 가독성과 유지 보수성을 높여준다.
Path Variable과 Request Param
Path Variable은 URL 경로의 일부로 명확하게 특정 리소스를 식별 ex) GET /users/123
Request Param은 URL 쿼리 문자열을 통해 검색, 필터링 등의 추가 조건을 전달 ex) GET /search?query=spring&page=2
ModelAttribute와 RequestBody
ModelAttribute: 폼 데이터나 URL 쿼리 파라미터를 객체로 바인딩 할 때 사용
ex) 폼 데이터를 서버로 전송하여 이를 객체로 변환하는 경우
RequestBody: HTTP 요청 본문의 JSON, XML 데이터를 객체로 변환할 때 사용
ex) 클라이언트가 JSON 형식의 데이터를 전송할 때 이를 객체로 변환하는 경우
1. 카멜 표기법 (Camel Case)
카멜 표기법은 여러 단어로 이루어진 식별자에서 첫 단어는 소문자로 시작하고,
그다음 단어들의 첫 글자는 대문자로 시작하는 표기법이다. 주로 변수명과 함수명에 사용
예시:
- camelCase
- numberOfStudents
- myVariableName
2. 스네이크 표기법 (Snake Case)
스네이크 표기법은 모든 단어를 소문자로 작성하고, 단어 사이를 밑줄(_)로 연결하는 표기법이다.
변수명과 함수명에 사용
예시:
- snake_case
- number_of_students
- my_variable_name
3. 파스칼 표기법 (Pascal Case)
파스칼 표기법은 카멜 표기법과 유사하지만, 첫 단어도 대문자로 시작하는 표기법
주로 클래스명이나 타입명에 사용된다.
예시:
- PascalCase
- NumberOfStudents
- MyVariableName
비교 예시
각 표기법을 동일한 단어로 비교하면:
- 카멜 표기법: myVariableName
- 스네이크 표기법: my_variable_name
- 파스칼 표기법: MyVariableName
정렬
선택 정렬 (Selection Sort)
개념:
- 선택 정렬은 가장 작은(혹은 큰) 원소를 찾아내어 제일 앞에 놓고, 그 다음 작은 원소를 찾아 두 번째에 놓는 방식으로 정렬한다
- 이 과정을 반복하여 리스트 전체를 정렬함
특징:
- 시간 복잡도: O(n^2)
- 공간 복잡도: O(1)
- 구현이 간단하지만, 성능이 좋지 않음.
- 안정적이지 않은 정렬 방식(동일한 원소의 순서가 바뀔 수 있음).
예시 코드
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_idx = i
for j in range(i + 1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
버블 정렬 (Bubble Sort)
개념:
- 버블 정렬은 인접한 두 원소를 비교하여 정렬하는 방식
- 가장 큰 원소를 배열 끝으로 보내고, 그 다음 큰 원소를 그 이전에 보내는 과정을 반복
- 정렬이 완료될 때까지 이 과정을 반복
특징:
- 시간 복잡도: O(n^2)
- 공간 복잡도: O(1)
- 구현이 간단하지만, 성능이 좋지 않음.
- 안정적인 정렬 방식(동일한 원소의 순서가 유지됨).
예시 코드
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
퀵 정렬 (Quick Sort)
개념:
- 퀵 정렬은 분할 정복 알고리즘의 하나로, 피벗을 기준으로 배열을 두 부분으로 나누고 각각을 재귀적으로 정렬
- 피벗보다 작은 원소는 왼쪽, 피벗보다 큰 원소는 오른쪽에 놓이게 함
특징:
- 평균 시간 복잡도: O(n log n)
- 최악의 시간 복잡도: O(n^2) (하지만 일반적으로 잘 발생하지 않음)
- 공간 복잡도: O(log n) (재귀 호출 스택을 사용하기 때문에)
- 매우 빠른 정렬 알고리즘으로, 대부분의 실무에서 사용됨.
- 불안정한 정렬 방식(동일한 원소의 순서가 바뀔 수 있음).
예시 코드
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
병합 정렬 (Merge Sort)
개념:
- 병합 정렬은 분할 정복 알고리즘의 하나로, 배열을 반으로 나누고 각각을 재귀적으로 정렬한 후, 다시 합쳐서 정렬된 배열을 만든다
특징:
- 시간 복잡도: O(n log n)
- 공간 복잡도: O(n) (추가적인 배열이 필요)
- 안정적인 정렬 방식(동일한 원소의 순서가 유지됨).
- 큰 배열을 정렬하는 데 적합하지만, 추가 메모리 사용이 필요함.
예시 코드
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
요약
- 선택 정렬: 구현이 간단하지만, 성능이 좋지 않은 정렬 알고리즘. 작은 데이터 집합에 적합.
- 버블 정렬: 구현이 간단하지만, 성능이 좋지 않은 정렬 알고리즘. 거의 정렬된 데이터에 적합.
- 퀵 정렬: 매우 빠른 정렬 알고리즘으로, 대부분의 실무에서 사용됨. 평균적으로 O(n log n)의 시간 복잡도를 가짐.
- 병합 정렬: 안정적이고, 큰 배열을 정렬하는 데 적합하지만, 추가 메모리 사용이 필요. 시간 복잡도는 O(n log n).
'TIL' 카테고리의 다른 글
TIL - 2024/06/19 (0) | 2024.06.19 |
---|---|
TIL - 2024/06/18 (0) | 2024.06.18 |
TIL - 2024/06/14 (0) | 2024.06.14 |
TIL - 2024/06/13 (0) | 2024.06.13 |
TIL - 2024/06/12 (0) | 2024.06.12 |