읽기 좋은 코드가 좋은 코드다

읽기 좋은 코드가 좋은 코드다

더스틴 보즈웰, 트레버 파우커 공저 / 임백준

이 책은 매우 읽기 편한 코드를 작성하는 방법을 설명한다. 이 책을 관통하는 핵심 아이디어는 '코드는 이해하기 쉬워야 한다'는 것이다. 자신의 코드를 다른 사람이 읽고 이해할 때 걸리는 시간을 최소로 만들어야 한다. 그렇다고 어려운 기법을 장황히 설명하지 않는다. 실전적인 간단한 기법만으로도 코드를 훨씬 읽기 편하게 만들 수 있게 이끌어준다.

이 책은 바로 이 아이디어를 C++, 파이썬, 자바스크립트, 자바 등을 포함한 여러 언어로 작성된 코드를 예로 들며 설명한다. 우리는 각 언어에 종속된 고급 기능을 일부러 ...





책은 네 개 파트로 이루어져있으며, 뒤로 갈수록 생각이 더 필요한 내용이 나온다.

변수명, 주석 작성에 대한 내용부터 함수, 리팩토링까지 크게 어렵지 않게 설명했다.

각 장마다 길지 않게 구성하여 틈틈히 읽어보기 좋다.

가볍게 읽어보길 권장한다.


구글 앱스 한글 입력기 설치

안드로이드에서는 실행되는 어플리케이션의 상태를 시스템에서 직접 관리한다. 이는 대부분의 휴대단말용 OS에서 사용하는 방법으로 독립적인 어플리케이션이 시스템에 의해 관리되지 않을 경우 실행된 어플리케이션이 메모리를 과도하게 점유하거나 화면을 보여주는 권한을 과도하게 가지게 됨으로써 전화기의 원래 기능인 전화 수발신 기능 자체를 사용하지 못하게 될 수도 있기 때문이다.


안드로이드 어플리케이션을 구성하는 구성요소 중 하나인 액티비티(Activity)도 효율적인 메모리 관리를 위해 액티비티가 생성되고 소멸되는 조건인 생명주기(Lifecycle)을 가지고 있다.


액티비티의 상태는 크게 활성, 일시정지, 정지의 3가지로 나눌 수 있다.


활성

  • 화면 상에 액티비티가 보이면서 실핻되어 있는 상태. 액티비티 스택의 최상위에 있으며 포커스를 갖고 있음

일시정지

  • 사용자에게 보이기는 하지만 다른 액티비티가 위에 있어 포커스를 받지 못하는 상태. 대화상자가 위에 있어 일부가 가려저 있는 경우에 해당함.

정지

  • 다른 액티비티에 의해 완전히 가려져 보이지 않는 상태

자세한 내용은 여기


앱을 만들다 보면 인텐트를 통해 단순히 String, int, boolean 같은 기본 타입 뿐 아니고 커스텀 클래스나 오브젝트를 다른 컴포넌트에 전달해 줘야 할 경우가 많다. 그 경우 단순히 그냥 인텐트에 putExtra() 로는  넣어줄 수가 없다.안드로이드에서는 그런 경우를 위해 자바의 Serialization 개념과 유사한 Parcelable이라는 클래스가 있다.

 

자세한 내용은 여기

메니페스트 파일, 너는 누구냐?

이전에 올렸던 이클립스 테마 변경 링크는 edit window 부분만 테마가 적용되었는데 다른 window들도 적용되는 테마를 찾았다. MoonRise라는 테마이다. 아래 링크로 ㄱㄱ


eclipse full dark theme

낮은 결합도, 높은 결합도응집도

소프트웨어 공학의 전통적인 이론에 따르면, 유지보수성이 높은 소프트웨어는 프로그램의 각 요소들이 결합도는 낮게, 응집도는 높게 구성되어야 한다.


결합도(coupling)란?

소프트웨어 코드의 한 요소가 다른 것과 얼마나 강력하게 연결되어 있는지, 또한 얼마나 의존적인지 나타내는 정도이다. 프로그램의 요소가 결합도가 낮다는 것은 그것이 다른 요소들과 관계를 그다지 맺지 않은 상태를 의미한다.


결합도가 높은 클래스의 문제점

  • 연관된 다른 클래스가 변경되면 더불어 변경해야 하고,
  • 수정하려는 클래스를 이해하기 위해 연관된 다른 클래스를 함께 이해해야 하고
  • 나중에 다른 프로그램에서 클래스를 재사용하기도 힘들다.



응집도란(cohesion)?

