일단 씻고 나가자
23.03.23 본문
2023. 03. 23 목요일
- [Java] long보다 더 큰 정수를 다루는 방법? 연산 방법?
: java.math.BigInteger;을 import하여 사용한다.
BigInteger은 기본적으로 문자열을 받아 해당 객체로 다시 저장하는 방식이다.
BigInteger bi = new BigInteger(“111”);
따라서 연산 결과도 해당 객체에 저장되는 것이 아닌 새로운 그릇에 담아야 하며, 피연산자도 BigInteger 객체이어야 한다.
연산은 별도 연산자의 이름을 담은 함수에 저장한다.
BigInteger bi2 = bi.multiply(new BigInteger(“2”);
add, subtract, multiply, divide, remainder(%) 로 사용하며,
해당 값을 기본형으로 바꾸려면 intValue, longValue, toString을 사용한다.
- [Java] 문자열에서 특정 인덱스를 지우는 방법?
: StringBuilder의 .deleteCharAt(index)로 지우면 된다.
.delete(strat index, end index)로 여러 부분을 지울 수도 있다.
- 써드파티란?
: Third Party. 제3 자란 뜻으로, IT계에선 원천 기술과 호환되는, 혹은 파생되는 상품을 만드는 회사. 반대로 원천 기술의 제작자가 호환 상품까지 출시하는 회사를 퍼스트 파티라고 한다.
게임 업계에선 플레이스테이션, 엑스박스처럼 콘솔 게임기에 연동되는 게임만을 만드는 회사,
프로그래밍에선 플러그인, 라이브러리, 프레임워크를 만드는 회사,
스마트폰에선 구글 플레이 등의 스토에어서 제공하는 어플리케이션을 만드는 회사를 일컫는다.
- 팩토리 메서드란?
: new를 활용한 객체 생성 직접 호출을, 본 클래스를 상속받은 하위 클래스의 객체로 대체하라고 제안하는 패턴.
- [Java] Time API란? 생성 방식과 주요 메서드?
: 자바에서 제공하는 Date, Time 클래스는 직관적이지 않거나 디자인 자체가 문제인 다양한 원인들로 써드파티에서 Joda-Time 라이브러리등을 만들기도 했다. 따라서 JDK core에서 이러한 문제를 해결하여 Java SE 8부터 Date, Time을 새롭게 디자인하여 API를 제공하기 시작했다.
LocalDate 클래스는 팩토리 메서드로 객체 생성을 유도한다.
LocalDateTime, LocalDate, LocalTime 클래스는 비슷한 방식으로 구동된다.
값을 설정할 때는 ofXXX(),
값을 얻어올 때는 getXXX(),
다른 타입으로 변경할 때는 fromXXX() 등의 다양한 팩토리 메서드를 제공한다.
LocalDate date = LocalDate.of(2023, 03, 24); 등으로 객체의 날짜를 조정할 수도 있고
LocalDate date2 = date.getMonth(); 으로 원 객체의 특정 값을 받을 수도 있다.
date2.getValue();처럼 getValue() 로 실제의 값을 받을 수도 있다.
버전 업이 되었기 때문에, Month에 1을 더할 필요 없이 직관적으로 월이 나온다.
- git에서 commit –a 명령어를 쓸 때 주의점?
: -a는 자동으로 add 후 commit을 해주는 명령어인데, 한 번도 add 되지 않고 버전 관리가 한 번도 되지 않은 파일은 자동으로 add 해주진 않는다.
- git branch를 치면 어떻게 되는가? 다른 branch의 생성과 바꾸는 방법?
: master이라고 뜬다. 이 master는 현재 내가 master라는 branch를 쓴다는 뜻이며, 이는 git을 시작하면 기본적으로 쓰고 있는 약속된 기본 branch의 이름이다.
git branch newname을 치면 newname이라는 이름의 새로운 branch가 생기며,
git checkout newname을 치면 master에서 나와서 newname의 branch로 이동하게 된다.
chechout은 여러 VCS에서 활용하는 개념이다.
branch를 바꾸게 되면 이전까지 쓰고 있던 branch의 개념을 그대로 가져온다. 즉, 여태까지의 log가 바뀐 branch에도 그대로 적용된다. branch를 바꿀 때마다 파일이 사라졌다 나왔다 한다. 추가적인 저장소 없이 새로운 버전을 적용할 수 있는 유용한 기능.
- 스프링부트의 테스트 방법? 어노테이션?
: @SpringBootTest, @Transactional
@SpringBootTest 는 DB와 자동으로 연결하여 테스트해주는 어노테이션.
자바 코드만을 테스트할 때와 다르게, 스프링 컨테이너가 직접 개입하여 함께 테스트를 실행.
@Transactional 은 DB와 연동하여 테스트 후, 입력된 테스트 데이터를 모두 롤백.
개별 테스트 시작 전에 트랜잭션을 실행하고, 테스트 완료 후 항상 롤백.
commit을 반영하지 않는다는 개념이 더 가깝다.
- 단위 테스트와 통합 테스트의 차이? 무엇이 왜 더 좋은가?
: 단위 테스트는 개별 테스트. 자바 코드 내에서만 실행. (시간이 굉장히 짧음.)
통합 테스트는 DB까지 연동하여 함께 테스트.
단위 테스트가 더 좋은 개념이다. 그런 습관을 훈련해야 함. 통합 테스트로 하는 테스트는 잘못된 설계일 가능성이 크다.
- [Java] log 계산을 하는 방법?
: Math 클래스의 log를 이용한다. 기본적으로 log, log10을 지원하고 있으며
밑이 다른 로그를 활용하려면 로그의 나누기를 하면 된다.
예를 들어 밑이 3, 위가 9인 값을 표현하려면
Math.log(9) / Math.log(3) = 2가 나온다.
- 바빌로니아 법이란?
: 어떤 수의 제곱근을 무수히 많은 연산의 반복으로 근사치를 구하는 방법이다.
굉장히 작은 수인 입실론을 이용하는 방법이고,
result는 1부터 result = (result + x/result) / 2;를 반복할수록 답과 가까워진다.
- 복잡도란? 복잡도의 계산법?
: 복잡도(Complexity)는 두 가지로 나뉜다.
시간 복잡도(Time Complexity) // 알고리즘의 필요 연산 횟수
공간 복잡도(Space Complexity) // 알고리즘의 필요 메모리
일반적으로 둘은 trade-off (비례) 관계이다.
최근에는 메모리가 많이 늘었기 때문에 메모리보다는 시간을 줄이는 방법을 지향해야 한다.
코딩테스트에서도 메모리는 여유롭게 주는 편이다.
추가적으로 O(logN)은 n만큼 반복할 때 n을 전부 순회하지 않고 몇씩 늘어나면서 순회.
O(N logN)은 이중 for문에서 바깥 for문은 전체 순회, 안쪽 for문은 띄엄띄엄 순회이다.
O(N^2)는 피보나치 수열을 재귀로 수행할 때 일어난다.