2019/05/02

빌드 이식성 이식성(portability)의 핵심은 특별한 수정이나 변경 없이도 다양한 환경에 배포하고 운영하는 것이 가능해야 한다는 것을 뜻한다. 빌드 이식성은 서로 다른 환경에서 추가적인 설정 파일의 변경을 하지 않더라도 빌드가 가능한 환경을 만드는 것이다. ex) 운영체제(OS)가 다른 환경(윈도우, 리눅스, 맥 등) JDK 버전이 다른 환경에서도 추가 설정 없이 가능한 애플리케이션을 빌드할 수 있어야 하는 것을 의미한다. 대부분 프로젝트를 하다보면 개발 환경(로컬, 개발, 운영 서버)에 따라 설정이 달라질 때가 있기 때문에 개발 환경마다 다른 빌드 스크립트를 만들지 않으면서 하나의 빌드 스크립트에서 서로 다른 설정이 가능해야 한다. 데이터베이스 설정 로깅 설정 프레임워크 관련 설정 서버 설정 컴파..
2019/03/20 - [프로그래밍 노트/JAVA] - [JAVA] 동기화된 컬렉션(thread-safe collection), 병렬처리 가능한 컬렉션 Hashtable 클래스는 동기화할 수 있으며 병렬처리에 효율적이다. 하지만 오버헤드 때문에 성능이 상당히 저하된다. HashMap은 오버헤드의 문제는 없지만, 동기화할 수 없다는 특징이 있다. 따라서 동시성 요구든 용도에 맞게 map 클래스를 사용해야 한다. 병렬 환경에서의 Map 인터페이스를 사용하는 곳에는 ConcurrentHashMap(자바5이상)를 사용하는 것이 좋다.
LinkedHashMap은 HashMap클래스의 속성을 모두 갖고 있으며, 맵 안 원소들의 순서도 보존한다. @Test public void showLinkedHashmapProperties(){ final LinkedHashMap linkedHashMap = new LinkedHashMap(); linkedHashMap.put(1, "One"); linkedHashMap.put(2, "Two"); linkedHashMap.put(3, "Three"); linkedHashMap.put(4, "Four"); linkedHashMap.put(5, "Five"); Assert.assertEquals("Five", linkedHashMap.get(5)); // map처럼 동작 // 삽입 순서를 보장 final ..
자바 7은 try/catch/finally 문과 함께 유용하게 사용할 수 있는 문법을 제공한다. AutoCloseable 인터페이스를 구현하면 아래와 같은 코드를 작성하여 자원 종료를 걱정할 필요가 없어진다. @Test public void testResourceHandling(){ try(final FileReader reader = new FileReader("c://tmp/test.txt")){ ... }catch(IOException e){ // 예외처리 } } try-with-resource가 없을 때는 finally를 사용하여 자원을 명시적으로 종료(close)시켜야 한다. (finally구문 안에 try-catch문 등등 상당히 보기 좋지 않은 코드를 사용해야 할 때가 있다.) AutoClo..
final Integer intObject = 42; 자바5 이전에는 위의 코드를 컴파일러가 에러로 인지했다. 하지만 자바5버전에서는 컴파일러가 오토박싱(Autoboxing)이라는 기능을 사용해 int와 같은 참조타입은 Integer타입 값이라는 것을 알기 때문에 오류가 나지 않는다. 자바5 이전에는 new Integer(42); 또는 Integer.valueOf(42);를 사용했어야 했다. (Integer.valueOf()가 더 효율적인데 이유는 상수풀에 캐시를 하고 있기 때문이다.) 그렇다면 오토박싱(Autoboxing)의 반대말인 언박싱(Unboxing)이란 무엇일까? Float, Integer, Boolean 같은 박스된 참조타입을 원시타입인 float, int, boolean 타입으로 변경하는 ..
class A class B extends A B는 A의 하위 타입이다. 하지만 List는 List의 하위타입이 아니다. 제네릭 타입을 사용할 때 가끔 클래스의 하위 타입을 받아들여야 하는 경우가 있다. 아래의 소스를 보자 public static Stack pushAll(final List list){ final Stack stack = new Stack(); for(A a : list){ stack.push(a); } return stack; } public void test(){ final ArrayList listA = new ArrayList(); final ArrayList listB = new ArrayList(); for(int i=0; i
2019/04/23 - [프로그래밍 노트/JAVA] - [JAVA] String 객체와 리터럴 (메모리관련) => 이 글을 읽으면 이해가 더 쉽게 된다. String 리터럴은 실행할 때 JVM이 특별히 관리를 하게 된다. JVM은 String 리터럴과 불변성에 어떤 도움을 줄까? 클래스가 로드되면 모든 리터럴이 상수 풀(constant pool)에 위치하게 된다. 그리고 String 리터럴은 풀 안의 같은 상수를 참조해서 이루어지는데 이를 String 인터닝(Interning)이라고 한다. 인터닝은 이 풀 안에 있는 상수들이 JVM에서 실행되는 모든 클래스를 참조할 수 있게 한다. String 인턴 풀은 컴파일할 때 단지 String 리터럴을 가져오는 것이 아니라, intern 메서드를 이용해서 Stri..
String 클래스에서 String 객체의 값을 변경하는 것처럼 보이는 모든 메서드는 실제로는 String 값을 변경하는 것이 아니라, 새로운 String 인스턴스를 반환하는 것이다. String의 값은 절대 변하지 않으며 바꿀 수 없다. @Test public void stringChanges(){ final String greeting = "Good Morning, Corn"; final String substring = greeting.substring(0, 4); assertTrue(substring.equals("Good")); assertFalse(greeting.equals(substring)); assertTrue(greeting.equals("Good Morning, Corn")); } ..
String 객체를 표현하는 값은 char의 배열이다. public final class String implements java.io.Serializable, Comparable, CharSequence { @Stable private final byte[] value; .... } JVM과 컴파일러는 특정 상황에서 특별한 방법으로 String 객체를 처리한다. 참고) 2019/04/23 - [프로그래밍 노트/JAVA] - [JAVA] String 객체와 리터럴 (메모리관련) [JAVA] String 객체와 리터럴 (메모리관련) 항상 읽어도 이해하기 힘들 부분이었으나, 이번 기회에 확실히 이해하고 정리를 하게 되었다. Java에서 String을 생성하는 방식은 두가지가 있다. new 연산자를 이용하는 ..
객체 지향 개발의 두가지 핵심 개념은 아래와 같다. 다형성(Polymorphism) 상속(Inheritance) 다형성(Polymorphism) 같은 자료형에 여러 가지 객체를 대입하여 다양한 결과를 얻어내는 성질 (동일한 조작방법으로 동작시키지만 동작방법은 다른 것을 의미한다.) 상속(Inheritance) 부모 클래스에서 클래스의 행동과 정의를 가져다 사용할 수 있게 해준다. 기존의 정의와 상태를 상속받아 사용할 수 있으며, 새로운 행동을 추가하거나 새로운 타입에 대한 행동을 오버라이드 할 수 있다. 정사각형(Square)는 사각형(Rectangle)이다. (is -a rectangle) 상속을 이용해 정사각형 만들기 public class Rectangle { private final int wid..
깡냉쓰
'2019/05/02 글 목록