추상화(Abstraction) Abstract 라는 단어의 어원은 라틴어 abstractus 에서 왔고, 이 단어는 from 의 의미를 가진 ab- 와 draw off 의 의미를 가진 trahere 의 합성어 이다. 어원에서 부터 이 단어의 의미를 생각해 보면 무엇으로 부터 어떤 것을 빼낸다는 것이다. 쉽게 생각해 보면 어떤 대상으로 부터 필요한 것을 추출한다는 의미를 가지고 있다고 볼 수 있다. OOP에서 말하는 추상화(Abstraction)의 개념도 이 단어가 가진 의미를 그대로 담고 있다. 복잡한 시스템에서 필요한 부분만 추출하여 단순화 하여 본질적이고 공통적인 부분만 남게 만드는 것이다. 사용자는 추상화를 통해 단순화 된 개념을 사용해 사용자의 본래 목적에 더 집중할 수 있게 된다. 캡슐화(Enc..
내부 클래스에 static이 권장되는 이유는 크게 두 가지이다. 첫째, static으로 선언되지 않은 내부 클래스는 외부 클래스에 대한 숨은 참조를 저장해야 하기 때문에 이를 위한 시간/공간적 복잡도가 증가해 성능이 떨어진다. 둘째, 내부 클래스가 외부 클래스에 대한 숨은 외부 참조를 갖기 때문에 가비지 컬렉션이 제대로 이루어 지지 않아 메모리 누수가 발생할 수 있다. 이러한 이유로 내부 클래스에서 외부 클래스의 인스턴스 변수에 접근하지 않는 경우 static으로 내부 클래스를 선언하는 것이 좋다. 이 때, static으로 선언된 내부 클래스는 외부 클래스에 대한 숨은 외부 참조를 갖지 않는다. 숨은 외부 참조를 가진다는 의미는 다음 코드를 보면 쉽게 이해할 수 있다. public class OuterC..
이펙티브 자바에서 소개하는 싱글턴을 만드는 방법은 다음 세 가지이다. public class Item3 { public static final Item3 INSTANCE = new Item3(); private Item3() {} // ... } 첫번째 방법은 생성자를 private 으로 감추고 유일한 인스턴스에 접근할 수 있는 수단으로 public static final 멤버를 하나 만드는 것이다. 생성자는 초기화 할 때 딱 한번만 호출되기 때문에 이 클래스의 인스턴스는 시스템 전체에 하나뿐임을 보증할 수 있다. 물론 리플렉션을 통해 생성자를 호출할 수는 있지만 생성자에서 예외를 던지도록 만들어서 방어할 수있다. 이 방법은 싱근턴임을 명확하게 파악할 수 있고 비교적 코드가 간결해 지는 장점이 있다. p..
보통 클래스의 인스턴스를 생성할 때 new 키워드를 통해 생성자를 사용하는 방법입니다. 하지만 생성자를 사용하는 방법은 때로는 조금 귀찮을 수 있습니다. 생성자 아규먼트의 순서를 헷갈린다거나 때로는 아규먼트가 너무나 많아서 그냥 코드 자체가 지저분해 지는 것이 싫을 수도 있겠죠. 이럴 때 사용할 수 있는 것이 정적 팩더리 메서드(static factory method)를 사용하는 것입니다. public static final List emptyList() { return (List) EMPTY_LIST; } 위 코드는 실제 Collections 클래스에 포함되어 있는 텅 빈 리스트를 반환하는 정적 팩터리 메서드 입니다. 이런 방법에는 장점과 단점이 모두 존재합니다. 장점을 먼저 알아보겠습니다. 1. 이름..
무작위로 0에서 99까지의 숫자들 중 10개를 뽑아서 오름차순으로 정렬한 뒤 출력하는 함수를 작성해 봅시다. 다음과 같은 코드를 만들 수 있겠죠. public void printRandomNumbers() { Set cache = new HashSet(); List result = new ArrayList(); while(result.size() < 10) { int number = (int) (Math.random() * 100); if (cache.contains(number)) { continue; } cache.add(number); result.add(number); } Collections.sort(result); for (int number : result) { System.out.print..
지금 다니는 회사에 입사해서 가장 처음 받게 된 코드리뷰에서 지적당한 것이 열거 타입을 비교하는 부분 이었습니다. public enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE } 저는 위와 같이 enum 으로 선언된 열거 타입의 변수들을 선언하고 다음과 같이 비교했습니다. public String getMessage(Size first, Size second) { if (first.equals(second)) { return "It's same size."; } return "It's not same size."; } 하지만 한 팀원 분께서 enum은 equals 메서드를 쓸 필요가 없다고 하셨습니다. 열거 타입은 인스턴스들이 고정되어 있으므로 간단하게 ==을 사용하면 ..
public interface Student { String getName(); } public interface Citizen { String getName(); } public class Brad implements Citizen, Student{ @Override public String getName() { return "Brad"; } } Student Interface 와 Citizen Interface 를 동시에 구현하는 Brad 라는 클래스가 있습니다. 각 인터페이스는 getName 이라는 문자열을 반환하는 메서드를 가지고 있고 이 인터페이스를 구현하는 Brad 클래스는 반드시 getName 메서드를 오버라이드 해야 합니다. Brad 클래스 에서는 getName 을 오버라이드 하고 있습니다..
- Total
- Today
- Yesterday
- 코딩의 기술
- RESTful
- 자바스크립트개론
- java
- html
- 동적계획법
- 자바스크립트 개론
- REST API
- 몰라서망신
- 유지보수
- CONVENTIONS
- 크롬
- 마르코프 연쇄
- 마르코프
- 야근
- Count
- 문장 생성기
- Spring in Action
- 로그
- 경고
- 전략패턴
- 디자인패턴
- DP
- 클린코드
- restful api
- Warning
- Markov
- GROUP BY
- was
- markov chain
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |