라디오스타


재밌는 영화였다. 88년도 가수왕이 2006년에 겪는 우여곡절(?)이랄까..

안성기가 박중훈의 매니저로 나옵니다. 아.. 지금 보니 왕의 남자를 만들었던 감독님이 만드셨구나…

스포일러가 될까봐 뭐라고 말은 못하겠고.. 잔잔하고 재밌습니다. 그저 그런 액션..반전.. 이런 류의 재미에 지친 분들에게 강추할 만한 영화입니다.

비와 당신… 이라는 노래 영화를 보는 내내 빠져들 수 밖에 없습니다. ㅋ


작곡은 음악을 담당하는 방준석 감독
작사는 시나리오를 쓰신 최석환 작가와 제작사인 영화사 아침의 정승혜 대표가 맡았다고 합니다.

Lesson 2. Java Basics

Lesson 2. Java Basics

이번장에서 배우게 될 내용은:

  • 학생수를 세기 위한 int 형 변수 사용하기
  • 여러 학생을 저장하기 위한 ArrayList 사용하기
  • 기본 생성자 이해하기
  • ArrayList를 어떻게 사용하는지 이해하기 위해 J2SE API를 어떻게 사용하는지 배우기
  • Student 객체만을 담기 위해 ArrayList를 제약하기
  • 여러 class를 test하기 위한 TestSuite 만들기
  • 패키지를 이해하고 import문을 배우기
  • 상수를 정의하는 방법과 사용
  • 시스템 라이브러리의 date와 calandar 클래스 사용하기
  • Java가 허용하는 다양한 주석문 배우기
  • javadoc을 사용하여 API 문서 생성하기

int

The int type allows variables to be created that store integer values from -2,147,483,648 to 2,147,483,647.

Numbers in Java are not objects like String literals are. You cannot send messages to numbers, although numbers can be passed as parameters along with messages just like Strings can. Basic arithmetic support in Java is provided syntactically; for many other operations, support is provided by system libraries. You will learn about similar non-object types later in Agile Java. As a whole, these non-object types are known as primitive types.

Initialization

you have two ways to initialize fields: You can initialize at the field level or you can initialize in a constructor.

There is no hard-and-fast rule about where to initialize. I prefer initializing at the field level when possiblehaving the initialization and declaration in one place makes it easier to follow the code. Also, as you will learn later in this lesson, you can have more than one constructor; initializing at the field level saves you from duplicate initialization code in each constructor.

Default Constructor

If you do not define any constructors in a class, Java provides a default, no-argument constructor.

The use of default constructors also implies that Java views constructors as essential elements to a class. A constructor is required in order for Java to initialize a class, even if the constructor contains no additional initialization code. If you don’t supply a constructor, the Java compiler puts it there for you.

Suites

여러 클래스들을 한꺼번에 테스트하고 싶을 때 다음과 같이 suite을 생성하여 추가합니다.


위 그림은 JUnit 3.8 대의 사용 법.
아래 그림은 JUnit 4.1에서 annotation을 사용 하는 방법.

The SDK and java.util.ArrayList

java.util.ArrayList<Student> allStudents = session.getAllStudents();

A type appearing in this forma class name followed by a parameter type within angle brackets (< and >) is known as a parameterized type. In the example, the parameter Student of java.util.ArrayList indicates that the java.util.ArrayList is bound such that it can only contain Student objects.

The class java.util.ArrayList is one of thousands available as part of the Java SDK class library.

왼쪽 상당은 패키지, 왼쪽 하단은 해당 패키지에 속한 클래스들 오른쪽은 하나의 클래스에 대한 설명을 보여주는 3단 구조로 되어있다.

Objects In Memory


사실 “Cain DiVoe” 같은 문자열도 메모리 어딘가를 참조하는 변수 일 텐데 그것은 그림에 빠져있다.

Packages and the import Statement

Packages provide a way for developers to group related classes. They can serve several needs: First, grouping classes into packages can make it considerably easier on developers, saving them from having to navigate dozens, hundreds, or even thousands of classes at a time. Second, classes can be grouped into packages for distribution purposes, perhaps to allow easier reuse of modules or subsystems of code.

Third, packagesprovide namespaces in Java. 서로 다른 패키지 안에 있다면 클래스의 이름이 같아도 상관없다.

Typing java.util.ArrayList throughout code can begin to get tedious, and it clutters the code as well. Java provides a keyword import that allows identification of fully qualified class names and/or packages at the source file level. Use of import statements allows you to specify simple class names throughout the remainder of the source file.

The java.lang Package

