Java

Java

리플렉션이란? (+ @GetMapping 만들어보기)

리플렉션이란 구체적인 클래스 타입을 알지 못하더라도 해당 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API를 의미합니다. 리플렉션은 '반사'라는 의미를 가지는데, 클래스 정보를 마치 거울에 반사된 것처럼 확인할 수 있다는 점에서 리플렉션이라는 이름을 가지게 되었다고 합니다. 자바 코드는 컴파일되면 바이트코드로 변환됩니다. 그리고 이런 바이트코드들은 클래스로더를 통해 JVM 내 메모리 영역에 저장되게 됩니다. 리플렉션은 이런 JVM 메모리 영역으로부터 클래스 정보를 읽어 다양한 작업을 가능하게 해 줍니다. Spring을 사용하면 흔히 접하는 @RequestMapping, DI(Dependency Injection) 컨테이너, JPA의 @Entity까지 모두 리플렉션을 통해 만들어진 기..

Java

I/O Stream이란 무엇일까? (+ Stream이란?)

Tomcat 구현 미션을 진행하면서 IO Stream이라는 개념을 다루게 되었습니다. 이번 아티클에서는 Stream이란 무엇인지, 그리고 IO Stream은 무엇이며 어떻게 사용될 수 있는지까지 알아보겠습니다. Stream이란? 우선 Stream이란 무엇인지부터 알아보겠습니다. Stream이란, '흐르는 시냇물' 이라는 사전적 의미를 가집니다. 그리고 이는 컴퓨터 공학 분야에서 자주 사용되는데, 주로 데이터, 패킷, 비트 등의 일련의 연속성을 갖는 흐름을 의미한다고 합니다. 보다 쉽게 이해하기 위해 실생활의 예시를 한번 들어보겠습니다. Streaming(스트리밍)이라는 키워드는 많이 들어보셨을 것 같습니다. 우리가 영상을 보거나 음악을 들을 때 자주 접하던 개념입니다. 영상을 보거나 음악을 들을 때 데이..

Java

Java: 커스텀 예외 사용에 대한 생각

표준 예외 & 커스텀 예외란 표준 예외, 커스텀 예외란 무엇일까? 표준 예외는 쉽게 말해, JDK가 제공하는 예외 클래스들을 의미한다. 커스텀 예외는 개발자가 직접 표준 예외를 커스텀 해(상속 받아) 만든 예외를 의미한다. 그렇지만 둘은 완전히 다른 개념이 아니다. 두 종류의 예외 모두 '예외 상황의 문맥을 제공'한다는 같은 목적을 갖고, '어떻게 예외 상황의 문맥을 제공할 수 있는지'의 방법만 다르다. 그렇다면 언제 무엇을 사용할지에 대한 생각을 안해볼 수 없을 것 같다. 주관적인 내용이 많이 포함되어 있는 글임을 미리 밝힙니다. 커스텀 예외 사용 시 어떤 이득을 취할 수 있는가 커스텀 예외를 사용하는 경우, 다음과 같은 이득이 존재할 수 있다. 도메인 집약적인 표현이 가능하다 예외는 도메인의 정보일까..

Java

Java: Throwable 소개 & API

