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

Problem34 sunny #19

Merged
merged 3 commits into from
Jul 12, 2023
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
94 changes: 94 additions & 0 deletions src/main/java/Practice/sunny/Chapter3/ArrayListPractice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package Practice.sunny.Chapter3;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

public class ArrayListPractice {

public static void main(String[] args) {

// Array
int[] odds = {1, 3, 5, 7, 9};
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};

// String[] weeks = new String[]; -> compile error
String[] weeks2 = new String[7];
weeks2[0] = "월";
weeks2[1] = "화";
weeks2[2] = "수";
weeks2[3] = "목";
weeks2[4] = "금";
weeks2[5] = "토";
weeks2[6] = "일";

// indexing
System.out.println(weeks[3]);

// length of array
for (int i = 0; i < weeks.length; i++) {
System.out.println(weeks[i]);
}

// ArrayIndexOutOfBoundsException
// System.out.println(weeks[7]);

// ArrayList
ArrayList pitches = new ArrayList();

// add
pitches.add("138");
pitches.add("129");
pitches.add("142");
pitches.add(0, "133");
pitches.add(2, "133");

// get
System.out.println(pitches.get(1));

// size
System.out.println(pitches.size());

// contains
System.out.println(pitches.contains("142"));

// remove
System.out.println(pitches.remove("129"));
System.out.println(pitches.remove(0));

// Generics
// ArrayList<String> pitches2 = new ArraList<String>();
ArrayList<String> pitches2 = new ArrayList<>();

ArrayList pitches3 = new ArrayList();
pitches3.add("138");
pitches3.add("129");
String one = (String) pitches3.get(0);
String two = (String) pitches3.get(1);

ArrayList<String> pitches4 = new ArrayList<>();
pitches4.add("138");
pitches4.add("129");
String three = pitches4.get(0);
String four = pitches4.get(1);

// asList
String[] data = {"138", "129", "142"};
ArrayList<String> pitches5 = new ArrayList<>(Arrays.asList(data));
System.out.println(pitches5);

ArrayList<String> pitches6 = new ArrayList<>(Arrays.asList("138", "129", "142"));
System.out.println(pitches6);

// String.join
String result = String.join(",", pitches6);
System.out.println(result);

String result2 = String.join(",", data);
System.out.println(result2);

// sort
pitches6.sort(Comparator.naturalOrder());
System.out.println(pitches6);
}
}
Copy link

Choose a reason for hiding this comment

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

위의 코드 패치에 대한 간단한 코드 리뷰를 도와드리겠습니다.

  1. Generics 사용: ArrayList는 제네릭으로 선언하는 것이 좋습니다. ArrayList pitches의 경우 raw type인 ArrayList로 선언되어 있으므로, 제네릭을 사용하여 타입 안정성을 확보해야 합니다.

  2. ArrayList 생성: ArrayList를 생성할 때, 제네릭으로 타입을 명시적으로 지정하는 것이 좋습니다. 예를 들어, ArrayList pitches = new ArrayList<>();와 같이 사용할 수 있습니다.

  3. 배열 인덱스 처리: 주의해야 할 부분은 weeks 배열의 경우, 7개의 요소를 가지며 인덱스는 0부터 6까지입니다. 따라서 weeks[7]과 같이 인덱스 7은 유효하지 않으므로 ArrayIndexOutOfBoundsException을 발생시킬 수 있습니다.

  4. 요소 추가 및 삭제: add() 메서드를 사용하여 요소를 추가하고 remove() 메서드를 사용하여 요소를 삭제하는 부분에서는 정상 작동합니다.

  5. String.join(): String.join()을 통해 문자열을 조합하여 출력하는 부분은 올바르게 작성되었습니다.

  6. Comparator.naturalOrder() 사용: pitches6.sort(Comparator.naturalOrder());와 같이 naturalOrder() 메서드를 사용하여 ArrayList를 정렬하는 부분은 문제가 없습니다.

각각의 개선 사항을 바탕으로 코드를 수정하면 더 안전하고 가독성이 좋은 코드를 작성할 수 있습니다.

