자바 멀티스레드 프로그래밍을 배우다 컴파일러 최적화에 대해서 다뤄야 할 기회가 생겨서 이루어보려고 합니다 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주일이 진짜 세상에서 제일 빨리 지나가는 것 같네요 회고를 적기로 결심했던 것은 정말 당행인 것 같네요. 1주일을 어떻게 보냈는지도 되돌아볼 수도 있는 것 같고 이번 주에 했던 실수를 쭉 되돌아볼 수도 있고, 다음 주차를 더 깔끔하게 만들려면 무조건 써야될 것 같습니다 이번주에는 저번주 미션 리팩토링을 했고, 2단계 페어프로그래밍을 진행했습니다 자동차 페어프로그래밍 리팩토링을 진행하면서 나왔던 부분들입니다 1. 입출력 어디까지 테스트해야 하는가? https://be-student.tistory.com/43 java에서 입출력 어디까지 테스트 해야할까요? 글을..
글을 작성하게 된 이유 좋은 품질의 코드를 위해서 거의 필수적인 부분인 테스트코드를 작성하다 생긴 궁금증입니다 어디서부터 어디까지 테스트를 짜야할까요? 당연하지만 도메인로직에 대한 단위테스트는 작성해야 할 것 같습니다 그렇다면 입출력은 어디까지 테스트를 해야할까요? 그리고 어떻게 테스트를 작성해야 할까요? 실제 우테코 전체 질답에 올렸던 질문 위 질문이 실제로 제가 올렸던 질문인데요 해결방법 1 여기에 답변이 달렸던 내용으로는 static을 그대로 유지하는 방법이 더 좋겠다는 말이 나왔습니다. 그 이유로는 원래대로라면 state가 없기에, static으로 충분히 유지할 수 있는 클래스인데, 이를 테스트만을 위해서 전략패턴을 적용해서 상속하는 부분은 테스트만을 위해서 코드가 변경되었기에 좋지않겠다는 내용인..
이 글을 쓰게 된 이유 Object 클래스에 대해서 생각보다 모르는 것들이 많았고, 이번 기회에 자세하게 알아보아야 겠다는 생각이 들었는데요 알아보는 김에 우아한테크코스 프리코스때 리뷰가 나왔던 부분 먼저 자세하게 알아보면서 진행해보려고 합니다 toString 메서드 알아보기 이 부분이 실제 toString 메서드에 대한 정의인데요 리턴하는 값은 오브젝트를 나타내는 스트링이라고 적혀 있습니다 toString 메서드는 오브젝트를 텍스트로 나타내는 텍스트를 나타내고, 사람이 읽기 좋은 좋은 결과를 반환해야 한다고 정의되어있습니다 모든 오브젝트를 상속하는 클래스(사실상 모든 클래스) 가 이 메서드를 오버라이딩 하는 것을 권장하고 있다고 합니다 계속 안정적일 필요도 없고, JVM 호출에서 안정적으로 유지될 필요..
Java Enum 에서는 함수형 인터페이스를 인자에 두고, 이를 오버라이딩 해서 사용하는 방식의 코드를 작성할 수 있습니다 이를 사용하는 것에는 주의가 필요하다고 생각하는 입장인데요 먼저 다른 언어와 같이 enum 마다 각각의 값이나, 상수를 저장하는 것은 당연하지만 무조건 필요하다고 생각하는 입장입니다 이와는 다르게 enum 에다 기능을 오버라이딩 해서 사용하는 것(함수를 추가하는 것)은 지양해야한다고 생각하는 입장인데요 public enum Day { MONDAY(() -> { Cook cook = new Cook(); cook.cook(); }), TUESDAY(() -> { WashingMachine washingMachine = new WashingMachine(); washingMachine...