Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[switch week2] junghyun-eunjung #6

Merged
merged 2 commits into from
Jan 17, 2025
Merged
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
145 changes: 145 additions & 0 deletions week2/eunjung/week2_eunjung.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
## JAVA
- kotlin의 부모이자 언니이자 .. 여튼 그거
- ej) 개인적으로 근본 언어라고 생각합니다.. ^.^
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

근본이죠.


### Class
```java
public class Person {
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public int getAge() {
return age;
}
}
```
- 외부에서 값을 참조하고 싶거나 셋업하고 싶다면 getter & setter를 정의해주어야 한다.
- 생성자 정의 방식도 코틀린과 조금 다르다. constructor 키워드 대신 `public 객체명`으로 만들어줘야 한다.

### Null
코틀린은 null 여부를 `?`로 나타낸다. 하지만 자바는 그런거 없다. 따라서 결과물이 null인지 아닌지 체크를 매번 해주어야 한다.
```java
public temp(String name) {
if (!StringUtils.hasText(name)) {
//
}
}
```

### 타입
- 자바는 타입을 앞에 명시한다.
- Java 10부터는 var를 사용해서 타입 추론도 가능하다고 함.
```java
String name1 = "test";
var name2= "test";
```

### Stream
- Collection 관련 api를 사용하고 싶을 때, 코틀린은 그냥 바로 사용 가능.
- 그러나 자바는 Stream이라는 파이프라인을 거쳐서 사용해야 한다.
- from jh) 배열 또는 Collection 을 선언형 스타일로 처리할 때 사용하고, 데이터를 변환하거나 필터를 통해 최종 데이터 연산 결과를 만들 때 사용한다.
```java
List<Person> personList = new ArrayList<>();

List<PersonResponse> result = personList.stream()
.filter(person -> Objects.nonNull(person.getSeq()) && Objects.nonNull(person.getName()))
.map(person -> new PersonResponse(person.getName(), person.getSeq()))
.toList();
```

### Record 객체
- 데이터 저장하고 읽는데 사용함. 고대 자바에는 없었고 버전 업데이트 되면서 생겼다고 한다.
- 주로 DTO 객체 생성 시 사용한다고 함.
- kotlin의 data class와 유사한 용도로 사용하면 될 듯하다.
- 컴파일 시 자동으로 생성자를 만든다고 함. also getter, setter.
```java
public record TestResponse(
String name,
int cost
) {

public static TestResponse of(String name, int cost) {
return new TestResponse(name, cost);
}
}
```