60 changes: 60 additions & 0 deletions src/main/java/Practice/sunny/Chapter3/CastingFinalPractice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package Practice.sunny.Chapter3;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class CastingFinalPractice {

public static void main(String[] args) {

// String to Integer
String num1 = "123";
int n1 = Integer.parseInt(num1);
System.out.println(n1);

// Integer to String
int n2 = 123;
String num2 = "" + n2;
System.out.println(num2);

int n3 = 123;
String num3 = String.valueOf(n3);
String num4 = Integer.toString(n3);
System.out.println(num3);
System.out.println(num4);

// String to Float
String num5 = "123.456";
double d = Double.parseDouble(num5);
System.out.println(d);

// Integer to Float
int n4 = 123;
double d1 = n4;
System.out.println(d1);

// Float to Integer
double d2 = 123.456;
int n5 = (int) d2;
System.out.println(n5);

// NumberFormatException Error
/*
String num = "123.456;
int n = Integer.parseInt(num);
*/

// Final
final int n6 = 123;
// n6 = 456; -> Compile Error

// Final List
final ArrayList<String> a = new ArrayList<>(Arrays.asList("a", "b"));
// a = new ArrayList<>(Arrays.asList("c", "d")); -> Compile Error

// List.of
final List<String> b = List.of("a", "b");
a.add("c");
}
}
Copy link

Choose a reason for hiding this comment

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

위의 코드 패치를 간단히 검토해 드리겠습니다.

  1. 주석 처리된 부분에서 문자열 "123.456"을 정수로 변환하려고 했으나 NumberFormatException 오류가 발생합니다. 해당 부분을 수정해야 합니다:
// String to Integer
String num = "123";
int n = Integer.parseInt(num);
System.out.println(n);
  1. ArrayList에 "a", "b" 요소를 추가한 다음, 변경되지 않도록하기 위해 final 예약어를 사용했습니다. 하지만 List.of("a", "b")로 생성한 List는 변경이 불가능하기 때문에, a에 "c"를 추가하려고 할 때 문제가 발생할 수 있습니다. 이 점을 유의해야 합니다.

일반적으로 보면서 변경할 사항은 없으며, 주의할 점과 버그 위험이 위에 언급된 두 가지입니다.

39 changes: 39 additions & 0 deletions src/main/java/Practice/sunny/Chapter3/EnumPractice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package Practice.sunny.Chapter3;

public class EnumPractice {

enum CoffeeType {
AMERICANO,
ICE_AMERICANO,
CAFE_LATE
}

;

public static void main(String[] args) {

// print
System.out.println(CoffeeType.AMERICANO);
System.out.println(CoffeeType.ICE_AMERICANO);
System.out.println(CoffeeType.CAFE_LATE);

// for loop
for (CoffeeType type : CoffeeType.values()) {
System.out.println(type);
}

// Why use Enum
/*
int countSellCoffee(int type){
...
}
int americano = countSellCoffee(1);
int result = countSellCoffee(99); -> error

int countSellCoffee(CoffeeType type){
...
}
int americano = countSellCoffee(CoffeeType.AMERICANO);
*/
}
}
Copy link

Choose a reason for hiding this comment

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

이 코드 패치는 EnumPractice 클래스를 정의하고, CoffeeType이라는 열거형을 포함합니다. 아래는 코드의 간단한 검토입니다:

  1. CoffeeType 열거형의 상수는 AMERICANO, ICE_AMERICANO, CAFE_LATE 로 구성됩니다.

  2. main 메서드에서는 다음 작업을 수행합니다:

    • CoffeeType의 상수들을 출력합니다.
    • for-each 루프를 사용하여 CoffeeType의 모든 값을 출력합니다.
  3. 주석 부분에서는 Enum 형식의 사용 이유를 설명하며, countSellCoffee 메서드를 예로 들고 있습니다. 주석의 코드를 참고하여 메서드의 매개변수를 Enum 타입으로 사용하면 특정한 값만 입력받을 수 있고, 잘못된 값이 입력될 경우 컴파일 타임에 오류가 발생하는 장점이 있다는 것을 설명하고 있습니다.

코드 자체에 버그는 보이지 않으며, 코드의 목적과 일치하는 기능을 수행합니다.

