본문 바로가기

전체 글58

[Java] 31이란.. 흔히 equals 와 hashcode를 함께 재정의 하라는 이야기를 들어봤을 것입니다. 저도 당연히 알고 있었지만,, 조금 더 아는체하기 위해 내부 구현을 뜯어봤습니다. 그러자 등장하는 31. 과연 이 녀석의 정체는 무엇일까요?? equals, hashcode 재정의 Object 명세서에서는 equals와 hashcode에 대해 다음과 같이 언급하고 있습니다. 동등성 비교에 사용되는 정보가 변경되지 않는다면, hashcode 메서드는 일관되게 같은 값을 반환한다. equals 메서드가 두 객체를 같다고 판단한다면 두 객체의 hashcode값은 같다. 두 객체가 equals 하지 않다고 해서 두 객체의 hashcode가 다를 필요는 없다. (하지만 성능이 떨어진다 -> Linked로 관리할거임 아마 ;;).. 2022. 2. 28.
[Java] 코드로 객체 지향 기본 용어 알아보기 객체지향을 처음 공부할 때 관련 내용을 검색 하면 책임, 협력, 다형성 등 알 수 없는 용어들이 잔뜩 등장하는 것을 본 경험이 있을 것입니다. 오늘 포스팅에서는 코드를 통해 객체 지향 기본 용어들을 정리하고 앞으로 코드를 작성할 때 의도적으로 이 내용을 떠올릴 수 있도록 도움을 주는 글을 작성하고자 합니다. 책임 책임 이란 객체가 맡아야하는 역할입니다. 한 User가 하나은행에 돈을 입금한다고 가정해봅시다. 비즈니스 상 User는 돈을 입금한다 는 역할을 갖게 됩니다. public class User { public void depositMoney() { //... } } 다음으로는 HanaBank라는 은행 객체를 만들겠습니다. 은행은 입금과 출금에 책임을 갖게 됩니다. public class HanaB.. 2022. 2. 27.
[Java] Stream docs 훑어보기 로또 미션을 진행하면서 의도적으로 Stream API를 사용하려고 노력했는데요. 지금까지 개념적 정립이 되지 않은 상태에서 Stream을 사용했다보니 어려움을 많이 겪었습니다. 오늘 포스팅에서는 Stream docs를 파헤쳐서 Stream에 대해 이해하고자 합니다. Stream이란? Stream은 컬렉션에서 map, reduce 처럼 요소의 스트림에 기능적 작업을 지원해주는 클래스입니다. int sum = widgets.stream() .filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum(); 위 코드를 보면, Collection의 인스턴스를 stream 소스로 변경하여 빨간색을 갖는 내부 객체의 무게 합을 구하는 reduction 과.. 2022. 2. 24.
[Java] 인스턴스를 캐싱하여 성능 개선하기 (feat. 로또) 오늘 포스팅은 빈번하게 사용되는 인스턴스를 캐싱하여 성능을 개선하는 방법에 대해 작성해보고자 합니다. 정적 팩토리 메소드의 장점을 떠올리면 이름을 가질 수 있다 가 가장 먼저 떠오릅니다. 하지만 정적 팩토리 메소드에는 또 다른 장점이 존재합니다. 바로 자주 사용하는 인스턴스를 캐싱하여 성능을 개선하는 방법인데요. Integer 코드를 통해 이 내용을 확인해봅시다. public static Integer valueOf(int i) { if (i >= IntegerCache.low && i 2022. 2. 23.
[Java] 의존성, 응집도, 결합도를 알아보자 의존성 응집도 결합도 객체 지향 공부를 하게되면 필연적으로 의존성, 응집도, 결합도에 대해 듣게됩니다. 직접 자바 코드로 이 내용들을 학습하고 객체지향 코드를 작성할 때 이들이 왜 중요한지 알아봅시다. 의존성 의존성은 코드레벨에서는 확인할 수 없지만 코드가 실행되는 지점에 객체간 의존관계가 존재하는 경우 이를 동적 의존성으로 분류합니다. 아래 코드를 보겠습니다. public class Developer implements Employee{ @Override public void doWork() { System.out.println("개발자가 일을 합니다."); } } class Designer implements Employee { @Override public void doWork() { System... 2022. 2. 21.
[Java] Java 예외처리와 StackOverFlow 인테리어 커머스 플랫폼 인턴 면접을 보며 "StackOverFlow는 왜 발생하나요?" 라는 질문을 받았습니다. 저는 정말 단순하게 메모리가 초과했기 때문입니다. 라고 답변했으나 아마 이는 썩 만족스럽지 못한 대답이었을 것입니다. 오늘은 그날의 기억을 되돌리며 StackOverFlow라는 에러를 알아보고 이어서 Java가 어떻게 예외를 처리하는지 살펴보고자 합니다. StackOverFlow StackOverFlow는 VM에서 런타임 시점에 발생시키는 에러로 application이 너무 깊이 재귀를 할 때 발생하는 에러입니다. 아니 그런데 왜 이름이 RecurseTooDeepError 이런게 아닌가요? 이렇게 이름이 생긴 이유는 Java의 메모리 구조를 통해 유추해 볼 수 있습니다. Java에서 인자나 지.. 2022. 2. 21.