코틀린을 왜 공부하기 시작했는데? 코틀린이 자바에 비해서 코드량이 엄청 줄어들어서 생산성이 엄청 높아진다는 말을 자주 들었습니다. 한번 해보고 싶었던 언어이기에, 사용해 보면서 자바와 비교했을 때, 어떤 점들이 편했는지 정리해보려고 합니다. 당연하지만, 사용해본지 1주일도 안 되었기 때문에, 틀린 내용도 많을 수 있습니다. https://solved.ac/problems/sprout solved.ac 알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 문제들의 난이도 및 티어 정보를 제공하는 사이트입니다. solved.ac solved ac 의 새싹 레벨 문제들을 전부 풀어보면서 학습을 진행했습니다. 편했던 점들 main 함수가 간단하다 java 라면? public class Cl..
자바 멀티스레드 프로그래밍을 배우다 컴파일러 최적화에 대해서 다뤄야 할 기회가 생겨서 이루어보려고 합니다 class SharedClass{ private int x=0; private int y=0; public void increment(){ x++; y++; } public void validate(){ if(x=y는 어떤 경우에도 만족할 수 있을 것으로 보입니다 하지만 실제로 실행시켜보면 어떨까요? public class ConcurrentTest { public static void main(String[] args) { SharedClass sharedClass = new SharedClass(); Thread t1 = new Thread(() -> { for(int i=0;i { for(int..
Java Exception 의 계층 구조 Java의 예외에는 대표적인 클래스 4가지가 있습니다 이 4가지 클래스는 사실 직접 사용하는 것은 권장되지 않습니다. 대부분의 경우에 이를 상속받는 새로운 클래스를 만들어 사용하거나, 대표적인 예외들을 사용하도록 권장하고 있습니다( ex) IllegalArgumentException, NullPointerException ) 1. Throwable 모든 예외에 관련된 부분의 가장 조상이 되는 클래스 입니다. 모든 예외가 공통으로 가지고 있는 메서드나, 상태를 가지고 있습니다. 실질적으로 에러와 관련된 거의 모든 로직들이 담겨있지만, 직접 사용되는 경우는 거의 없기에, 사실 그렇게까지 깊게 알 필요는 없습니다 이 클래스를 포함한 서브 클래스들 중 RuntimeExc..
이 글을 쓰게 된 이유는 Java 에서 Exception 에 대해서 알아보는 과정에서 This 로 "초기화 되지 않음" 상태를 표현할 수 있다는 점을 알게 되어서 이를 정리하려고 합니다 초기화 되지 않음을 표현하는 방법 1. 기본 값 기본 값을 초기화되지 않았다는 표현을 할 방법으로는 한가지 밖에 존재하지 않습니다 Magic Number를 사용하는 방법인데요 int 값이라면 Integer.MAX_VALUE 같은 평범한 케이스에서 생길 수 없는 값을 미리 넣어놓고, 안 들어올 것 같으니까 초기화 안 된거다는 것으로 예외 처리를 하는 방법이 있습니다 당연하지만, 이것은 절대로 들어오지 않는다는 보장이 있어야 합니다 int 값이라면 이런 방식으로 설정이 가능하더라도, boolean 같은 경우가 된다면 더욱 까..
Generic과 함께하는 가장 대표적인 warning부터 보고 시작하겠습니다 List 대신 List 형태로 바로 사용하고 있는데요 Warning unchecked Generic을 이용해 타입 지정을 했지만, 실제 추론 가능한 타입은 Object일 때 사용됩니다 Object를 Generic에 의해서 제공된 타입의 정보로 캐스팅할 때 발생합니다 list.get(index)를 하는 결과는 Object타입이지만, 이를 (T) 형태로 캐스팅할 수 있는지 여부를 확인하지 못하고 변환했기에 발생한 예외입니다 rawtypes List를 List 형태로 작성하지 않고, List 형태로 사용했기 때문에 컴파일러가 타입추론을 할 수 없다는 경고를 하고 있습니다 List 를 제대로 적어준다면, 발생하지 않는 경고입니다 런타임..
Generic 을 왜 사용하기 시작했을까요? 이 질문에 대해서 알아보기 위해서 글을 작성했습니다 Generic 이 없었을 때는 어땠을까요? Generic 이 없이 작성된 과거의 코드를 가져와보도록 하겠습니다 실제로 작성할 수 있는데요 문제가 되는 상황이 2가지나 보이는데요 1. String을 직접 꺼내도 String이 나오지 않고, Object 형태로 나와서 캐스팅을 하지 않는다면 컴파일 에러가 발생하게 됩니다 2. String 만 들어있을 것으로 기대되는 ArrayList 에 int 값을 넣으려고 시도해도 에러가 발생하지 않습니다 실제로 그 위치까지 가서 String으로 변환을 시도했을 때 런타임에 ClassCastException 이 발생합니다 이를 generic으로 해결할 수 있습니다 실제로 int..
글을 작성하게 된 이유 좋은 품질의 코드를 위해서 거의 필수적인 부분인 테스트코드를 작성하다 생긴 궁금증입니다 어디서부터 어디까지 테스트를 짜야할까요? 당연하지만 도메인로직에 대한 단위테스트는 작성해야 할 것 같습니다 그렇다면 입출력은 어디까지 테스트를 해야할까요? 그리고 어떻게 테스트를 작성해야 할까요? 실제 우테코 전체 질답에 올렸던 질문 위 질문이 실제로 제가 올렸던 질문인데요 해결방법 1 여기에 답변이 달렸던 내용으로는 static을 그대로 유지하는 방법이 더 좋겠다는 말이 나왔습니다. 그 이유로는 원래대로라면 state가 없기에, static으로 충분히 유지할 수 있는 클래스인데, 이를 테스트만을 위해서 전략패턴을 적용해서 상속하는 부분은 테스트만을 위해서 코드가 변경되었기에 좋지않겠다는 내용인..
Java Enum 에서는 함수형 인터페이스를 인자에 두고, 이를 오버라이딩 해서 사용하는 방식의 코드를 작성할 수 있습니다 이를 사용하는 것에는 주의가 필요하다고 생각하는 입장인데요 먼저 다른 언어와 같이 enum 마다 각각의 값이나, 상수를 저장하는 것은 당연하지만 무조건 필요하다고 생각하는 입장입니다 이와는 다르게 enum 에다 기능을 오버라이딩 해서 사용하는 것(함수를 추가하는 것)은 지양해야한다고 생각하는 입장인데요 public enum Day { MONDAY(() -> { Cook cook = new Cook(); cook.cook(); }), TUESDAY(() -> { WashingMachine washingMachine = new WashingMachine(); washingMachine...
interface와 abstract class의 차이가 뭘까요? 이 질문을 하게 된 배경 Cloneable함수가 동작하는게 너무 이상했어요 https://velog.io/@suky/Java-Cloneable%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0 Java: Cloneable에 대한 고찰 이펙티브 자바를 읽다가 문득 든 의문을 풀기 위하여 삽질한 기록입니다. 🤣 velog.io 대체 왜 interface만 구현했는데, 모든 코드가 알아서 작동할까요? Java8에 오면서 interface에도 default 메서드를 만들 수 있고, static 메서드까지 만들 수 있는데, 그러면 abstract class 와의 차이가 뭘까요? 1. 다중 상속이 가능하다. 2. 접근..