35 changes: 35 additions & 0 deletions src/main/java/Practice/sunny/Chapter3/MapPractice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package Practice.sunny.Chapter3;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MapPractice {

public static void main(String[] args) {

// HashMap
// put
HashMap<String, String> map = new HashMap<>();
map.put("people", "사람");
map.put("baseball", "야구");

// get
System.out.println(map.get("people"));
System.out.println(map.get("java"));
System.out.println(map.getOrDefault("java", "자바"));

// containsKey
System.out.println(map.containsKey("people"));

// remove
System.out.println(map.remove("people"));

// size
System.out.println(map.size());

// keySet
System.out.println(map.keySet());
List<String> keyList = new ArrayList<>(map.keySet());
}
}
Copy link

Choose a reason for hiding this comment

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

이 코드는 Java에서 HashMap을 사용하는 예제입니다. 아래는 코드 리뷰와 개선 제안입니다:

  1. 변수명 관례: 변수명은 일반적으로 소문자로 시작하고 카멜 표기법을 따릅니다. 예를 들어, "map" 대신 "hashMap" 또는 "wordMap"과 같은 이름을 사용할 수 있습니다.
  2. 주석: 코드 위에 패키지 및 클래스에 대한 설명 주석이 없습니다. 주석을 추가하여 코드의 의도와 목적을 명확히 할 수 있습니다.
  3. 인덴트: 모든 코드 줄은 동일한 수준의 들여쓰기를 사용합니다. 들여쓰기에는 일반적으로 공백 4개나 탭 하나를 사용합니다.
  4. 출력 방식: 현재 코드에서는 System.out.println()을 사용하여 콘솔에 출력합니다. 더 많은 데이터를 처리하거나 로깅을 위해 log4j 또는 SLF4J와 같은 로깅 프레임워크를 사용할 수 있습니다.

버그 위험:
이 코드 조각에서는 심각한 버그 위험이 보이지 않습니다.

개선 제안:

  1. Generics 타입 지정: 현재 코드에서 HashMap은 String 타입의 key와 value를 가지지만, 이를 Generics를 사용하여 명시적으로 지정할 수 있습니다. 예를 들어 HashMap<String, String> 대신에 HashMap<String, String>를 사용합니다.
  2. 추가적인 기능: 현재 코드에서는 HashMap의 기본 기능과 몇 가지 메서드를 사용하고 있습니다. 더 복잡한 연산이나 일련의 작업에 대한 예시를 추가하여 HashMap을 완전히 활용하는 예제로 확장할 수 있습니다.

위의 제안은 개선을 위한 참고 사항입니다. 실제 상황과 조직의 규칙에 따라 유동적으로 적용하십시오.

72 changes: 72 additions & 0 deletions src/main/java/Practice/sunny/Chapter3/NumBoolPractice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package Practice.sunny.Chapter3;

import java.nio.file.FileSystemNotFoundException;

public class NumBoolPractice {

public static void main(String[] args) {

// Integer
int age = 10;
long countOfstar = 8764827384923849L;

// Float
float pi = 3.14F;
double morePi = 3.14159265358979323846;
double d1 = 123.4;
double d2 = 1.234e2;

// Oct, Hex
int octal = 023; // Decimal : 19
int hex = 0xC; // Decimal : 12

// Add, Subtract, Multiply, Divide
int a = 10;
int b = 5;
System.out.println(a + b); // print 15
System.out.println(a - b); // print 5
System.out.println(a * b); // print 50
System.out.println(a / b); // print 2
System.out.println(7 % 3); // print 1
System.out.println(3 % 7); // print 3

// Increment, Decrement
int i = 1;
int j = 10;
i++;
j--;
System.out.println(i); // print 1
System.out.println(j); // print 9

i = 0;
System.out.println(i++); // print 0
System.out.println(i); // print 1

i = 0;
System.out.println(++i); // print 1
System.out.println(i); // print 1

// Boolean
boolean isSuccess = true;
boolean isTest = false;

// Boolean operation
// 2 > 1 -> true
// 1 == 2 -> false
// 3 % 2 == 1 -> true
// "3".equals("2") -> false

// Conditional
int base = 180;
int height = 185;
boolean isTall = height > base;

if (isTall) {
System.out.println("키가 큽니다."); // print 키가 큽니다.
}

i = 3;
boolean isOdd = i % 2 == 1;
System.out.println(isOdd); // print true
}
}
Copy link

