전체 글 50

[Effective Java] item22 - 인터페이스는 타입을 정의하는 용도로만 사용하라!

인터페이스는 타입을 정의하는 용도로만 사용하라!계속해서 인터페이스 이야기가 나온다. 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다고 한다. 즉, 클래스가 특정 인터페이스를 구현하면, 클라이언트로부터 자신의 인스턴스로 할 수 있는 것을 알려주는 것이다. 그리고, 인터페이스는 오직 이 용도로 사용해야 한다.다만 가끔 일부 사람들이 상수 인터페이스라는 것을 사용하는데, 이는 오직 static final 필드로만 가득 찬 인터페이스이다. 그러나 명시해야 할 점은, 우리가 클래스 내부에서 사용하는 상수는 외부 인터페이스의 역할이 아니다. 어찌보면 내부 API 구현의 일부를 바깥에 공개해버리는 꼴이 된다! 게다가 상황에 따라 해당 상수를 사용하지 않더라도 컴파일 과정에서의 하위호환을 위해 해당..

Programming/Java 2021.03.16

빅데이터 2주차 내용 정리

3.1 근접 이웃 탐색의 응용 자카드 유사도 (Jaccard Similarity): 교집합의 상대적인 크기로 관찰되는 집합의 유사성 집합 S와 T가 있으면, 이 둘의 자카드 유사도는∣S∩T∣/∣S∪T∣| 로 정의한다. (둘의 자카드 유사도는 SIM(S, T)로 나타내기도 함.) 일반적으로 웹이나 기사 모음 같은 말뭉치에서 유사한 문서들을 찾는 일은 자카드 유사도로 다루기 적합한 종류의 문제인데, 이는 문자 기반 유사성 (Character-level Similarity) 임에 유의하자. 즉, 의미가 유사한 것이 아닌 문자 자체의 유사도를 비교하는 것이다. (사용하는 예시: 표절, 미러페이지, 출처가 유사한 기사의 필터링) 단순히 글의 유사도만 걸러내는 것이 아니라, 협업 필터링 (Collaborative ..

[Effective Java] item21 - 인터페이스는 구현하는 쪽을 생각해 설계하라!

인터페이스는 구현하는 쪽을 생각해 설계하라!기존에 존재하는 인터페이스에 메소드를 추가하면 매우 높은 확률로 컴파일 오류가 날 것이다. 그것을 구현하는 클래스마다 해당 메소드를 몽땅 구현해야하기 때문이다!앞에서 디폴트 메소드를 배웠기에, 그것을 사용하면 되는거 아니냐고 할 수 있지만 현실적으로 모든 메소드가 디폴트 메소드가 될 수 없기 때문에... 또한 디폴트 메소드는 구현 클래스에 대한 정보 없이 상위 레벨에서 작성되는 부분이기 때문에, 구현 클래스에서 정확히 작동할 것이라는 보장도 없다.자바 8부터는 람다식을 활용하기 위해 디폴트 메소드들이 많이 추가되었지만, 그걸 보고 우리도 디폴트 메소드를 막 만들어도 된다고 생각하면 큰일난다! 이유는 윗 문단에서 적어놨고...심지어 자바 라이브러리에 있는 디폴트 ..

카테고리 없음 2021.03.08

[Effective Java] item20 - 추상 클래스보다는 인터페이스를 우선하라!

추상 클래스보다는 인터페이스를 우선하라!자바가 기본적으로 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스로 나뉜다. 일반적인 자바 입문서를 보면 인터페이스는 메소드 구현이 불가하다고 나와있지만 정말일까? 사실 인터페이스도 default method를 갖고 있다!public interface Calculator { public int plus(int x, int y); public int minus(int x, int y); default int defaultPlus(int x, int y) { return x + y; } public static int staticMinus(int x, int y) { return x - y; } }추상 클래스의 경우 extends를 사용해야 하고, 인터페이스의 ..

Programming/Java 2021.03.08

[Effective Java] item19 - 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라!

상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라!개발을 할 때 상속이 편리한 친구이긴 하지만, 외부 클래스를 상속하는 과정에서 발생하는 문제들도 분명 있다. 그렇기에 상속을 할 가능성을 조금이라도 열어놓는다면 문서화를 해 두는 것을 권장한다.일반적으로 상속을 하면 가장 먼저 하는 것 중에 하나가 메소드 재정의일 것이다. 그러나 상속을 하는 사람들이 이 메소드의 구체적인 역할이 무엇인지 판단해야 하므로, 상속용 클래스는 재정의할 수 있는 메소드들을 내부적으로 어떻게 이용하는지 문서로 남길 필요가 있다. 구체적으로 어떤 순서로 내부 과정이 이뤄지는지, 각각의 결과가 어떤 결과를 만들어내는지 까지 작성하면 좋다.자바 API 문서의 메소드 설명을 보면, 가끔 특이한 문구가 붙어있다.Imple..

Programming/Java 2021.03.08

[KAKAO BLIND 2020] - 가사 검색

이 문제의 정해는 트라이로 알려져 있는데, 개인적으로는 코테를 준비하기 위해 트라이를 배우는 것은 권장하지 않는다. 카카오 블라인드에서 트라이로 풀 수 있는 두 문제는 모두 트라이가 아닌 다른 방법으로 해결할 수 있고, 코드도 훨씬 짧다. 실제로 코딩테스트 과외를 할 때도 절대 이 문제를 트라이로 풀 생각을 하지 말라고 말했고, 아래 풀이는 수업을 하면서 실시간으로 작성한 코드이다. 어차피 가능한 경우는 AAA??나 ??AAA 같이, 앞과 뒤에 ?가 붙는 문자들이다. 그런데 생각해보자. AAA??는 AAAAA, AAAAB, .... AAAZY, AAAZZ가 가능할 것이다. 그렇다면 이것은 AAAAA ~ AAAZZ 의 사이에 들어있는 문자를 모두 검색하면 되는 것이고, 다시 말해서 (AAAZZ의 upper..

[Effective Java] item15 - 클래스와 멤버의 접근 권한을 최소화하라.

클래스와 멤버의 접근 권한을 최소화하라! 객체지향의 요소를 떠올리면, 캡슐화 (Encapsulation) 이라는 말이 있다. 해당 요소의 의미는 프로그램 내 같은 기능을 목적으로 작성된 코드를 모아서 보이지 않게 숨기는 것을 의미한다. 그런데 왜 캡슐화를 해야할까? 객체지향적인 이야기이긴 하지만, 몇 가지 장점을 생각해보자. 여러 컴포넌트를 병렬로 개발할 수 있기 때문에 개발 속도를 향상시킨다. 컴포넌트를 변경할 수 있고, 특정 컴포넌트를 분리해서 디버깅 할 수 있다. 다른 컴포넌트와 분리되어 있는 만큼, 성능 최적화를 위해선 특정 컴포넌트만 떼어서 최적화 하기에도 편하다. 독자적으로 동작하는 컴포넌트를 개발했으면, 해당 컴포넌트를 다른 프로젝트에서도 사용할 수 있기 때문에 재사용성이 올라간다. 시스템을..

Programming/Java 2021.02.18

[Effective Java] item14 - Comparable을 구현할지 고려하라.

Comparable을 구현할지 고려하라! 의도하던 아니던, 값을 비교해야 하는 경우는 많다. 가령 정렬을 한다거나, 이분 탐색을 한다거나, TreeMap/Set을 쓴다면... 따라서 새로운 객체를 만들게 된다면 Comparable을 구현할지 고려해야 한다. Comparable은 어떻게 생겼을까? public interface Comparable { public int compareTo(T o); } 결국 Comparable을 구현한다는 것은 compareTo를 정의하는 것과 마찬가지 일 것이다. equals를 열심히 공부했다면, compareTo의 규약도 쉽게 읽힐 것이다. 이 객체의 주어진 객체의 순서를 비교하는데, 이 객체가 주어진 객체보다 작으면 음의 정수를, 같으면 0을, 크면 양의 정수를 반환한..

Programming/Java 2021.02.18

[Effective Java] item13 - clone 재정의는 주의해서 진행하라.

clone 재정의는 주의해서 진행하라! clone은 원본 객체의 필드값과 동일한 값을 가지는 새로운 객체를 생성하는 메소드이다. protected native Object clone() throws CloneNotSupportedException; 앗! native다. 또한 CloneNotSupportedException을 던지는데, 이는 clone을 사용할 수 없는 객체에서 clone을 사용하려고 할 때 발생하는 예외일 것이다. 그렇다면 clone을 쓸 수 있을지, 없을지 어떻게 판단할 수 있을까? 바로 Cloneable을 구현했는지 확인하면 된다. 그렇다면 Cloneable은 어떻게 생겼을까? public interface Cloneable {} 텅텅 비었다? 대체 이게 무슨 역할을 할까? 구현되어 ..

Programming/Java 2021.02.17

[Effective Java] item12 - toString을 항상 재정의하라.

toString을 항상 재정의하라!Object의 toString의 결과물은 다음과 같다.Chicken@12a58z단순히 클래스 이름@16진수로 표기한 해시코드 형식인데, 우리가 객체를 print 할 때 저런 결과물을 바라고 출력하는게 아니지 않을까?규약에 따르면 toString은 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 한다.사실 일반적으론 toString은 그 객체가 가진 모든 주요 정보를 반환하는게 최고다. 최소한 디버깅용으론 좋지 않을까? 문제는 객체의 사이즈가 크다면 담기 힘들 것이다.대한민국 치킨집이 20000개가 넘는데, 해당 자료를 담은 객체가 있다고 가정하자. 모든 데이터를 출력하도록 toString을 재정의하면 대참사가 날 것은 뻔하다! toString을 재정의 할 때는..

Programming/Java 2021.02.12