코드스쿼드 11일차
Interface
구현되지 않은 메서드(행위)의 조합
implements 를 한 클래스는 반드시 인터페이스 메서드를 구현 해야함
인터페이스는 행위를 표현하는 것이지 특정 상태 값을 가지진 않음 ( ex) 인스턴스 변수..)
규격을 만들어 놓으면 좋은 점?
- 공급자나 수요자가 조작하기 쉬움
인터페이스는 내부의 숨겨진 녀석들을 밖으로 노출할 때 쓰는 것이므로,
public 키워드를 추가하지 않아도 default 가 public 임
인터페이스는 기능 제공 명세만 해줌
사용자가 사용하기 쉬움
보안상 안전, 반면 abstract 는 상당수의 코드가 노출이 됨
ex)
public interface Figure {
List<Point> points;
}
- 인터페이스가 외부에 노출될때 행위만 노출함
- 이것이 ArrayList인지 LinkedList인지는 관심이 없음 (알수도 없음)
- 사용자는 사용만 하면됨
- 그러므로 보안상 안전
내부 구현 체계를 노출하고 싶지 않을 때 사용
(내부를 노출하게 되면 사용자는 더 많은 메서드를 알아야 하므로 비효율적)
클래스 내에 구현되지 않은 추상메서드만 있으면 이것은 그냥 인터페이스임
굳이 추상메서드로 만들 필요가 없음.
중복 코드를 제거하는 법
자바8 이전에는 구현메서드를 인터페이스에 넣을 수 없다. (없다는 가정하에)
상속을 통해서 중복 제거
- 부모클래스에 중복 코드를 넣는다.
- 부모를 추상클래스로 만든다. ex) abstract int size();
- 달라지는 부분은 자식클래스에서 조작을 하므로 중복이 제거가 된다.
Generic 에서 기본형을 제공하지 않는 이유
자바는 100% 순수한 객체지향 언어가 아니다
why ) primitive Type 의 존재 때문
-> 얘들은 클래스가 없음 그래서 Object 를 상속받지도 않음
- Object 의 자식으로만 쓸 수 있도록 (클래스) 한정
- primitive Type은 사용 할 수 없다.
public interface Figure<A extends Point>{}
- Figure 는 A를 Point 클래스를 상속하는 것만 쓸 수 있도록 제약을 걸어줄 수 있다.
상수값은 View 에 있어야 할까? domain에 있어야 할까?
상수값이 View 에서만 쓰인다면 상관없지만 domain에서 쓰인다면 domain에 써야함
외부가 변경이 되도 domain은 별개로 작동 해야함
view 는 domain에 의존해도 되지만
domain은 view에 의존하면 안된다.
if / else 제거
if (points.size() == 2){
return new Line(points);
}
if( points.size() == 3){
return new Triangle(points);
}
- 다형성을 이용해서 제거할 수 있다.
- Enum , 람다 (익명클래스) 이용
if / else 를 제거하면 좋은 점?
성능상의 차이는 없다.
현업에서는 (ex> 네이버 ) 메서드하나에 라인수가 1000라인이 넘어간다.
(은행) 은 10000라인도 넘어간다.
그 라인에 if else 를 남발한다면 시간이 지나면서 if 문이 늘어남 (처음에는 5개에서 50개로)
이런 일들이 현업에서는 다반사.
즉, 읽기 어려운 코드가 됨
if else 는 신경을 쓰면서 코드를 수정해야하지만
if else 를 제거한다면 다른 클래스에 영향을 미치지 않으면서 새로운 코드를 만들 수 있다.
유지보수, 심적인 안정, 빠른 대응이 가능해진다. (객체지향의 가장 큰 장점)
참조 변수 타입을 List로 쓰면 좋은 점
참조 변수 타입을 ArrayList 로 쓰지 않고 List 로 쓰면
만약 ArrayList로 사용하다가 LinkedList로 바꾸게 되는 일이 발생하더라도 어떠한 수정을 할 필요가 없다.
인터페이스를 사용할 때는 외부로 노출할 때 인터페이스로만 노출해라!
생각해보기
- String.format()과 printf 의 기능이 동일한데, 내부적인 성능 차이가 있는지
- 래퍼클래스의 정의와 제네릭에서 기본형(primitive Type)을 제공하지 않는 이유
- List 인터페이스의 ArrayList 와 Vector 의 차이점
'코딩 교육 기관 > 코드스쿼드 백엔드 레벨2' 카테고리의 다른 글
2018.10.22 (월) (0) | 2018.11.11 |
---|---|
2018.10.17 (수) (0) | 2018.11.11 |
2018.10.11 (목) (0) | 2018.11.11 |
2018.10.08 (월) (0) | 2018.11.11 |
2018.10.04 (목) (4) | 2018.10.25 |
댓글