The Java library contains classes so fundamental to Java programming that they are needed in many, if not all, classes. The classes String and Object are two such classes. The ubiquitous nature of these classes is such that the designers of Java wanted to save you from the nuisance of having to specify an import statement for them everywhere.

1장 리팩토링, 첫 번째 예제

먼저 리팩토링이란? 외부 동작을 바꾸지 않으면서 내부 구조를 개선하는 방법으로, 소프트웨어 시스템을 변경하는 프로세스이다. 이것은 버그가 끼어 들 가능성을 최소화하면서 코드를 정리하는 정형화된 방법이다.

“코드가 작성된 후에 디자인을 개선한다.”

물론 그 코드는 디자인을 거쳐 작성이 되었겠지만 코드가 디자인을 잘 따르지 않았거나 디자인이 잘 못 됐을 수도 있기 때문에 어감이 반대로 된 듯해도 맞는 말이다.

새로운 기능을 추가해야 하는데 프로그램의 코드가 새로운 기능을 추가하기 쉽도록 구조화되어 있지 않은 경우에는 먼저 리팩토링을 해서 프로그램에 기능을 추가하기 쉽게 하고, 그 다음에 기능을 추가한다.

유지보수에는 네 종류의 유지보수가 있는데 기억이 가물가물 하지만 억지로라도 떠올려 보면
에러가 발생하여 수정하는 유지보수(corrective maintanance)
환경의 변화에 따라 적응시키는 유지보수(adaptive maintanance)
미래에 발생할 문제를 미리 예방하는 유지보수
완벽을 기하기 위한 기능을 추가하는 유지보수 가 있다고 배웠다.(시스템 분석 및 설계 시간에…)
여기서는 네번째 유지보수 측면을 고려한 듯하다. 하긴 리팩토링 자체를 유지보수로 본다면 위 네가지 모두 고려대상인 듯하다.

리팩토링을 시작하기 전에 견고한 테스트 세트를 가지고 있는지 확인하라. 이 테스트는 자체 검사여야 한다.

테스트의 중요함을 할 수 있다. 요새 Agile Java 책을 스터디 하면서 TDD(Test Driven Development)를 공부하고 있는데 하나의 습관인지라 역시 쉽지 않다. 습관을 바꾸는게 가장 힘든일인듯 하다.(내 글씨는 악필인데 초등학교 때 서예학원도 다녀보고 맞기도 엄청 맞았지만 아직도 악필이다 –)

리팩토링은 작은 단계로 나누어 프로그램을 변경한다. 실수를 하게 되더라도 쉽게 버그를 찾을 수 있다.

조금씩 고쳐 나갈 때마다 계속해서 test를 해줘야 한다. 그래야 쉽게 버그도 찾을 수 있고 오히려 한번에 왕창 해두고 버그가 발생해서 어디가 문제인지 찾는데 시간이 더 오래 걸린다.

컴퓨터가 이해할 수 있는 코드는 어느 바보나 다 짤 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다.

아~ 감명깊은 말이다. 주석의 중요함에 대해 써있는 책을 몇 번 봤었다. 그러나 주석이 잘 달린 프로그램 보다는 주석이 없어도 이해가 되는 프로그램인 듯하다. 물론 주석도 없고 이해도 안되는 코드는…최악이겠지만 말이다. 그러려면 역시 작명에도 신경을 잘 써야 하지만 대부분의 프로그램 언어가 영어인 관계로 작명+작문 이 합쳐지게 된다는 태생적인 문제가 있다.(영어 공부도 열심히?ㅋ)

오늘은 여기까지 보고 자야겠다. 내일 데이트를 해야한다.

Good Night!

1장을 다 보았다.(자랑인가? ㅋ) 보기만 했고 손으로 안따라 해봤기 때문에 아직 제대로 본건 아니다.

추가할 요약사항이 있어서 수정한다.

리팩토링의 리듬!

테스트 -> 조금 수정 -> 테스트 -> 조금 수정

Arrays and Hashes

Arrays and Hashes

Ruby의 array와 hash는 인덱스가 있는 collection입니다. 둘 다 객체를 담아 두고 key를 사용하여 접근하는 콜렉션입니다. array에서 key는 정수이지만 hash는 어떤 객체도 key가 될 수 있습니다. 둘 모두 새로운 요소를 추가할 때 커기제 됩니다. array에 접근을 하는게 보다 효율 적이지만 hash는 보다 유연함을 제공합니다. 어떤 array이나 hash들도 여러 타입의 객체를 담아 둘 수 있습니다. 이 말은 하나의 array에 정수, 문자열, 실수를 담을 수 있다는 것입니다.

