본문 바로가기
엄마와 딸내미의 관심사/컴퓨터 프로그래밍

[한번 읽으면 두번 깨닫는 객체지향 프로그램] 김동헌 chapter1

by 엄마와 딸내미 2019. 11. 2.

간략 저자 소개 : 그는 글쓰기.개발을 좋아한다. 평범한 개발자하고 본받고싶은 작가.

 

<챕터 1장 "발상의 전환">

"발상의 전환" 주요 내용 3가지 

1. 객체지향의 필요성을 분석한다.

- 기능중심적인, 고급 알고리즘 활용보다 코드에서 중요한 것은 무엇일까?

2. 객체지향에 대한 고정관념을 제거한다.

- 각 객체만 잘 구현하면 될까?

3. 객체지향에 올바른 생각과 코드 작성법을 알려준다.

- 객체지향 일반적인 작성법 vs 인터페이스 중심 작성법

 

각 핵심에 대한 간단한 답변

"1번 객체지향의 필요성을 분석한다."

객체지향 정의 및 목표 : 차별화된 자신만의 역할을 수행하는 메소스(행동)와 속성(상태)로 이루어진 유연하고 독립적인 모듈이 협동하도록 하자.

->내 방식으로 말풀이하기

"군인들이 자신만의 군무기를 가지고 협업하는 군부대다. 누군가는 탱크, 누군가는 비행기, 누군가는 잠수함. 그러나 목표하는 바는 동일하게 공유한다. 즉, 적으로부터의 위험을 제거하기 위해 자신만의 역할을 처리하고, 이를 다른 부대들과 함께 일할때만 성공적으로 목표를 이룰 수 있다. 객체지향적 프로그래밍도 마찬가지다."

이제 객체지향을 알았으면, 왜 객체지향을 써야하는지 알아보자.

(원인 : 기능 중심적인 코드 작성에 대한 문제 때문이다. 결과 : 이를 해결하고자 하는 고심했고 객체지향이 탄생했다. )

기능 중심적인 코드 작성법의 문제=. 보수, 유지가 쉽지 않다. 

즉, 본래 기능에서 변동이 필요한 경우, 이전 프로그램을 변경한 프로그램에서 사이드 effect가 일어날 수 있다. 계획에 따라 미리 분리한 객체가 없고 하나의 클래스가 모든 것을 처리하기 때문이다. -> 코드 품질 저하라고 표현한다.

해결법 : 코드 품질 향상시킨다.

코드 품질 향상법 : 유연한 소프트웨어를 작성한다.(aka. 객체지향적 발상으로 다가간다.)

 

"2번 객체지향의 고정관념을 제거한다."

객체지향의 구현 대상은 새롭게 창조된 세계이다.

객체란 주도적으로 어떠한 요청(요구사항)을 처리하기 위한 행동(기능)을 하고(처리하고), 이를 명백하고 분명하게 내용을 말하고 있다(반환값 전달). 

그럼 객체 하나하나를 잘 만드는 게 중요한 게 아닐까? -> 고정관념 등장 // 완벽주의적인 관점

그러나, 본질이 더욱 중요하다. 즉, 객체 간의 협력에 집중해야한다. 이는 모든 기술을 완벽하게 형성하는 것보다 중심적인 기술을 제대로 만들 수 있도록 한다는 말이다. -> 각 필요에 맞게 시간/노력을 분배하기

"3. 객체지향에 올바른 생각과 코드 작성법을 알려준다."

 

테스트 주도 개발이란? (인터페이스 중심적)

우선 가정한다. 목표하는 프로그램이 제대로 실행된다고 믿는다. 즉, 테스트할 하나의 프로그램 속 객체들의 기능과 그 안의 내부 기능 및 로직이 이미 올바르게 구현되었다. 따라서 이를 판단할 수 있는 테스트 프로그램을 먼저 만든다.

전제 : 하나의 프로그램 속 객체들의 기능과 그 안의 내부 기능 및 로직 구현된 상태

결과물 : 전제된 프로그램이 올바르게 작동하는지 확인하는 또다른 테스트 프로그램

쓰는 법 : 1) 테스트 프로그램 작성 2) 테스트 프로그램으로 테스트할 프로그램의 오류사항 확인함 3)테스트 프로그램의 오류를 모두 통과할 때까지 2)를 반복함 

 

일반적인 개발자 중심 개발과, 테스트 주도 개발의 차이점은?

일반적인 개발 : 개발자는 특정 기능을 구현하고자 한다. -> 개발자는 스스로 기능에 필요한 논리 사고의 절차에 따라서 필요한 메소드, 속성을 생각하면서 작성한다(하나의 핵심 기능을 중심으로 필요한 걸 잔나무치듯이 생각해서 작성함) -> 구현을 마치고, 특정 값을 넣어 기능이 잘 돌아가는지 확인한다.

