interface와 abstract class의 차이가 뭘까요?
이 질문을 하게 된 배경
Cloneable함수가 동작하는게 너무 이상했어요
https://velog.io/@suky/Java-Cloneable%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0
대체 왜 interface만 구현했는데, 모든 코드가 알아서 작동할까요?
Java8에 오면서 interface에도 default 메서드를 만들 수 있고, static 메서드까지 만들 수 있는데, 그러면 abstract class 와의 차이가 뭘까요?
1. 다중 상속이 가능하다.
2. 접근 제어자를 만들 수 있다.
interface의 경우에는 무조건 public으로 구현하는 메서드를 강제로 설정해야합니다. abstract class는 그런 부분에 있어서 분명한 차이가 있죠 protected, private같은 것도 심지어 가능하죠
2-1. public 메서드로 열려있기에, template 메서드 같은 부분 역시 만들기 힘들죠
https://yaboong.github.io/java/2018/09/25/interface-vs-abstract-in-java8/
김영한님의 강의중 스프링부트 입문을 듣는 중간에 H2데이터베이스를 까는 모습을 봤는데, H2를 까는 이유가 뭔가요? mysql도 있는데 말이죠
1. h2를 안 깔고 쓴다는 부분에 있어서 간단하다는 장점이 있었지만, 까는 과정에서 그 장점을 거의 잃어버리게 된다.
2. 깔게 되었을 때 물론 가볍다는 장점도 있고, 쿼리를 일부 구현했다는 내용도 있지만, 실제로는 완벽하게 일치하지 않기에 분명한 단점을 일으킬 수 있습니다.
3. 깔아서 사용했을 경우, inmemory 의 간단한 휘발성 데이가 저장되면서 영구적으로db를 유지할 수 있다는 장점은 있습니다.
팩토리 패턴과 정적 팩토리 메서드의 차이는 무엇인가요?
이 질문이 나오게 된 배경
왜 정적 팩토리 메서드라는게 존재하지? 지금도 팩토리로 대충 쓰고 있던거 같은데, 아니었나?
그럼 정적이 아닌 거랑 맞는거랑 차이는 뭐지? 왜 java에서만 저런걸 들었지?
정말 멍청했죠 js에서도 충분히 만들어낼 수 있었는데 공부의 양이 부족했던거였습니다
1. 팩토리 메서드는 보통 instance에 묶여 있기 때문에, instance속 멤버 변수가 바뀌면 다른 결과를 낼 수 있습니다. 반대로 static 팩토리 메서드는 static한 값만 의존하기에 같은 클래스라면 static 값을 수정하지 않는 이상 무조건 같은 값만 뱉어내게 됩니다.
2. 정적 factory는 static을 참조하기에, singleton 패턴을 구현하기에 최적화되어있습니다. 클래스별로 하나의 값만 확실하게 있음을 보장할 수 있죠
그냥 팩토리 같은 경우는 builder 패턴을 구현하는 마지막 .build() 함수와도 비슷하다고 볼 수 있습니다. 그냥 build라는 인터페이스만 제시하게 되고, 어떤 객체가 나올지는 서브 클래스에서 결정한다는 점의 차이가 있다고 볼 수 있죠
List 와 배열의 차이
이 질문이 나오게 된 배경
당연하지만 우리가 알고 있는 내용인 linked list 와, 연속된 array를 의미하는 것과는 다르게
List에서는 generic이 허용되고, array에서는 허용되지 않는 차이가 생겼다. 이는 왜그럴까?
generic은 소거되고, array는 타입이 그대로 남아있다는 점인데, 그래서 generic을 통해서 검사한 타입은 런타임에서 안전하다. array는 당연하지만 런타임에서 ClassCastException이 발생할 수 있다.
라고 적혀있었다. 그러면 다시 한 번 생각보자 배열은 메모리에 연속된 값으로 남게 된다.
int형 타입이라고 했을 때
1000번지, 1004번지, 1008번지 같은 당연한 순서로 나아가게 된다. 그런데 만약 여기에 double형을 저장하려고 한다면? 혹은 64비트 컴퓨터에서 참조값을 저장하게 된다면? 1000번지가 1004번지까지 침범해서 우리가 전혀 예상치 못한 버그를 일으킬 수 있다. 그래서 runtime시에 검사를 끝까지 남겨두는 것이다.
그래서 generic을 통해서 검사하는, 런타임시에 검사를 사용하지 않는 방식을 허용하지 않는 것이다 라고 생각할 수도 있지만, 뭐 어차피 Reference 로 계산하기에, 같은 크기를 무조건 갖는다. 따라서 언어 자체에서 Type-safe를 검사하기에 큰 문제는 없다.
설계상 공변성을 배열은 가지고 있다는 점이 가장 큰 문제이다. 공변성으로 공통 조상을 갖게 되면 추후에 꺼냈을 때 문제를 일으킬 수 있기에, 이를 허용하지 않는다고만 생각해도 될 것이다
Stream 연산자와 Rx의 Cold Observable 간의 차이는 뭘까?
'Java' 카테고리의 다른 글
Java Generic 딥 다이브 (6) | 2023.02.23 |
---|---|
Generics 시작하기 (6) | 2023.02.23 |
java에서 입출력 어디까지 테스트 해야할까요? (2) | 2023.02.19 |
Object 의 toString 부터 hashCode 까지 (0) | 2023.02.19 |
Enum 사용시 메서드 오버라이딩을 주의해서 사용해야 합니다 (0) | 2023.02.17 |