본문 바로가기

전체 글205

[Kotlin] 연산자를 다루는 방법 연산자를 다루는 방법 단항 연산자, 산술 연산자 public class JavaMoney implements Comparable{ private final long amount; public JavaMoney(long amount) { this.amount = amount; } @Override public int compareTo(@NotNull JavaMoney o) { return Long.compare(this.amount, o.amount); } } val money1 = JavaMoney(2_000L) val money2 = JavaMoney(1_000L) // compareTo를 자동 호출한다. if (money1 > money2) { println("money1이 money2보다 금액이 큽.. 2022. 7. 5.
[Kotlin] Type을 다루는 방법 Type을 다루는 방법 기본타입 val number1 = 3 // 명시적으로 타입을 변환해야 한다. val number2: Long = number1.toLong() // nullable 의 경우에는 적절한 처리가 필요하다. val number1: Int? = 3 val number2: Long = number1?.toLong() ?: 0L 코틀린에서는 선언된 기본값을 보고 타입을 추론한다. 3: Int, 3L: Long, 3.0: Double, 3.0f: Float Java에서 기본 타입간의 변환은 암시적으로 이루어지지만 (int Integer) Kotlin에서는 기본 타입간의 변환은 명시적으로 이루어져야 한다. 그렇기 때문에 toLong()과 같이 명시적 형변환이 필요하다. 타입 캐스팅 fun pri.. 2022. 7. 5.
[Kotlin] null을 다루는 방법 null을 다루는 방법 null 체크 Java public boolean startsWithA1(String str) { if (str == null) { throw new IllegalArgumentException("null이 들어왔습니다."); } return str.startsWith("A"); } public Boolean startsWithA2(String str) { if (str == null) { return null; } return str.startsWith("A"); } public boolean startsWithA3(String str) { if (str == null) { return false; } return str.startsWith("A"); } Kotlin fun st.. 2022. 7. 5.
[Kotlin] 코틀린에서의 변수 코틀린에서의 변수 변수 선언 키워드 - var과 val Java long number1 = 10L; final long number2 = 10L; Kotlin var number1 = 10L // 변수 var number2: Long = 10L // 타입지정 val number3 = 10L // 상수 // Val cannot be reassigned, 값 변경이 불가능하다. number3 = 30L // 컴파일 에러 발생, 초기화가 필요하다. var number3: Int println(number3) var: 변경 가능한 변수, variable val: 변경 불가능한 상수, value 타입지정은 변수명: 타입 형태로 작성한다. TIP! 모든 변수는 우선 val로 만들고 꼭 필요한 경우에 var로 변경한.. 2022. 7. 5.
[CleanCode] 8장 경계 8장 경계 외부 코드 사용하기 public class Sensors { private Map sensors = new HashMap(); public Sensor getById(String id) { return (Sensor) sensors.get(id); } } Map을 예시로 Map은 clear(), containsKey(), containsValue() 등 많은 기능을 제공한다. 때문에 Map 사용자라면 누구나 clear()메서드를 이용해 Map 내용을 지울 수 있다. 즉, 사용자에게 필요하지 않은 기능까지 제공한다. 또한 Map이 반환하는 Object를 올바른 유형으로 변환할 책임은 Map을 사용하는 클라이언트에 있다. 제네릭스를 사용하면 코드 가독성이 높아지지만, 아직 사용자에게 필요하지 않은.. 2022. 7. 4.
[SpringBatch] 멀티쓰레드 Step 멀티쓰레드 Step TOCHE 프로젝트를 진행하면서 대용량 배치 처리를 해야하는 일이 생겼다. 기존의 배치는 chunk 기반의 단순한 배치이다. private Step useDeckStatsStep() { return stepBuilderFactory.get("useDeckStatsStep") .chunk(chunkSize) .reader(useDeckStatsReader()) .processor(useDeckStatsProcessor) .writer(useDeckStatsWriter()) .build(); } 위와 같은 Step을 10개의 쓰레드를 이용해 멀티쓰레드 환경으로 실행해야 했다. private final int poolSize = 10; ... private Step useDeckStatsS.. 2022. 7. 2.
[CleanCode] 7장 오류 처리 7장 오류 처리 오류 처리는 프로그램에 반드시 필요한 요소다. 뭔가 잘못될 가능성은 늘 존재한다. 오류 코드보다 예외를 사용하라. 오류를 확인한느 방법을 if문 등으로 처리한다면 호출자 코드가 복잡해진다. 함수를 호출한 즉시 오류를 확인해야 하기 떄문이다. 오류가 발생하면 예외를 던지는 편이 낫다. 호출자 코드가 더 깔끔해지기 때문에 논리가 오류 처리 코드와 뒤섞이지 않기 때문에 Try-Catch-Finally 문부터 작성하라 try 블록에서 무슨 일이 생기든지 catch 블록은 프로그램 상태를 일관성 있게 유지해야 한다. 그러므로 예외가 발생할 코드를 짤 떄는 try-catch-finally 문으로 시작하는 편이 낫다. 예외에 의미를 제공하라 예외를 던질 떄는 전후 상황을 충분히 덧붙인다. 오류가 발생.. 2022. 7. 2.
[CleanCode] 6장 객체와 자료구조 6장 객체와 자료구조 자료 추상화 // 구체적인 클래스 public class Point { public double x; public double y; } // 추상적인 클래스 public interface Point { double getX(); double getY(); void setCartesian(double x, double y); double getR(); double getTheta(); void setPolar(double r, double theta); } 변수 사이에 함수라는 계층을 넣는다고 구현이 저절로 감춰지지는 않는다. 구현을 감추려면 추상화가 필요하다. 자료를 세세하게 공개하기 보다는 추상적인 개념으로 표현하는 편이 좋다. 아무 생각 없이 조회/설정 함수를 추가하는 방법이 가.. 2022. 7. 2.