본문 바로가기

Java

(13)
모니터와 락에 대하여 자바에선 자체적으로 동기화 메커니즘을 지원한다. C언어와는 달리 언어 자체에서 지원하는 잠금이 있는건 특이했다. 사전지식 잠금 방식에 따른 구분 Busy - Wait: CPU 자원을 소모하면서 락을 얻을 때까지 대기함. Block and Wakeup: 임계 영역에 들어가면, 프로세스 상태가 wait 상태로 변하며, 자원을 얻을 때까지 대기함. 모니터란 ? 모니터란 자바에서 지원하는 락 방법 중 하나이다. synchronized 키워드를 붙여 구현할 수 있으며, 클래스, 메서드에 붙일 수 있다. 각각을 살펴보면, 클래스에 붙인 경우 인스턴스 자체가 동기화되므로, 오직 하나의 스레드만이 인스턴스에 접근할 수 있다. 메서드에 붙인 경우 해당 메서드를 실행할 때 오직 하나의 스레드만이 실행할 수 있다. 동작 방..
리플렉션에 대하여 리플렉션이란 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API를 말한다. 왜 리플렉션을 사용하는가? 리플렉션은 애플리케이션 개발보다는 프레임워크, 라이브러리에서 많이 사용된다. 프레임워크, 라이브러리는 사용하는 사람이 어떤 클래스를 만들지 모른다. 이럴 때 동적으로 해결해주기 위해 리플렉션을 사용한다. 대표적인 사용 예로는 스프링의 DI, Proxy, ModelMapper 등이 있다. 구체적인 클래스를 모르는데, 어떻게 접근할 수 있는가? 자바의 클래스 파일들은 바이트코드로 컴파일되어 static과 함께 method 영역에 저장되므로 클래스 이름만 알면 클래스의정보를 찾을 수 있다. 예시 @Controller @RequestMapping("/..
Enum에 대하여 자바의 Enum은 다른 언어들과는 다르게 클래스 형태로 관리된다. 상수의 의미를 담고 있지만 단순히 상수를 넘어, 상태와 행위를 스스로 관리하는 객체지향의 의미로 확장된 클래스로 볼 수 있다. 기본 사용법은 다음과 같다. public enum MENU{ PIZZA, COLLA //각각 0, 1의 상수로 관리된다. } 그런데 특이하게도 상수를 싱글톤 객체로 관리한다. 즉, 상수와 함께 다른 프로퍼티들을 넣을 수 있다. 다음 예시를 보자. public enum Menu{ PIZZA("피자"), COLLA("콜라"), MARATANG("마라탕") private final String menuName; Menu(String menuName){ this.menuName = menuName; } } 상수 옆에 문자..
제네릭에 대하여 제네릭을 소개하기에 앞서 왜 쓰는지부터 파악해보자. 컴파일 단계에 형이 다르면 컴파일을 중지하고 에러를 반환하는걸 강타입 언어, 그렇지 않은걸 약타입 언어라 한다. 자바는 강타입 언어이다. 그런데 열심히 클래스를 설계하고 보니 int형만 처리하는게 아닌 double, 심지어 객체까지도 처리해야하는 상황이 생기면 각 타입마다 메서드를 새로 만들어야 할 것이다. 코드의 중복은 최악이다. 따라서 이를 해결하기 위해 제네릭이란걸 만들었다. 제네릭은 무엇인가 제네릭의 사전적 의미는 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법이다. 예를 들어 List 클래스는 Integer, Double 상관없이 받을 수 있다. 그렇다면 아무거나 상관없이 받는게 제일 좋은거 아닌..
일급 컬렉션에 대하여 일급 + 컬렉션의 의미로 나누어 생각했다. 일급의 의미는 일급 객체의 의미 (위키백과)를 참조했는데, 다음과 같다. 컴퓨터 프로그래밍 언어 디자인에서, 일급 객체란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통 함수에 인자로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다. 말이 어렵지만 정의는 간단하다. 변수에 할당(assignment)할 수 있다. 다른 함수를 인자(argument)로 전달 받는다. 다른 함수의 결과로서 리턴될 수 있다. 컬렉션은 자바에서 목록성 데이터를 처리하는 자료구조를 통칭한다. 일급 컬렉션이란 이러한 컬렉션을 자료구조로만 사용하는게 아닌 목적성을 가지고 의미있게 만드는게 목적이라 볼 수 있다. 그렇다면 왜 목적..
Optional에 대하여 자바를 사용하면서 Null Pointer Exception를 만나본 적이 있는 사람들은 null 처리를 위한 분기를 작성할 것이다. 자바 8에서 이러한 분기를 코드 흐름은 가독성에 방해가 된다 생각하여 Optional을 도입하였다. Optional은 한 마디로 정의내린다면 null일 수도 있는 값이다. 즉, 값이 없거나 (null) 있거나 둘 중 하나란 소리다. Optional에 구현된 메서드들은 null이 아니라면 동작하도록 구현되어 있다. 이를 통해 복잡한 null 처리 분기를 작성하지 않고, 순차적인 흐름으로 코드를 읽도록 도와준다. 예제를 통해 살펴보자. public class Manager{ List cars = new ArrayList(); public Car getCar(int idx){ i..
Stream에 대하여 자바 8에서 스트림이란 기능이 추가되었다. 스트림이란 한 번에 한 개씩 만들어지는 연속적인 데이터 항목들의 모임이다. 유닉스 계열 운영체제의 명령어 중 파이프라인과 유사한 동작을 하는데, 출력의 스트림은 입력 스트림이 될 수 있다. 본격적으로 스트림에 대해 알아보자. 명령을 파이프라인으로 처리하면 무엇이 좋길래 추가한걸까 자바에서는 우리가 하려는 작업을 고수준으로 추상화해서 일련의 스트림으로 만들어 처리할 수 있는게 목적이라 생각한다. (마치 데이터베이스 질의처럼) 연속된 요소: 스트림은 컬렉션과 마찬가지로 특정 요소 형식으로 이루어진 연속된 값 집합의 인터페이스를 제공한다. 컬렉션은 자료구조이므로 시간과 공간의 복잡성과 관련된 요소 저장 및 접근 연산이 주를 이루지만, 스트림에서는 filter, sor..
Java의 static method는 왜 오버라이딩 되지 않는가 Java Static Method는 왜 오버라이딩 되지 않는가? static 키워드로 선언한 대상들은 JVM의 method 영역 (static 영역)에 들어간다. new 키워드로 선언한 대상들을 JVM의 heap 영역에 들어간다. static method는 객체의 인스턴스와 연결되지 않고, 모든 인스턴스가 method 영역을 통해 공유하는 구조이기 때문에 동적 바인딩을 수행할 수 없다. (method 영역도 마찬가지) 그렇다면 static method는 왜 사용하는가? 사실 static method는 객체지향 관점에서 별로 좋지 못한 설계이다. 객체들이 메시지로 주고 받는 컨셉이 static method는 전역적으로 공유되기 때문에, 성립하지 않기 때문이다. 그럼에도 사용하는 이유는 내 기준이지만 클래스..
오늘의 질문 : Java의 Enum은 왜 생성자가 있는가? 자바의 Enum엔 특이하게도 생성자가 있다. 내가 주로 다루던 C++과는 다른 사용법이다. 일반적으로 Enum의 사용법은 상수를 열거하여 표현해야 할 때 주로 사용한다. 연관있는 상수들을 응집시키지 않고 열거하기만 하면 소스코드가 지저분해지고, 가독성이 떨어지기 때문이다. 자바에서는 왜 Enum에 생성자를 넣었을까. 이유를 알아보기 위해 C++의 Enum을 살펴보자. C++에서는 Enum에 상수 값만 할당할 수 있다. enum Type { TYPE1 = 1, TYPE2, TYP3 } 그런데, 정수가 아닌 문자열을 할당하고 싶다면? enum TYPE { TYPE1 = 1, TYPE2, TYPE3 } String TypeConverter(Type type) { switch(type) { case TYPE.T..
자바 어노테이션 스프링 프로젝트를 생성하면 @Component와 같은 키워드가 달려있는걸 볼 수 있다. 이걸 자바에선 어노테이션이라 부르는데, 클래스, 메서드, 변수에 달 수 있다고 한다. 어노테이션은 무엇인가? 어노테이션이란 프로그램에 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있다. 여기서 메타데이터란 어플리케이션이 처리해야 할 데이터가 아니라 컴파일 과정과 런타임에서 코드를 어떻게 컴파일하고 처리할 것인지에 대한 정보를 말한다. 이 메타데이터를 잘 이용하면 비즈니스 로직과 분리하여 대상의 유효성 검증, 값 주입, 역할 부여(기능 주입) 등을 수행할 수 있어 코드를 좀 더 깔끔하게 작성할 수 있게 된다. 어노테이션은 옵션에 따라 컴파일 전까지만 유효하도록 처리될 수 있고, 컴파일 시기에 처리될 수도 있고, 런타..