분류 전체보기
[Book] 4장) 역할, 책임, 협력
학습 내용 역할, 책임, 협력에 대한 이해 협력 행동을 결정 하는 것은 협력이다. 협력의 구성 연쇄적인 요청과 응답 책임 어떤 대상의 요청은 그 대상이 요청을 처리할 책임을 가진다. 분류 하는 것 ( doing ) 객체 생성, 스스로 계산 다른 객체를 제어 아는 것 ( knowing ) 정보, 객체를 아는 것 자신이 유도하거나 계산할 수 있는 것에 아는 것 메시지 다른 객체에게 요청을 보내는 것 역할 책임의 집합을 역할 이라 한다. 추상화 된 책임 추상화로 인해 대체 가능한 역할 이 됨 정리 상태와 행위에 대해 고민하기 전에 협력을 먼저 고민 한 다음 협력 안에서 어떠한 책임과 역할을 수행 할 지 고민해라.
[JAVA] 스레드 ( Thread )
스레드를 알아보기 전에 동기식 처리 방식과 비동기식 처리 방식을 알아야합니다. 생각 정리 동기식 처리 방식 프로세스 하나가 끝야 다음 프로세스로 넘어가는 것이 동기식 처리 방식이다. 제조업에서 조립공정1 이 끝나야 다음 조립공정2로 넘어가는 것으로 비유하면 좋겠네요. 문제점은 조립공정1의 공정 시간이 오래 걸릴수록 다음공정이 계속 대기한다는 것이 문제점입니다. 그러므로 완조립체가 늦게 나오는 문제점이 생길 수 있겠죠? 동기식 처리 방식 예제 코드 1부터 100까지 출력해주는 예제 코드이다. 자식 메서드 2개를 만들고 메인 프로세스를 1개를 만들어 찍어보자. print1 이 먼저 처리가 되고 다음 print2 , main 순서대로 처리가 끝나면 다음 순서를 처리 할 것이다. 결과는 생략.. 비동기식 처리 ..
[Book] 2장) 이상한 나라의 객체
책을 읽으며 저의 생각을 정리한겁니다. 오류가 있을 시 피드백 부탁드립니다. 학습내용 상태, 행동, 식별자에 대한 이해 객체의 의인화, 은유에 대한 이해 상태와 행동의 상호관계 객체의 행동은 상태에 영향을 받는다. 상태도 행동에 상태를 변화 시킨다. 왜? 책임 주도 설계가 나온것인가? 1강에서 설계를 한 것을 바탕으로 설명하자면 인바디라는 객체에 행동은 인바디를 계산해주는 것이다. 그러면 계산할때 어떤 상태가 필요할까?? 체지방률과 골견근량에 필요한 키와 몸무게, 회원이름을 출력해야할 이름도 필요하다. 이처럼 행동을 먼저 생각하고 상태가 뭐가 필요한지 생각을 해보면 설계할때 수정을 덜하고 편하다. 왜? 상태라는 개념이 나온것인가? 문제 -> 과거에 행동과 현재의 행동의 결과를 어떤 행동을 했는지 잘 알지..
[JAVA] Optional
학습내용 Optional 을 왜 사용하는가?? Optional 사용법 1. 우리는 Optional 을 왜 사용하는가?? Book 이라는 domain 이 있습니다. Book 의 name 이 null 일 때 무엇일 일어날까? NullPoint Exception 이라는 Error 가 출력 될 것인데 이 부분의 에러를 잡으려면 조건문으로 null 이 들어오지 않게 코드를 작성했을겁니다. 이런식으로 null 조건을 만들어 감싸줍니다. 하지만 Otional 을 사용한다면 null 체크를 위한 조건문을 만들지 않아도 되고 Otional로 감싸주어 null 을 예방할 수 있습니다. 객체가 null 이면 터지겠죠? Optional 이라는 케이스, 컨테이너?? 껍질?? 로 감싸서 null 이 터지는걸 보호합니다. 정리 단..
[JAVA] 해싱 동작 방식
학습 내용 해시 코드의 동작 방식을 이해합니다. 불변 객체 public class Book { private final String name; public Book(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { return "Book{" + "name='" + name + '\'' + '}'; } @Override public boolean equals(Object o) { return this.name.toString().equals(o.toString()); } @Override public int hashCode() { int sum = 0; f..
[JAVA] 성능을 개선한 Map 구현 (해싱)
학습 내용 MyMap 을 좀 더 개선하여 구현 해싱 내장된 맵에 따라 키를 나누므로 각 맵의 엔트리 개수는 줄어듭니다. 그러므로 메서드의 속도는 향상됩니다. private List maps; public MyBetterMap(int k) { makeMaps(k); } protected void makeMaps(int k) { maps = new ArrayList(k); for (int i = 0; i < k; i++) { maps.add(new MyMap()); } } k 를 인자로 받아 k 개의 엔트리를 ArrayList 에 저장합니다. 핵심 키를 살펴보고 어느 내장 맵에 투입할지를 결정하는 방법입니다. 새로운 키를 추가하면 맵 중에서 하나를 고르고, 같은 키가 있다면 그키를 어느 맵에 넣었는지 기억해..
[JAVA] Map 구현
학습 내용 Map의 구조를 알수 있습니다. 추가 key, value 추가 조회 key 에 해당하는 value 값 조회 삭제 key 에 해당하는 entry 값 삭제 MyEntry.class private K key; private V value; public MyEntry(K key, V value) { this.key = key; this.value = value; } @Override public K getKey() { return key; } @Override public V getValue() { return value; } @Override public V setValue(V value) { return this.value = value; } } Entry 인터페이스를 구현하였습니다. MyMap ..
[JAVA] Stack 구현
학습 내용 스택의 대표적인 3가지 기능을 구현 할 수 있습니다. 시간 복잡도 분류를 할 수 있습니다. 추가 요소 추가 삭제 요소 삭제 조회 최상단 요소 반환 필드 private E[] array; private int top; private int capacity; public MyStack(int size) { array = (E[]) new Object[size]; capacity = size; top = -1; } 추가 1. 요소 추가 public void push(E element) { if (isFull()) { E[] bigger = (E[]) new Object[array.length * 2]; System.arraycopy(array, 0, bigger, 0, array.length); a..
[JAVA] LinkedList 구현
학습 내용 추가 요소 추가 지정 인덱스에 요소 추가 조회 인덱스의 값 조회 인덱스의 값을 비교 수정 지정 인덱스에 요소 수정 삭제 요소 삭제 초기화 ( size, node clear ) Node.Class public class Node { public E data; public Node next; public Node() { this.data = null; this.next = null; } public Node(E data) { this.data = data; this.next = null; } public Node(E data, Node next) { this.data = data; this.next = next; } } data 는 요소를 뜻하고 next 는 다음 node 를 참조하는 뜻을 가집니..
[JAVA] ArrayList 구현
개인 정리 내용이니 틀린 부분이 있을 수도 있습니다. 피드백 해주시면 감사드리겠습니다. 학습 내용 기능 구현을 하며 시간 복잡도를 구별 해보자. 1. 구현 상세 내용 추가 요소 추가 인덱스 지정하여 요소 추가 수정 인덱스 지정하여 요소 수정 조회 해당 인덱스의 값 조회 해당 인덱스의 값과 target 값을 비교하여 인덱스 값 반환 삭제 인덱스를 설정하여 값 삭제 요소 전체 삭제 필드 int size; private E[] array; public MyArrayList() { size = 0; array = (E[]) new Object[10]; } ArrayList 와 비슷하게 기본 Size 를 10으로 설정 하였습니다. 추가 1. 요소 추가 public boolean add(E e) { if (size..
[JAVA] 선택 정렬 ( Selection Sort )
학습 내용 Big-O 선택 정렬 구현 Big-O O(1) : 입력 데이터의 크기에 상관없이 일정한 연산 시간이 걸리는 알고리즘. O(n) : 입력 데이터의 크기에 비례하여 연산 시간이 걸리는 알고리즘. O(n^2) : 입력 데이터의 크기에 제곱하여 연산 시간이 걸리는 알고리즘. 이외의 여러 종류들이 있습니다. 선택 정렬 구현 1. 자리 바꿈 public static void swapElement(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; // test 성공 } 입력받은 배열의 요소를 자리 바꿈을 하는 로직입니다. 입력 받은 데이터의 크기에 상관없이 일정한 연산 시간을 갖는 로직이여서 O(1) 의 시간 복잡도를..
[JAVA] @애노테이션 ( Annotation )
학습 내용 애노테이션 정의 방법 표준 애노테이션 메타 애노테이션 애노테이션 정의 방법 interface 앞에 @를 붙여 주면 애노테이션을 정의 할 수 있습니다. 하지만 지금 생성한 애노테이션은 아무런 정보가 없는 빈 껍데기 일 뿐 입니다. 여기서 정보를 더 추가 해봅시다, 디폴트 값으로 애노테이션 안에 값을 지정을 할 수도 있고 애노테이션을 사용하고 그 값을 정의 할 수도 있습니다. 표준 애노테이션 @Override -> 부모에게 상속 받은 기능들을 사용 할 때 사용하는 애노테이션입니다. 메서드 이름이 부모의 메서드 이름과 달라지면 컴파일 시 에러가 발생됩니다. @Deprecated -> 필드의 멤버나 메서드 중에 우리가 사용하지 않는 것들을 삭제하지 않고 이 애노테이션을 사용하여 더 이상 사용하지 않을..
[JAVA] 열거형 ( enums )
열거형 ( enums ) 서로 관련된 상수를 편리하게 정의 하기 위한 것으로 기능이 추가 되었고, JDK 1.5 부터 기능이 추가 되었습니다. 기존의 열거 패턴과 문제점 기존에 상수를 정의하는 방법은 이와 같다. 카드의 무늬와 숫자 2가지 타입의 상수들을 정의 해놓고 같은 값들을 비교해보면 같다고 나온다. 결과는 맞지만 의미상으로 타입이 다르므로 다르다 라는 결과가 나와야만 한다. 타입을 다르게 하여 상수를 정의 하였는데 비교 해보면 같은 값이 나온다라는 타입의 불안정한 코드라 문제점을 알아 볼 수 있습니다. Enum 사용 타입을 정의하여 생성해줍니다. 기존의 코드보다 더욱 간결해진 것을 볼 수 있고 타입 체크를 컴파일 시에 확인 할 수 있고 런타임 실행 전에 에러를 미리 예방을 할 수 있습니다. 컴파일..
[java] 객체지향 프로그래밍 설계 원칙 - SOLID
이번 글은 SOLID 원칙에 대해 적어 보겠습니다. 제가 이해한 내용이 맞지 않다면 피드백 부탁드립니다. SOLID 란 무슨 단어 일까? 객체지향 프로그래밍에서의 5대 설계 원칙이 있습니다. 단어 부터 살펴보겠습니다. SRP ( 단일 책임 원칙 : Single Responsibility Principle ) OCP ( 개방 폐쇄 원칙 : Open Close Principle ) LSP ( 리스코브 치환 원칙 : The Liskov Substitution Principle ) ISP ( 인터페이스 분리 원칙 : Interface Segregation Principle ) DIP ( 의존성 역전 원칙 : Dependency Inversion Principle ) 위의 5가지로 정의 되어 있습니다.. 순서대로..