[Java] Enum이 철벽치는 방법
·
Java
들어가기 전에Effective Java 스터디를 진행하다가 [Item 3]. private 생성자나 열거 타입으로 싱글턴임을 보증하라에서 아래의 내용이 나왔다.싱글턴을 만드는 세 번째 방법은 원소가 하나인 열거 타입을 선언하는 것이다.public 필드 방식과 비슷하지만, 더 간결하고, 추가 노력 없이 직렬화할 수 있고, 심지어 아주 복잡한 직렬화 상황이나 리플렉션 공격에서도 제2의 인스턴스가 생기는 일을 완벽히 막아준다.출처 : Effective Java 3/E 해당 아이템을 담당한 발표자가 "왜 열거 타입이 리플렉션 공격으로부터 안전하다는 걸까요?"라는 질문을 던졌고 그에 대한 답변으로 자바는 열거 타입의 구조를 변경할 수 없게끔 리플렉션을 제한하기 때문이라는 설명을 들었다.  리플렉션은 런타임 시점에..
[Java] MessageFormat
·
Java
들어가기 전에 이번 프로젝트에서 Feed 기능을 구현하기로 했다. 아래와 같은 템플릿을 만들어놓고 일정 신청이 완료되면 해당 정보로 문자열을 치환해서 데이터를 가공해야 했다. [일정 신청] OOO님이 2023년 O월 OO일 O요일 20:00로 코칭 일정을 신청했습니다. 참고로 발신인 정보는 닉네임 변경과 같은 사유로 업데이트될 수 있어서 조회할 때 치환해서 보여주기로 하고 날짜 정보에 대한 치환만 했으면 됐는데 어떤 걸 사용하면 좋을까 찾다가 MessageFormat을 사용하기로 했다. MessageFormat MessageFormat은 원하는 위치에 지정한 문자열을 삽입할 수 있어서 위의 경우처럼 지정된 Template이 있고 값들만 변경해서 완성된 메시지를 얻고 싶을 때 사용하기에 알맞다. 사용할 때..
[Java] Object.clone()
·
Java
들어가기 전에 멘토링 시간에 clone()과 Clonable 인터페이스에 대해 제대로 답변하지 못했던 것이 생각난다. 멘티님과 같이 리마인드하면서 얕은 복사와 깊은 복사까지 짚고 넘어갔었는데 어제 정렬 알고리즘 문제를 풀다가 배열을 복사할 때 간단하게 사용하면서 다시 생각이 났다. 인터넷에 이 키워드로 정리된 글이 많아서 여러 개를 읽다가 java.lang.Object.clone 메소드라는 글을 보게 됐다. Object.clone()이 native 메서드라서 구현 코드가 나와있지 않은데 이 글을 통해서 관련 코드를 살펴볼 수 있었고, 인용하신 Thinking in Java의 내용을 통해 새로 알게되는 내용도 꽤 많았다. 참고로 추가하신 사이트들에서도 다른 개념들을 파악하는 데 도움이 돼서 이 글을 바탕으..
[Java] Object.hashCode()와 Hashing, 그리고 Hash Collision
·
Java
들어가기 전에 Object의 hashCode() 메서드는 객체를 구별하는 정수 값을 반환한다. hashCode() 메서드에도 equals() 메서드와 같이 규약이 존재하는데 해당 내용은 다음과 같다. 1. 자바 응용 프로그램이 실행되는 동안 동일한 객체에 대해 hashCode() 메서드가 두 번 이상 호출될 때 비교에 사용되는 정보가 수정되지 않는 이상 동일한 정수 값을 일관되게 반환해야 한다. 동일한 응용 프로그램이라고 할지라도 각각의 다른 실행에서 이 값은 다를 수 있다. 2. 두 객체에 대한 equals() 메서드 호출 결과가 true라면 hashCode() 메서드를 호출했을 때 동일한 정수 값이 반환되어야 한다. 3. 두 객체에 대한 equals() 메서드 호출 결과가 false라면 hashCod..
[Java] Object.equals()
·
Java
들어가기 전에 우리 눈에는 보이지 않지만 사실 모든 클래스들은 java.lang 패키지에 위치한 Object 클래스를 상속받고 있다. 클래스에 명시되어있지 않더라도 컴파일 시점에 상속 관계 설정을 해주기 때문이다. Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class. 그렇다면 자바는 왜 Object 클래스를 모든 클래스가 상속받게 했을까? 이유는 바로 Object의 메서드들에 있다. 배열을 포함한 모든 객체들은 Object 클래스의 메서드들을 구현하고 있다. 다시 말해서, 모든 클..
[Java] Socket에 관하여
·
Java
들어가기 전에 자바의 Socket에 대해 설명하기 전에 먼저 네트워크 관점에서 소켓을 알아보고자 한다. 기본적인 Socket의 개념에 대해 공부한 것을 정리하고자 하는 글이므로 자세한 송수신 과정이나 소켓 말소에 대해서는 다루지 않으며 모두 TCP 통신을 기반으로 작성되었다. 클라이언트가 서버와 데이터를 송수신하기 위해서는 OS의 내부에 있는 네트워크 제어용 소프트웨어인 프로토콜 스택을 이용해야 한다. 에서 소켓은 개념적인 것이어서 실체가 없다고 설명하면서 소켓 자체를 프로토콜 스택 내부에 데이터를 송수신 하기 위한 제어 정보를 저장하는 메모리 영역이라고 생각하면 된다고 이야기한다. 그러니까 데이터 송수신을 위한 연결의 양 끝점에 소켓이 위치하는 것이다. 실제로 아래의 데이터 송수신 의뢰 과정을 보면 이..
[Java] 다중 상속이 가지는 문제
·
Java
들어가기 전에 자바가 다중 상속을 지원하지 않는 이유는 무엇일까? James Gosling이 작성한 자바 백서 에 따른 자바의 특징을 먼저 살펴 보자. 자바는 단순하다. 객체 지향적이다. 분산 환경에서 사용된다. 인터프리터 언어이다. 견고하며 안전하다. 아키텍처에 중립적이다. 이식성이 있다. 높은 성능을 제공한다. 멀티스레드를 지원한다. 동적으로 처리가 가능한 언어이다. 이중 오늘의 주제와 연관된 특징은 바로 "SIMPLE"이다. Oracle Primary characteristics of the Java programming language include a simple language that can be programmed without extensive programmer training whil..
[Java] 컴포지션을 선택하는 이유
·
Java
들어가기 전에 p.243 같은 시점에 나온 맥북 프로의 4가지 모델이 있다고 하고, 각 모델을 처음부터 따로 디자인한다고 하면 엄청난 시간과 인건비가 소요될 것이다. 하지만, 하나를 제대로 만들어 놓고, 그것에서 파생되는 것들을 조금씩 바꾸어 판매하면 사용자는 기호에 따라 여러 모델을 살 수 있을 것이다. 자바에서의 상속도 바로 이와 비슷한 개념이다. 하나의 클래스를 잘 만들어 놓은 게 있으면, 그 클래스를 상속받아 내가 추가적인 기능을 넣을 수 있다. 자바에서는 코드의 재사용성을 위해 상속을 사용한다. 모든 클래스가 Object를 상속하는 이유가 Object에 클래스가 기본적으로 필요로 하는 메소드들을 모두 구현해 놓았기 때문인 것처럼, 하위 클래스가 필요로 하는 무언가를 상위 클래스가 가지고 있기 때..
[Java] 객체를 생성하는 다양한 방법
·
Java
들어가기 전에 p.191 자바는 클래스의 객체를 보다 간편하게 만들기 위해서 여러 가지 매개변수를 갖는 여러 생성자를 가질 수 있다. 자바에는 기본 생성자란 것이 있어서 개발자가 직접 생성자를 만들지 않아도 컴파일 시점에서 자동으로 생성해 준다. 하지만 특정한 매개변수 별로 생성자를 만들고 싶다면 개발자가 직접 전달 받고 싶은 매개변수를 정해 생성자를 만들어야 하는데 이때의 매개변수 개수는 제한이 없고, 생성자 또한 몇 개를 만들어도 상관 없다. 개인적으로 생성자에 대해 깊게 고민해 본 적이나 코드를 개선해야 하는 상황을 겪어본 적이 없어서 이렇게 제한 없이 생성되는 생성자를 어떻게 보완할 수 있을지에 대해 생각해보지 못했기 때문에 이 포스팅을 작성해 본다. 우선은 매개변수가 제각기 다른 생성자가 제한 ..