### 문제
- [문자열 내 마음대로 정렬하기](https://school.programmers.co.kr/learn/courses/30/lessons/12915?language=java)

```java
class Solution {
/**
* 문제: 문자열 내 마음대로 정렬하기, 12915, Java
* 소감: 처음에는 stream의 toList를 썼는데, 프로그래머스 자바 버전이랑 안 맞다고 해서,
* Arrays.asList api를 사용해보았다.
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아 버전 차이가 있겠네요~
굳굳👍

*/
public String[] solution_12915(String[] strings, int n) {
// array -> list
List<String> stringList = new LinkedList<String>(Arrays.asList(strings));

// compare
stringList.sort((o1, o2) -> {
char tmp1 = o1.charAt(n);
char tmp2 = o2.charAt(n);

if (tmp1 == tmp2) {
return o1.compareTo(o2);
}

return Character.compare(tmp1, tmp2);
});

// list -> array
String[] answer = new String[stringList.size()];
for (int i = 0; i < stringList.size(); i++) {
answer[i] = stringList.get(i);
}

return answer;
}
}
```

- [두 개 뽑아서 더하기](https://school.programmers.co.kr/learn/courses/30/lessons/68644?language=java)

```java
class Solution {
/**
* 문제: 문자열 내 마음대로 정렬하기, 12915, Java
* 소감: 자바 너무 어렵다 ;;; 특히 Array <-> List 변환이 너무 헷갈리고 어렵다 ㅜ.ㅜ;;
*/
public int[] solution(int[] numbers) {

Set<Integer> nums = new HashSet<>();
for (int i = 0; i < numbers.length - 1; i++) {
int j = i + 1;
while (j < numbers.length) {
nums.add(numbers[i] + numbers[j]);
j++;
}
}


int[] answer = new int[nums.size()];
int i = 0;
for (Integer num : nums) {
answer[i++] = num;
}
Arrays.sort(answer);
return answer;
}
}
```

### 💬
한 주 또 시작이네요.. 화이팅하시죠.. ㅎ
176 changes: 176 additions & 0 deletions week2/junghyun/week2_junghyun.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
## 2주차

### 목표

- Kotlin 에 대한 설명을 정리하고 관련 프로그래머스 문제 풀기

### 내용

- Kotlin 이란?

- (Java 동생..ㅎ)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ㅋㅋㅋ cute.

- JVM 기반 언어, Java 와 100% 호환
- 간결하고 Null 안전성을 내장
- 함수형 프로그래밍을 지원한다.

- Class 선언

- 생성자, `getter/setter`, `toString`, `equals`, `hashCode` 등을 자동으로 생성해준다.

```kotlin
data class Person(val name: String, val age: Int)
```

- Null 안전성

- 모든 변수는 기본적으로 Null 이 될 수 없다.
- ? 을 사용해서 Null 허용 변수를 선언한다.

```kotlin
val name: String? = null
```

- 타입 추론

- 더 강력한 타입 추론을 지원한다.

```kotlin
val name = "Test"
val age = 25

// 각각을 String, Int 타입으로 추론한다.
```

- 함수형 프로그래밍

- Java 에서 아래와 같이 Stream 을 썼다면,

```java
List<Person> personList = new ArrayList<>();

List<PersonResponse> result = personList.stream()
.filter(person -> Objects.nonNull(person.getSeq()) && Objects.nonNull(person.getName()))
.map(person -> new PersonResponse(person.getName(), person.getSeq()))
.toList();
```

- Kotlin 에서는 아래와 같이 사용할 수 있다.

```kotlin
val personList: List<Person> = listOf()

val result: List<PersonResponse> = personList
.filter { person -> person.seq != null && person.name != null }
.map { person -> PersonResponse(person.name!!, person.seq!!) }
```
Comment on lines +44 to +65
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

신기한 자바의 스트림..


- Collection

- List, Set, Map : Immutable
- 변경할 수 없는 컬렉션
- 읽기 전용(Read-Only) 이며, 수정 기능이 없다.
- Java 의 `Collections.unmodifiableList` 와 비슷하다.
- MutableList, MutableSet, MutableMap : Mutable
- 그 컬렉션의 내용을 바꿀 수 있음.
- Java Collection 과 동일하다.
- 선언 시

```
List : listOf() / mutableListOf()
Set : setOf() / mutableSetOf()
Map : mapOf() / mutableMapOf()
```

- Collection API
collection에 대고 `.` 누르면 사용할 수 있는 api가 주루룩 뜬다. 그중에 주로 쓰는 건 다음과 같다.

- filter : predicate에 맞춰서 필터링 목적.
- filterIsInstance : 특정 type으로 필터링하고 싶을 떄.

```kotlin
fun main() {
val anyThings = listOf<Any>("3", 3, "hi")
val strings = anyThings.filterIsInstance<String>()
println(strings) // 3, hi
}
```

- filterNotNull : element가 nullable일 때 nonnull만 필터링하고 싶은 경우.

```kotlin
fun main() {
val mList = listOf("3", null, "hi")
val strings = mList.filterNotNull()
println(strings) // 3, hi
}
```

- map / mapNotNull : 매핑 ! (자바의 맵과 거의 똑같은듯?)
- any : predicate과 일치하는 요소가 있다면 true, 없으면 false 반환.

```kotlin
fun main() {
val mList = listOf("3", "hello", "hi")
val isNumExist = mList.any { it.toIntOrNull() != null }
println(isNumExist) // true
}
```

- return@함수명
- return
- return 은 함수 실행을 종료하고 값을 반환한다.
- 외부 함수 전체를 종료한다.
- return@함수명
- 람다만 종료할 때 사용한다.
```kotlin
fun main() {
listOf(1, 2, 3).forEach {
if (it == 3) return@forEach
println(it)
}
println("종료")
}
```
- top level function

- 함수를 사용하기 위해 클래스를 만들 필요가 없음.
- 파일 레벨에서 간단하게 함수 선언 가능.
- Java 의 static method 를 대체할 수 있다.

### 문제
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍


- [문자열 내 마음대로 정렬하기](https://school.programmers.co.kr/learn/courses/30/lessons/12915?language=kotlin)

```kotlin
class Solution {
fun solution(strings: Array<String>, n: Int): Array<String> {
var answer = arrayOf<String>()

//먼저 사전순 정렬
strings.sort()

//인덱스 n 번째 글자를 기준으로 오름차순 정렬
answer = strings.sortedBy { it[n] }.toTypedArray()

return answer
}
}
```

- [두 개 뽑아서 더하기](https://school.programmers.co.kr/learn/courses/30/lessons/68644?language=kotlin)

```kotlin
class Solution {
fun solution(numbers: IntArray): IntArray {
val result: MutableSet<Int> = hashSetOf()

for (i in 0 until numbers.size - 1) {
for (j in i + 1 until numbers.size) {
result.add(numbers[i] + numbers[j])
}
}

return result.sorted().toIntArray()
}
}
```