인터페이스와 패키지 - accidentlywoo/java GitHub Wiki

인터페이스와 패키지


  1. 인터페이스의 기능과 의미를 이해하고, 인터페이스를 활용하여 다형성을 구현할 수 있다.
  2. 패키지의 개념을 이해하고, 사용자 정의 패키지 및 커스텀 라이브러리를 생성하여 활용할 수 있다.

인터페이스

추상 클래스보다 추상성이 더욱 심화된 개념 멤버 변수는 상수형으로 선언되어야 함 메서드는 모두 추상 메서드로 선언되어야 함

  • 인터페이스는 상수와 추상 메서드 외에 다른 멤버를 갖지 못하게 함으로써 추상클래스보다 더욱 완벽한 추상화를 제공함.

  • 인터페이스를 사용하는 이유는?

  • 상속인 경우 논리적으로 'is a~'관계가 성립함 문법적으로 단일 상속만을 허용함

  • 상속이 아닌 경우 논리적으로 'is a~' 관계가 성립하지 않음 다중 상속을 받고 싶은 경우 -> 인터페이스 활용

EX) 폴라로이드 카메라 구현 폴라로이드 카메라 : 카메라 + 프린트 자바는 단일상속만을 지원하므로 불가능.

-> 카메라로부터 상속을 통해 재사용 +프린터라는 인터페이스 사용 -> 인터페이스를 통해 다중상속과 유사한 기능 구현 가능.

자바에서 다중상속이 금지된 이유는 동일한 이름의 변수가 자식 클래스에 중복되어 상속되는 것을 막기 위해서임 -> 인터페이스는 변수를 가질 수 없는 특수한 클래스이므로 다중상속이 가능하게 됨.

자바 API에는 많은 인터페이스들이 제공되고 있고, 직접 인터페이스를 생성해서 이용 가능함.

인터페이스의 정의

public interface 인터페이스명 [extends 부모인터페이스명,...]{
  // 상수 -> final 예약어를 이용해서 멤버 변수를 선언해야 함. 
  // 인터페이스는 객체를 생성할 수 없으므로, 상수는 static 예약어를 붙여서 선언해야함
  // 추상 메서드
}

인테페이스 이름으로 직접 해당 상수를 사용하게 하기 위해서는 반드시 static 예약어를 final 예약어와 함께 사용해야 함.

인터페이스에 포함되는 메서드는 추상 메서드로 선언되므로, 메서드의 블록({})을 가지지 못함

public interface Drawable{
  public static final int PLAIN_PEN = 1
  public static final int BOLD_PEN = 2
  public static final int ITALIC_PEN = 3
  public abstract void draw();
  public abstract void move(int x,int y);
}

인터페이스의 변수 선언에 사용된 static final이나 메서드 선언에 사용된 abstract는 생략 가능

public interface Drawable{
  public int PLAIN_PEN = 1
  public int BOLD_PEN = 2
  public int ITALIC_PEN = 3
  public void draw();
  public void move(int x,int y);
}

인터페이스는 추상 클래스와 유사하기 때문에 직접 객체화 되지 못함

인터페이스의 상속(implements) -> 자식 클래스의 생성 -> 자식 클래스의 객체 생성 -> 프로그램의 사용

인터페이스를 포함하는 클래스 구문의 형태

[modifiers] class 클래스명 [extends 부모 클래스] implements 인터페이스1, 인터페이스2,...]{
}

인테페이스를 상속하는 클래스는 인터페이스에 정의된 추상 메서드들을 Overriding 해야 함. -> 블록을 추가하여 추상 메서드의 기능을 구현해야 함

인터페이스에 등록된 추상 메서드를 하나라도 Overriding 하지 않으면? -> 추상 메서드가 상속되어 해당 클래스는 abstract 예약어가 붙은 추상 클래스로 선언됨.

형변환

인터페이스 사용 시 클래스와 동일하게 묵시적 형변환과 명시적 형변환이 가능함

class Circle extends Shape implements Drawable{} 

Shape s = new Circle();
Drawable d = new Circle(); // Drawable 타입의 변수 또는 Drawable 타입의 변수에도 할당함

인터페이스는 부모 클래스와 동일한 지위를 가짐 인터페이스 유형의 객체 참조 변수는 인터페이스에 선언된 요소에만 접근 가능함 인터페이스를 구현한 객체의 요소에 접근하는 것은 허용되지 않음

인터페이스의 상속

인터페이스 선언 시 다른 인터페이스를 상속하여 정의할 수 있음

public interface 인터페이스명 [extends 부모인터페이스1, 부모인터페이스2...]{
}

인터페이스를 상속하는 경우에도 extends 예약어를 사용함 인터페이스도 상속 관계에 따라 계층구조를 가질 수 있음

class -> 상속된 Class

Interface, Interface, Interface -> 상속된 Interface -> 인터페이스는 여러개를 상속할 수 있다.

자바 패키지

자바 API 패키지

