Fact
- 아침에 프로그래머스에서 자연수 뒤집어 배열로 만들기와 콜라츠를 자바로 풀었다. 콜라츠는 조건에 따라 처리 하는것이라서 별 문제 없이 if 때려서 통과를 시켰다. 자연수 뒤집어 배열로 만들기 문제는 type변환 때문에 시간이 많이 걸렸다. 그래도 덕분에 공부가 많이 됬다. input을 long으로 주고 output 은 int[] 로 주는 문제였다. 문제 푼 방식은 long을 split을 해서 배열로 만들었다. 만든 배열은 list로 바꿨다. 바꾼 후에 stream으로 바꾸고 String을 Integer로 바꿨다. 바꾼 후에 stream을 list로 바꿨다. list를 collection의 메서드 reverse를 써서 뒤집었다. 뒤집은 후에 stream으로 변경 후 Integer를 int로 바꾸고 배열로 바꿔서 반환을 했다. 이 문제를 풀면서 array, stream, list 바꾸는 작업을 연습을 많이 하게 되었다.
- 문제를 푼 후에 코어자바 5~6장을 읽었다. 책을 보고, 주어진 예제를 수정 해보면서 공부를 했다.
Feelings
- 자바 문제 푸는데 너무 구리다. 문제를 계산? 변환 하는 코드 보다 타입을 변환하는 코드가 배로 많다.
- 제네릭 generic 퉷 너무 어렵다. 그냥 처음 부터 다 되게 만들지. 자바스크립트 만세.
Findings
- Stream.of() 를 쓸때 Arrays.stream() 를 부른다.
- stream 사용 방법중 Arrays.stream() and Stream.of() 차이
- Arrays.stream() 메서드는 int[], Long[] 및 Double[] 유형의 primitive 배열에만 적용되며 IntStream, LongStream 및 DoubleStream을 각각 반환한다. 다른 primitive 유형의 경우 Arrays.stream() 작동 안한다.
-
stream.of()는 T형(Stream)의 일반 스트림을 반환한다. 따라서, 그것은 어떤 유형에도 사용될 수 있다. https://www.geeksforgeeks.org/difference-between-stream-of-and-arrays-stream-method-in-java/
- string reverse 하는 방법은 여러가지. 그 중 하나는 StringBuilder을 사용하는것 이다.
``` java
String randomString = "asdasd" // 스트링 선언
StringBuilder builtString = new StringBuilder(randomString).reverse() // 스트링 빌더 사용과 리버스 쓰기.
return shbuiltStringit.toString() // 스트링 빌더에서 스트링으로 반환
https://www.baeldung.com/java-reverse-string
String Array reverse 하는 방법
String[] fruits = {"apples", "tomatoes", "bananas", "guavas", "pineapples"};// String Array 선언
List<String> list = Arrays.asList(fruits);// list로 변환
Collections.reverse(list);// Collections의 reverse 함수 사용
return list.toArray(String[]::new) // String Array 로 반환
https://www.baeldung.com/java-invert-array
char Array to one String
char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; // 선언
String string = new String(charArray); // char 배열로 string 만들기
return string
다중 char Array to one String
char[][] arrayOfCharArray = { { 'b', 'a' }, { 'e', 'l', 'd', 'u' }, { 'n', 'g' } }; // 다중 char 배열 선언
StringBuilder sb = new StringBuilder(); // stringbuilder 사용
for (char[] subArray : arrayOfCharArray) {
sb.append(subArray);
}// loop를 써서 배열을 sb에 하나씩 붙이기
return sb.toString();// stringbuilder를 string 형식으로 출력.
stream 이용
Character[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' };
Stream<Character> charStream = Arrays.stream(charArray);
String string = charStream.map(String::valueOf).collect(Collectors.joining());
return string;
Collectors.joining()은 join("") 쓰는것 과 비슷하다 단 stream 안에서 사용 할 뿐.
Collectors.joining() 쓰는 예제
String[] names = new String [] {"a", "b", "c"}
List<String> nameList = Arrays.asList(names);
return nameList.stream().map(name-> "'" + name+ "'").collect(Collectors.joining(","));
// 출력 결과 "'a','b','c'"
string array 변환
```java
Stream<String> stringStream = Stream.of("baeldung", "convert", "to", "string", "array"); // 다수 String 들어있는 stream 선언
return stringStream.toArray(String[]::new); //stream을 String array로 변환
// 혹은
return stringStream.toArray(size -> new String[size]);// lambda expression 쓰기
Stream Integer to int Array
Stream<Integer> intStream = Stream.of(1,2,3,4,5); // stream 선언
return intStream.mapToInt(i -> i).toArray();
//결과: int[5] { 1, 2, 3, 4, 5 }
유사 메서드 mapToLong과 mapToDouble 이 있다.
- 제네릭 메서드는 타입을 매개 변수로 받는거라고 생각 하면 된다.
- 타입 경계를 지정하면 타입이 특정 클래스를 확장하거나 특정 인터페이스를 구현할 수 있다.
- 타입이 달라도 subclass와 superclass 관계가 변하지 않는다. 이것을 공변성(covariance)라고 한다.
- 메서드의 매개변수와 반환 타입 변하는 방식을 와일드카드로 지정하는 메커니즘을 사용처 가변성이라고 한다.
- 서브 타입 와일드 카드는 다이아몬드 <> 안에서 ? 를 쓰고 extends를 쓴다
- 슈퍼 타입 와일드 카드는 다이아몬드 <> 안에서 ? 를 쓰고 super 를 쓴다.
- 브리지 메서드란 subclass를 superclass로 할당 할시에 subclass 메서드를 불러오는 프로세스.
- 제네릭은 로(Raw) 타입 밖에 될 수 없다.
Future Action
- 자바 프로그래머스 문제를 푸니깐 많이 배우게 되었다. 다음에도 많이 풀어서 공부 해보자.
- 책을 읽고 쳐보고 했는데도 이해가 안갔다. 그래서 그런지 시간이 많이 걸렸다. 다음에는 너무 오래 걸리면 꼭 당장 필요 한게 아니면 그냥 넘어가고 다음에 다시 보자.