java

public class IntAryQueue { private int max; // 큐 용량 private int num; // 현재 데이터 수 private int[] que; // 큐 본체 private int front; private int rear; // 예외 : 큐가 비어 있음 class EmptyIntQueueException extends RuntimeException{ } // 예외 : 큐가 가득 참 class OverflowIntQueueException extends RuntimeException{ } public IntAryQueue(int capacity){ num = front = rear = 0; max = capacity; try { que = new int[capacity]..
public class IntStack { private int max; // 스택 용량 private int ptr; // 스택 포인터 private int[] stk; // 스택 본체 // 예외 : 스택이 비어 있음 class EmptyIntStackException extends RuntimeException{ } // 예외 : 스택이 가득 class OverflowIntStackException extends RuntimeException{ } // 생성자 public IntStack(int capacity){ ptr = 0; max = capacity; try { stk = new int[max]; }catch(OutOfMemoryError e){ max = 0; } } public int pu..
메서드 이름을 신중히 짓자 항상 표준 명명 규칙을 따라야 한다. 이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 짓는 게 최우선 그다음 목표는 개발자 커뮤니티에서 널리 받아들여지는 이름 사용(긴 이름은 피하자!) 편의 메서드를 너무 많이 만들지 말자 모든 메서드는 각각 자신의 소임을 다해야 한다. 메서드가 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다. (인터페이스도 마찬가지) 매개변수 목록은 짧게 유지하자 매개변수는 4개 이하가 좋다. 일단 4개가 넘어가면 매개변수를 전부 기억하기가 쉽지 않다. 같은 타입의 매개변수 여러개가 연달아 나오는 경우는 특히 해롭다. 사용자가 매개변수 순서를 기억하기 어려울뿐더러, 실수로 순서를 바꿔 입력해도 그대로 컴파일되고 실행..
자바개발자라면 한번씩 필수로 알아두어야 하는 부분이다. (Naming Rule, Naming Convention 이라고도 한다.) 자바의 명명 규칙은 크게 철자 와 문법 두 범주로 나뉜다. 철자 규칙 은 패키지, 클래스, 메서드, 필드 타입 변수의 이름을 다룬다. 이 규칙들은 특별한 이유가 없는 한 반드시 따라야 한다. 철자 규칙 패키지(package) 패키지와 모듈이름은 각 요소를 점(.)으로 구분하여 계층적으로 짓는다. 요소들은 모두 소문자 알파벳 혹은 (드물게)숫자로 이뤄진다. 조직 바깥에서도 사용될 패키지라면 조직의 인터넷 도메인 이름을 역순으로 사용한다. (edu.cmu, com.google) 패키지 이름은 나머지 해당 패키지를 설명하는 하나 이상의 요소로 이뤄진다. (일반적으로 8자 이하의 짧..
private final List cheesesInStock = ...; /** * @return 매장 안의 모든 치즈 목록을 반환한다. * 단, 재고가 하나도 없다면 null을 반환한다. */ public List getCheese(){ return cheesesInStock.isEmpty() ? null : new ArrayList(cheesesInStock); } 위의 코드의 문제점은 null을 반환한다는 것이다. 재고가 없다고 해서 특별히 취급할 이유는 없는대도 말이다.. 만약에 재고가 없을 경우 null을 반환하는 것을 고집한다면, 이 메소드를 사용하는 모든 클라이언트는 아래와 같은 방어 코드를 넣어줘야 한다. List cheeses = shop.getCheese(); if(cheeses != ..
자바가 람다를 지원하면서 API를 작성하는 모범 사례도 크게 바뀌었다. 상위 클래스의 기본 메서드를 재정의해 원하는 동작을 구현하는 템플릿 매서드 패턴의 매력이 줄었다. ⇒ 함수 객체를 받는 정적 팩터리나 생성자를 제공 LinkedHashMap을 생각해보자. LinkedHashMap의 protected 메서드인 removeEldestEntry 를 재정의하면 캐시로 LinkedHashMap을 사용할 수 있다. 맵에 새로운 키를 추가하는 put 메서드는 이 메서드를 호출하여 true가 반환되면 맵에서 가장 오래된 원소를 제거하게 로직을 추가하면 된다. public class MyLinkedHashMap extends LinkedHashMap { @Override protected boolean removeE..
람다가 익명 클래스보다 나은 점 중 가장 큰 특징은 간결함이다. 그런데 람다보다도 더 간결하게 만드는 방법이 있으니 바로 메서드 참조(method reference)이다. 아래 코드는 키가 맵안에 없다면 키와 숫자 1을 매핑하고, 이미 있다면 기존 매핑 값을 증가시킨다. map.merge(key, 1, (count, incr) -> count + incr); 깔끔해 보이지만, 매개변수인 count와 incr은 크게 하는일 없이 공간을 꽤 차지한다. (두 인수의 합을 단순히 반환하는 역할을 한다.) 자바8의 Integer 클래스는 이 람다와 같은 기능이 같은 정적 메서드 sum을 제공하기 시작했다. 따라서 위의 코드는 아래코드로 변경할 수 있다. map.merge(key, 1, Integer::sum); ..
Optional을 어떻게 하면 효율적으로 사용할 수 있을까? 전통적인 null check 코드를 살펴보자 NullPointException 방어패턴 중첩 null 체크 if(a != null){ B b = a.getMember(); if(b != null){ C c = b.getAddress()); if(c != null){ ... } } } return "incheon"; return 하기 if(a == null) return "incheon"; B b = a.getMember(); if(b == null) return "incheon"; C c = b.getAddress(); ... 어떻게 하면 null처리를 효과적으로 어떻게 할 수 있을까? Optional 자바8에는 Optional이라는 것이 생겼..
Format 클래스 형식 클래스는 java.text 패키지에 포함되어 있다. 숫자 형식 : DecimalFormat 날짜 형식 : SimpleDateFormat 문자열 형식 : MessageFormat 숫자 형식 클래스(DecimalFormat) DecimalFormat df = new DecimalFormat("#,###.0"); String result = df.format("1234567.89"); 기호 의미 패턴 예 1234567.89 변환결과 0 10진수(빈자리는 0으로 채움) 0 0.0 0000000000.0000 1234568 1234567.9 0001234567.8900 # 10진수(빈자리는 채우지 않음) # #.# ##########.#### 1234568 . 소수점 #.0 1234567..
Function 함수적 인터페이스는 매개값과 리턴값이 있는 applyXXX() 메소드를 가지고 있다. 이 메소드는 매개값을 리턴값으로 매핑(타입 변환)하는 역할을 한다. 인터페이스명 추상 메소드 설명 Function R apply(T t) 객체 T를 객체 R로 매핑 BiFunction R apply(T t, U u) 객체 T, U를 객체 R로 매핑 DoubleFunction R apply(double value) double를 객체 R로 매핑 IntFunction R apply(int value) int를 객체 R로 매핑 IntToDoubleFunction double applyAsDouble(int value) int를 double로 매핑 IntToLongFunction long applyAsLong(..
깡냉쓰
'java' 태그의 글 목록 (2 Page)