2024년 1월 5일부터 오늘 17일까지 약 2주간 Java에 대해서 공부하였다. 앞으로 1주일 정도 더 Java와 Spring에 대해 공부할 예정인데, 이 시점에서 지금까지 풀었던 Java 문제에 대해 정리해보면 좋을 것 같아 학습한 내용과 함께 정리해보도록 하자!
학습한 Java 내용은 다음과 같다.
① 자바의 객체지향 프로그래밍
② 참조 자료형 / 기본 자료형
③ 조건문 / 반복문
④ Array와 ArrayLists
⑤ Collection Frameworks
⑥ 제네릭
순서는 최근 순 → 오래된 순 (즉 어려운 순 → 쉬운 순)으로 역순으로 작성한다.
(그냥 내 맘이다.)
✨ 메서드
list.stream()
: 리스트를 스트림으로 변환
stream.filter()
: 요소를 필터링하여 제거
stream.collect()
: 스트림을 다시 리스트로 변환한다.
- 이때 해당 함수 안에서 임력된 요소들을 통해 새로운 리스트에 누적하도록.collect()
함수에 명령하는 유틸리티 메서드인Collectors.toList()
를 사용한다.
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class FunctionalProgrammingMagic {
public static List<Integer> filterOddNumbers(List<Integer> numbers) {
return numbers.stream().filter(x -> x % 2 != 0).collect(Collectors.toList());
}
}
정수 n
을 입력값으로 받아서 첫 자연수 n
개의 세제곱들이 담긴 리스트를 리턴합니다.
n
이 0이라면 여러분의 코드는 빈 리스트를 리턴해야 합니다.✨ 메서드
IntStream.range()
: n부터 m미만의 정수 수열을 생성
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.List;
public class FunctionalProgrammingMagic {
public static List<Integer> getCubesOfFirstNNumbers(int n) {
return IntStream.range(1, n+1).map(num -> num * num * num).boxed().collect(Collectors.toList());
}
}
강좌 이름 리스트를 받아서 각 강좌 이름의 문자 개수가 담긴 리스트를 리턴합니다.
null
이 될 수 있습니다. 그런 경우에도 함수는 빈 리스트를 리턴해야 합니다.✨ 메서드
mapToLong()
:map()
메서드의 특수한 버전으로,LongStream
(long 값들의 스트림)을 만들고 객체를 int로 변환하는 함수를 받는다
sum()
: 스트림에 있는 숫자들의 합을 계산한다.
import java.util.List;
import java.util.stream.Collectors;
public class FunctionalProgrammingMagic {
public static List<Integer> getCourseNameCharacterCount(List<String> courses) {
if (courses == null) {
return List.of();
}
return courses.stream().map(x -> x.length()).collect(Collectors.toList());
}
}
리스트의 가장 큰 짝수를 리턴하세요.
✨ 메서드
stream()
: JavaCollection
인터페이스에 있는 함수로, 컬렉션에 있는 요소들로 이루어진 순차적인 스트림을 리턴한다. 스트림은 병렬로, 혹은 순차적으로 처리할 수 있는 요소들로 된 시퀀스를 의미한다.
filter()
: JavaStream
인터페이스의 함수로, 불리언을 리턴하는 람다 함수를 받아true
를 리턴한 모든 요소들이 포함된 새로운 스트림을 리턴한다.
max()
: JavaStream
인터페이스의 함수로,Comparator
를 받고 제공된Comparator
에 따라 스트림의 최대 요소를Optional
로 감싸 리턴한다.
Optional
:null
이 아닌 값을 포함하거나 포함하지 않을 수 있는 컨테이너 객체를 의미한다.
- 만일 어떤 값이 존재하면isPresent()
는true
를 리턴하고, 그렇지 않다면 객체가 비어 있다고 간주해false
를 리턴한다.
-Optional
을 사용하면NullPointerException
을 피할 수 있다.
orElse()
: JavaOptional
클래스의 메서드로, 존재할 경우 값을 리턴하고 아니면 인수로서 전달된 기본 값을 리턴한다.
Integer::compare
: Java에서 사용하는 메서드 참조이다.
- 2개의 정수를 숫자로서 비교하는Integer
클래스 안의 정적 메서드compare
를 참조한다.
-::
은 Java에서 메서드 또는 생성자를 참조하기 위해 사용하는 토큰이다.
import java.util.List;
import java.util.Optional;
public class FunctionalProgrammingMagic {
public static int findMaxEvenNumber(List<Integer> numbers) {
if (numbers == null) {
return 0;
}
Optional<Integer> maxEven = numbers.stream().filter(x -> x % 2 == 0).max(Integer::compare);
return maxEven.orElse(0);
}
}
2개의 문자열 str1
과 str2
가 주어지면, 2개의 문자열이 서로 애너그램인지 판정해 결과를 리턴하세요.
🗣️ 애너그램이란 단어나 문구의 글자를 재배열하여 만들어진 단어나 문구를 가리킵니다.
str1
또는 str2
가 null이라면 메서드는 false
를 리턴해야 합니다.str1
과 str2
의 길이가 같지 않아도 메서드는 false
를 리턴해야 합니다.✨ 메서드
string.toLowerCase()
: 문자열에 있는 모든 문자를 소문자로 변환
string.toCharArray()
: 문자열을 새로운 문자 배열로 변환
Arrays.sort(charArray)
: 지정된 배열을 숫자 오름차순으로 정렬
Arrays.equals(charArray1, charArray2)
: 지정된 두 문자 배열이 서로 같으면 true를 리턴
import java.util.Arrays;
public class StringMagic {
public boolean areAnagrams(String str1, String str2) {
if(str1 == null || str2 == null) {
return false;
}
if (str1.length() != str2.length()) {
return false;
}
str1 = str1.toLowerCase();
str2 = str2.toLowerCase();
char[] charArr1 = str1.toCharArray();
char[] charArr2 = str2.toCharArray();
Arrays.sort(charArr1);
Arrays.sort(charArr2);
return Arrays.equals(charArr1, charArr2);
}
}
문자가 유효한 16진수 문자(A ~ F 또는 a ~ f)일 경우, isHexadecimalChar(char ch)
메서드는 true
를 리턴하고, 그렇지 않으면 false를 리턴하세요.
isHexadecimal()
메서드는 false
를리턴해야 합니다.isHexadecimalChar(char ch)
메서드는 대소문자를 모두 처리해야 합니다.✨ 메서드
Character.isDigit(char ch)
: 문자가 숫자인지 검사한다.
String.toCharArray()
: 문자열을 문자 배열로 변환한다.
public class MyString {
public String str;
public MyString(String str) {
this.str = str;
}
public boolean isHexadecimalChar(char ch) {
return (
(ch >= 'a' && ch <= 'f') ||
(ch >= 'A' && ch <= 'F')
);
}
public boolean isHexadecimal() {
if (str == null || str.length() == 0) {
return false;
}
char[] arr = str.toCharArray();
for(char ch: arr) {
if (!isHexadecimalChar(ch) &&
!Character.isDigit(ch)) {
return false;
}
}
return true;
}
}
문자열 문장을 입력으로 받아서 문장 안의 모든 단어가 역순으로 변경되지만 원래의 단어 순서는 유지되는 문자열을 리턴해야 합니다.
null
이면 여러분의 메서드는 문자열 "INVALID"
를 리턴해야 합니다.""
이면) 여러분의 메서드는 빈 문자열을 리턴해야 합니다.✨ 메서드
string.split(String regex)
: 주어진 정규 표현식에 따라 문자열을 분할한다.
stringBuilder
: 문자열 조작 작업을 할 때String
보다 더 효율적이다.
stringBuilder.reverse()
:StringBuilder
안의 문자 순서를 역순으로 바꾼다.
stringBuilder.append(String str)
: 지정된 문자열을 시퀀스에 추가한다.
string.trim()
: 앞과 뒤의 공백을 생략한 문자열 사본을 리턴한다.
public class StringMagic {
public String reverseWordsInSentence(String sentence) {
if(sentence == null) {
return "INVALID";
}
if(sentence.isEmpty()) {
return "";
}
String[] words = sentence.split(" ");
StringBuilder reverseSentence = new StringBuilder();
for(String word: words) {
StringBuilder reverseWord = new StringBuilder(word).reverse();
reverseSentence.append(reverseWord).append(" ");
}
return reverseSentence.toString().trim();
}
}