프로그램의 한 요소가 해당 기능을 수행하기 위해 얼마만큼의 연관된 책임과 아이디어가 뭉쳐있는지를 나타내는 정도이다. 일반적으로 프로그램의 한 요소가 특정 목적을 위해 밀접하게 연관된 기능들이 모여서 구현되어 있고, 지나치게 많은 일을 하지 않으면 그것을 응집도가 높다고 표현한다. 응집도가 높으면 프로그램을 쉽게 이해할 수 있으므로 유지보수성이 높아진다.


응집도가 낮은 클래스의 문제점

  • 이해하기 힘들고
  • 따로 재사용하기 힘들며
  • 유지보수하기 힘들고
  • 다른 클래스의 변화에 민감하다.


예)


다른 기능 영역의 메소드들을 다수 포함한 클래스

  • 이런 클래스는 대개 X and Y와 같은 식으로 이름을 붙인다. 한 클래스 안에 여러 기능 영역의 메소드가 들어 있어, 클래스가 한 가지 기능에 집중하지 못하는 일이 많다. 예를 들어, 이미지 처리하는 기능과 사운드 처리하는 기능을 같이 갖고 있으면 그 클래스는 응집도가 낮은 것이다.


너무 많은 책임을 짊어진 클래스

  • 같은 기능영역의 메소드로 구성되었지만 클래스내에 그들이 모두 구현된 경우로서 너무 많은 책임을 짊어지다 보니 클래스의 크기가 엄청나게 커진 경우이다. 다른 클래스가 해야 적당한 기능을 자신이 억지로 하려고 하니까 크기가 커진 것이다. 예를 들어, 돈의 지불(현금, 수표, 신용카드)과 관련된 모든 기능을 Payment(지불)라는 클래스에 넣으면 이 클래스는 응집도가 낮아진다. 이럴때는 현금, 수표, 신용카드의 공통된 결제 기능을 Payment 클래스에 정의하고, 각자 고유한 기능은 Cash, Check, CreditCard 등의 Payment를 상속받은 하위 클래스에 정의하는 것이 응집도를 높이는 방법이다.


 


응집도가 높은 클래스의 특징

  • 클래스의 목적에 부합하는, 같은 기능영역( function area )의 메소드들로 구성되어 있다.
  • 메소드의 개수가 상대적으로 작다. 그것은 오로지 자신만이 할 수 있는 책임을 부여 받았다는 뜻이다.
  • 혼자 너무 많은 일을 하지 않는다. 다른 클래스와 협력한다.


1. Genymotion Download

2. Eclipse>Help>Install New Software

3. Work with란에 http://plugins.genymotion.com/eclipse 입력하고 엔터

4. Eclipse의 Genymotion 아이콘을 클릭하여 Genymotion 설치경로 설정


Genymotion player.exe 오류 시

Vertical LinearLayout 내에 Horizontal LinearLayout 두 개를 두고, 상단의 Horizontal LinearLayout엔 textview 2개와 button 1개를 배치하고 하단의 Horizontal LinearLayout엔 button 2개를 배치했다.

상단의 Horizontal LinearLayout 내의 각 view의 layout_weight 값을 1:1:1로 설정하고, 하단의 Horizontal LinearLayout 내의 각 view의 layout_weight 값은 2:1로 설정했다.

그리고 상하단 Horizontal LinearLayout 내의 모든 view의 layout_width 값을 wrap_content로 설정하고 실행해보니 아래와 같이 view가 배치되었다.



상단 Horizontal LinearLayout 내 textview 두 개의 끝과 하단 Horizontal LinearLayout 좌측 button 끝이 일치할거라고 생각했는데 이상하게도 차이가 있었다. padding 값 때문에 그런가 싶어서 좌우 padding 값을 0dp로 해보았으나 동일한 결과였다.

웹서칭을 해보니 view의 layout_width 값을 0dp로 설정해야되는거 같다. 그래서 그렇게 적용했더니 아래와 같이 예상했던 결과가 나왔다.



layout_width를 wrap_content로 하면 왜 첫 번째 그림과 같이 나오는지 모르겠다. ㅡㅡ;;

혹시 이 글을 보시는 분 중에 아시는 분 있다면 댓글 부탁드립니다.


View란?

  • Activity 내에 들어가는 각각의 구성요소
  • 컨트롤이나 위젯이라는 이름으로 불리는 UI 구성요소


ViewGroup

  • View를 여러 개 포함하고 있는 것
  • View와 ViewGroup은 Composite Pattern을 사용했음

Part_of__Android_View_Hierarchy.png (837×689)
그림1. 클래스 다이어그램

viewgroup.png (474×253)
그림2. Tree 구조를 갖는 UI 구성


+ Recent posts