2019/05

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..
정적(static)메서드와 변수는 클래스 내부에 정의하지만 인스턴스에는 속하지 않는다. 대개 클래스 이름을 통해 정적 메서드와 정적 변수에 접근한다. ※ 정적 메서드와 변수에 접근할 때는 클래스 이름을 이용하는 것을 추천 => 인스턴스를 이용해서 접근하면 혼란을 야기할 수 있기 때문이다. 인스턴스나 클래스 자신을 참조해서 클래스 멤버 변수를 관리할 수 있음을 보여주는 예 public class ExampleClass { public static int EXAMPLE_VALUE = 6; } @Test public void staticVariableAccess(){ assertEquals(ExampleClass.EXAMPLE_VALUE, 6); ExampleClass c1 = new ExampleClass(..
객체에 선언하는 final 키워드는 원시 타입에 선언한 final 키워드와 동일한 역할을 한다. 즉, 일단 할당이 되고 나면 메모리 위치가 변경되지 않는다. 단, 객체 참조는 변경할 수 없어도 객체 내부의 값들의 개별 값들이 final이 아니라면 변경할 수 있다. @Test public void finalReferenceChanges(){ final int i = 45; // i = 46; 컴파일 에러가 남 final List list = new ArrayList(); assertEquals(0, list.size()); list.add("add"); assertEquals(1, list.size()); list.clear(); assertEquals(0, list.size()); }
깡냉쓰
'2019/05 글 목록 (3 Page)