Stack
스택은 물건을 쌓아올린 형태의 자료구조이다.
마지막에 추가된 자료가 먼저 나오는 후입선출 자료구조이다.
=> LIFO (Last In First Out)
스택의 기본 기능
- 데이터 추가 (push)
- 데이터 회수 (pop)
- 스택이 비어있는지 확인 (isEmpty)
- 제일 위의 데이터 확인 (peek)
Call Stack
stack 자료구조를 활용해 프로그래밍 언어의 함수 호출 및 복귀 순서를 관리한다.
함수 또는 메소드 호출 시 마지막 수행 위치를 Stack에 저장한다.
스택 내부에 함수 실행을 위해 필요한 데이터와, 함수 호출 시 마지막 수행 위치 등을 저장한다.
재귀적 함수 호출로 인해 Call Stack의 최상단이 JVM의 Heap에 도달하게 되면
StackOverflow가 발생하게 된다.
괄호 검사
문자열의 문자를 하나씩 조사한다.
1. 여는 괄호를 만날 경우 --> 스택에 삽입
2. 닫는 괄호를 만날 경우
a. 스택이 비어있을 경우 --> 실패
b. 스택이 비어있지 않은 경우 --> pop
3. 모든 문자를 조사했을 때
a. 스택이 비어있지 않을 경우 --> 실패
b. 스택이 비어있는 경우 --> 성공
괄호 검사
public class ParTest {
public boolean solution() throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String input = reader.readLine(); // 괄호 입력 받는 부분
Stack<Character> charStack = new Stack<>();
// 문자열 길이만큼 순회한다.
for (int i = 0; i < input.length(); i++) {
char next = input.charAt(i);
// 1. 여는 괄호를 만날 때 push
if (next == '(') {
charStack.push(next);
}
// 2. 닫는 괄호를 만날 경우
else if (next == ')'){
// a. pop 할 게 없으면 검사 실패 (false 반환)
if (charStack.isEmpty()) return false;
// b. 아니라면 pop
char top = charStack.pop();
// c. pop의 결과로 나온 값이 여는 괄호인지 확인
if (top != '(') return false;
}
}
// 3. 순회가 끝났을 때 스택이 비었는지 확인
return charStack.isEmpty();
}
}
소괄호, 중괄호, 대괄호 모두 검사
public class ParTest2 {
public boolean solution() throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String input = reader.readLine();
Stack<Character> charStack = new Stack<>();
// 문자열 길이만큼 순회한다.
for (int i = 0; i < input.length(); i++) {
char next = input.charAt(i);
// 1. 모든 여는 괄호를 만날 때 push
if (next == '(' || next == '[' || next == '{') {
charStack.push(next);
}
// 2. 어떤 닫는 괄호를 만날 경우
else if (next == ')' || next == ']' || next == '}'){
// a. pop 할 게 없으면 검사 실패 (false 반환)
if (charStack.isEmpty()) return false;
// b. 아니라면 pop
char top = charStack.pop();
// c. pop의 결과로 나온 값이 올바른여는 괄호인지 확인
// "들어온 건 닫는 소괄호 && top은 여는 소괄호"가 아닐 떄 실패
if (next == ')' && top != '(') return false;
else if (next == '}' && top != '{') return false;
else if (next == ']' && top != '[') return false;
}
}
// 3. 순회가 끝났을 때 스택이 비었는지 확인
return charStack.isEmpty();
}
}
lombok
lombok이란 어노테이션을 기반으로 코드를 컴파일 과정에서 생성해 주는 방식으로 동작하는 라이브러리이다.
반복되는 getter, setter, toString 등을 어노테이션을 통해 자동으로 생성해준다.
어노테이션은 컴파일 시 바이트 코드로 변환되고 사라진다.
@Getter, @Setter, @ToString, @EqualsAndHashCode 등의 어노테이션이 존재한다.
@AllArgsConstructor
@AllArgsConstructor는 lombok 어노테이션 중 하나로
모든 필드값을 파라미터로 받는 생성자를 만들어준다.
다음과 같은 클래스가 있다고 했을 때
public class StudentDto {
private Long id;
private String name;
private String email;
public static void main(String[] args) {
StudentDto student = new StudentDto(1L, "yeon", "yeon@gmail.com");
}
StudentDto는 따로 선언된 생성자가 없고 기본 생성자만 존재한다.
근데 메인에서 StudentDto를 생성할 때 id, name, email을 같이 넘겨주었다.
StudentDto는 id, name, email을 넘겨받는 생성자가 없으므로 오류가 발생한다.
이런 경우 StudentDto에 @AllArgsConstructor를 붙여주면
@AllArgsConstructor
public class StudentDto {
private Long id;
private String name;
private String email;
public static void main(String[] args) {
StudentDto student = new StudentDto(1L, "yeon", "yeon@gmail.com");
}
StudentDto에 id, name, email을 매개변수로 하는 생성자를 선언해주지 않아도
@AllArgsConstructor 어노테이션을 통해 모든 필드값을 매개변수로 하는 생성자가 만들어졌기 때문에
오류가 발생하지 않는다 !
'멋쟁이 사자처럼 > TIL' 카테고리의 다른 글
230614 TIL. Spring Streotypes (Beans) (0) | 2023.06.14 |
---|---|
230613 TIL. 후위표기법, DFS, MyBatis (0) | 2023.06.13 |
230609 8주 4일차 TIL. @PathVariable, Thymeleaf th:, @{} (0) | 2023.06.11 |
230607 8주 2일차 TIL. 빌드 자동화 도구, Maven, Gradle (0) | 2023.06.07 |
230605 8주 1일차 TIL. @Controller, @RequestMapping, IOC (0) | 2023.06.05 |