TIL 2021.03.07
String은 IDE에서 테스트해보면 값이 바뀐다. (값이 바뀌는 게 아니라 아마도 참조가 바뀌는거라고 알고 있다.) 어쨋든, 이렇게 값이 바뀐다는 것은 불변 객체가 아니라는 말 아닐까? 불변객체에 대해서도 좀 더 조사해봐야겠다.
내가 알고 있던 점은 값이 바뀌는 게 아니라 참조가 바뀌라는 것을 이미 알고있었지만, 그게 불변을 의미한다는 것은 알지 못했다. String은 primitive type 처럼 실제 값 자체를 바꾸는 게 아니라, 참조를 바꾸는 것이기 때문에 불변이라고 하는 것이다.
불변이기 때문에 가지는 이점들도 있다. 궁금할때 다시 찾아보자.
그리고 날짜/시간 데이터를 문자열로 저장하는 것이 좋지 않은 것에 대한 이유도 리뷰를 통해 배웠다. 가장 와닿았던 것은 "연산을 수행하기 적절치 않은 형태이다." 라고 말씀하신 것. 확실히 나중에 날짜를 이용해서 뭔가 데이터를 사용할 일이 있다면 LocalDateTime 클래스을 활용할 수 있지만 String 이면 그렇게 하기에 정말 번거롭고 큰 제약이 생긴다. split() 으로 해결할것인가? 노노
일단 저걸 사용하게 된 계기는 일단 빨리 구현했으면 해서 다른 분 코드를 그냥 가져온 것 뿐이었다.
unmodifiableList()는 Collections 클래스에서 제공하는 메서드이다. unmodifiableList 에 List 를 담아서 사용하면 Collection 의 add, remove 메서드 등을 사용할 수 없다. Read-only 상태가 된다. 하지만 원본 리스트 자체가 수정되지 않도록 보장되는 것은 아니다. Collections.unmodifiableList()
로 리턴받은 레퍼런스 이외의 다른 레퍼런스로는 수정할 수 있다.
일단 저걸 사용하게 된 계기는 일단 빨리 구현했으면 해서 다른 분 코드를 그냥 가져온 것 뿐이었다.
라고 말했지만, 왜 static일 필요가 없는지 알고싶다.
저게 static이 아니면 객체를 생성해서 불러와야하는데 @Controller인 객체를 new 연산자를 사용해서 불러와도 될까? 직감적으로 하면 안될것 같은 느낌이긴 함.
questionList()는 UserController 가 쓰고 있다. 음, QuestionController에 있는 메서드를 어떻게 가져오지?
// 다음에 볼때 참고할 UserController 클래스
@Controller
public class UserController {
@GetMapping("/")
public String index(Model model) {
model.addAttribute("questionList", QuestionController.questionList());
return "index";
}
}
Logger를 사용하는 클래스가 두 군데가 있어서 필드에 따로 각각 선언안하고 클래스로 따로 빼서 info() 를 정적메서드로 사용하려고 했다. 단순히 중복제거하자는 의미에서 출발함.
근데 그렇게하려니까 문제가 발생.
private final Logger LOGGER = LoggerFactory.getLogger(QuestionController.class.getName());
이 코드에서 getLogger의 아규먼트는 Logger가 사용되어지는 클래스의 이름을 넣어야함.
근데 각각의 클래스 이름을 어떻게 따로받아서 그것도 다른 클래스에 있는 필드에 인자로 넣어줘야하나?
결국에 똑같은 코드가 재생산 되어져야 해결되므로 무의미한 코드라고 판단.
그래서 각각의 클래스에 Logger를 선언해줌.