일단 씻고 나가자
23.03.07 본문
2023. 03. 07 화요일
- [Java] 달력 관련 클래스와 초기화 방법, 해당 달의 요일과 마지막 날을 아는 함수?
: LocalDate
LocalDate는 static이므로 초기화 방법은 LocalDate date = LocalDate.of(yyyy, mm, dd);
마지막 날을 return하는 함수는 date.lengthOfMonth()
해당 날의 요일을 아는 방법은 DayOfWeek 클래스를 사용하여
DayOfWeek dow = date.getDayOfWeek(); int dayNum = dayOfWeek.getValue();로
월요일부터 일요일까지 1~7 값이 매겨진다.
- [Java] Math.random()의 범위 설정 방법?
- [Java] printf나 String.format에서 %기호를 문자열로 사용하는 방법?
: %%로 사용하면 퍼센트 기호 하나만 문자열로 담김.
- [Java] 컬렉션 프레임워크란?
: 여러 데이터를 편리하게 관리할 수 있게 만들어 놓은 것. 자료 구조 및 알고리즘을 구조화.
- [Java] 대표 컬렉션 프레임워크 3요소와 종류? 특징? 각 대표 함수? 정렬 방법?
: List – 순서가 있는 데이터 집합에 쓰이며, 데이터 중복 허용.
ArrayList, LinkedList, Vector
Set – 순서가 없는 데이터의 집합. 데이터 중복 불허.
HashSet, TreeSet
Map – 키와 값의 쌍으로 이루어진 데이터 집합. 순서 유지 않음.
HashMap, TreeMap
ArrayList list = new ArrayList();
.add(index, value) // 값을 넣어줌. index를 쓰면 해당 위치에 넣고, 안 쓰면 마지막.
.remove(int index || value) // 해당 인덱스에 있는 값을 지우거나 명시된 값을 지움.
// 1을 넣으면 1인덱스 값이, Integer.valueOf(1)이면
1을 찾아서 지운다.
.size() // 사이즈를 알려줌.
.contains(value) // 해당 value가 있는지 알려줌.
.indexOf(value) // 해당 value의 인덱스를 알려줌.
.clear() // 해당 객체를 비움.
+) LinkedList도 유사. 다만 remove/addFirst/Last를 사용할 수 있음.
HashSet set = new HashSet();
.add(value) // 인덱스를 설정할 수 없고 값만 들어감. 인덱스 설정도 불가.
// Set의 특성으로 중복된 값을 add해도 새로 추가되지 않음.
.remove(value), .size(), .contains(value), .clear() // 동일
+) TreeSet도 유사. 다만 이진 탐색 트리에 특화돼있으며 하나의 종류(String이 들어가면 다음부턴 int 못 넣음)만 관리할 수 있다. 정수만 있을 시에 .lower(value), .higher(value)로 value보다 크고 작은 값을 내보낼 수 있으며, .first(), .last()를 추출할 수 있음.
HashMap map = new HashMap();
.put(key, value) // key값에 맞춘 value를 넣음.
.remove(key), get(key) // key로 해당되는 value를 삭제하거나 가져옴.
+) TreeMap도 유사. 다만 TreeSet과 같이 하나의 자료형만 key로 통일할 수 있으며, .lower/higherEntry/Key가 가능함.
정렬은
Set set = new Set();
List list = new List(set);
Collections.sort(list);
로 list 자체를 sort해주며, 단 set에는 동일한 자료형만이 존재해야 한다.
(String만 들어있다면 String끼리도 sort 가능)
- [Java] 람다식이란? 장단점?
: Lambda Expression. 메소드 대신 하나의 식으로 표현하는 것이며, 익명 클래스의 특성이 일회용인 것과 유사하게 익명 함수(Anonymous)라 칭하며 일회용 함수라고도 한다.
코드가 간결해져서 가독성과 생산성이 높아지는 장점이 있지만, 재사용이 불가능하고 함수가 아니기 때문에 중간 중간 확인할 수 없으므로 디버깅이 어렵고 재귀함수로는 맞지 않음.
- [Java] 람다식의 사용법?
: 람다식의 구현은 익명 클래스 구현과 유사하나, abstract 클래스 객체를 익명 클래스로 구현하여 사용할 수 있는 반면 람다식은 interface에서만 구동할 수 있다,
다음과 같이 작성한다.
- [Java] 스트림이란? 특징? 구성?
: 배열이나 컬렉션 등 여러 데이터들을 다루는 자료형들에서 데이터 개별로 하나씩 참조하여 처리 가능한 기능. for문의 사용을 줄여 코드를 간결하게 한다.
스트림은 크게 Stream 생성, 중개 연산, 최종 연산으로 이루어진다.
데이터 소스 객체.Stream 생성().중개 연산().최종 연산();
1. 생성 : Stream stream = List/Set.stream(); / Arrays.stream([]);
// 배열의 경우 Arrays를 써주어야 하는데, 인자로 정수 배열을 넣으면
명시적 형 변환이 필요하다. (String 배열은 필요하지 않음.)
2. 중개 : IntStream intStream = IntStream.range(1, 10).filter(n -> n%2 == 0);
// filtering : filter 내부 조건에 참인 요소들을 추출
IntStream intStream = IntStream.range(1, 10).map(n -> n+1);
// mapping : map 안의 연산을 요소별로 수행
3. 최종 : IntStream.range(1, 5).sum/average/min/max().getAsDouble/Int()
// 최종 연산의 경우 더 이상 연산이 불가하며 끝난다.
// .forEach(System.out::println)도 있다.
이건 .forEach(n -> System.out.println(n); 으로도 작성 가능.
- [Java] 스트림 생성 관련 함수들? (6개)
1. 배열
// Arrays.stream(arr)
2. 컬렉션 스트림
// List/Set.stream();
3. 스트림 빌더
// Stream sb = Stream.builder().add(1).build();
4. 제너레이터
// Stream sg = Stream.generate( () -> “abc” ).limit(3); // 연산 X. 연산은 이터레이터.
5. 이터레이터
// Stream it = Stream.iterate(10, n -> n*2).limit(3); // 10, 20, 40. 10은 초깃값.
6. 기본 타입 스트림
// IntStream is = IntStream.range(1, 5); // rangeClosed를 사용하면 5도 포함.
- [Java] 스트림 중개 연산 관련 함수들? (3개)
1. Filtering
// IntStream.range(1, 10).filter( n -> n%2 == 0 ); // 조건에 맞는 것을 뽑음.
2. Mapping
// IntStream.range(1, 10).map( n -> n+1 ); // 요소들을 연산.
3. Sorting
// IntStream.builder().add(1).add(9).add(7).build().sorted();
- [Java] 스트림 최종 연산 관련 함수들? (6개)
sum, average
// IntStream.range(1, 10).sum/average(); //.getAsDouble()
2. min, max
// IntStream.range(1, 10).min/max(); //.getAsInt();
3. reduce
// Stream<Integer> sr = new ArrayList<Integer>(Arrays.asList(1, 2, 3)).stream();
sr.reduce( (x, y) -> x+y); //.get();
// 1+2 번째 연산, (1,2) + 3 연산, (1,2,3) + 4 이렇게 순차적인 연산을 도움.
4. forEach
// IntStream.range(1, 10).filter( n -> n==5 ).forEach( System.out::println );
+) 추가적인 최종 연산 get/AsDouble/AsInt() 가 없으면 답이 Optional로 나온다.
- ARM이란 무엇이며 관련 CPU에 대한 지식?
: ISA (Instruction Set Architecture) - CPU 별로 작성한 CPU의 언어.
완전한 기계어이며 Java, C같이 고급 언어를 컴파일하여 CPU 별로 맞는 번역을 해주어야 함.
CPU의 종류에 따라 코드가 구성이 달라지기 때문에 특정 ISA가 다른 종류의 CPU에선 돌아가지 않는다.
대표적인 ISA는 x86, x86-64. 각각 인텔과 AMD사가 개발했으며 1981년 이후 대세. 이미 많은 프로그램이 x86에 맞춰졌기 때문이다. 이에 대척하는 것이 ARM이며, 사업 방식이 인텔이나 AMD와는 다르게 CPU를 처음부터 끝까지 설계하지 않고 뼈대까지만 만들어진 설계도를 다른 CPU 설계사에 제공해주고 돈을 받으며, 설계사는 거기에 개별 기술로 CPU칩을 완성시킴. ARM은 arm v8 등의 ISA를 사용함.
컴퓨터는 많은 명령어의 고성능 CISC 방식(x86, x64), 휴대폰은 자주 사용하는 명령어만 넣어 구조를 간단히 만든 전성비의 RISC 방식(ARM) CPU 아키텍쳐를 사용하는데, 둘의 목적은 명확하게 전력 효율과 성능(쿨링)을 기준으로 나뉘기 때문에 명령어도 다르고 서로 호환되지 않는다.
2년전 apple은 2년에 걸쳐서 mac의 CPU를 x64에서 자사 arm 기반 CPU로 모든 기기를 교체한다는 발표를 했다. 이것의 의미는 이미 IOS에서 돌아가는 앱들을 맥에서 구동하는 것을 가능하게 해준다는 의미로 애플 기기 간의 연동성과 호환이 눈에 띄게 증가하며 성능, 최적화 문제를 해결하겠다는 뜻이다.
https://www.youtube.com/watch?v=zhYL0TcY9uc&t=196
https://www.youtube.com/watch?v=fBg-L6pwS_0
- cmd에서 파일을 문자열로 불러오는 명령어?
: type (리눅스에선 cat) 파일 이름.확장자
- cmd에서 vim으로 파일을 만들고 그 파일에 문자를 쓰는 방법?
: 파일을 만들 경로로 cd한 후
vim 파일이름.확장자
이후 I를 누르면 insert로 문자 입력이 가능하고,
esc를 누르면 명령어 모드로 전환.
명령어 모드에서 :를 누르면 아래쪽에 명령어 입력창이 뜨는데
wq를 입력하면 write, quit로 작성 후 꺼짐.
- cmd에서 파일이 git에 보내졌는지 확인하는 명령어와 보내는 명령어? 왜 필요?
: git status를 입력하면 untracked files: 로 나온 파일들은 VCS 폴더에 있긴 하지만 git에 보내지진 않은 상태.
이때 git add 파일 이름.확장자를 입력하면 보내짐.
임시로 작성한 파일들은 보내면 되지 않기 때문에 일일이 보내는 기능이 필요하다.