7회차. 패키지

KIMA·2023년 1월 27일
0
post-thumbnail

목표

자바의 패키지에 대해 학습하기

학습할 것

package

: 서로 관련된 클래스들의 묶음

  • 패키지의 물리적인 형태는 파일 시스템의 폴더이다.
  • 하위 폴더처럼 하위 패키지를 가질 수 있다.

선언하는 방법

: 소스 파일의 최상단에 해당 클래스가 속한 패키지를 하나만 선언한다.

  • 문법 : package 패키지명
  • 명명규칙
    • 모두 소문자 작성하는 것이 관례
    • 숫자로 시작 ❌
    • _, $를 제외한 특수문자 ❌
    • 해당 소스 파일이 위치한 폴더의 이름과 같아야 한다.
    • 웹사이트 주소를 반대로 기재한 모양으로 패키지명을 부여
      • 예) com.회사명.프로그램명
        • com : 영리단체(회사) 패키지
        • org : 비영리단체(오픈소스) 패키지
    • 다음의 패키지 이름은 사용하면 안된다.
      • 첫째, 자바의 예약어
        • 예) int, static
      • 둘째, 자바 패키지
        • java : 자바 기본 패키지
        • javax : 자바 확장 패키지

Built-in Package

: 사용자 정의 패키지 이외에 자바는 개발자들이 사용할 수 있도록 많은 패키지와 클래스를 제공한다.

  • 종류
    • java.lang
      : 자바의 기본적인 클래스들을 포함하는 패키지
      • import문으로 불러오지 않아도 컴파일러가 자동으로 임포트해준다.
      • 포함하는 클래스
        • String
        • System
        • Object
        • Math
        • wrapper 클래스 - Integer, Character
          등...
    • java.util
      : 유용한 클래스들을 포함하는 패키지
      • 포함하는 클래스
        • 자료구조 구현을 위한 클래스 - List, Set
        • Random - Math.random()이 내부적으로 이 클래스를 사용한다.
        • Objects - null check, 두 객체의 대소비교 등 Object 클래스의 보조 역할을 한다.
        • regex 패키지 - 정규식을 지원한다.
        • Scanner - 입출력
        • StringTokenizer - 문자열을 특정 문자를 기준으로 파싱해준다.
    • java.io
      : 입출력 기능을 지원하는 클래스를 포함하는 패키지
    • java.net
      : 네트워킹 기능을 지원하기 위한 클래스를 포함하는 패키지

💡 FQCN(Fully Qualified Class Name)이란?
: 모든 클래스에는 정의된 클래스 이름과 패키지 이름이 있고, 이 두 이름을 합쳐야 한 클래스를 완전하게 표현할 수 있다

  • 클래스의 완전한 이름이 중복되지 않아야 하므로 하나의 패키지 안에는 같은 이름의 클래스가 존재하지 않으며 패키지가 다르다면 같은 이름의 클래스가 가능하다.
    • 이러한 특징이 클래스를 유일하게 만들어준다.
  • 예) String클래스의 패키지는 java.lang이며, FQCN은 java.lang.String이다.

💡 Namespace란?
: 이름을 구분할 수 있게 해주는 공간

  • A라는 이름을 가진 파일이 /directory_a/ 안에도 있고 /directory_b/ 안에도 있을 때, 사용하고자 하는 파일이 속한 디렉토리를 같이 지정해주면서 어떤 디렉토리에 있는 파일을 사용할 것인지 알려준다. 즉, 같은 이름을 가진 파일 A를 구분시켜주는 것은 디렉토리이다. 이때 디렉토리가 네임스페이스 역할을 하는 것이다.
  • 예를들어, 자바의 패키지도 네임스페이스이다.
  • 네임스페이스로 이름 중복으로 인한 문제를 방지할 수 있다.

import 키워드

: 다른 패키지에 있는 클래스를 사용하기위해, 해당 클래스를 import한다.

  • 문법

    • 하나의 클래스만 가져오는 경우 : import 패키지명.클래스명
    • 다수의 클래스를 가져오는 경우 : import 패키지명.*
      • *는 클래스 전체를 의미한다.
      • import문으로 지정된 패키지의 하위 패키지는 import 대상이 아니다.
      • 다수이지만 적은 갯수의 클래스들을 가져오는 경우, IDE 설정을 통해 해당 클래스들을 *가 아닌 각각의 import 패키지명.클래스명 문법으로 가져올 수도 있다.
        • IDE의 설정에서 적은 갯수가 몇 개를 의미하는지 설정해줄 수 있다.
        • 적은 갯수의 클래스를 가져올 때 *, 구체적인 클래스명 둘 중에 어떤 방식을 따를지는 개발 팀의 컨벤션에 따르도록 한다.
  • 클래스를 사용할 때 패키지를 같이 명시해준다면, import문을 생략해도된다.

    // import 사용 ⭕
    package livestudy.week7;
    
    import livestudy.week0.Car;
    
    public class Practice
        public static void main(String[] args) {
            Car car = new Car();
        }
    }
    
    // import 사용 ❌
    package livestudy.week7;
    
    public class Practice {
      public static void main(String[] args) {
          livestudy.week0.Car car = new livestudy.week0.Car();
      }
    }
    • 하지만 패키지가 길 경우 가독성이 좋지 않다.
    • 따라서 동일한 이름의 클래스를 두개 이상의 패키지에서 import할 때 패키지를 구분하기위해, 클래스를 사용하면서 패키지를 같이 명시해주는 것이 좋다.

