일단 씻고 나가자

23.04.11 본문

Study/닥치는 대로 주워 담기

23.04.11

일단 씻고 나가자 2023. 4. 12. 05:52

2023. 04. 11 화요일

 

- [Java] ConcurrentModificationException이란 무엇이며 해결법?

: list를 순회하는 중 해당 객체를 삭제하게 되면 인덱스가 변화하여 다음 객체에 접근하지 못할 수도 있을 때 발생하는 예외.

 

해결 방안으로는 Iterator로 순회 중 iterator.remove();를 사용하거나,

list.removeIf(item -> item.equals(“me”)); 형식으로 사용한다.

 

 

- 최대 부분합을 구하는 아이디어?

: 분할 정복으로 최댓값을 구하는 방식에 추가로,

left, right와의 mid 인덱스를 구하여 두 개의 for문으로 left <- mid, mid+1 -> right

중앙에서 출발한 각각의 max 합 두 개를 합한 값을 return 한다.

그 후 left, right 각각과 max 값을 비교하여 가장 큰 값을 return 한다.

 

 

- [Java] LinkedList로 각 노드의 값을 비교하여 하나의 link로 엮는 방법?

 

 

- [Regex] 소괄호의 의미와 활용?

: 소괄호 내부의 문자를 하나로 엮는 역할을 한다. 파이프 ‘|’ 기호와 연계할 수도 있다.

예를 들면, (Mon|Tues|Wednes)day 는 각각의 단어들이 하나의 묶음으로 인식되면서 파이프 기호를 통해 OR의 효과를 낼 수 있다.

내부에 모든 개별 문자가 후보군이 되는 대괄호와는 의미가 다르다.

 

 

- [Regex] 수량자란 무엇이며 각 기호와 활용?

: 수량자란 어떤 패턴이 몇 번 등장하는가를 숫자를 나타내는 방법이다.

모두 앞의 패턴에 대한 수량을 의미한다.

* 0 ~ 다수

+ 1 ~ 다수

? 0 ~ 1

 

응용 방식으로는

.* 모든 문자

[ab]* 모든 ab 선택

[^ ]+ 공백이 아닌 하나 이상의 모든 문자

 

 

- [Git] bare 명령어란? push의 종류와 추가 연결 기능?

: 원격 저장소와 흡사하게, 저장소의 특성을 순수하게 지키기 위해, 워크 스페이스의 파일을 수정하고 작업할 수 있는 기능을 지니지 않은 저장소의 역할만 하는 디렉토리를 만듦.

만들게 되면 작업할 수 있는 공간이 없는 .git 디렉토리 내부의 파일만 지닌 디렉토리가 된다.

git init bare 디렉토리 명 처럼 사용한다.

 

git 현재 저장소 명 add 별명 주소 로 입력하면 해당 주소를 계속 복사 붙여넣기 할 필요 없이 해당 별명만으로 작성이 가능해진다. 해당 주소의 원격 저장소를 현재 저장소에 저장하겠다는 뜻.

 

push에는 matchingsimple 방식이 있는데, matchinggit이 내부적으로 알아서 처리하는 방법이고 simple은 사용자가 어디에서 어디로 push 하겠다는 것을 명시해야 하는 방식이다. simple 방식을 추천한다.

 

추가로 git push set-upstream 별명 원격 branch 명 명령어는 현재 branch에서 push를 한다면 항상 원격 저장소의 해당 branch에 저장하겠다는 명령어이다.

 

 

- [Java] 데몬 쓰레드란? 특징? 관련 함수?

: 데몬이란 유닉스와 리눅스 계열에서 자주 쓰이는 단어로 백그라운드에서 특정한 작업을 하는 쓰레드이고, 윈도우에서는 서비스라고 불린다.

데몬 쓰레드는 일반 쓰레드가 모두 종료되면 강제로 종료된다.

 

사용 방법은 쓰레드 객체.setDaemon(true)로 설정하고 start를 하면 백그라운드에서 계속 실행되게 된다.

 

 

- [Spring] LSP?

: Liskov Substitution Principle. 상속받은 클래스는 부모 클래스와 동일한 동작을 해야 재활용 가능성이 커지므로, 상속받은 클래스는 부모 클래스와 아예 기능이 달라지게끔 기능을 너무 확장하게끔 구현하지 않아야 한다는 것. ( ex. 헬리콥터 extends 자동차 (X) )

 

의외로 현업에서는 상속을 자주 사용하지 않는다. 상속 시 오버라이드를 한 것과 아닌 것의 혼란을 초래함과, fragile base class 문제를 발생시키기 때문이다.

 

상속의 대안으로는 상속을 위한 설계를 한 클래스만 상속하고, 부모 클래스를 차라리 인터페이스로 만들거나 어쩔 수 없다면 부모와 상호 치환이 가능하게끔 해야 한다.

 

 