Choose a reason for hiding this comment

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

이 코드는 NumBoolPractice 클래스를 포함하는 패키지 Practice.sunny.Chapter3에서 실행됩니다. 주어진 코드는 정수, 부동 소수점, 논리형 변수 및 연산자들에 관련된 예제 코드입니다.

주요 점검 사항:

  • 코드에서 오류나 버그는 보이지 않습니다.
  • 개선 제안으로는 주석을 추가하여 코드의 목적과 기능을 설명하는 것이 있을 수 있습니다.
  • 변수와 상수의 네이밍 컨벤션을 따르고 있는지 확인해야 합니다. 변수 이름은 의미가 명확하고 가독성이 좋아야 합니다.

코드 리뷰 완료!

51 changes: 51 additions & 0 deletions src/main/java/Practice/sunny/Chapter3/SetPractice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package Practice.sunny.Chapter3;

import java.util.Arrays;
import java.util.HashSet;

public class SetPractice {

public static void main(String[] args) {

// HashSet
HashSet<String> set = new HashSet<>(Arrays.asList("H", "e", "l", "l", "o"));
System.out.println(set);

HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9));

// Intersection
HashSet<Integer> intersection = new HashSet<>(s1);
intersection.retainAll(s2);
System.out.println(intersection);

// Union
HashSet<Integer> union = new HashSet<>(s1);
union.addAll(s2);
System.out.println(union);

// Relative Complement
HashSet<Integer> subtract = new HashSet<>(s1);
subtract.removeAll(s2);
System.out.println(subtract);

// Add
HashSet<String> set2 = new HashSet<>();
set2.add("Jump");
set2.add("to");
set2.add("Java");
System.out.println(set2);

// AddAll
HashSet<String> set3 = new HashSet<>();
set3.add("Jump");
set3.addAll(Arrays.asList("To", "Java"));
System.out.println(set3);

// Remove
HashSet<String> set4 = new HashSet<>();
set4.remove("To");
System.out.println(set4);

}
}
Copy link

Choose a reason for hiding this comment

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

이 코드 조각은 SetPractice라는 클래스를 포함하고 있습니다. 이 클래스는 HashSet을 사용하여 다양한 연산을 수행하는 예제입니다.

  1. 먼저, 주어진 문자열 "Hello"로 초기화된 set이라는 HashSet 객체를 생성합니다.
  2. 또한, 정수 값으로 초기화된 두 개의 HashSet 객체 s1s2가 있습니다.
  3. "Intersection"을 계산하기 위해 intersection이라는 HashSet 객체를 s1의 복사본으로 초기화한 후 retainAll() 메서드를 사용하여 s2와의 교집합을 계산합니다.
  4. "Union"을 계산하기 위해 union이라는 HashSet 객체를 s1의 복사본으로 초기화한 후 addAll() 메서드를 사용하여 s2와의 합집합을 계산합니다.
  5. "Relative Complement"를 계산하기 위해 subtract라는 HashSet 객체를 s1의 복사본으로 초기화한 후 removeAll() 메서드를 사용하여 s2의 차집합을 계산합니다.
  6. 일부 요소들을 추가하고 삭제하는 몇 가지 작업을 수행한 후 결과를 출력합니다.

이 코드 조각에는 큰 문제는 없어 보입니다. 그러나 다음과 같은 몇 가지 개선 제안이 있습니다:

  1. 패키지 이름을 업데이트하고 폴더 구조를 변경해야 합니다. Practice.sunny.Chapter3와 같은 패키지 명명 규칙을 준수하여 폴더 구조를 만드는 것이 좋습니다.
  2. 주석을 추가하여 코드의 각 부분을 설명할 수 있습니다. 이는 코드를 읽고 이해하는 데 도움이 됩니다.
  3. 변수 이름을 더 명확하게 설정해야 합니다. 예를 들어, set2, set3과 같은 변수 이름은 해당 세트가 어떤 내용을 나타내는지 알려주지 않습니다. 설명적이고 명확한 변수 이름을 사용하는 것이 좋습니다.

이외에는 큰 문제가 없어 보이며, 주어진 요구사항을 충족하는 기능을 제공하는 것으로 보입니다.

Loading