Item 53 : 가변인수는 신중히 사용하라
2022. 8. 24. 13:33
책/effectiveJava
가변인수가 등장하기 전에는? varargs 는 Java 5 에 도입되었다. 그렇다면 그 이전에는 “임의 개수의 인자가 전달되어 올 수 있는 상황" 에 대해 어떻게 다루고 있었을까? 배열을 받는 메소드 → 명시적으로 배열을 인자로 받는 메소드 선언 public int sum(int[] args) { ... } N 개의 메소드를 선언 ( 1개,2개,3개,…. 인자를 받는 메소드들) public int sum() { ... } public int sum(int value) { ... } public int sum(int val1, int val2) { ... } 가변인수? 가변인수 명시한 타입의 인수를 “0개 이상" 받을 수 있다. 가변인수 메소드 호출시 무조건 “배열을 생성" 하여 인수들을 배열에 저장하여 ..
record 의 생성자를 private 으로 만드는 것이 불가능한 이슈
2022. 8. 23. 15:19
Java
상황: record 의 static factory method 만들었다. 개인적인 기호는 new 보다 정적 팩토리 메소드를 사용하는 것을 선호한다. 따라서 타 클래스에서 new 를 통한 생성자를 직접 호출하는 대신, 정적 팩토리 메소드를 사용하도록 제한을 두기 위해 "생성자를 private" 으로 변경하고자 했다. 이미 정적 팩토리 메소드 내부에서는, 모든 불변 필드를 초기화하는 역할의 기본 생성자(이하 '주생성자' 라고 칭하겠음) 를 호출하는 방식을 취하도록 했다. record 타입에서는 컴파일러가 자동으로 public 주생성자를 만들어주기 때문에, 이를 명시적으로 다시 정의해서 private 으로 해주려고 했다. 그런데 컴파일 에러가 발생했다 - 좀 더 구체적인 상황을 적자면 -> 해당 레코드 타입은..
logback.xml 설정할 때 property 들 관련 문제들
2022. 8. 15. 12:56
카테고리 없음
logback.xml 에서 사용될 Property 들을 applicaiton.yml 에 설정해 둘 경우, 인식이 안되는 경우들이 좀 잦은 것 같다. ( logback.xml 이 먼저 실행되어 스프링 부트의 application.yml 설정 파일을 인식하지 못한다는 글들이 있는 것 같은데 logback-spring.xml 로 해도 같은 문제가 발생했었다) 특히 logging.file.path 를 설정해 두었더니 LOG_PATH_IS_UNDEFINED 라는 디렉토리가 프로젝트 하위에 생성되어, 여기에 로그가 생성되는 일이 발생했다. → logback.xml 하위에 로 LOG_PATH 를 등록해주었다. 또한 xml 파일이 원래 tag 의 위치가 중요한지는 모르겠으나, 뒤에, 이 appender 에서 사용할 로..
[Java] method final parameter ?
2022. 7. 27. 10:28
Java
final parameter Method 인자로서 final parameter 를 선언해두는 것을 본 적 있다. Java 에서 final 키워드는 클래스 → 상속을 허용하지 않는 클래스 메소드 → 오버라이딩을 허용하지 않는 메소드 클래스,인스턴스 변수 → 초기화 이후에 값을 변경할 수 없는 변수임을 명시적으로 나타낸다 물론, 이 변수가 “참조변수" 인 경우라면, 해당 객체 내부의 값은 또 변경될 가능성이 존재한다. 를 의미한다. “인자"는 변수와 같은 의미에서 final 을 사용하는 걸까? 어차피 Java 에서는 “참조값을 전달" 하며, 이 값 자체는 스택에 복사되어올 뿐이다. 따라서 새로운 메소드 호출로 인해 생긴 스택 프레임 상의 값을 변경하는 것은 Caller 에 존재하던 참조 변수의 값을 변경하지..
thymeleaf 에서 객체의 메소드 출력하기 그리고 null
2022. 7. 23. 14:45
Spring
기존의 코드는 위와 같았는데,users 에는 Page 타입의 객체가 담겨져 있었다 count 쿼리에 대한 비용이 불필요하다고 생각해(하지만 1,2,3,.. 의 페이지 번호를 보이는 거라면 어쩔 수 없다 or 프론트에서 단 한번만 총 개수를 받아두고 이를 저장해두고 출력해주는 방법도 있을 수도..??) Slice 로 변경하며 Slice users 가 되었고, 위의 코드를 그대로 사용하면 템플릿 파싱 오류가 발생하는 상황이 되었다. 따라서 Slice 객체를 사용하도록 변경해야 했다. 해당 코드는, 이전 페이지가 존재하는지 여부에 따라 Previous 버튼을 비활성화 시키는 코드다. 따라서 Slice 의 hasPrevious() 를 사용해야 했다. 그런데 users 가 null 인 경우도 존재하기 때문에 아래..
[elegant]ch04 ! 끝!
2022. 6. 23. 22:33
책/엘레강트 오브젝트
모든 내용은 정답에 대한 내용이 아닙니다 개인적인 생각들이 추가 되어있으며,책의 내용에 대한 의문도 적어두었습니다 Null 반환 대신 예외던지기 null 반환 메소드 클라이언트에서는 “null 방어 코드" 를 작성해야만 한다. 반환 결과를 확인하는 코드를 작성해야만 한다 → 객체지향세계에서 객체는 “(자신만의 행동, 상태, 생명주기 를 가지는 )자율적인 객체" 이고, 우리는 이 “객체를 신뢰”하며 사용해야 한다. 그런데 객체가 반환하는 결과를 확인해야만 한다면 “신뢰 할 수 없는 객체" 가 되는 것이나 다름없다. 객체는 자신의 행동을 책임져야 한다. 심지어 내부적으로 예외를 발생시키는 것도 괜찮은데, 그 사실에 대해 알려줘야 한다. null 을 반환하는 객체를 신뢰할 수가 없으니 우리는 반환된 결과를 다..
[elegant] ch03 (정리중)
2022. 6. 23. 02:09
책/엘레강트 오브젝트
5 개 이하의 public 메소드만 노출하세요 → 작은 객체를 만드세요 작은 객체를 만들 수록 유지보수에 좋다는 의견에는 동의한다. 작은 크기의 객체를 만들 수록, 응집도가 높은 객체를 만들 “확률"이 높아지기 때문이다. 하지만 그 “크기" 에 대해서는 약간 의문스럽다. 책의 저자는 항상 단정지어 “이렇게만 만들어!!!” 라고 하는데 그 내용을 추상화 시켜서 딱 “ 작은 크기의 객체를 만들어 유지보수성을 높이자" 정도로만 생각하면 좋을 듯 하다. 그리고 여기서 는 “public 메소드의 개수를 제한" 하고 있는데, 실질적으로 객체 사이에 메시지를 주고 받을 때의 메시지가 “퍼블릭 메소드" 이기 때문이다. 이는 해당 “객체가 제공하는 기능" 에도 해당된다고 생각한다. 만약 그 개수가 너무 많다면, 너무 많..
[elegant] ch02 - 2.8
2022. 6. 15. 11:37
책/엘레강트 오브젝트
엘레강트 오브젝트의 ch2.8 을 읽으며 실습의 필요성이 느껴져 아래와 같이 진행해보았다. 생각과정이 꽤 많이 들어가서 이상한 코드들이 존재할 수 있으니 많은 첨언 부탁드립니다 🥺 외부 자원( 외부 서버 등)에 의존하는 클래스를 테스트하기 위한 방법은 뭐가 있을까?? 의존하는 인터페이스에 대한 모의객체 생성하기 우리는 이 가짜 객체 중 Mocking 의 단점에 대해 살펴볼 것이다 우리는 이 가짜 객체 중 하나인 Fake 객체를 사용 해 볼 것이다. 우리는 이 가짜 객체 중 Fake 객체의 장점에 대해 살펴볼 것이다 결론은 → 가능하다면 인터페이스에 대한 Fake 클래스를 작성하여 단위테스트를 합시다!!! (이 글을 작성할 때는 test double 에 대한 정리가 안되어 있었어서 그런지 혼란스러운 부분이..