반응형

분류 전체보기 56

[클린코드(CleanCode)] 10장 클래스

개요지금까지 코드 행, 코드 블록, 함수 구현 방법과 함수 간의 관련 맺는 방식을 공부했다.하지만 좀 더 차원 높은 단계까지 신경 쓰지 않으면 코드를 얻기는 어렵다.이 장에서는 깨끗한 클래스를 다룬다.클래스 체계클래스를 정의하는 표준 자바 관례에 따르면 가장 먼저 변수 목록이 나온다. static public 상수 => static private 변수 => private 인스턴스 변수 이렇게 나온다.public 변수는 필요한 경우가 거의 없다.변수 목록 다음에는 공개 함수가 나온다. 비공개 함수는 자신을 호출하는 공개 함수 직후에 나온다. 즉, 추상화 단계가 순차적으로 내려간다.그래서 프로그램은 신문 기사처럼 읽힌다. 캡슐화변수와 유틸리티 함수는 가능한 공개하지 않는 편이 낫지만 반드시 숨겨야 한다는 법..

[클린코드(CleanCode)] 9장 단위 테스트

용어 설명테스트 주도 개발(Test-driven development TDD)은 매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 프로세스 중 하나이다. 개발자는 먼저 요구사항을 검증하는 자동화된 테스트 케이스를 작성한다. 그런 후에, 그 테스트 케이스를 통과하기 위한 최소한의 코드를 생성한다. 마지막으로 작성한 코드를 표준에 맞도록 리펙토링한다. - Wikipedia유닛 테스트(unit test)는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다. 즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다. 이를 통해서 언제라도 코드 변경으로 인해 문제가 발생할 경우, 단시간 내에 이를 파악하고 바로 잡을 수 있도록 해준다.-..

[클린코드(CleanCode)] 8장 경계

개요시스템에 들어가는 모든 소프트웨어를 직접 개발하는 경우는 드물다.패키지, 오픈소스, 사내 다른 팀이 구현한 컴포넌트를 사용할 수 있다.이 외부 코드를 우리 코드에 깔끔하게 통합해야 한다.이 장에서는 소프트웨어 경계를 깔끔하게 처리하는 기법과 기교를 살펴본다.외부 코드 사용하기인터페이스 제공자(또는 프레임워크 제공자)는 적용성을 최대한 넓히려고 애쓴다.반면 사용자는 자신의 요구에 집중하는 인터페이스를 바란다.이 두 의견의 입장 차이로 인해 시스템 경계에서 문제가 생길 소지가 많다. java.utill.Map을 예시로 설명을 들어보자면Map은 다양한 인터페이스로 수많은 기능을 제공한다.Map이 제공하는 기능성과 유연성은 확실히 유용하지만 그만큼 위험도 크다.왜냐하면 Map이 제공하는 함수 중에 Map 내..

[클린코드(CleanCode)] 7장 오류 처리

