본문 바로가기
코딩 교육 기관/코드스쿼드 백엔드 레벨2

2018.10.15 (월)

by 성건희 2018. 11. 11.
반응형

코드스쿼드 11일차


Interface

  • 구현되지 않은 메서드(행위)의 조합

  • implements 를 한 클래스는 반드시 인터페이스 메서드를 구현 해야함

  • 인터페이스는 행위를 표현하는 것이지 특정 상태 값을 가지진 않음 ( ex) 인스턴스 변수..)

  • 규격을 만들어 놓으면 좋은 점?

    • 공급자나 수요자가 조작하기 쉬움
  • 인터페이스는 내부의 숨겨진 녀석들을 밖으로 노출할 때 쓰는 것이므로,

    public 키워드를 추가하지 않아도 default 가 public

  • 인터페이스는 기능 제공 명세만 해줌

    • 사용자가 사용하기 쉬움

    • 보안상 안전, 반면 abstract 는 상당수의 코드가 노출이 됨

      ex)

      public interface Figure {
      	List<Point> points;
      }
      • 인터페이스가 외부에 노출될때 행위만 노출함
      • 이것이 ArrayList인지 LinkedList인지는 관심이 없음 (알수도 없음)
      • 사용자는 사용만 하면됨
      • 그러므로 보안상 안전
  • 내부 구현 체계를 노출하고 싶지 않을 때 사용

    (내부를 노출하게 되면 사용자는 더 많은 메서드를 알아야 하므로 비효율적)

  • 클래스 내에 구현되지 않은 추상메서드만 있으면 이것은 그냥 인터페이스임

    굳이 추상메서드로 만들 필요가 없음.

 

중복 코드를 제거하는 법

  • 자바8 이전에는 구현메서드를 인터페이스에 넣을 수 없다. (없다는 가정하에)

  • 상속을 통해서 중복 제거

    1. 부모클래스에 중복 코드를 넣는다.
    2. 부모를 추상클래스로 만든다. ex) abstract int size();
    3. 달라지는 부분은 자식클래스에서 조작을 하므로 중복이 제거가 된다.

 

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

댓글