스택
스택은 각티슈, 감자칩과 같다.
위에 있는 것이 먼저 나오고, 먼저 들어간 것이 아래에 깔린다.
push : 감자칩을 넣는것
pop : 감자칩을 꺼내는 것
peek : 맨 위의 값을 확인하는 기능 (꺼내지 않음)
isEmpty : 비었는지 확인. pop이나 peek 전에 보통 isEmpty로 확인함.
jvm에도 스택 영역이 있다.
스택 영역에는 primitive 타입 변수가 저장되는데, 함수 호출 과정도 스택에서 관리한다.
예를 들어 다음 식을 계산하면,
plus(minus(30, multiple(4 * 5)) , 20) = plus(10, 20)
→ push plus()
→ push minus()
→ push multiple()
→ pop multiple()
→ pop minus()
→ pop plus()
순으로 스택에서 관리된다.
push() 구현
push는 스택에 데이터를 넣는 기능이다.
public class Stack1 {
private int[] arr = new int[10000];
private int pointer = 0;
public void push(int value) {
this.arr[pointer++] = value;
System.out.println(Arrays.toString(arr));
System.out.println("pointer = " + pointer);
}
public static void main(String[] args) {
Stack1 st = new Stack1();
st.push(10);
st.push(20);
}
}
pointer의 초기값을 0으로 주고
push가 호출될 때마다 인자로 받은 값을 현재 pointer가 가르치는 위치에 저장하고
pointer를 1 증가시킨다.
그러면 arr[0]에는 인자로 받은 10이 저장되고 pointer는 1만큼 증가하여 1을 가르키게 된다.
pointer는 값이 추가될 위치를 가리키게 한다.
pop() 구현
pop은 스택에 있는 데이터 중 가장 위에 있는 데이터를 꺼내는 기능이다.
스택이 비어있는 경우 pop 호출 시 array out of index 예외가 발생한다.
그래서 호출하기 전 isEmpty로 스택이 비어있는지 확인한다.
pop을 구현하는 방법은 2가지가 있다.
변수를 추가로 사용하는 방식과 증감연산자를 사용하는 방식이다.
변수를 추가로 사용하는 방식은 변수를 하나 더 선언해줘야 하지만 직관적이다.
public int pop() {
if (isEmpty()) {
throw new EmptyStackException();
} else {
int temp = this.arr[pointer - 1];
pointer--;
return temp;
}
}
증감연산자를 사용하는 방식은 간단하지만 덜 직관적이다.
public int pop() {
if (isEmpty()) throw new EmptyStackException();
else return this.arr[--pointer];
}
peek() 구현
peek는 스택의 가장 위의 값을 확인만 하는 기능이다.값을 확인만 하고 꺼내는 것이 아니기 때문에 여러번 실행해도 같은 값이 출력된다.
public int peek() {
if (isEmpty()) throw new EmptyStackException();
return this.arr[pointer - 1];
}
isEmpty() 구현
isEmpty는 스택이 비었는지 확인하는 기능이다.
보통 pop이나 peek를 사용하기 전에 isEmpty로 스택이 비어있는지를 먼저 확인한다.
public boolean isEmpty() {
if (isEmpty()) throw new EmptyStackException();
return this.pointer == 0;
}
나는 pointer가 현재 가르키는 값이 데이터가 저장될 위치를 나타내는 것으로 지정했기 때문에
pointer가 0이면 스택이 비어있는 상태이다.
Database
DB란?
데이터를 저장해주는 어플리케이션으로
데이터를 효율적으로 관리하기 위해 사용한다.
정규화란?
중복(이상 현상)을 제거하기 위해 테이블을 설계해 데이터를 나누는 작업이다.
ERD란?
데이터 모델링에서 개체와 개체간의 관계를 그림으로 표현한 것이다.
예를 들면 이런거
DDL Data Definition Language
DDL은 테이블 같은 구조 정의 시 사용하는 명령어로
대표적으로 CRAETE, ALTER, DROP, RENAME, TRUNCATE 등이 있다.
CREATE SCHEMA
스키마 생성
CREATE TABEL
테이블 생성
CREATE TABLE `likelion-db`.`book` (
`bookid` INT NOT NULL,
`bookname` VARCHAR(45) NOT NULL,
`publisher` VARCHAR(45) NULL,
`price` INT NOT NULL,
PRIMARY KEY (`bookid`));
ALTER TABLE
테이블 수정
ALTER TABLE `likelion-db`.`book`
ADD COLUMN `publisherid` INT NULL AFTER `price`;
DROP TABLE
테이블 삭제
DROP TABLE book;
DML Data Manipulation Language
DML은 테이블에 입력된 레코드를 조회, 삽입, 수정, 삭제하는 명령어로
대표적으로 SELECT, INSERT, UPDATE, DELETE 등이 있다.
INSERT
레코드 삽입
INSERT INTO `likelion-db`.`book` (`bookid`, `bookname`, `publisher`, `price`)
VALUES ('1', '축구의 역사', '굿스포츠', '7000');
SELECT
레코드 조회
SELECT * FROM book LIMIT 10;
LIMIT은 조회할 레코드의 수를 제한하는 명령어이다.
UPDATE
레코드 값 수정
update book set publisher="글빛" where bookid=2;
DELETE
레코드 삭제
where절에 지정된 조건에 해당하는 레코드가 여러개일 경우 전부 삭제되므로 사용 시 주의
delete from book where bookid = 1;
IN 연산자
where절에서 사용하며 지정된 값 목록 중 하나와 일치하는 경우 레코드 반환.
IN 연산자 사용 시 or 연산자로 여러 개의 조건을 지정하지 않고도 특정 값들을 검색할 수 있음
SELECT * FROM book WHERE bookid IN (2, 3);
book 테이블에서 bookid가 2 또는 3인 레코드 조회
JOIN
두 개 이상의 테이블을 연결해 하나의 테이블로 합칠 때 사용
join을 사용해 두 테이블 간의 공통된 값을 연결한다.
SELECT * FROM book, publisher
WHERE publisher.publisherid=book.publisherid;
book 테이블과 publisher 테이블에 공통으로 존재하는 컬럼인 publisherid로 join.
실행하면 다음과 같이 나옴
'멋쟁이 사자처럼 > TIL' 카테고리의 다른 글
230522 6주 1일차 TIL. DB 연동, Statement, PreparedStatement, DB 접속 정보 변수 처리 (1) | 2023.05.22 |
---|---|
230518 5주 4일차 TIL. 괄호 풀기, DB 연관관계, Dump (3) | 2023.05.18 |
230516 5주 2일차 TIL. 선택정렬, 삽입정렬 (1) | 2023.05.16 |
230515 5주 1일차 TIL. 버블 정렬, EC2, Docker (1) | 2023.05.15 |
230511 4주 4일차 TIL. List, ArrayList (1) | 2023.05.11 |