자바의 클래스들을 분류하고, 관련된 클래스와 인터페이스를 하나의 폴더에 적절하게 배치할 때 관련된 클래스들이 묶여 있는 폴더

패키지를 사용할 때의 장점은 무엇?

  • 다른 기능을 구현한, 같은 이름의 클래스를 사용할 때 이름의 충돌을 피할 수 있음
  • 관리가 용이하며, 클래스의 접근 권한을 패키지 단위로 제어할 수 있음.

API에 제공되는 많은 클래스들을 패키지화하여 제공 사용자가 만든 클래스들을 패키지화해서 사용할 수도 있음

  • Java.applet : 애플릿 작성에 필요한 기능을 모아 놓은 패키지
  • java.awt : GUI작성과 관련된 패키지.javax.swing 패키지와 함께 자바 GUI애플리케이션 작성 시 필수적으로 사용함. 버튼, 텍스트 필드, 메뉴 등 관련 컴포넌트와 이벤트 기능을 제공함
  • *java.io : 자바 입출력 기능과 관련된 패키지. 파일이나 버퍼 등의 입출력 기능을 제공함
  • *java.lang : 자바 언어의 기초적인 사항을 정의한 클래스와 관련된 패키지. Object 클래스, 문자열 관련, 시스템 관련, 멀티 Thread 관련 등 기본적인 기능을 포함함
  • *java.net : 자바의 네트워크에 관련된 패키지. 네트워크와 관련된 패키지는 이 밖에도 여러 가지가 있지만, 이 패키지 내에는 소켓과 관련된 기능을 제공함.
  • java.swing : java.awt 패키지와 더불어 자바 GUI애플리케이션 기능과 관련된 패키지. java.awt 포함 내용보다 다양하고, 융통성 있는 컴포넌트를 제공함.
  • *java.util : 유틸리티성 기능과 관련된 패키지. 날짜 표현이나 여러 자료형을 하나로 취급하는 컬렉션과 관련된 기능을 제공함.

import 예약어

API에 제공되는 패키지화된 클래스들을 사용하기 위해서 import 예약어를 사용함 별도의 패키지를 지정하지 않은 경우에는 디폴트 패키지가 됨

  • 디폴트 패키지의 클래스를 사용할 때에는 import문을 사용하지 않음
  • java.lang패키지는 별도의 import문을 사용하지 않음 import 문을 사용하여 JVM실행 시 클래스를 찾기되는 과정
  • 클래스가 저장된 폴더 -> 클래스패스를 설정한 폴더 -> import한 클래스

import 문 사용 시 패키지 이름 지정 방법

  1. 패키지의 특정 클래스 이름까지 포함된 완전한 이름을 사용하는 경우

    • 패키지 내의 한 클래스만 사용하면 클래스 이름까지 지정함
  2. 패키지 이름만을 사용하는 경우

    • 한 패키지 내에 여러 클래스가 사용될 때 패키지 이름만을 사용함

import 문 사용 시 패키지 이름 지정 방법은 컴파일러에게 포함할 클래스를 미리 알려줌 -> 컴파일 시간의 효율성과 연관.

여러 패키지에 동일한 이름의 클래스를 import 하는 경우?

import java.util.Date;
import java.sql.Date;

error 발생

동일한 이름의 클래스는 여러 개 import 할 수 없음 -> 사용빈도가 높은 클래스 - import 시켜 사용함 사용빈도가 낮은 클래스 - 패키지 경로를 포함하여 사용함.

import java.sql.Date;

public class ImportTest{
   main(){
     java.util.Date utilDate = new java.util.Date();
     Date sqlDate = new Date(system.currentTimeMillis());
  }
}

패키지의 개념

ex) 고객관리 프로그램

  • 두 클래스의 이름 다르게 지정하기 개인고객 : PersonalCustomer.class 법인고갹 : EnterpriseCustomer.class --문제점--> 고객의 종류가 많아질수록 클래스 이름을 매번 다르게 생각해야 함 프로그램의 특성상 모든 종류의 고객을 동일한 이름의 클래스로 정의해야 하는 경우가 있음 자바는 객체지향 프로그램이기 때문에 시스템이 복잡해질수록 클래스 파일들도 상대적으로 많이 작성됨 -> 기능과 용도가 다른 많은 클래스들이 모두 같은 폴더에 저장되어 있다면 관리상 어려움이 생김

--해결방법--> 두 Customer클래스를 폴더를 다르게 저장하여 이름 충돌을 피함. 개인 고객 관련 클래스들과 기업 고객 관련 클래스들을 각기 다른 폴더에 저장하여 관리함. enterprise(폴더) > Customer.java personal(폴더) > Customer.java

자바는 프로그램 구현에 필요한 중요 클래스들을 API형태로 JVM에 포함

커스텀 라이브러리 : API에서 제공하지 않거나, API를 응용해서 개발자가 직접 만든 클래스들을 라이브러리 형태로 만들어서 사용할 수 있음 -> 비슷한 기능들을 간단하게 구현할 수 있으며 다른 애플리케이션에서도 재사용이 가능함.