2020-07-28 TIL

Fact

  • 프로그래머스 3레벨 네트워크 문제, 타겟넘버 문제를 풀었다. 문제 자체가 이해가 잘 안가는 부분이 많았다.
  • 공부 우선순위를 정하기위해 내가 가고싶은 회사에서 필요로하는 사항들을 엑셀로 정리했다.
  • 자바 인터페이스에 대해서 다시 공부했다.

Feelings

  • 레벨 3 네트워크 문제를 풀면서 DFS문제를 복습하고있는데, 정말 어렵다.
  • 인터페이스 부분을 다시 보고있는데, 처음 봤던 것보다 더 확실하게 이해가 되는느낌이다. 다시 쳐보면서 결과를 확인하고 있다.

Findings

  • T 타입의 모든 값을 변환 없이 S타입의 변수에 할당할 수 있다면 S타입은 T타입(서브타입)의 슈퍼타입이다. 반대로 슈퍼타입 -> 서브타입으로 변환해야 할 때도 있다. 이때는 캐스트(강제 변환)을 사용한다. 다음과 같이 사용한다.
IntSequence sequence = ...;
DigitSequence digits = (DigitSequence) sequence;
System.out.println(digits.rest());

주의할 점은 객체는 실제 클래스나 그 슈퍼타입으로만 캐스트할 수 있다. 잘못 캐스트하면 컴파일 시간 오류나, 클래스 캐스트 예외(ClassCastException)가 발생한다.

String digitString = (String) sequence; // 불가능하다 IntSequence는 String의 슈퍼타입이 아니다.
RandomSequence randoms = (RandomSequence) sequence; // 작동 가능성은 있지만, 불가능하면 클래스 캐스트 예외를 던진다.
  • 예외가 일어나지 않게 하려면 먼저 객체가 원하는 타입인지 instanceof 연산자로 검사해야 한다.
object instanceof Type

if(sequence instanceofe DigitSequence) {
    DigitSequence digits = (DigitSequence) sequence;
}

이 표현식은 object가 Type을 슈퍼타입으로 둔 클래스의 인스턴스일 때 true를 반환한다.

  • 인터페이스는 또 다른 인터페이스를 확장해서 원래 있던 메서드 외의 추가 메서드를 요구하거나 제공할 수 있다. 예를 들어 Closeable은 메서드가 한개만 있는 인터페이스다.
public interface Closeable {
    void close();
}

pucblic interface Channel extends Closeable {
    boolean isOpen();
}
  • 클래스는 인터페이스를 몇개든 구현할 수 있다.
public class FileSequence implements IntSequence, Closeable {
    ...
}
  • 인터페이스에 정의한 변수는 자동으로 public static final이 된다. 예를 들어 다음 swingConstants 인터페이스는 나침반 방향을 나타내는 상수를 정의한다.
public interface SwingConstantss {
    int NORTH = 1;
    int NORTH_EAST = 2;
    int EAST = 3;
}
  • 인터페이스에 기본메서드를 작성하기 위해서는 메소드 앞에 default를 붙여야 한다.

Future Action

  • 이번주 내에 DFS문제를 다 풀어봐야겠다.
  • 객체지향에 익숙해지도록 책에 있는 예제들을 손으로 쳐보면서 확인해야겠다.