인터페이스와 패키지
■ 인터페이스와 다형성
인터페이스
- 추상 클래스보다 추상성이 더욱 심화된 개념
- 멤버변수는 모두 상수형
- 메서드는 모두 추상 메서드로 선언
사용 이유
- 두가지 클래스의 특성을 가지는 클래스를 만들기 위해 다중상속이 불가능한 대신 인터페이스 제공
public interface 인터페이스명 extends 부모인터페이스명, ...{
// 상수 (final 예약어 사용)
// 추상 메서드 (인터페이스는 객체생성이 불가능하므로 상수에 static 예약어 필요
}
public interface Drawable{ // 인터페이스의 경우
public static final int PLAIN_PEN = 1; // static final 생략 가능
public static final int BOLD_PEN = 2;
pbulic static final int INTALIC_PEN = 3;
public abstract void draw(); // abstract 생략 가능
public abstract void move(int x , int y);
}
활용
- 인터페이스는 추상 클래스와 유사하기 때문에 직접 객체화 되지 못함
- implements 예약어 사용
[modifiers] class 클래스명 [extends 부모 클래스] implements 인터페이스1,2,3...{ ... }
인터페이스를 상속하는 클래스는 인터페이스에 정의된 추상 메서드들을 Overriding 해야함
하나라도 Overriding 하지 않으면 추상 메서드가 상속되어 해당 클래스는abstract 예약어가 붙은 추상 클래스로 선언됨.
인터페이스를 상속받은 클래스는 인터페이스의 기능을 사용하며 프레임을 가져오는 셈
형변환
class Circle extends shape implements Drawable{}
shape s = new Circle();
drawable d = new Circle();
- 인터페이스는 부모 클래스와 동일한 지위를 가짐
- 인터페이스 유형의 객체 참조 변수(d) 는 인터페이스에 선언된 요소에만 접근 가능
- 인터페이스를 구현한 객체의 요소에 접근하는것은 허용되지 않음. (d는 Circle의 요소에 접근 불가)
상속
- 인터페이스 선언 시 다른 인터페이스를 상속하여 정의할 수 있음
- 기본적인 상속과 동일함.
- 이를 상속받은 클래스는 부모 인터페이스의 모든 메서드를 Overriding 해야함.
■ 자바 패키지
패키지
- 자바의 클래스들을 분류하고 관련된 클래스와 인터페이스를 하나의 폴더에 적절하게 배치할 때 관련된 클래스들이 묶여있는 폴더
- 다른 기능을 구현한, 같은 이름의 클래스를 사용할 때 이름의 충돌을 피할 수 있음
- 관리가 용이하며, 클래스의 접근 권한을 패키지 단위로 제어할 수 있음.
import 예약어
- API에 제공되는 패키지화된 클래스들을 사용하기 위해서 import예약어 사용
- java.lang 패키지는 별도의 import문 사용 x
- 별도의 패키지를 지정하지 않은 경우 디폴트 패키지가 되며 이 패키지의 클래스를 사용할 때에는 import문을 사용하지 않음.
JVM 실행 시 import한 클래스를 찾게 되는 과정
클래스가 저장된 폴더 -> 클래스패스를 설정한 폴더 -> import한 클래스
- 다른 패키지의 클래스 사용하기
public class ImportTest{
public static void main(String args[]){
Date date = new Date(); // java.util.Date 클래스를 사용함
System.out.println(date.toString());
}
} // ImportTest클래스와 다른 패키지에 있는 클래스이기 때문에 기본적으로 컴파일이 되지 않음
- 다른 패키지의 클래스를 import 선언하여 사용하기
import java.util.Date;
public class ImportTest{
public static void main(String args[]){
Date date = new Date();
System.out.println(date.toString());
}
} // 외부 패키지인 java.util패키지의 Date클래스를 사용하기 위해 improt를 선언해야함
- import 없이 다른 패키지의 클래스 사용하기
public class ImportTest{
public static void main(String args[]){
java.util.Date date = new java.util.Date();
// import를 선언하지 않는다면 Date클래스를 생성할 때 경로까지 표현함
System.out.println(date.toString());
}
}
- 패키지내 한개의 클래스만 사용하면 클래스 이름까지 지정 ex) import java.util.Date
- 여러 클래스가 사용된다면 패키지 이름만 사용 ex) import java.util.*
- 서로 다른 패키지의 같은 이름의 클래스를 같이 import할 수 없음
import java.util.Date;
import java.sql.Date; // Error 발생
사용빈도가 높은 클래스를 import 시키고 빈도가 낮은 클래스는 패키지 경로를 포함하여 사용해야함
사용자 정의 패키지
package의 개념
- 윈도우 탐색기에서 폴더 or 디렉토리 개념과 같음
- 동일한 이름의 파일을 하나의 폴더에 저장하는 것은 불가능
package 예약어
- 개발자가 작성한 클래스르 특정 패키지로 묶을 수 있음
package 상위패키지명.패키지명; // 패키지 선언 문장은 반드시 첫번째 문장으로 기술
or
package 패키지명; // 이 파일 내에 모든 클래스는 이 패키지에 포함되어 저장
package PackageTest;
class A{}
class B{}
public class PackageTest{} // PackageTest 폴더에 세개의 클래스 파일이 생성되어 저장됨
생성된 패키지 내의 클래스를 다른 패키지에서 import하여 사용할 수 있음.
커스텀 라이브러리
- 자바는 프로그램 구현에 필요한 중요 클래스들을 API형태로 JVM에 포함
- 커스텀 라이브러리 생성 및 사용에 대한 자세한 내용 : [참고] -> javaProgramming 초급(2) -> 7차시 -> 24:37
[참고] : SWExpertAcademy
'Etc.. > SWExpertAcademy' 카테고리의 다른 글
[Java Programming] 객체지향 핵심 원리(8) (0) | 2021.07.22 |
---|---|
[Java Programming] 객체지향 핵심 원리(6) (0) | 2021.07.18 |
[Java Programming] 객체지향 핵심 원리(5) (0) | 2021.07.17 |
[Java Programming] 객체지향 핵심 원리(4) (0) | 2021.07.17 |
[Java Programming] 객체지향 핵심 원리(3) (0) | 2021.07.17 |