본문 바로가기

SW LAB/Java

코딩테스트 중요 포인트 요 근래 다양한 코딩테스트 문제를 풀면서 중요하거나 인지해야할 부분을 나열해보려 합니다. ​ ​ 1. 가장 중요한 것은 '문제 인지' 입니다. 문제에서 요구하는 것이 무엇인지를 정확히 파악해야합니다. 문제에 작성된 한 줄 한 줄 지문에 맞춰 코딩을 하게 되면, 특이 케이스에 걸려 결국 실패할 확률이 높습니다. ​ 2. 코드 작성 전 풀이 방안을 고민해야합니다. 풀이 방안 1안이 생각났다고, 바로 코드를 작성하는 것이 아니라 .. 적어도 더 나은 방법은 없을까 ? 생각하며 두, 세 가지 정도는 고민할 필요가 있습니다. 코드 작성 중, 다른 방안이 생각나서 급하게 수정하면.. 버그나 시간초과에 걸릴 확률이 높아질 것입니다. ​ 3. 유형에 따른 처리 방식 학습 스택, 큐, 리스트 등 선형 자료구조를 활용해야.. 더보기
Effective Java : (16) 추상 클래스보다는 인터페이스를 우선적으로 ! 추상 클래스보다는 인터페이스를 우선하라 (아이템 20) 자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스 두 가지 입니다. 자바 8부터는 인터페이스도 default method를 제공하여 구현 형태를 제공할 수 있습니다. 이 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점입니다. 자바는 단일 상속만 지원하니, 추상 클래스 방식은 새로운 타입을 정의하는 데 커다란 제약을 안게 되는 셈입니다. 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있습니다. Comparable, Iterable, AutoCloseable 인터페이스가 추가되었을 때 표준 라이브러리의 수많은 기존 클래스가 이 인터페이스들을 구현한 채 릴리스.. 더보기
Effective Java : (15) Composition 활용 상속 보다는 컴포지션을 사용하라 (아이템 18) 상속은 코드를 재사용하는 강력한 수단이지만 항상 최선은 아닙니다. 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만듭니다. 상위 클래스와 하위클래스를 모두 같은 프로그래머가 통제하는 패키지 안에서라면 상속도 안전한 방법입니다. 메소드 호출과 달리 상속은 캡슐화를 깨뜨립니다. 상위 클래스가 확장을 충분히 고려하고 문서화도 제대로 해두지 않으면 하위 클래스는 상위 클래스의 변화에 발맞춰 수정돼야만 합니다. public class InstrumentedHashSet extends HashSet { private int addCount = 0; ... @Override public boolean add(E e) { addCount ++; return super.ad.. 더보기
Effective Java : (14) Public 클래스의 접근자 메서드 Public 클래스에서는 Public 필드가 아닌 접근자 메서드를 사용하라 (아이템 16) 다음 코드는 어떤 단점이 존재할까 ? class Point { public double x; public double y; } 필드 x, y에 직접 접근할 수 있기 때문에 캡슐화의 이점을 제공받지 못하게 됩니다. API 수정하지 않고는 내부 표현을 바꿀 수 없음 불변식을 보장받지 못함 외부에서 필드에 접근할 때 부수 작업을 수행할 수 없음 따라서 각 필드를 private으로 선언하고 getter, setter를 활용하는 것이 일반적입니다. 하지만 package-private, private 클래스는 데이터 필드를 노출한다 해도 하등의 문제가 없습니다. 이 방식이 클래스 선언 면에서나 클라이언트 코드 면에서나 접근자.. 더보기
Effective Java : (13) 변경 가능성을 최소화한 클래스 설계 변경 가능성을 최소화하라 (아이템 17) 불변 클래스란 그 인스턴스의 내부 값을 수정할 수 없는 클래스를 말합니다. 예로 String, BigInteger, BigDecimal을 볼 수 있습니다. 불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉽고, 오류가 생길 여지도 적어 훨씬 안전합니다. 클래스를 불변으로 만들려면 다음 다섯 가지 규칙을 따르면 됩니다. 1. 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않습니다. 2. 클래스를 확장할 수 없도록 합니다. 상속을 받는 대표적인 방법은 클래스를 final로 선언하는 것이지만 다른 방법도 알아보겠습니다. 3. 모든 필드를 final로 선언합니다. 새로 생성된 인스턴스를 동기화 없이 다른 스레드로 건네도 문제없이 동작하게끔 보장하는데 필요합니.. 더보기
Effective Java : (12) try-with-resource 사용 try-finally 보다는 try-with-resource를 사용하라 자바 라이브러리는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많습니다. 안전망으로 finalize가 있지만 많은 문제가 있기 때문에 썩 좋지 않습니다. 전통적으로는 try-finally를 많이 사용하였습니다. static String readLine(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } } 하지만 자원을 하나 더 사용하게 되면 코드가 지저분하게 되고, close를 놓치기도 합니다. static v.. 더보기
Effective Java : (11) 클래스 멤버 접근 권한 최소화 클래스 멤버의 접근 권한을 최소화하라 어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐입니다. 잘 설계된 컴포넌트는 구현과 API를 깔끔하게 분리되어 있습니다. 정보 은닉, 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리입니다. 정보 은닉의 장점 시스템 개발 속도를 높입니다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문입니다. 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고, 다른 컴포넌트로 교체하는 부담도 적기 때문입니다. 정보 은닉 자체가 성능을 높여주지는 않지만, 성능 최적화에 도움을 줍니다. 완성된 시스템을 프로파일링해 최적화할 컴포넌트를 정한 다음 다른 컴포넌.. 더보기
Effective Java : (10) 객체 참조 해제에 신경써라 다 쓴 객체 참조를 해제하라 C, C++에서 메모리를 직접 관리하다가 가비지 컬렉터가 있는 Java로 넘어오면서 메모리 관리를 더 이상 하지 않는다고 생각하면 안됩니다. 메모리 누수는 여전히 발생할 수 있기 때문입니다. 메모리 누수 예 public class Stack { private Object[] elements; private int size = 0; ... public Object pop() { if (size == 0) throw new EmptyStackException(); return elements[--size]; } } 위 예에서 elements에 저장된 데이터를 pop을 했더라도, 여전히 elements에는 객체가 담겨 있습니다. 더 이상 사용하지 않더라도 말이죠. 따라서 다음과 같.. 더보기