본문 바로가기

java

(28)
[Java8] 3. Optional Class 3. Optional ClassNPE(NullPointerException) 때문에 고생한 경험이 한 두 번이 아닐거라 생각한다. 그래서 Java8 에서는 하스켈, 스칼라 등의 함수형 언어에서 사용되고 있는 ‘선택형 값’ 개념의 영향을 받아 Optional 라는 새로운 클래스를 제공한다. 값이 없는 상황을 모델링하는 것이다. Optional은 선택형 값을 캡슐화하는 클래스이다. 값이 존재하면 그 값을 감싼다. 값이 없는 경우에는 Optional.empty 메서드로 Optional을 반환한다. empty 메서드는 Optional의 특별한 싱글턴 인스턴스를 반환하는 정적 팩토리 메서드이다. null 레퍼런스와 Optional.empty()는 의미상으로 비슷하지만 실제로 차이점이 많다. null을 참조하려 하..
[JAVA8] 1. 동작 파라미터화 전달하기 [JAVA 8] 1. 동작을 파라미터로 전달하기 메소드 내부에서 실행되는 동작이 유동적인 경우가 있다. 이러한 경우 오버로딩을 사용하여 해결할 수 있지만, 전달되는 파라미터가 동일한 경우 그럴 수 없다. 때문에 메소드 내부에서 if 문을 통해 해당하는 동작에 따라 실행되도록 해야 한다. 이것에는 실제 수행되어야 하는 비즈니스 로직과 상관없는 코드들을 생성하고, 실행해야 한다는 문제점이 있다. 더욱이 가독성은 지극히 떨어지며 그 메소드는 더이상 한 가지 일만 수행하지 않게 된다. 코드를 살펴보자. private List filter(List list) { List result = new ArrayList(); for (Apple apple : list) { if (apple.getColor().equals..
[JAVA Adv] Blocking I/O, ServerSocket, Socket 그리고 Thread Pool Blocking I/O, ServerSocket, Socket 그리고 Thread Pool성능에 영향을 미치는 결정적인 요인으로서의 I/O에는 크게 두 가지 I/O가 존재한다. 디스크에서 데이터를 읽어오는 I/O와 네트워크 통신에서 발생하는 I/O이다. 이 두 I/O 작업이 처리되는 속도는 CPU의 작업 처리 속도에 비해 매우 느리다. 그렇기 때문에 애플리케이션의 성능은 이 I/O 작업을 어떻게 처리하느냐에 달려있다고 할 수 있다. 그 중 네트워크 통신에 사용하는 Socket을 중심으로 I/O 방식을 알아보자. Socket소켓(Socket)의 정의를 다시 한 번 짚고 가자면, 소켓이란 데이터 송수신을 위한 네트워크 추상화 단위로 IP주소와 포트를 가지고 있으며 양방향 네트워크 통신이 가능한 객체다. 이 ..
[JAVA Adv] StringBuffer vs StringBuilder 그리고 String StringBuffer vs StringBuilder String 의 정체두 클래스의 차이를 알기 위해서 일단 String 객체의 정체를 짚어보고 가자. String 객체는 기본적으로 immutable 이다. 내부적으로 char[] 배열을 사용하고 있고 이 배열은 변경이 불가능하다는 뜻이다. 즉, Constant Pool에 문자열이 특정 상수로 저장되어 더 이상 변하지 않는, 변할 수 없는 값이 되는 것이다. (물론 참조 변수인 String 객체는 Heap 영역에 생성된다! String 객체 자체가 Constant Pool에 생성된다는 것이 아니다.) 이 String 객체에 문자열을 저장하고, + 연산자 또는 concat 메소드를 통해 새로운 문자열을 덧붙이려고 할 때는, 기존의 String 객체가 가리..
[Java] 자바의 기본적인 이슈들 5가지 #JAVA의 기본적인 이슈들 5가지 1. 다시 자바의 기본으로 JDK(Java Development Kit) : 자바 개발 도구 - JVM용 소프트웨어 개발 도구 JRE(Java Runtime Environment) : 자바 실행 환경 - JVM용 OS JVM(Java Virtual Machine) : 자바 가상 머신 - 가상의 컴퓨터 JDK를 이용해 개발된 프로그램은 JRE에 의해 가상의 컴퓨터인 JVM 상에서 구동된다. JDK가 JRE를 포함하고 JRE는 JVM을 포함하는 형태로 배포된다. JDK는 자바 소스 컴파일러인 javac.exe를 포함하고 있고,JRE는 자바 프로그램 실행기인 java.exe를 포함하고 있다. 2. 메모리는 어떻게 사용되는가 일반적인 프로그램은 이 프로그램에게 할당된 메모리 ..
[JAVA Adv] Annotaion 에 대해서, Annotaion (어노테이션인가, 애너테이션인가, 애노테이션인가)도입 배경 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시키기 위해서이다. 어노테이션 이전에는 주석을 사용하여 소스코드에 대한 설명을 적었고, 이 주석을 javadoc.exe라는 프로그램을 사용하여 문서를 작성하였다. 문법으로서 역할 어노테이션은 기본적으로 인터페이스이다. JEE 5부터 추가된 문법이며, 사전적 정의로는 주석이라는 의미를 갖고 있다. 주석과는 역할이 다르지만 주석처럼 달아 클래스에 특수한 의미를 부여하거나, 기능을 주입할 수 있고, 이 의미는 컴파일 타임 또는 런타임에 해석될 수 있다. 기존의 자바 웹 애플리케이션들은 구성과 설정값들을 외부의 XML 설정 파일에 명시하는 방법으로 프로그래밍..
[Java Adv] 16. Lambda Expression + Inner class, anonymous class 내부클래스란(inner class)? 말 그대로 클래스 내부에 선언된 클래스를 말한다. 두 클래스가 서로 긴밀한 관계에 있기 때문에 내부에 선언한 것이다. 내부 클래스를 사용하면 외부 클래스의 멤버들을 쉽게 접근할 수 있다. 이로 인해 코드의 복잡성이 감소하며 캡슐화를 할 수 있게 된다. 단, 내부 클래스는 외부 클래스를 제외하고 다른 클래스에서 잘 사용되지 않는 것이어야 한다. 익명 클래스(anonymous class) 내부 클래스에는 익명 클래스라는 것이 존재한다. 익명 클래스도 마찬가지로 이름 그대로의 역할을 수행한다. 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스로, 일회용 클래스인 것이다. 이름이 없기 때문에 생성자도 가질 수 없으며, 조상클래스의 이름이나 구현하고자 하는 인터페이스..
[JAVA] 15. Thread ( 스레드 ) 쓰레드 실행 중인 프로그램 을 프로세스라 한다. 프로세스 내부에 둘 이상의 쓰레드가 존재할 수 있다. 어떤 프로세스든 간에 쓰레드가 하나 이상 수행된다. 아무런 쓰레드를 생성하지 않아도 JVM을 관리하기 위한 여러 쓰레드가 존재한다. 왜 쓰레드라는 것을 만들었을까. 하나의 작업을 동시에 수행하려고 할 때 여러 개의 프로세스를 띄워서 실행하려면 각각 메모리를 할당해 주어야만 한다. 그에 반해, 쓰레드를 하나 추가하면 더 적은 메모리를 점유하게 된다. 어떤 작업을 할 때 단일 쓰레드로 실행하는 것보다는 다중 쓰레드로 실행하는 것이 더 시간이 적게 걸린다. 자바에서는 쓰레드도 하나의 인스턴스로 정의한다. 쓰레드는 쓰레드만의 main메소드를 지닌다. 단 이름은 main이 아니라 run이다. 쓰레드를 생성하는 방..