- [Effective Java] 초기화할 변수가 많은 클래스의 객체에 대한 해결법?

: 여러 개의 생성자를 두는 방법과 Java beans Pattern(Setter) 방식이 있다.

하지만 여러 개의 생성자에 대한 방법은 같은 자료형의 parameter가 여러 개일 때 사용자에게 parameter에 대한 순서나 필수 parameter 자체에도 혼란을 주며 추가적인 parameter에 대해 논리적인 에러도 유발할 수 있고,

Setter 방식은 코드가 길어지고 loose 해질 수 있는 단점이 있다.

 

이런 문제의 해결 방안으로 Builder 패턴을 고려할 만하다. builder 패턴이란 클래스의 내부에 클래스명Builder (관례상의 명명) 라는 static 내부 클래스를 생성하는 방식이다. 해당 builder 클래스는 생성자로 필수 값들만 받으며, 나머지 필드들에 대해서는 setXXX( XX ); 방식의 메서드들을 메서드 체이닝 방식으로 모두 만들어 객체 생성 레벨에서 처리하게끔 하는 방식이다. (마지막으로 build() 메서드를 통해 return new this;로 반환한다.)

그 후, 원 클래스에서는 생성자를 private으로 만들고 builder 객체를 매개로 받아 다시 변수들을 초기화해준다.

( ex. new MyClass.MyClassBuilder(ssn).setName(name).setAge(20).build() )

 

이와 같은 방식은 객체 생성 부에서 코드가 길어질 수 있기 때문에,

클래스 생성 시 생성자의 윗단에 @Builder 어노테이션을 사용하는 lombok 방식을 사용하면 자동으로 내부에서 해당 변수들의 이름과 동일한 함수를 만들어 제공해준다.

이와 같은 방식은 생성자에 고의로 PK 변수를 적지 않도록 하여 builder 생성 시에 설정할 수 없도록 제한하는 장점도 있다.

( ex. MyClass.builder().name(“name”).age(20).build() )

 

단 생성 비용과 장황한 점층적 생성자 패턴으로 적은 개수(~3, 4)parameter에선 좋지 못하다.

https://charliezip.tistory.com/m/17

 

 

- 파이프 라인이란?

: CPU의 실행 과정인 인출, 해독, 실행의 과정이 순서대로 실행되므로 특정 과정이 실행 중일 때 다른 과정의 회로들은 놀고 있게 된다. 이때, 가동되고 있지 않은 회로들을 활동하게 하여 CPU의 성능을 높이는 CPU가 제공하는 기법이 파이프라인이다.

파이프라인은 특정 데이터의 진행이 끝나면 다음 회로에 넘겨주고 해당 최종 연산이 끝나지 않은 채 바로 새로운 데이터를 받는 방식이다.

 

과정을 세분화할수록 시간이 줄기 때문에, 명령 실행 과정을

명령어 인출 (IF : Instruction Fetch), 명령어 해독 (ID : Instruction Decode),

오퍼랜드 인출(OF : Operand Fetch), 명령어 실행 (EX : Execute), 실행 결과 저장 (SR : StoRe) 과정 등으로 나눈다. 최근 CPU는 성능의 상승을 위해 파이프라인을 16단계까지 나누고 있다.

 

따라서 cycle이란 하나의 세부 작업을 하는 단위이고, 파이프라인의 단계의 개수에 따라 몇 번의 명령을 실행하는지 나눌 수 있다. ( ex. 100 cycle이고 파이프라인이 5라면 초당 20 명령 실행 )

 

 

- RISC, CISC란 무엇이며 차이?

: Reduced/Complex Instruction Set Computer 방식으로 CPU의 명령어를 정의하는 전략이다. RISC는 간단한 명령어만 제공하여 효율성을 높이고, CISC는 복합 명령어를 수행하여 가능한 많은 작업을 수행한다.

 

CISC는 복합 명령어이기 때문에 명령어의 포맷이나 길이에 대한 규칙이 없으며, 전체 명령이 얼마나 걸릴지 예측이 불가하다. RISC는 포맷이 같으므로 전체 명령 시간 예측이 가능하다.

 

 

- DMA?

: CPU가 메모리에 들러 해당 데이터를 가져오는 것이 아니고 직접 IO에 접근하여 데이터를 가져오는 장치. CPU는 캐쉬까지만 접근한다. CPU는 메모리에 접근해야 할 때 버스 사용을 포기하고 DMA에게 허가하여 가져오게 한다.

https://hydroponicglass.tistory.com/283

 

'Study > 닥치는 대로 주워 담기' 카테고리의 다른 글

23.04.13  (0) 2023.04.14
23.04.12  (0) 2023.04.13
23.04.10  (1) 2023.04.11
23.04.07  (0) 2023.04.08
23.04.06  (0) 2023.04.07