일단 씻고 나가자
23.03.27 본문
2023. 03. 27 월요일
- [Java] Integer List에서 1, 0이 들어 있을 때, index를 쓰지 않고 1을 지우는 방법?
: list.remove(1);을 해버리면 1번째 인덱스인 0이 지워져버린다.
1을 지우려면 list.remove(Integer.valueOf(1));을 해주면 1이 지워짐.
+ Integer을 int로 바꾸는 건 Integer.intValue()이다.
- [Java] int 배열을 list<Integer>에 담을 때의 문제점, 해결 방법? Integer 배열에 담을 땐?
: List<Integer> list = Arrays.asList(int[]);를 하게 되면
배열 전체를 list의 첫 번째 원소에 담아라는 뜻으로 에러가 발생한다.
이는 list = new ArrayList(Arrays.asList(int[])를 해도 마찬가지.
이를 해결하기 위해 arr의 원소를 하나씩 list에 담는 방법으로
List<Integer> list = Arrays.stream(int[]).boxed().collect(Collectors.toList());
처럼 Collection을 활용하고, int 개별 원소를 Integer로 boxed하여 담는 방법이 있지만 시간 소요가 크다.
따라서 새로운 list를 만들고 for문을 돌려 개별 원소를 add해주는 것이 좋다.
int[] -> Integer[]의 경우 Integer[] = Arrays.stream(int[]).boxed().toArray(Integer[]::new);
- [Java] byte, int, long의 자료 범위? 10진수 범위와의 상관관계?
:
기본적으로 int는 2^32, long은 2^64이며 양수, 음수와의 범위를 위해 2^(n-1)값의 음수, 2^(n-1)-1값의 양수 범위를 갖는다.
10^3은 2^10과 유사하므로, 2^32는 양수 범위 2^31 -1까지를 가지고 이는 10^9와 유사하다.
- 사방면을 체크하는 문제에서, if문을 중복하지 않는 방법?
: int 배열로 { {0,1}, {1,0}, {0,-1}, {-1,0} } 네 가지를 만들어 놓고
해당 배열 크기(4)만큼 for문을 돌면서 해당 인덱스에 하나씩 더해본다.
x나 y가 < 0인 경우는 –1을 했을 때 배열이 처음 끝이기 때문에 –1이 된 경우,
x나 y가 >= 배열 끝 사이즈인 경우는 배열의 마지막 끝이기 때문에 초과된 경우이다.
- git에서 branch를 쉽게 하는 명령어? git의 merge의 두 방식과 설명?
: -b는 새로운 branch를 만들고, 바로 해당 branch로 checkout 할 수 있다.
즉, -b newBranch == -branch newBranch, checkout newBranch
git의 merge 두 방식은 fastforward와 아닌 방식이 있다.
fastforward란 빨리 감기란 뜻으로, master에서 분할된 newBranch가 최신화를 끝마친 후에 master가 아무 수정 사항(commit)이 없었다면 master와 newBranch를 병합하는 과정이다.
이때는 master와 newBranch를 같은 곳을 가리키게 하고, newBranch를 삭제시킨다. 즉 새로운 branch는 생성되지 않는다.
다른 방식으로는 3-way merge(recursive strategy) 방식이 있는데, 기존 master가 새로운 commit 사항이 생겼고, 그 이전 버전의 master로부터 분리된 branch와 변경 사항이 생긴 master을 병합하는 방법이다. 이는 두 버전의 다른 부분을 조상 코드를 중심으로 차이를 비교하며 master, newBranch 총 세 부분을 모두 비교하며 merge한다.
이때는 새로운 commit이 발생하며, 조상 코드로부터 두 branch가 모두 수정한 부분은 conflict를 내어 사용자가 해당 부분은 직접 작성하도록 유도한다.
https://wonyong-jang.github.io/git/2021/02/05/Github-Merge.html
- List를 내림차순 정렬하는 법? List의 특정 value의 인덱스를 가져오는 함수?
: List.sort(Coparator.reverseOrder());
List.indexOf(Value);
- 카탈란 수란? 구현법?
: 괄호가 n개일 때, 완벽한 괄호 꼴을 만들 수 있는 개수.
오르막, 내리막을 n쌍으로 만들 수 있는 방법의 수 등등
점화식은 C0=1, Cn= 시그마(i : 0~n-1) Cn * C(n-i)
- [Spring] JPA란? ORM 기술이란?
: 기존의 반복 코드를 줄여줌과 동시에, 기본적인 SQL도 JPA가 직접 만들어 실행해준다.
DB로의 쿼리를 직접 작성 없이 보내주고, DB에서의 데이터도 가져와 줌.
데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있고, 개발 생산성을
크게 높일 수 있다. (ORM 기술 : Object Relation Mapping)
JPA는 인터페이스이고, 구현체로 hibernate, 이클립스 링크 등등이 있다.
JPA는 자바의 표준 인터페이스고, 구현은 업체들이 한다. (성능이 각각 다르다.)
비슷한 소프트웨어로 마이바티스가 있다.
- [Spring] JPA의 기본 사용 방법? (PK, 행) Entity Manager?
: import javax.persistence.Entity; 로 Entity를 import 한 후
@Entity 어노테이션을 설정해준다. 이는 스프링이 관리하는 entity가 된다.
(DB에서 entity란 데이터베이스 테이블이다.)
PK는 @Id(아이디 어노테이션)와 @GeneratedValue(strategy = GenerationType.IDENTITY)
로 선언. 해당 방식은 아이덴티티 전략이라 부르며, ID를 직접 넣어주는 것이 아닌, 값을 넣어주면 DB 자체에서 아이디를 자동으로 생성해주는 것을 일컫는다.
그 외의 값들은 열 이름과 변수 이름을 동일하게 하면 되는데, 이름이 다를 경우
@Column(name = “해당 Attribute(열) 이름”)으로 DB와 매핑한다.
EntityManager은 build.gradle에서 spring-boot-starter-data-jpa를 implementation하면
자동으로 객체를 생성해주며, 스프링부트가 자동으로 해당 DB와 연결 후 제공해준다. JPA는 모든 것이 EM으로 동작한다. 우린 자동으로 생성된 EM 객체를 injection 받으면 된다. 내부적으로 Datasource를 가지고 있어서 DB랑 통신이 가능하다.
즉, JPA를 쓰려면 EntityManager을 주입받아야 한다.
Data를 저장하거나 변경하는 클래스는 항상 @Transactional 내부에서 사용해야 함.
- [Spring] JPA의 기본 함수?
: save – em.persist(member)
// persist는 영구적인 이런 뜻. 자동으로 setID 다 해준다.
findById – em.find(Class 타입, id(특성))
// 첫 매개변수엔 해당 클래스 타입, 다음엔 찾고자 하는 특성을 적는다.
findAll – em.createQuery(“select m from Member m”, Member.class).getResultList();
// EM은 JPQL이라는 객체 지향 쿼리문을 쓴다. 비슷하지만 객체로 쿼리를 작성한다.
단건을 찝어서 반환하는 건 (ex. findById) 관련 함수가 존재하지만, findAll 등 여러 가지를 가져오는 건 JPQL을 작성해주어야 한다.
이런 JPA기술을 spring에서 감싸서 제공하는 Spring Data JPA는 JPQL 안 써도 된대!
- [Java] 데코레이터 패턴이란? IO의 구분?
: 객체의 결합을 통해 기능을 동적으로 유연하게 확장. 기능 추가를 가능하게 클래스 작성.
생성자에 해당 객체를 꾸미는 Decorate 클래스를 만들어서, 해당 객체를 꾸미는 방법.

장식 하는 클래스는 입력과 출력을 다양한 방법으로 할 수 있게끔 하는 기능만 제공.
- [Java] 바이트 스트림이란? 특징?
: 한 바이트씩 받아 한 바이트씩 작성하는 클래스.
byte를 리턴한다면 끝을 나타내는 값을 표현할 수 없기 때문에, byte가 아닌 int에 읽은 값을 담아야 한다. 읽어 들일 것이 없다면 –1을 리턴하는데, 음수의 경우 맨 좌측 비트가 1이 되기 때문에 읽어 들일 것이 있다면 항상 양수를 리턴한다고 볼 수 있다.
즉, InputStream은 –1을 반환할 때까지 .read()를 반복하여 사용하면 된다.
- [Java] 데크 (Deque)란? 선언 방법과 기초 함수?
: Doubly ended Queue. 양방향에서 모두 삽입과 삭제가 가능한 자료구조.
Queue와 Stack을 합친 형태이다. 일부 기능을 제한하여 용도에 맞게 변형이 가능하다.
입력 제한 데크(scroll)와 출력 제한 데크(shelf)로 front 혹은 rear 중 하나를 제한할 수 있다.
add/offer, remove/poll 메서드가 있는데 앞쪽은 공간이 없을 때 추가하거나 빈공간에서 삭제하면 예외를 발생시키지만, 후자는 false나 null을 발생시킨다. 목적에 맞게 사용 가능.
Deque deque = new ArrayDeque(); 형태로 인터페이스로 되어 있다.
주요 함수로는 add/offer/remove/pollFirst/Last() 등이 있다.
- 컴퓨터의 구조와 작동방식? 기본 설명?
: 폰노이만이 제안한 폰노이만 구조. 현 컴퓨터 구조이다.
과거 새로운 프로그램을 만들면 항상 해당 로직이 적힌 하드웨어를 일일이 만들었어야 했는데, 이는 큰 비용과 어려운 유지보수를 동반했다. (작업마다 스위치를 설치하거나, 전선을 재배치하는 방식을 사용. -> 소프트웨어만 교체)
따라서 하나의 하드웨어에 그 내부에서 여러 프로그램을 돌리는 방법을 제안했다. 메모리에 CPU의 명령어를 올려놓고, CPU가 코드를 한줄 한줄 읽어서 코드의 명령을 실행하는 방식. 따라서 현재 방식은 SSD의 코드를 Memory로 받고, 그곳에서 CPU와 소통하는 방식이다.
컴퓨터의 주요 3대 구성요소는 CPU, Memory, IO Devices로 구성된다.
메인보드에 떨어져서 위치 해있는 세 가지를 물리적으로 연결하여 통신하는 것을 버스라고 한다.
- [Java] StringBuffer, StringBuilder의 차이?
: StringBuffer은 동기화된 메소드를 제공하기 때문에 멀티 스레드 환경에서 안전하고, Builder은 단일 스레드 환경에서 속도가 빠르다.