본문 바로가기

Etc../SWExpertAcademy

[Java Programming] 객체지향 핵심 원리(7)

인터페이스와 패키지

■ 인터페이스와 다형성

인터페이스

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

사용 이유
  • 두가지 클래스의 특성을 가지는 클래스를 만들기 위해 다중상속이 불가능한 대신 인터페이스 제공

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