자바 기본 복습 7. 패키지

장난·2021년 5월 25일
0

자바 기본

목록 보기
7/15
post-thumbnail

7주차 과제: 패키지


📌 목표

자바의 패키지에 대해 학습하세요.


📌 학습할 것

  • package 키워드
  • import 키워드
  • 클래스패스
  • CLASSPATH 환경변수
  • -classpath 옵션
  • 접근제어자

📜 시작에 앞서

  • 백기선 님의 라이브 스터디(2020년 11월부터 2021년 3월까지) 커리큘럼을 따라 진행한 학습입니다
  • 뒤늦게 알게 되어 스터디 참여는 못했지만 남아있는 스터디 깃허브 주소유튜브 영상을 참고했습니다

📑 package 키워드


패키지

소프트웨어에서 구조를 단순화하기 위해서는 서로 관련성이 높은 클래스 집합을 논리적인 단위로 통합해야 한다. 이처럼 상공에서 바라본 소프트웨어의 전체적인 구조를 표현하기 위해 관련된 클래스 집합을 하나의 논리적인 단위로 묶는 구성 요소를 패키지 또는 모듈이라고 한다
출저: 객체지향의 사실과 오해

  • 클래스, 인터페이스, 하위 패키지의 모음
  • 물리적으로 하나의 디렉토리를 처럼 작용
  • 디렉토리 구조기 때문에 도메인 역순이 자연스럽다 com.mydomain.service
  • 내장 패키지와 사용자 정의 패키지로 분류
    • 내장 패키지: JDK에 포함된 Java API로 java.lang java.util java.io
    • 사용자 정의 패키지: 사용자가 직접 정의한 패키지
  • 모든 클래스는 반드시 하나의 패키지에 포함
    • 패키지 선언 없을 경우 unnamed package 로 자동 분류

FQCN(Fully Qualified Class Name)

  • 패키지명과 클래스명을 포함해 클래스를 표현
    • String -> java.lang.String
    • Member -> example.Member

패키지 선언

package 패키지명;

  • 해당 소스파일을 선언 패키지에 속하게 한다
  • 소스파일의 주석과 공백을 제외한 첫 문장에, 한 번만 선언 가능

📑 import 키워드


import

com.mydomain.uesrs.User user = new com.mydomain.uesrs.User();
  • 소스코드를 작성할 때 다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스명 사용

import com.mydomain.users.User;
	...
    User user = new User();
  • import키워드를 사용하면 패키지명을 생략할 수 있다
  • import 키워드를 통해 소스파일에서 사용할 다른 패키지 정보 컴파일러에 전달
  • 컴파일러는 이 정보를 통해 클래스명 앞에 패키지명 작성 가능
  • 패키지명.*표기로 해당 패키지에 속한 모든 클래스 사용 가능

static import

import org.assertj.core.api.Assertions;
	...
	Assertion.assertThat(actual).isEqualTo(expected)
import static org.assertj.core.api.Assertions.*;
	...
	assertThat(actual).isEqualTo(expected)
  • static import를 사용해 해당 클래스의 static 멤버 클래스명 없이 호출 가능

📑 클래스패스

  • JVM이나 Java 컴파일러가 파일을 실행할 때 필요한 클래스 파일을 찾을 경로

📑 클래스패스

  • JVM이나 Java 컴파일러가 파일을 실행할 때 필요한 클래스 파일을 찾을 경로
    • JVM의 클래스로더는 클래스패스의 경로를 바탕으로 클래스 파일을 찾는다
      • 클래스패스의 기본값은 현재 경로
    • 이때 기본적으로 해당 경로의 최상위 디렉터리부터 하위 디렉터리까지 순차적으로 탐색

📑 CLASSPATH 환경변수


환경변수

  • 운영체제 차원에서 설정하는 변수로, 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미친다
  • 윈도우는 시스템 속성 > 고급 > 환경변수에서 추가할 수 있다

환경변수 CLASSPATH 등록

  • 환경 변수 생성시 변수 이름과 변수 값이 필요
  • JAVA_HOME=설치한 jdk 경로
  • CLASSPATH=%JAVA_HOME%\lib;.

자동 클래스패스 설정

  • IDE나 빌드툴은 자동으로 클래스패스를 설정해준다
  • 인텔리j는 File > Project Structure > Project Settings > Modules 에서 확인 가능
    • IDE가 예측할 수 없는 클래스패스 경로를 설정해야 할 경우 여기서 수정 가능

📑 -classpath 옵션


java [options]

  • 명령어창 java java -help로 확인
    -cp <class search path of directories and zip/jar files>
    -classpath <class search path of directories and zip/jar files>
    --class-path <class search path of directories and zip/jar files>
                  A ; separated list of directories, JAR archives,
                  and ZIP archives to search for class files.

javac [option]

  • 명령어창 javac javac -help로 확인
  --class-path <path>, -classpath <path>, -cp <path>
        Specify where to find user class files and annotation processors

-cp \

  • 현재 디렉토리를 나타내는 . 상위 디렉토리 나타내는 ..
  • 여러 경로를 구분하는 윈도우 ;, 리눅스 계열 :

📑 접근제어자

  • 자바의 클래스, 인터페이스, 멤버 각각의 접근성은 이들이 선언된 위치와 접근 제어자로 결정
  • 접근성을 다룬다는 점에서 자바의 정보 은닉을 위한 도구
  • 접근성은 가능한 좁혀야 한다
    • 외부로부터 데이터를 보호
    • 외부에 불필요한 정보 감춰서 복잡성 감소

접근 제어자클래스 내부동일 패키지상속받은 클래스이외의 영역(전체)
privateOXXX
package-private (default)OOXX
protectedOOOX
publicOOOO
  • 톱레벨 클래스와 인터페이스는 접근제어자 public, package-private만 가능
    • public : 공개 API가 되며, 클라이언트를 위해 하위 호환 관리 필요
    • package-private : 해당 패키지 내에서만 사용하므로, 클라이언트와 관계 없이 얼마든 작업 가능
  • 인스턴스 멤버의 경우 명시하지 않으면 public이 디폴트

📑📌📜✏️

0개의 댓글