테스트 주도 개발 : 개발자는 특정 기능을 테스트할 프로그램을 작성한다 -> 위의 테스트 프로그램에게 전달될 경우를 고려하면서, (즉 단순한 기능중심이 아닌 인터페이스-반환값 전달- 중심) 테스트에 전달될 메소드, 속성을 생각하면서 필요한 객체들을 생성한다 -> 그 뒤에 생성된 각 객체들에게 필요한 처리기능을 분배한다(일반적인 개발과 마찬가지로 핵심 기능을 앞서 생성한 메소드, 속성들에게 분배하여 처리하도록 함) -> 구현을 마치고, 이를 테스트 프로그램으로 확인한다. 

 

 객체지향이 부합한 상황

1) 유연한 소프트웨어가 필요하다.

즉, 개발 프로세스/문서이 중요하기보다는, 고객의 요구사항, 결과물의 변동, 개발 환경 개선을 추구하는 상황(애자일 기법)이다.

2) 품질 향상이 필요하다.

즉, 기능을 처리하되, 그 안에서의 각 모듈이 독립적이고 각 객체들간의 의존성이 낮다 또한 객체들이 처리하는 활동이 집중적이다.

올바른 객체들 이해하기

1. 객체는 유일하다. (타객체와 구별가능하다- 자신만의 특징을 갖는다)

2. 객체가 구현한 코드 또한 유일하다. (타객체에서 구현한 타코드와 구별가능하다 - 자신만의 특징을 갖는다)

3. 객체는 자신이 제일 잘 처리할 수 잇는 독립적인 책임기능이 있다.

4. 클래스와 메소드는 한가지 종류만의 책임기능을 아래처럼 수행한다.

1) 그 책임에 해당하는 일을 빠짐없이 모두 하는가?

2) 그 일을 다른 클래스나 메소보다 더 잘하는가?

3) 그 일을 자신만이 유일하게 하는가?

5. 결론은 '객체가 하나의 일만 수행하게 하라'이다.

 

추가정리

1. 정리하다 보니 내가 class와 method에 대한 개념이 확실하지 않음을 알았다. 따라서 객체지향에서 class와 method이어떻게 다른지 알아보았다.

class : 특정 변수들을 모아두고 함수로 처리할 수 있는 객체들의 집합이다. return이 없다. 대신 접근지정자를 쓸 수 있다. 전체적이고 포괄적인 개념이다. 전환하는 값이 없으므로, 데이터 타입이 없다. 

method : 특정 값을 받으면 return값으로 함수처리된 값을 전달할 수 있다. 인자를 받고 그에 따라서 return해야 하기에, 매개변수(특정값,인자)와 메소드(함수)간의 데이터 타입이 일치하는지가 중요하다. 전환하는 값이 있으므로, 메소드이름 앞에 데이터 타입을 적어야만 한다.

2. 왜 class랑 method가 헷갈리는지 생각해보았다. 앞서서 객체지향에 대한 개념을 공부할 때, 속성(상태)이랑 메소드(행동/기능)이란 용어를 봤다. 이게 확실하지가 않았다. 그냥 관련 용어를 다 정의해서 찾아봤다. -출처 위키피디아

object : class에 포함된다. 실제로 컴퓨터 메모리에 할당되는 자료구조로 있다. 경제적으로 메모리를 쓰려면 자료 구조, 데이터 타입이 중요하고 class안에서 타객체들과 구조되어 있어야 한다.

instance : 인스턴스는 하나의 객체(object)가 지닌 데이터 값을 정의한 것이다(객체의 기준이 되는 값). 성질, 수량 등을 표현하는 값이다. 

method : object에 포함된다. 객체의 작동을 명시하는 함수다. 가장 작은 처리 함수이다. 즉 객체들이 서로 처리한 결과물을 공유하기 위한 함수로 return값이 있다. 

뭔소리인지 잘 모르겟어서, 누군가가 정리한 내용을 여기에다가 가져와 봤다.

"OOP 객체지향 프로그램은 사물(객체)을 처리의 기본단위로 삼는다.

객체의 작동(메소드)이나 사물의 기준이 되는 값(인스턴스)를 정의해 놓은 클래스를 가지고 있다.

유연하고 독립적인 객체(처리 기본 단위)들로 일정한 부분이 변화되더라도 이를 반영해 이벤트 중심 작업들을 처리할 때 유용하게 사용될 수 있다(애자일 기법)"

 

Parameter & Argument


파라미터 = 함수 선언시, 매개변수, 인사 

function test(x)  // 함수 선언시 매개변수 = x
{
...
}

이때, 매개변수,인사,파라미터는 x다.


어규먼트 = 함수 실행시, 실행인수 

function test(x) // 함수 선언시 매개변수 = x
{
...
}

Check = test(100); // 선언된 함수 실행시 매개변수 = 100


이대, 실행인수,어규먼트는 100이다.




주의!**매개변수 : 함수가 다른 함수에게 전달하는 값 (이렇게 큰 범위로 쓰이기도 함)