본문 바로가기
[Effecitve Java] 리플렉션보다는 인터페이스를 사용하자. [Effecitve Java] 리플렉션보다는 인터페이스를 사용하자. - 리플렉션은 여러모로 강력한 기능을 제공한다. 하지만 이런 강력함은 다음의 대가들을 수반한다. 컴파일 시점에 가능한 타입 확인의 장점이 없어진다. 재귀적인 접근을 필요로 하는 코드는 알아 보기 어렵고 길다. 처리 성능이 늦다. - 사실 리플렉션은 컴포넌트 기반의 어플리케이션 개발 도구용으로 설계되었다. 따라서 일반적으로 런타임에서는 리플렉션을 이용해서 재귀적으로 사용하면 안된다. - 리플렉션이 필요한 복잡한 애플리케이션은 다음과 같다. 클래스 브라우저 객체 조사기 코드 분석 도구 RPC - 리플렉션을 지극히 제한된 형태로만 사용하여 비용이 거의 수반되지 않도록 한다면 리플렉션의 많은 장점을 얻을 수 있다. 예를 들어 컴파일 시점에는 쓸.. 2017. 2. 13.
[Effective Java] int 상수 대신 enum 을 사용하자. [Effective Java] int 상수 대신 enum 을 사용하자. - int enum pattern 이라고 불리는 int 를 이용한 분기는 단점이 많다. - 타입 안전을 보장하지도 않고, 편리하게 사용할 수 있는 방법도 제공하지 않는다. 즉 취약하다. - int enum 상수를 출력 가능한 문자열로 쉽게 바꾸는 방법도 없다. - 하나의 int enum 그룹에 있는 모든 상수를 loop 처리하거나, 그룹 사이즈를 알 수 있는 좋은 방법도 없다. - int enum 패턴의 변이로 String enum 패턴이 있는데 더더욱 바람직하지 않다. print 하는 부분에서는 좋지만, 문자열 비교에 의존하여 성능 문제가 생길 수도 있다. 더욱 문제가 되는 것은 필드명 대신 string 상수 값을 클라이언트 코드에.. 2016. 12. 19.
[Effective Java] static 맴버 클래스를 많이 사용하자. [Effective Java] static 맴버 클래스를 많이 사용하자. - 중첩 클래스(nested class) 혹은 내부 클래스(inner class)는 외곽 클래스(enclosing class)를 지원하는 목적으로만 존재해야 한다. 만일 어떤 중첩 클래스가 일부 다른 분야나 클래스에서도 유용하게 사용된다면 그 클래스는 독립적인 최상위 클래스가 되어야 한다. - 중첩 클래스는 다음 4가지 종류가 있다. static 맴버 클래스 static 이 아닌 맴버 클래스 익명 ( anonymous ) 클래스 지역 ( local ) 클래스 - static 맴버 클래스는 가장 간단한 종류의 중첩 클래스로, 어떤 클래스의 내부에 선언되어 있으며, 그 외곽 클래스의 모든 static 맴버들( private 으로 선언된.. 2016. 11. 17.
[Effective Java] 전략을 표현할 때 함수 객체를 사용하자. [Effective Java] 전략을 표현할 때 함수 객체를 사용하자. - 자바는 함수 포인터를 제공하지 않는다. 대신 객체 참조를 사용해서 유사한 효과를얻을 수 있다. 호출된 객체의 메소드에서 다른 객체(메소드로 전달되는)의 메소드를 수행하도록 객체를 정의하는 것이 가능하다. 그런 메소드 하나만 달랑 외부에 제공하는 클래스의 인스턴스는 사실상 메소드 포인터의 역할을 한다. 그런 인스턴스를 함수 객체(function object)라고 한다. ex) Comparator Interface 를 상속한 Class instance. - 좋은 함수 객체는 상태가 없어 static final, singleton 으로 사용 가능한 녀석이다. Summary 함수 포인터의 주 용도는 전략(strategy) 패턴을 구현하는.. 2016. 11. 15.
[Effective Java] 태그(tagged) 클래스보다는 클래스 계층을 사용하자. [Effective Java] 태그(tagged) 클래스보다는 클래스 계층을 사용하자. - 인스턴스들이 두 개 이상의 특성으로 분류되고 그런 특성을 나타내는 태그(tag) 필드를 갖는 클래스들을 태그 클래스라고 한다. 예를 들어 Figure 라는 class 가 있는데, 생성자의 종류에 따라 Rectangle 도 되었다가 Circle 도 될 수 있는 녀석. 한 Class 가 조건에 따라 많이 다른 특성의 class 의 형태로 변하는 녀석을 말한다. - 태그 클래스(Tagged class) 는 단점 투성이다. enum 선언, 태그 필드, switch, if 문 등을 포함해서 각종 복잡한 코드로 가독성을 떨어뜨린다. 다른 종류의 인스턴스에 속하는 부적절한 필드를 인스턴스가 가지고 있어 필요 없는 메모리 할당과.. 2016. 11. 14.
[Effective Java] 가급적 상속(inheritance) 보다는 컴포지션(composition)을 사용하자. 가급적 상속(inheritance) 보다는 컴포지션(composition)을 사용하자. - 상속은 코드를 재사용하는 강력한 방법이다. 그러나 일을 하는데 가장 좋은 도구는 아니다. 잘못 사용하면 부실한 소프트웨어를 초래한다. - 동일 프로그래머가 서브 클래스와 수퍼 클래스의 구현을 관장하는 같은 패키지 내에서 상속을 사용하는 것은 안전하다 상속을 위해 특별히 설계되고 문서화된 클래스를 확장(extends) 하기 위해 상속을 사용하는 것도 안전하다. 그러나 다른 패키지에 걸쳐 일반적인 실체 클래스로부터 상속을 받는 것은 위험하다. - 상속은 캡슐화(encapsulation) 을 위배한다. 올바른 동작을 위해 서브 클래스는 자신의 수퍼 클래스가 구현하는 상세 내역에 의존한다. 수퍼 클래스의 구현 내역은 소프.. 2016. 10. 27.
[Effective Java] 가변성을 최소화 하자. [Effective Java] 가변성을 최소화 하자. -불변 클래스는 자신의 인스턴스가 갖는 값을 변경할 수 없는 클래스. - 불변 클래스는, 가변 클래스에 비해 설계와 구현 및 사용이 더 쉽다. 에러 발생이 적으며 보안이나 사용 측면에서 더 안전하다. - 불변 클래스를 만들 때는 다음 다섯 가지 규칙을 따르자. 1. 객체의 상태를 변경하는 그 어떤 메소드도 제공하지 않는다. 2. 상속을 할 수 없도록 하자. ( class 에 final 을 주어 막을 수 있다. ) 3. 모든 필드를 final 로 지정한다. 4. 모든 필드를 private 으로 지정한다. 5. 가변 컴포넌트의 직접적인 외부 접근을 막자. 생성자와 접근자 메소드 및 readObject 메소드에서 해당 객체의 방어 복사본을 만들어 사용하도록.. 2016. 10. 24.
[iOS Study] 디버그 도구 [iOS Study] 디버그 도구 출처 : 아론 힐리가스의 iOS 프로그램 -Xcode 5 CPU와 메모리 사용량에 관한 정보를 한눈에 제공하는 디버그 측정기(debug gauges) 가 있다. -디버그 네비게이터는 프로그램 실행 중에(실시 정지나 중단된 경우가 아닌) CPU 와 메모리 측정기를 보여준다. -이 측정기들은 실제 프로그램이 실행 중인 하드웨어를 기반으로 측정한다.Mac 은 iOS 장비보다 가용 램이 훨씬 많고 CPU 코어도 대개 더 많다.따라서 iOS 시뮬레이터에서 프로그램을 실행하면 CPU 와 메모리 사용량은 매우 작게 나타날 것이다. -CPU 디버그 측정기는 편집기 패널에 CPU 리포트를 표시한다. Percentage Utilized 해당 장비가 가진 CPU 코어 수에 상대적인 CPU .. 2016. 2. 26.
[iOS Study] 델리게이션과 텍스트 입력 [iOS Study] 델리게이션과 텍스트 입력 출처 : 아론 힐리가스의 iOS 프로그래밍 -UITextField 인스턴스는 사용자가 텍스트를 수정할 수 있게 해준다. -UIResponder 는 UIKit 프레임워크에 존재하는 추상 클래스이다.다음 세 클래스는 UIResponder 의 하위 클래스이다. UIView, UIViewController, UIApplication UIResponse 는 이벤트를 제어하는 메소드들을 정의한다.이벤트에는 터치 이벤트, 흔들기와 같은 모션 이벤트, 재생/정지와 같은 원격 제어 이벤트 등이 있다.하위 클래스들은 이런 이벤트에 응답하기 위해 각각에 따라 이들 메소드를 재정의한다. -UIWindow 는 다른 이벤트들에 응답할 객체를 가리키는 퍼스트 리스폰더 (first re.. 2016. 2. 19.
반응형