객체 vs 클래스 vs 인스턴스

  • 객체
    소프트웨어를 통해 문제를 해결할 때 구현할 대상
    소프트웨어 관점에서의 Concept

  • 클래스
    객체 생성을 위한 설계도

  • 인스턴스
    클래스에 따라 실제로 구현된 실체
    클래스와 관계 위주로 설명할 때 사용됨

// car 객체는 Car 클래스의 인스턴스
Car car = new Car();
Bike bike = new Bike();

static

  • 메모리의 Method(static) 영역에 저장된다.
  • static은 모든 인스턴스가 하나의 저장공간을 공유하므로 static 키워드가 붙은 Field를 클래스 변수라고 부르고, 붙지 않은 Field를 인스턴스 변수라고 부른다.
  • 클래스가 메모리에 올라갈 때 생성되므로 인스턴스를 생성하지 않아도 접근가능하다.
  • static 메서드 안에서는 인스턴스 변수에 접근할 수 없다.

Java Collection Framework

  • 데이터의 집합, 그룹을 효율적으로 다루기 위한 자료구조 인터페이스 및 구현체를 제공

  • Collection 인터페이스는 크게 List, Set, Queue로 나뉘며 Map은 Collection 인터페이스를 구현하지 않지만 Collection으로 분류된다.

  • List : 인덱스 순서로 저장되며 중복된 데이터 저장이 가능하다.

    • ArrayList : 초기 capacity는 10이고, 이보다 많은 데이터가 들어오면 용량을 늘린다. 중간에 데이터를 추가하거나 삭제할 경우 한 이후 모든 인덱스가 한 칸씩 밀리거나 당겨지므로 처리 속도가 느리다.
    • Vector : ArrayList와 동일한 구조이지만 Vector는 동기화를 지원하므로 멀티 쓰레드 환경에서 안정적으로 사용 가능하다. 하지만 단일 쓰레드에서는 ArrayList가 성능이 더 좋다.
    • LinkedList : ArrayList, Vector와 사용 방법은 동일하지만 구조가 다르다. LinkedList는 인접한 곳을 링크해 관리하며, 중간에 데이터를 추가, 삭제하는 경우 인접한 노드만 처리하면 되므로 처리 속도가 빠르다.
  • Set : 중복된 데이터를 저장할 수 없다.
    • HashSet : 순서를 보장하지 않는다.
    • TreeSet : 순서를 보장하지 않으며 기본적으로 오름차순으로 데이터를 정렬한다.
    • LinkedHashSet : 입력된 순서대로 데이터를 관리한다.
  • Map : Key와 Value로 구성된 자료구조. Key는 중복으로 저장할 수 없지만 Value는 중복해 저장할 수 있다.
    • HashMap : 가장 기본적인 Map의 구현체.
    • Hashtable : HashMap과 동일하게 사용 가능하지만 동기화를 지원한다.
    • TreeMap : Red-Black Tree로 저장되며 Key에 대해 오름차순으로 정렬한다.
    • LinkedHashMap : 입력된 순서대로 데이터를 관리한다.

원시값 포장

  • 원시값(및 래핑 클래스) 포장이란 원시 타입의 값을 그대로 사용하는 것이 아닌 원시값만을 인스턴스 필드로 가지는 클래스를 사용하는 것
public class LottoNumber {
  private static final int LOTTO_NUMBER_LOWER_BOUND = 1;
  private static final int LOTTO_NUMBER_UPPER_BOUND = 45;
  private final int lottoNumber;

  public LottoNumber(final int lottonumber) {
    checkIsInBounds(lottoNumber);
    this.lottoNumber = lottoNumber;
  }

  private void checkIsInBounds(int lottoNumber) {
    if (lottoNumber < LOTTO_NUMBER_LOWER_BOUND || lottoNumber > LOTTO_NUMBER_UPPER_BOUND) {
      throw new LottoNumberOutOfBoundsException();
    }
  }
}
  • 장점

    • 타입에 사용하는 의도를 갖지 않는 값에 이름을 부여해 의도를 명확하게 나타낼 수 있음
    • 상태와 행위를 한 곳에서 관리

일급 컬렉션 (First Class Collection)

  • 컬렉션을 래핑해 컬렉션을 제외한 멤버 변수를 가지지 않는 상태.
public class LottoTicket {
  private final List<LottoNumber> lottoTicket;

  public LottoTicket(final List<LottoNumber> lottoTicket) {
    checkLottoTicket(lottoTicket);
    this.lottoTicket = lottoTicket;
  }

  public LottoPrize matchPrize(LottoDrawingResult lottoDrawingResult) {
    //matching logic
  }
}
  • 장점
    • 비지니스에 종속적인 자료구조
    • 컬렉션의 불변성 보장
    • 상태와 행위를 한 곳에서 관리
    • 이름이 있는 컬렉션

enum

  • JDK 1.5부터 도입
  • 클래스형의 상수 집합
  • 서로 관련 있는 상수를 모아 의미있는 명칭의 집합으로 정의한 것
  • 상태와 행위를 한 곳에서 관리

exception

  • error : 컴퓨터 하드웨어의 오동작 또는 고장, 개발자의 잘못된 코드로 응용 프로그램에 이상이 발생해 실행하지 못하거나 실행 중 중단되는 것

  • exception : 응용 프로그램 실행 중 사용자의 잘못된 조작 혹은 개발자의 잘못된 코드로 인해 발생

  • 예외가 발생하면 프로그램이 종료되는 것은 에러와 같지만 예외는 예외처리를 통해 프로그램을 종료시키지 않고 동작을 유지하도록 할 수 있음

  • 자바는 CheckedException과 UncheckedException이 있음

    • ChecedException : RuntimeException을 상속하지 않는 Exception. 복구 가능한 예외이므로 예외 처리문을 함께 작성해야함. 예외처리를 하지 않는다면 throws signature를 명시해야함
    • UncheckedException : RuntimeException을 상속하는 Exception. 예외 상황을 예상하고 있고, 의도적으로 발생하는 예외이므로 throws signature를 명시하지 않아도 됨

상속, 인터페이스

  • 상속

    • 클래스의 멤버변수, 메서드 등을 재사용 및 확장.
    • extends 키워드로 사용 가능함
    • 한 클래스는 하나의 클래스만 상속 가능함
      public class Truck extends Car {...} 
  • 인터페이스

    • 같은 Signature로 다양한 구현을 제공하기 위해 사용

    • 구현하지 않은 API를 구현해 사용

    • implements 키워드로 사용 가능

    • 자바 8 이상부터 default 키워드를 사용해 인터페이스에서 메서드 구현 가능

      public interface Calculator {
          public calculate(int a, int b);
      }
      public class AddCalculator implements Calculator {
          @Override    
          public calcaulate(int a, int b) {
              return a + b;
          }
      }