Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar
/out/
/target/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

# IntelliJ project files
out
gen
55 changes: 55 additions & 0 deletions 10weeks/Collection.forEach와 Stream.forEach의 차이.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Collection.forEach와 Stream.forEach의 차이
```java
public void print(List<Integer> nums) {
nums.forEach(System.out::println);
nums.stream().forEach(System.out::println);
}
```
Collection.forEach는 따로 객체를 생성하지 않고 forEach 메서드를 호출한다. forEach 메서드는 Iterable 인터페이스의 default 메서드인데, Collection 인터페이스에서 Iterable 인터페이스를 상속하고 있기에 바로 호출할 수 있는 것이다.

```java
public interface Iterable<T> {
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
...
}
public interface Collection<E> extends Iterable<E> {
...
}
```
반면에 Stream.forEach는 Collection 인터페이스의 default 메서드 stream()으로 Stream 객체를 생성해야만 forEach를 호출할 수 있다.

## parallelStream
stream 메소드로 생성한 Stream.forEach를 했을 땐 Collection.forEach와 별 차이가 없었지만 Collection 인터페이스의 또다른 Stream 객체 생성 메소드 parallelStream()을 사용해서 Stream.forEach를 한다면 그 차이점이 명확하다.

```java
public void print() {
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
System.out.println("Collection.forEach 출력 시작");
nums.forEach(System.out::println);
System.out.println("Stream.forEach 출력 시작");
nums.parallelStream().forEach(System.out::println);
}

//실행 결과
Collection.forEach 출력 시작
1
2
3
4
5
Stream.forEach 출력 시작
3
4
1
5
2
```
parallelStream 메소드로 생성한 Stream 객체는 여러 스레드에서 스트림을 실행하기 때문에 forEach를 했을 때 실행 순서가 매번 달라지며 예측 불가능하다.

## Reference
- [Collection.forEach와 Stream.forEach는 뭐가 다를까?](https://dundung.tistory.com/247)
54 changes: 54 additions & 0 deletions 10weeks/Stream의 특징 정리.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Stream 특징 정리
## map()
- 스트림의 각 요소마다 수행할 연산을 구현할 때 사용한다.
```java
intList.stream().map(x -> x*x).forEach(System.out::println); // 1,4,9
```

## filter()
- 스트림 요소를 필터링 하기 위한 메소드이다.
- filter()는 스트림 요소마다 비교문을 만족하는 요소로 구성된 스트림을 반환한다.
- 특정 조건에 맞는 값만 추리기 위한 용도로 사용한다.
```java
intList.stream().filter(x -> x<=2).forEach(System.out::println); // 1,2
```

## sorted()
- 스트림 요소를 정렬하는 메소드로 기본적으로 오름차순으로 정렬한다.
- sorted() 활용하는 방법은 몇 가지가 있는데 스트림 원소가 Comparable 인터페이스를 구현하고 있는 상태라면 다음과 같이 하면 된다.

Comparable 인터페이스 구현은 오름차순이라고 가정한다.
```java
Arrays.asList(1,4,3,2).stream().sorted().forEach(System.out::println); // 1,2,3,4
Arrays.asList(1,4,3,2).stream().sorted((a,b) -> b.compareTo(a)).forEach(System.out::println); // 4,3,2,1
Arrays.asList(1,4,3,2).stream().sorted( (a,b) -> -a.compareTo(b)).forEach(System.out::println); // 4,3,2,1
```
두번째와 세번째 방법은 오름차순 구현을 활용해 내림차순으로 처리할 때 사용할 수 있는 방법 이다.
내림차순 정렬을 위한 또다른 방법은 -a.compareTo(b) 를 사용하는 것인데 직관적이지 못해 권장하지는 않는다.

정렬에 사용되는 또다른 방법은 Comparator를 사용하는 것으로 새로운 정렬 조건을 지정하고자 한다면 sorted((a,b) -> { })와 같이 코드를 작성하면 된다.
```java
Arrays.asList(1,4,3,2).stream().sorted( Comparator.reverseOrder()).forEach(System.out::println); // 4,3,2,1
```

## distinct()
- distict()는 요소들의 중복을 제거하고 스트림을 반환한다.
```java
Arrays.asList(1,2,3,2,5).stream().distinct().forEach(System.out::println); // 1,2,3,5
```

## limit()
- 스트림의 시작 요소로부터 인자로 전달된 인덱스까지의 요소를 추출해 새로운 스트림을 생성한다.
```java
intList.stream().limit(2).forEach(System.out::println); // 1,2
```

## forEach()
- 스트림의 요소들을 순환하면서 반복해서 처리해야 하는 경우 사용한다.
```java
intList.stream().forEach(System.out::println); // 1,2,3
intList.stream().forEach(x -> System.out.printf("%d : %d\n",x,x*x)); // 1,4,9
```

## Reference
- [[Java] Stream](https://velog.io/@gillog/Java-Stream-Class)
19 changes: 19 additions & 0 deletions 10weeks/racingcar/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
plugins {
id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
mavenCentral()
}

dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}

test {
useJUnitPlatform()
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
12 changes: 12 additions & 0 deletions 10weeks/racingcar/build/tmp/compileJava/source-classes-mapping.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
utils/GameUtils.java
utils.GameUtils
Application.java
Application
view/InputView.java
view.InputView
racingcar/Car.java
racingcar.Car
racingcar/Cars.java
racingcar.Cars
utils/RandomUtils.java
utils.RandomUtils
Binary file not shown.
5 changes: 5 additions & 0 deletions 10weeks/racingcar/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
185 changes: 185 additions & 0 deletions 10weeks/racingcar/gradlew

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading