Java

    빌더

    이펙티브 자바 3판 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라 빌더 빌더는 인스턴스 생성 시에 제공해야할 선택적 매개변수가 많을 때 사용할 수 있는 방식입니다. 메소드를 연쇄적으로 실행하면서 파라마터 값을 받아오고, 최종적으로 build() 를 통하여 완성된 인스턴스를 반환합니다. 기존의 사용방식 ( 점층적 생성자 패턴, 자바빈즈 패턴 ) public class ComputerShop { private String CPU; private String Mainboard; private String Ram; private Long RamSize; private String Cooler; private String GraphicCard; private String Case; public Compu..

    정적 팩토리 메소드

    이펙티브 자바 3판 아이템 1. 생성자 대신 정적 팩토리 메소드를 고려하라 인스턴스 생성법 보통 클래스의 인스턴스를 생성하기 위해서는 public 생성자를 이용합니다. 이 생성자를 이용하여 인스턴스를 얻는 방법에 대해 문제점을 찾아보는 시각으로 접근을 해봅시다. 운이 좋으면 어떠한 상황에도 별다른 문제점이 없는 사용방법이 될 수도있고, 어쩌면 문제점을 발견하고 그 문제를 해결할 수 있는 다른 방법을 얻을 수 있을지도 모릅니다. 생성자를 이용한 인스턴스 생성의 문제점? 역시 예시를 직접 살펴보는 것이 더 잘 이해될 것이라고 생각하여 예시 코드를 작성해가며 생각해 보았습니다. 1. 생성된 인스턴스의 목적성 public class Order { private String menu; private Long pr..

    Optional

    자바 8에서 추가된 키워드입니다. 어떠한 작업의 결과로 null이 왔을 때, 이를 처리하기 위해서는 보통 if문을 사용하여 체크합니다. College Ahn = College.student(1234567, "ddings"); Integer age = Ahn.getAge(); if(age != null){ /* do something */ } 이런식으로 null을 체크하게되면, 컴파일 타임에 IDE가 알려주지 않기 때문에 사용자가 실수로 빠트리는 경우 + 코드 작성 시의 번거로움이 생깁니다. 한 두개의 경우는 별로 신경쓰이지 않더라도 null체크를 해야하는 값이 많아지면 많아질수록 사용자가 실수할 확률은 점점 상승하며, 코드의 가독성은 하락할 것으로 예상됩니다. Optional Optional을 사용하게 ..

    Stream

    Stream 자바 SE 8 버전에 추가된 기능으로 Collection에 저장되어있는 데이터를 탐색하고, 선별하여 최종적인 결과를 만들어내는 과정을 좀 더 간편하게 표현할 수 있는 방법입니다. Classes to support functional-style operations on streams of elements, such as map-reduce transformations on collections. 오라클 자바 docs에서는 컬렉션의 map에서 특정 데이터를 골라내는 것과 같은 연산을 함수스타일로 지원해주는 클래스라고 말하고있네요. 스트림은 데이터를 담고있는게 아니라, 데이터가 흐를 수 있는 통로에 해당하는 개념이며 스트림내의 모든 연산은 보통 한번만 수행되며 스트림연산을 거치더라도 원본데이터의 ..

    람다식

    목표 자바의 람다식에 대해 학습하세요. 학습할 것 (필수) 람다식 사용법 함수형 인터페이스 Variable Capture 메소드, 생성자 레퍼런스 람다식 람다 식은 자바 8 버전에서 추가된 기능입니다. 오라클 자바 튜토리얼에서는 람다식의 사용배경에 앞서 기존 익명클래스의 불편함에 대하여 얘기합니다. 하나의 메소드만 포함하는 인터페이스처럼 익명 클래스의 구현이 매우 단순할 경우 사용이 불편할 수 있다. 위와 같은 상황에서 불편함을 해결하기 위하여 등장한 기능이 람다식 이라고 합니다. 앞서 말한 하나의 메소드만 포함하는 인터페이스는 주로 함수형 인터페이스라고 부릅니다. 이런 함수형 인터페이스의 예시로 멀티쓰레드를 공부할 때 배웠던 Runnable 인터페이스가 떠올랐습니다. 람다식의 사용에 앞서서 기존 익명클..

    제네릭

    제네릭? 제네릭, 어노테이션, 스트림, 람다.. 자바를 접하게되면서 "이게 뭐지?" 라는 생각이 들게만든 키워드이다. 어노테이션은 기능을 가진 주석. 람다는 함수형 인터페이스를 간편하게 표현. 스트림은 작업의 흐름을 표현하는 방법. 자바 공부를 하게되면서 각각의 키워드를 나름대로 위와 같이 생각하게 되었다. 그렇다면 제네릭은 무엇일까? 제네릭은 클래스나 인터페이스 또는 메소드 정의 시에 이 자리에 사용될 타입을 호출이나 선언 시 지정해라. 를 표현하는 방법이다. 여기서 이런 종류에 프리미티브 타입은 올 수 없다. 제네릭이 사용된 List인터페이스를 보면 와 같이 표현된 부분을 찾을 수 있으며, 이 부분이 바로 제네릭이다. 이는 List를 선언할 때 E타입의 값을 가지도록 지정할 수 있다는 의미를 가진다고..

    입출력

    목표 자바의 Input과 Ontput에 대해 학습하세요. 학습할 것 (필수) 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O InputStream과 OutputStream Byte와 Character 스트림 표준 스트림 (System.in, System.out, System.err) 파일 읽고 쓰기 자바의 입출력 자바에서의 입출력은 Stream, Buffer, Channel 기반으로 작동합니다. 스트림( Stream ) 스트림(Stream) 이란, 데이터의 흐름 또는 데이터의 순서를 의미합니다. Source( 키보드 or 파일 etc.. )에서 InputStream을 이용하여 데이터를 읽어 들이고 OutputStream을 이용하여 Destination( 콘솔 or..

    리플랙션

    어떤 기능을 가졌을까 리플랙션은 JVM에서 실행중인 애플리케이션의 런타임 동작을 제어하고 수정할 수 있는 기능입니다. 클래스의 필드목록이나 메소드목록, 상속하고있는 클래스 등등에 대한 정보를 알아낼 수 있으며 이를 런타임에 수정하는 것 또한 가능합니다. 리플랙션은 private 접근지시자를 포함한 모든 멤버에 접근이 가능한 것처럼 강력한 기능을 지니고있어서 사용시에 주의가 필요합니다. 사용하는 방법 리플렉션은 특정 클래스의 인스턴스나, FQCN, 클래스명 등을 이용하여 사용할 수 있습니다. package me.ddings73; public class Child extends Parent{ public int A; } package me.ddings73; public class App { public st..

    클래스로더

    클래스파일을 읽는 과정 로딩 링크 초기화 로딩(Loading) 클래스 로더가 .class 파일을 읽고나서 알 수 있는 정보들을 메모리에 저장하는 단계. .class파일에서 알 수 있는 정보는 다음이 존재한다. 클래스 메소드 변수 인터페이스 Enum FQCN (Fully Qualified Class Name) ex : java.lang.String 메소드와 변수는 클래스내부에 존재하며, 인터페이스와 Enum은 전부 클래스의 일종이라고 볼 수 있기 때문에 로딩이 종료되면 클래스타입의 객체를 Heap 영역에 저장한다. Class Loader ( 클래스 로더 ) 클래스를 읽어들이는 일을하며, 클래스의 타입과 경로에 따라 특정 클래스를 로드하는 ClassLoader 가 결정된다. 클래스로더를 알아내기 위해서 ge..

    바이트코드?

    ByteCode 바이트코드란 가상컴퓨터에서 돌아가는 실행프로그램을 위한 이진 표현법입니다. 자바의 JVM을 학습하게 되면서 알게 된 개념으로, 기계어로 변환되기 이전에 JVM에서 동작하기위해 생성되는 .class 파일이 이 바이트코드에 해당합니다. D:\IdeaProjects\JavaLearn\src\main\java\me\ddings73>javap -c App.class Compiled from "App.java" public class me.ddings73.App { public me.ddings73.App(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return public static void main(j..