05/07 면접준비/인터페이스와 클래스의 차이, 제네릭

전성수·2025년 5월 6일

클래스

  • 클래스는 객체의 속성과 동작(메서드)을 정의하며, 실제 인스턴스를 생성.

  • 객체지향 프로그래밍의 기본 단위

  • 클래스는 멤버 변수와 메서드를 모두 가질 수 있고, 메서드의 구체적인 구현을 포함

  • 클래스는 단일 상속

  • 클래스는 객체의 설계도이자, 기능의 구체적인 구현을 담당

  • 객체를 만들기 위한 설계도

  • 일반 클래스 상속: "모든 기능이 구현되어 있고, 오버라이딩은 선택", 객체 직접 생성 가능

추상 클래스

  • 추상 클래스는 상속을 통해 기능을 확장하고, 기본 동작이나 공통 속성을 자식 클래스에 제공하기 위해 사용

  • 추상 클래스는 추상 메서드(구현 없는 메서드)와 일반 메서드(구현된 메서드), 멤버 변수, 생성자 등을 모두 가질 수 있음

  • 클래스이기 때문에 단일 상속

  • 추상 클래스는 공통 동작, 속성, 기본 구현을 자식 클래스에 제공하고 코드 재사용에 유리

  • 추상 클래스 상속: "반드시 구현해야 하는 메서드가 있다(강제성)", 객체 직접 생성 불가.

인터페이스

  • 인터페이스는 클래스가 반드시 구현해야 할 메서드(기능)들의 집합만을 정의
  • 구현은 없고, 설계만 존재
  • 인스턴스를 직접 생성할 수 없음
  • 인터페이스는 기본적으로 메서드의 선언만 포함하며, Java 8 이후에는 default/static 메서드에 한해 구현이 가능
  • 인터페이스는 다중 구현이 가능
  • 인터페이스는 여러 클래스가 동일한 동작을 보장하도록 강제하는 역할을 하며, 서로 다른 계층 구조의 클래스에 동일한 기능을 부여할 때 사용
  • 기능 명세서 역할

제네릭

제네릭(Generic)은 클래스나 메서드를 정의할 때 데이터 타입을 미리 정하지 않고, 사용하는 시점에 외부에서 타입을 지정할 수 있게 해주는 기능

  • 타입 안전성 보장: 컴파일 시점에 타입을 검사해, 잘못된 타입 사용을 미리 막아줌

  • 코드 재사용성: 하나의 클래스나 메서드를 여러 타입에 대해 재사용할 수 있어, 코드 중복이 줄고 유지보수가 쉬워짐

  • 제네릭을 쓰지 않을 때 (Object 기반)

List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0); // 다운캐스팅 필요
  • 만약 잘못된 타입으로 캐스팅하면 런타임 오류
  • 제네릭을 쓸 때
List<String> list = new ArrayList<>();
list.add("hello");
String s = list.get(0); // 캐스팅 불필요
  • 컴파일 시점에 타입이 체크되어, 잘못된 타입이 들어가면 컴파일 에러가 발생
profile
ㅡ/ㅡ

0개의 댓글