static import

: 클래스의 static 필드와 static 메소드를 클래스명없이 필드명과 메소드명만으로도 바로 접근할 수 있도록해준다.

  • static import문이 아니라 일반 import문을 사용한다면 클래스.필드, 클래스.메소드 형태로 클래스명을 반드시 명시해야 한다.

  • 예제) 테스트 프레임워크인 JUnit의 단정문 작성시

    // static import ❌
    @Test
    public void nonStaticImport(){
        Assert.assertThat(1, CoreMatchers.is(1)); // 클래스명.메소드 형식으로 접근
    }
    
    // static import ⭕
    @Test
    public void staticImport(){
        assertThat(1, is(1)); // 메소드명만으로도 접근
    }
    • static import를 사용하면 코드를 영어 문장 형태로 읽을 수 있어 의도를 쉽게 파악하기 쉽다.

클래스패스

  • JVM이 자바 프로그램을 실행하면서 혹은 자바 컴파일러가 소스 파일을 컴파일 하면서 필요한 클래스 파일(.class)을 클래스 패스로 지정한 경로에서 찾는다.

지정하는 방법

  • 클래스 패스로 .class 파일이 포함된 디렉토리의 경로를 여러개 지정할 수 있으며, 경로가 여러개 있다면 ;로 구분하여 적는다.
  • 디렉토리뿐만 아니라 zip 파일와 jar 파일도 경로에 지정할 수 있다.

첫째, CLASSPATH 환경변수 설정하기

: JVM의 클래스 로더는 컴퓨터 환경 변수 설정을 통해 지정한 $CLASSPATH 환경변수를 호출해 해당 디렉토리에 정의된 클래스들을 로딩한다.

  • 문법 : CLASSPATH=경로1;경로2;경로3;...
    • 예) CLASSPATH=.;[JDK의 경로]\lib\tools.jar
  • 단점 : 운영체제를 변경하면 환경변수가 사라지기 때문에 이식성 면에서 불리하다.
    • 최근에는 운영체제 상의 환경변수로 클래스패스를 설정하는 것은 지양하고 IDE나 빌드도구를 통해 클래스패스를 설정한다.

💡 환경변수란?
: 운영체제에 지정하는 변수로 자바 가상머신과 같은 애플리케이션은 환경변수 값을 참고해서 동작하게 된다.

  • 환경변수 설정 방법
    • windows : 시스템 설정 > 환경변수
    • linux, unix 계열 : etc/profile

둘째, java compile 혹은 runtime때 -classpath 옵션 설정하기

: $CLASSPATH 환경변수로 지정해주지 않은 경로에 있는 클래스 파일들을 사용할 때 해당 옵션을 설정한다.

  • 문법
    • 컴파일 시 : javac --classpath 경로1;경로2;경로3;... <source file>
    • 런타임 시 : java --classpath 경로1;경로2;경로3;... <class file>
    • --classpath는 단축어인 --cp를 사용해도 된다.
  • -classpath 옵션을 지정해주지 않으면 기본적으로 현재 디렉토리가 클래스 패스로 지정된다.

💡 JVM의 클래스 로더

  • 클래스 로더의 종류
    출처 - 패키지
    • Bootstrap Class Loader
      : 기본 클래스로더 중 최상위 클래스 로더
      • 자바 1.8버전 기준으로 jre/lib/rt.jar에 담긴 String이나 Object 같은 기본 클래스들의 클래스 파일을 자동으로 로딩해준다.
    • Extension Class Loader
      • 자바 1.8버전 기준으로 jre/lib/ext 폴더나 java.ext.dirs 환경 변수로 지정된 폴더에 있는 클래스 파일을 자동으로 로딩해준다.
    • System Class Loader
      : $CLASSPATH 환경변수나 -classpath로 지정된 폴더에 있는 사용자 정의 클래스들의 클래스 파일을 자동으로 로딩해준다.

접근 제어자(Access Modifier)

: 클래스, 멤버변수, 메서드 그리고 생성자에 사용되어, 외부에서 접근하지 못하도록 제한하는 역할을 한다.

  • 종류(접근할 수 있는 범위에 따라 나뉨)

    public > protected > (default) > private

    • private : 같은 클래스 내
      • 클래스의 내부에 선언된 데이터를 외부로부터 보호하기 위해 사용된다.
        • 예) 비밀번호
      • 클래스의 외부가 아닌 내부에서만 사용될 때 사용된다.
        • 예) 카운터
      • 이 둘은 객체지향 개념에서 은닉화(information hiding)로 불린다.
      • 객체 생성자 호출을 막기 위해 생성자에 붙이기도 한다.
    • default : 같은 패키지 내
      • 따로 접근 제어자를 명시하지 않으면 default가 적용된다.
    • protected : 같은 패키지 내 또는 다른 패키지의 자식 클래스 내
    • public : 모든 곳
  • 사용가능한 접근 제어자

    대상접근 제어자
    클래스public, (default)
    메소드public, protected, (default), private
    멤버 변수public, protected, (default), private
    지역 변수없음

Reference

profile
안녕하세요.

0개의 댓글