전체 글

초보 개발자의 지식 공유의 장
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()); }
객체 => 상태와 행위가 존재함 (개체(entity)와 개체들에 관련된 연산을 제공하는 메서드들의 모음을 나타냄) 원시 타입(primitive type)을 제외하면 자바 언어의 다른 모든 변수들은 참조 타입이다. 객체는 참조 타입이다. 라는 말은 정확히 무엇을 의미하는 것일까? 원시 타입은 int i = 42로 변수가 선언되었을 때, 42라는 값이 메모리에 할당된다. 그러면 프로그램은 나중에 int j = i 라는 형식으로 i에 의해 표현되는 값이 j에 할당되었을 때 메모리의 다른 위치에 같은 값을 할당한다.(일단 할당하고 나면 i는 j의 값에 영향을 미칠 수 없다.) 그렇다면 객체 타입은 어떻게 동작할까 자바에서 new ArrayList(20)같은 구문은 데이터를 저장하는데 필요한 영역을 메모리에 요구..
Queue는 선입선출(First In First Out)자료구조를 구현한 자바 인터페이스이다. 새 원소를 추가하는 add, 오래된 원소를 제거하는 remove, 가장 오래된 원소를 반환하지만 삭제하지 않는 peek 메서드가 있다. Deque(`덱(deck)`이라고 발음함)는 Queue 인터페이스의 확장이며 자료구조의 양끝에 원소를 추가하고 삭제할 수 있다. @Test public void queueInsertion(){ final Queue queue = new LinkedList(); queue.add("first"); queue.add("second"); queue.add("third"); Assert.assertEquals("first", queue.remove()); Assert.assertEqu..
리스트 정렬된 컬렉션 List 인터페이스를 사용 배열과 리스트의 관계 배열 JVM은 배열이 생성될 때 반드시 배열의 크기를 알아야 한다. final String[] stringArray = new String[3]; 배열의 원소에는 인덱스 값을 이용해서 직접 접근할 수 있다.(랜덤 접근 Random Access) 배열 전체를 사용 중일 때 원소를 추가하려면 배열 크기를 늘려야 한다. 배열 복사 후 새로운 배열이 원본 배열의 주소를 가리키도록 재할당 @Test public void arrayCopy(){ int[] integers = {0, 1, 2, 3, 4}; int[] newIntegersArray = new int[integers.length + 1]; System.arraycopy(integers..
정렬되지 않은 리스트 검색 시 주어진 값에 맞는 원소를 찾기 위해선 리스트를 모두 찾아봐야 한다. 하지만 리스트가 정렬되어 있다면 이진 탐색(binary search)를 사용하는 것이 매우 효율적이다 성능 - O(logn) public static boolean binarySearch(final List numbers, final Integer value){ if(numbers == null || numbers.isEmpty()){ return false; } final Integer comparison = numbers.get(numbers.size()/2); if(value.equals(comparison)){ return true; } if(value < comparison){ binarySearc..
maven 외부 라이브러리 jar 추가 방법 (로컬 레파지토리 추가) => groboutils가 maven Repository에 존재하지 않아 프로젝트에 추가 후 사용 ConcurrentHashMap put, get 시 thread-safe 하지만, 로직이 들어간다면 thread-safe 보장을 할 수 가 없음. synchronized가 필요 lombok @Slf4j lombok @EqualsAndHashCode 위와 관련된 것들은 좀더 찾아 정리가 필요
문서정리의 중요성 내가안다고해서 모든 사람들이 아는 것은 아니다. 내가 있지않거나, 처음 업무를 하는 사람들을 위해 문서정리 및 공유는 필수라고 생각된다. 가끔은 개발보다 문서정리가 더 중요하다고 생각이 든다.
깡냉쓰
평범한 개발자 노트