[ ] 이 괄호 사이에 요소들을 나열 하는 array literal을 사용하여 새로운 배열을 생성하고 초기화 할 수 있습니다. array 객체를 가지고 객체에 있는 각각의 요소들에 [] 안에 index를 사용하여 접근할 수 있습니다. 다음의 예에서 봅시다.

a = [ 1, 'cat', 3.14 ]   # array with three elements
# access the first element
a[0] » 1
# set the third element
a[2] = nil
# dump out the array
a » [1, "cat", nil]

array 객체의 생성자를 사용하여 생성하거나 요소들이 없는 비어있는 괄호 [] 를 사용하여 배열을 생성할 수도 있습니다. Array.new .

empty1 = []
empty2 = Array.new

단어들의 배열을 생성할 때 “” 와 , 를 사용하기가 매우 번거로울 수 있는데 이 때 사용하기 편한 것이 있습니다. 바로 %w 입니다. 다음과 같이 사용할 수 있습니다.

a = %w{ ant bee cat dog elk }
a[0] » "ant"
a[3] » "dog"

Ruby의 hash는 배열과 비슷합니다. hash는 [] 말고 {} 이 괄호를 사용합니다. 반드시 하나의 요소에는 두 개의 객체가 제공되어야 합니다. 하나는 key 하나는 value입니다.

예를들어, 악기들을 오케스크라 위치에 따라 매핑하고 싶다면 다음과 같이 할 수 있습니다.

instSection = {  'cello'     => 'string',  
'clarinet'  => 'woodwind',  
'drum'      => 'percussion',  
'oboe'      => 'woodwind',  
'trumpet'   => 'brass',  
'violin'    => 'string'}

Hash는 array와 같이 [] 괄호를 사용하여 index화 됩니다.

instSection['oboe'] » "woodwind"
instSection['cello'] » "string"
instSection['bassoon'] » nil

마지막 예가 보여주듯이 hash에 해당하는 key가 없는 경우에 기본적으로 nil을 반환합니다. 하지만 가끔은 여러분이 원하는 기본값을 반환하도록 하고 싶을 것입니다. 예를 들어 해당하는 key가 몇 번 출현하는지 카운팅하는 hash의 경우 기본값을 0으로 하고 싶을 것입니다. 이것은 hash를 생성할 때 생성자에 기본값을 인자로 넘겨 주는 방식으로 할 수 있습니다.

histogram = Hash.new(0)
histogram['key1'] » 0
histogram['key1'] = histogram['key1'] + 1
histogram['key1'] » 1

배열과 해쉬 객체는 매우 유용한 메소드들을 많이 가지고 있습니다. 33page와 278page~317page에 걸쳐 이 메소드들에 대해 자세하게 나와있습니다.

Agile Java 발표 후기

초반에 상당히 긴장을 했다.

갑자기 반장님께서 무서운 포쓰를 발산하시는 바람에 덜덜덜 떨수밖에 없었다.

자칫 내가 잘못된 정보를 전달하면 어떻게 될까..

말을 얼버무리면 안되는데 내가 1장을 정말 다 아는 걸까..

물론 영회형이 같은 발표 팀이라 한편으론 든든 했지만 한편으론 내 자신이 너무 작아보여 떨리고 무서웠다.

회사원들..그리고 아버지 나잇대의 어른.. 난 정말 긴장해 있었다.

그리고 ppt…만드는데 30분정도 걸렸다. 어떠한 내용을 넣어야 할지 감이 잡히질 않았다.

이미 실무에서 개발자로 일하고 계신 분들에게 자바의 매우 기초적인 지식들에 대해 발표하는 건 어색하다고 생각했다.

뭐 앞에서 주름잡기라고 하지 않았던가… 막막했다..

다행히 영회형이 정리 해 둔 내용을 중심으로 요약을 하고 내가 요약한 부분 중에 추가할 것을 붙였다.

영회형은 기본을 넘어 좀더 실용적인 지식들을 전달해줄 준비를 마치고 있었다.

반면에 난 매우 기본 적인 지식에도 긴장한 탓인지 내 기본 지식의 두께인지.. 자신감을 잃고 말았다.

영회형이 주신 조언에 따라 다음 부턴 똑바로하자 기선아…

청중에 초점을 맞추기.

스크린샷/사진/데모가 좋다.

텍스트는 간결하게.

목차를 읽어주기 보단 눈으로 읽을 시간을 주며 골자가 무엇인지를 이야기 함.