개요깨끗한 코드를 다루는 책에서 오류 처리를 다루는 장이 있어 이상하게 여길 수 있지만오류 처리는 프로그램에 반드시 필요한 요소 중 하나일 뿐이다. 깨끗한 코드와 오류 처리는 확실히 연관성 있다.상당수 코드 기반은 전적으로 오류 처리 코드에 좌우된다.오류 처리 코드 때문에 길제 코드가 하는 일을 파악하기 불가능한 일이 발생하고프로그램 논리를 이해하기 어려워진다면 깨끗한 코드라 부르기 어렵다.오류 코드보다 예외를 사용하라public class DeviceController { ... DeviceHandle handle = getHandle(DEV1); if (handle != DeviceHandle.INVALID) { retrieveDeviceRecord(handle); if (record.getSta..

[클린코드(CleanCode)] 6장 객체와 자료 구조

개요변수를 비공개(private)로 정의하는 이유가 있다.남들이 변수에 의존하지 않게 만들고 싶어서다.충동이든 변덕이든, 변수 타입이나 구현을 맘대로 바꾸고 싶어서다.그렇다면 어째서 수많은 프로그래머가 조회(get) 함수와 설정(set) 함수를 당연하게 공개(public)하여 비공개 변수를 외부에 노출할까?자료 추상화아래 두 클래스 모두 2차원 점을 표현한다.그런데 한 클래스는 구현을 외부로 노출하고 다른 클래스는 구현을 완전히 숨긴다.public class Point { public double x; public double y;}public interface Point { double getX(); double getY(); void setCartesian(double x, double y)..

[클린코드(CleanCode)] 5장 형식 맞추기

개요독자들에게 주고 싶은 인상코드가 깔끔일관적꼼꼼하다고 감탄질서 정연하다고 탄복모듈을 읽으며 두 눈이 휘둥그레 놀람전문가가 짰다는 인상 심어줌프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야 한다.코드 형식을 맞추기 위한 간단한 규칙을 정하고 그 규칙을 착실히 따라야 한다.팀으로 합의해 규칙을 정하고 모두가 그 규칙을 따라야 한다.필요하다면 규칙을 자동으로 적용하는 도구를 활용한다.형식을 맞추는 목적코드 형식은 중요하다.너무나 중요해서 무시하기 어렵고 너무나 중요해서 융통성 없이 맹목적으로 따르면 안 된다.코드 형식은 의사소통의 일환이고 의사소통은 전문 개발자의 일차적 의무다. 오늘 구현한 기능이 다음 버전에서 바뀔 확률은 아주 높다.그런데 오늘 구현한 코드의 가독성은 앞으로 바뀔 코드의 품질에 지대한 영..

[클린코드(CleanCode)] 4장 주석

개요잘 달린 주석은 그 어떤 정보보다 유용하다.하지만 부정확하고 근거 없는 주석은 코드를 이해하기 어렵게 만든다.오래되고 조잡한 주석은 거짓과 잘못된 정보를 퍼뜨려 해악을 미친다.우리가 프로그래밍 언어를 치밀하게 사용해 의도를 표현할 능력이 있다면, 주석은 거의 필요하지 않으리라. 코드만이 자기가 하는 일을 진실되게 말한다.코드만이 정확한 정보를 제공하는 유일한 출처다.그러므로 우리는 (간혹 필요할지라도) 주석을 가능한 줄이도록 꾸준히 노력해야 한다.주석은 나쁜 코드를 보완하지 못한다코드에 주석을 추가하는 일반적인 이유는 코드 품질이 나쁘기 때문이다. 표현력이 풍부하고 깔끔하며 주석이 거의 없는 코드가, 복잡하고 어수선하며 주석이 많이 달린 코드보다 훨씬 좋다. 자신이 저지른 난장판을 주석으로 설명하려 ..

[클린코드(CleanCode)] 3장 함수

작게 만들어라!함수를 만드는 첫째 규칙은 '작게!'다, 함수를 만드는 둘째 규칙은 '더 작게!'다.얼마나 짧아야 하는지에 대한 규칙은 없지만 아래처럼 짧은 게 좋다public static String renderPageWithSetupsAndTeardowns(PageData pageData, boolean isSuite) throws Exception { if (isTestPage(pageData)) { includeSetupAndTeardownPages(pageData, isSuite); } return pageData.getHtml();}블록 들여쓰기if 문 / else 문/ while 문 등에 들어가는 블록은 한 줄이어야 된다. 대게 함수를 호출하여 처리한다.바깥은 감싸..

[클린코드(CleanCode)] 2장 의미있는 이름

들어가면서소프트웨어에서 이름은 어디나 쓰이므로 이름 잘 지으면 여러모로 편해진다이 장에서는 이름을 잘 짓는 간단한 규칙 몇 가지 소개한다의도를 분명히 밝혀라의도가 분명하게 이름을 지어야 한다좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 많아진다그러므로, 이름을 주의 깊게 살펴 더 나은 이름이 떠오르면 개선하면 된다변수나 함수 클래스의 존재 이유, 수행 기능, 사용 방법에 대해 주석이 필요하다면 의도를 분명히 드러내지 못한 것이다int d; // 경과 시간(단위: 날짜)아래처럼 의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다int elapsedTimeInDays; // 날짜에서 잰 시간int daysSinceCreation; // 만들어진 이래로 며칠이 지났는가int..

[클린코드(CleanCode)] 1장 깨끗한 코드

개요이 책을 읽고 있다면 이유는 두 가지프로그래머라서더 나은 프로그래머가 되려고이 책은 좋은 프로그램 작성 요령을 설명하는 책읽고 나면 코드에 대해 많은 사실을 배울 수 있음좋은 코드와 나쁜 코드를 구분하는 능력도 생김좋은 코드를 작성하는 방법도 익힘나쁜 코드를 좋은 코드로 바꾸는 실력도 쌓임코드가 존재하리라코드가 자동으로 생성하는 시대가 왔다고 하지만 코드가 사라질 가망은 전혀 없음코드는 요구사항을 상세히 표현하는 수단이기 때문!어느 수준에 이르면 코드의 도움 없이 요구사항을 상세히 표현하고 추상화하는 것이 불가능기계가 실행할 정도로 상세하게 요구사항을 명시하는 작업, 바로 이것이 프로그래밍이며, 이렇게 명시한 결과가 코드임언어의 추상화 수준은 높아지고 특정 응용 분야에 적합한 프로그래밍 언어 수도 많..

[C# 문법] Part16 static 한정자

[ static 한정자란 ]C#을 다루면서 static이라는 키워드는 많이 봤을 것이다.static은 변수, 메서드, 클래스에서 정적 속성을 부여하여 클래스로부터 객체를 생성하지 않고 변수나 메서드를 호출할 수 있게 한다.우리가 클래스를 구현하고 이를 new 연산자를 통해 인스턴스를 생성한다면 메모리에 할당된다는 것을 알 수 있었다. 그러나 static을 사용한다면 인스턴스를 생성하지 않아 메모리의 비용을 줄 일 수 있는 장점이 있다. 즉, 객체를 생성하지 않고 사용할 수 있는 변수, 메서드, 클래스라면 static을 사용하는 것이 유용할 수 있다.[ static 변수 ]또는 정적 변수라고도 부른다.클래스의 일반 멤버 변수는 클래스로부터 객체가 생성될 때마다 각각 할당되지만, 정적 변수는 해당 클래스가 ..

C#문법 2024.10.19

[C#문법] Part15 this 키워드

[ this 키워드 ] this 키워드는 인스턴스 자신을 가리킬때 사용된다.죽, this 키워드를 사용하면 인스턴스 내부에서 자신의 멤버 변수나 멤버 메서드에 접근할 수 있다.그냥 인스턴스의 멤버 변수와 멤버 메서드는 가져와도 상관없지만 코드의 가독성을 높일 수 있다.그리고 멤버 변수와 매개변수의 이름이 같을 경우, this 키워드를 이용하면 구분하기 쉽다.[ 구현 방법 ]this.멤버변수 = 값;this.멤버메서드();this 키워드 뒤에 인스턴스가 가지고 있는 멤버 변수나 멤버 메서드를 불러올 수 있다.[ 사용 방법 ]public class GameCharacter{ public string name; public GameCharacter(string name) { thi..

C#문법 2024.10.12

[C#문법] Part14 new 연산자

[ 개요 ]GameCharacter warrior = new GameCharacter();인스턴스와 생성자를 다루면서 new 키워드는 언급하였다.이 파트에서 new 연산자에 대해서 설명하고자 한다.참고로 new 연산자라고 한 것은 new의 쓰임새가 여러 개가 있는데 그중 연산자로서의 new에 대해 알아볼 것이다.[ new 연산자 ]new 연산자는 생성자를 이용해서 heap 메모리에 객체(인스턴스)를 생성하고 heap메모리에서 생성한 객체(인스턴스)를 반환해 주는 역할을 한다. C언어를 배웠다면 malloc라는 개념을 알고 있을 텐데 new 연산자와 같다고 알고 있으면 된다. [ new 연산자의 다양한 활용 ] 참고로 C#에서는 클래스, 구조체, 배열, 제네릭 타입 등 모든 데이터 형식이 클래스이다.즉 n..

C#문법 2024.10.09

[C#문법] Part13 생성자(Constructor)와 소멸자(Destructor)

[ 개요 ]인스턴스를 생성할 때 자동으로 호출되는 함수가 있다.GameCharacter warrior = new GameCharacter();앞선 클래스 파트에서 인스턴스를 생성할 때 이런 코드를 봤었을 것이다.new 키워드 뒤에 오는 GameCharacter()가 바로 생성자이다.이번에는 생성자가 무엇인지 알아보고 그와 한 쌍을 이루는 소멸자가 무엇인지 알아보도록 하겠다.[ 생성자란 ]인스턴스 생성 시 자동으로 호출되는 함수로서 인스턴스 초기화 메서드라고 불린다.어떤 인스턴스든 꼭 가지고 있는 메서드이다. 생성자에는 두 가지 종류가 있다.기본 생성자(default constructor)직접 정의한 생성자기본 생성자는 사용자가 직접 생성자를 정의하지 않아도 자동으로 만들어지며 아무런 작동을 하지 않는 생..

C#문법 2024.10.09

[C#문법] Part12 클래스(Class)

[ 개요 ]https://blackwolfdev.tistory.com/30위의 객체지향 프로그래밍 설명에서 클래스 부분을 참고하면 된다[ 구현 방법 ]클래스를 구현하려면 멤버 변수와 멤버 메서드가 필요하다.무엇을 멤버 변수로 하고 무엇을 멤버 메서드로 하면 좋을까?내가 게임 캐릭터를 구현한다고 가정하자전사, 마법사 등 다양한 직업들이 있을 텐데 이들의 모체가 될 클래스를 구현하려면게임 캐릭터가 공통적으로 가지고 있을 속성과 기능을 생각하면 된다. 속성으로는 이름, 체력, 공격력 등이 있고기능으로는 서있기, 공격하기, 대화하기 등이 있을 것이다.속성은 클래스의 멤버 변수가 되고기능은 클래스의 멤버 메서드가 된다.class 클래스명{ 자료형 변수명1; 자료형 변수명2; 반환형 메서드명1() ..

C#문법 2024.10.04
728x90