본문 바로가기

분류 전체보기

(183)
의미있는 객체 이름 붙이기 1. 길어도 상관없다. 의도를 분명히 밝힌다. 어떤 것으로 어떤 일을 하고 어떤 결과를 내는 것인지 처럼 최대한 의도를 밝힌다. 일반적으로 변수 이름의 길이가 평균 10~16일 때 프로그램을 디버깅하기 위해서 들이는 노력을 최소화 할 수 있고, 변수의 평균 길이가 8~20인 프로그램은 디버깅하기가 쉽다 2. 헷갈리게 하지 않는다. 정말 리스트의 뜻이 아니라면, List와 같은 단어를 접두어에 붙여서 헷갈리게 하지 않는다. 약어를 쓰지 않는다. 3. 불용어를 쓰지 않는다. a, an, Info, Data, the, 단순한 숫자 추가 등을 하지 않는다. 4. 발음 하기 쉬운 단어를 사용한다. 코드를 보는 사람이 술술 읽히는 코드를 작성하기 위해 노력한다. 5. 한 개념에 한 단어를 사용하라. 한 클래스에서 ..
데이터 유효성 체크 자동차 경주 게임을 처음 구현할 때, 데이터를 받아 들이는 InputView 에서 모든 유효성을 검사했었다. 고민 끝에 다음은 이름을 저장하는 Name클래스에 다시 모두 옮겼었다. 객체 지향적인 설계를 공부하면서 이게 맞을까 라는 생각이 들어서 했던 고민에 대한 결론을 정리해본다. 데이터 유효성 체크도 객체의 역할이라고 생각했다. 예를 들어 [공백을 입력받으면 안됨] [이름이 5자가 넘으면 안됨] [마지막에 쉼표가 있으면 안됨] [이름은 한명만 있으면 안됨] 이라는 유효성 체크를 해야 한다면, [공백을 입력받으면 안됨] [마지막에 쉼표가 있으면 안됨] 은 입력받는 InputView 에서 처리해야 한다. 왜냐면 이름을 저장할 때 생기는 예외라기 보다는 입력 그 자체에서 생기는 예외니까. [이름이 5자가 넘..
static 메소드 사용 static 키워드를 쓰면 자바가 구동될 때 메모리할당을 딱 한번만 하게되어 이점이 있다. static을 붙인 메소드는 어디 쓰이면 좋을까. 1. 유틸성 메소드 정해져 있는 값을 가지고 포멧을 변경한다거나 도구처럼 정해놓고 자주 쓰는 특정한 메소드들에 대해 static으로 지정하고 사용한다. 2. 객체가 아닌 것 객체란 상태를 가지고 활동하는 것을 떠올릴 수 있다. 1번에서 언급한 것들 처럼 '도구'는 객체가 활동하는데 필요한 것이지 자체로 뭔가 활동하는 것이 아니다. 인스턴스를 생성하지 않아도 메소드를 호출 하고 싶다면 static 메소드로 만들도록 한다. 1, 2주차의 RandomUtils에서 매개변수가 없는 생성자를 private으로 생성하고 있었다. 랜덤값을 생성해주는 클래스는 '도구'와 같은 역..
equals() Overriding 자동차 미션을 테스트하는 중에 List에 담긴 Car객체의 Name과 Position이 잘 담겼는지 테스트하는 상황이 왔었다. 하지만 테스트를 위해 작성한 예상 객체와 실제 객체는 주소가 다르므로 값이 같아도 다르다는 결과가 나왔다. 그래서 값 자체를 빼와서 테스트를 진행했는데, 이보다 좋은 방법을 발견하여 작성해본다. 모든 Object 형 객체는 기본적으로 equals() 메소드와 hashCode() 메소드를 가진다. 이 중 equals()는 두 객체가 동일한 객체인지 테스트하는 메소드이다. 이 동일한 객체가 무엇이냐면, class Car{ private String name; public Car(String name) { this.name = name; } } Car car1 = new Car("티코..
Exception 테스트하기 지금까지 TDD_byExample 책을 읽으면서 값에 대한 비교 테스트만 접해봤지 예외상황이 잘 나오나 테스트를 해본적은 없었다. 예외를 메세지와 함께 테스트 하는 방법을 기록한다. Exception exception = Assertions.assertThrows(발생할 예외.class, () -> { 예외가 발생할 상황(메소드) }); Assertions.assertEquals(예외가 발생하면 출력되도록 예상하는 메서드, exception.getMessage());
private 메소드 테스트 private로 선언한 메소드를 테스트하고 싶었는데, private로 선언된 메소드는 외부에서 접근이 불가능하므로 테스트를 할 수 없었다. 그래서 임시로 public으로 바꾸고 테스트를 진행하였다. 하지만 나중에 프로젝트의 크기가 커지면. 테스트의 규모가 커지면. 그 과정에서 내가 public으로 바꾼 것을 다시 private으로 바꾸는 것을 잊으면? 이런 이슈에 대해 알아보았다. 1. 많은 경우 private 메소드는 public 메소드 안에 존재한다. 공용 메소드만을 외부로 노출시킨다는 원칙을 따른다면, private 메소드는 밖에서 쓰이는 것이 아니라 안에서 쓰이는 것이기 때문. 따라서 우린 public 메소드를 통해 간접적으로 테스트 할 수 있다. 이 방법이 제일 자연스럽다. 2. 하지만 priv..
String과 StringBuilder String string은 불변이다. String str = "abc"; str = "def"; 가 가능한데 왜 불변일까. 여기서 중요한 점은, String은 기본타입이 아닌 참조타입이라는 점이다. String 변수형의 첫 글자가 대문자임에서도 나타나듯이, 클래스이다. String 객체는 stack영역에 직접 값을 저장하는 int, char등과 달리 Heap영역의 String constant pool이라는 곳에서 따로 관리된다. 드래그 List가 안되고 List은 되는 이유는, wrapper는 클래스이기 때문에 힙영역에서 관리된다. collection 역시 힙 영역에서 관리되기 때문에, List는 힙영역에서 스택영역을 참조하는 구조라 말이 안된다. (방금 생각한 내용) int num = 10; num =..
Arrays.asList() List stringList = Arrays.asList(arr); arr이라는 배열을 ArrayList로 바꿔 반환하는 메서드. 우리가 일반적으로 아는 java.util.ArrayList와 다르다. 레퍼런스를 찾아보면java.util.Arrays에서 함수를 발견할 수 있는데, Returns a fixed-size list backed by the specified array. This method acts as bridge between array-based and collection-based APIs, in combination with Collection.toArray(). 이라는 문구가 있다. 고정된 사이즈의 배열을 반환한다는 것이 무엇일까. asList()로 만들어진 ArrayList는 set..