왜 Throwable을 알아야 하는가 모든 예외 및 에러는 Throwble의 하위 클래스이다. 또한, 모든 표준 예외 및 에러 클래스는 Throwable에 정의된 메소드 및 프로퍼티 이외에 아무것도 추가적으로 정의하지 않는다. 그저 Throwable의 생성자를 호출해 초기화만 명시할 뿐이다. 커스텀 예외는 어떻게 정의하느냐에 따라 추가적인 기능이 존재할수도 있습니다. 다음은 흔히 사용하는 IllegalArgumentException의 실제 내부 구현이다. 앞서 말했다시피, super 키워드를 통해 부모 클래스의 생성자만 호출할 뿐, 추가적인 기능은 없다. public class IllegalArgumentException extends RuntimeException { public IllegalArgum..

Java

Java: enum의 구현방식 알아보기

enum 객체는 compile time에 정의된다 우선 구현방식을 알아보기에 앞서 결론부터 말하자면, enum 객체는 compile time에 정의된다. 왜 그래야만 할까? 사실 enum은 Java에서 객체의 성질을 띠고는 있지만, 본질은 상수이다. 상수는 특성상 인스턴스마다 생성될 필요가 전혀 없다. 오히려 컴파일 타임에 한번만 바인딩되는 것이 바람직하다. 리터럴이나 매직 넘버를 상수화할 때도, static final 키워드를 사용하지 않는가? enum도 마찬가지로 상수의 특성이 강하기 때문에 compile time에 정의되는 것이라 예측할 수 있다. 어떻게 compile time에 정의되는 걸까? 내부적으로 어떤 구조이길래, 자꾸 compile time에 정의되는 것이라 하는걸까? 운송수단을 나타내는..

Java

Java: enum 소개 및 API 파헤쳐 보기

enum이 왜 필요할까? enum이 필요한 이유는 무엇일까? 우리는 프로그래밍하다 보면, 어떤 값에 의미를 부여해야 할 때가 있다. 매직 넘버, 리터럴 등은 코드를 읽는 클라이언트가 의미를 파악하기 힘들다. 따라서 우리는 상수를 사용해 값에 적절한 의미를 부여하는데, 상수는 의미적으로 군집되어 있는 경우가 많다. 예를 들어, 요일 별 메뉴를 반환하는 식단표 어플리케이션을 생각해보자. 식단표 어플리케이션 // 식단표 어플리케이션 public String getMenu(String day) { if (day.equals("MONDAY")) { return "순두부찌개"; } else if (day.equals("TUESDAY")) { return "짜장면"; } else if (day.equals("WEDN..

Java

Java: equals & hashCode

필요성 프로그램에서 일반적으로 '같다' 라는 의미를 어떻게 나타낼까? 가장 쉬운 방법은 동등 연산자(==)를 사용하는 방법이다. 그러나 이 방법은 원시형에 대해서만 유효하다. (원시형에 대해서는 나중에 따로 작성해보겠다) 원시형이 아닌 참조형에 대해 동등 연산자를 사용하는 경우는, 내부 값이 아닌 메모리 주소값에 대한 비교이다. 그렇다면 객체가 같다는 것은 어떻게 정의할 수 있을까? 이런 문제를 해결하기 위해 equals & hashCode가 등장했다. equals란 equals는 모든 객체들의 조상, Object에 정의되어 있는 메소드이다. 필요에 따라 모든 객체들은 이를 오버라이딩해 사용할 수 있다. equals는 어떤 객체가 다른 객체와 '동등한지'를 비교할 수 있는 수단이다. 여기서 동등하다는 키..

Java

Java: 동일성과 동등성

사전적 의미 동일성(Identity)과 동등성(Equality)은 무엇이 다를까? 우선 사전적 의미를 살펴보겠다. 동일성(identity)은 다른 사물과 대립구분되면서 변함없이 똑같이 존재하는 개개의 성질을 말한다. 동등성(equality)은 두 가지 이상의 개체나 개념이 서로 동일한 것으로 취급될 수 있는 상태를 의미한다. 사전적 의미만 봐서는 쉽게 와닿지 않는 것 같지만, 그래도 의미를 유추해보자면.. 동일성의 경우, 두 사물이 완전히 똑같은 상태로 존재하는 경우라고 생각해볼 수 있다. 즉, 완전히 같은 경우이다. 동등성의 경우, 완전히 똑같은 사물은 아니지만 동일하게 취급될 수 있는 상태를 의미하는 것 같다. 예를 들어, 자동차 공장에서 자동차들은 '동등하다'고 할 수 있다. 하지만 그렇다고 해서 ..

Java

Java: Varargs와 Heap Pollution

가변 인자란? 가변 인자란, Java 5 이후로 도입되었으며, 임의의 수를 가진 파라미터를 받을 때 유용하게 사용할 수 있다. public int adder(int a1, int a2, int a3) { return a1 + a2 + a3; } 파라미터가 3개라면 위와 같은 덧셈 계산기를 만들 수 있다. 100개의 인자를 더하고 싶다면 어떻게 할까? 파라미터가 100개인 adder 메소드를 오버로딩할까? 파라미터가 10000개가 된다면? 이 시점에서 생각해볼 수 있는 것이, 배열 혹은 리스트이다. 배열 또는 리스트로 값을 받을 수만 있다면 iterator로 반복 접근도 가능하며, 오버로딩에 대해 걱정할 필요가 없다. 따라서 Varargs(가변 인자)를 사용한다. public int adder(int.....

teo_99
'Java' 카테고리의 글 목록