💡 목표 : 자바의 패키지에 대해 학습해보자.

⚡️ 목차

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

패키지

자바에서 패키지란 물리적으로 파일 시스템의 폴더를 의미하며, 관련있는 클래스나 인터페이스를 함께 묶어 파일을 효율적으로 관리할 수 있게 한다. 모든 클래스에는 정의된 클래스 이름과 패키지 이름이 있다. 이 둘을 합쳐야 완전하게 한 클래스를 표현한다고 할 수 있으며 FQCN(Fully Qualified Class Name) 이라고 한다.

FQCN(Fully Qualified Class Name)
FQCN은 object, 함수, 변수의 계층적 구조를 모두 포함하여 표현하는 것을 말하며 Java로 예를 드는 경우 해당 클래스가 속한 패키지명을 모두 포함한 이름을 말한다. 예를 들어 아래와 같다.

// 일반적인 사용법
String s = new String();


// FQCN
java.lang.String s = new java.lang.String();

Built-in package (내장 패키지)

java, lang, javax, net, io, util, math 등 Java API에 포함된 모든 패키지들을 말한다.

Custom package (사용자 정의 패키지)

사용자(개발자)가 정의한 패키지를 말한다.

Sub package (하위 패키지)

어떤 package 내부에 존재하는 package를 Sub package라고 한다. 이는 하나의 package에서도 객체의 행위를 기반으로 다시 분류하기 위함이다.

패키지 명명 규칙

  1. 숫자로 시작하거나, _$를 제외한 특수 문자 사용 금지
  2. java로 시작하는 패키지 금지 (자바 표준 API에서만 사용)
  3. int, static 등 자바 예약어 금지
  4. 모두 소문자로 작성하는 것이 관례

import

자바에서 import란 자바의 라이브러리 패키지의 클래스를 사용하거나 다른 패키지 안의 클래스를 사용할 때 import 명령어를 사용하면 클래스 이름으로 사용할 수 있게 해주는 명령어 이다.

import문의 선언

자바에서 import문은 다음과 같이 선언할 수 있다.

1. import 패키지이름.클래스이름;
2. import 패키지이름.*;

패키지 이름에는 패키지의 경로를 포함한 풀 네임을 명시해야 한다.
첫번째 방법은 해당 패키지의 특정 클래스만을 사용하고자 할 때 사용한다.
두번째 방법은 해당 패키지의 모든 클래스를 클래스 이름만으로 사용하고 싶을 때 사용한다.

classpath

소스 코드를 컴파일 하면 바이트 코드로 변환되고 JVM이 이 바이트 코드로 된 파일을 실행하려면 파일을 찾아야 하는데 이 바이트 코드까지의 경로를 classpath라고 한다. classpath는 콜론(:)으로 구분된 디렉터리 및 파일 목록이며, JVM이나 Java 컴파일러에 사용자 정의 클래스와 패키지의 위치를 지정해주는 파라미터이다. 쉽게 말해 자바가 클래스를 찾아 사용을 해야하는데 클래스들이 어디에 있는지 위치를 지정해주는 값이다. classpath를 지정할 수 있는 방법은 두가지가 있는데 하나는 환경변수 CLASSPATH를 사용하는 방법이고, 또 하나는 java runtime에 -classpath 플래그를 사용하는 방법이다.

CLASSPATH 환경변수

  • 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는, 동적인 값들의 모임
  • 운영체제에서 자식 프로세스들을 생성할 때 참조하는 변수

환경변수를 사용하는 이유

환경변수 PATH를 사용하는 이유는 macOS의 터미널 같은 창에서 자바가 설치된 경로까지 이동하지 않고 java, javac를 사용하려고 설정하는 것이다. 예를 들어 /Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk경로에 자바가 설치되었다고 가정해보면 우리가 아는 바이트 코드를 보기 위해선 컴파일을 해야하는데 이 때 환경변수가 설정되어 있지 않으면 위 경로로 이동하여 javac 명령을 실행해야만 한다. 하지만 자바가 설치되어있는 경로를 시스템 변수로 설정하면 디렉터리를 이동하지 않고도 컴파일이 가능하다.

-classpath 옵션

  • .class 파일을 실행할 때 사용할 클래스들의 위치를 JVM에게 알려주는 역할을 한다.
  • -classpath 옵션을 사용하지 않을 경우 클래스 파일이 위치한 현재 디렉터리를 기본 classpath로 잡아준다.

예제를 하나 퍼왔다 예제로 정확히 이해해보자

-classpath 옵션을 사용하지 않을때

  • src 디렉터리 안에 AAA.java,BBB.java, WhatYourName.java 파일이 있다.
public class WhatYourName {
	public static void main(String[]args) {
    	AAA a = new AAA();
        a.showName();
        
        BBB b = new BBB();
        b.showName();
	}
}
public class AAA {
	public void showName() {
    	System.out.println("AAA");
	}
}
public class BBB {
	public void showName() {
    	System.out.println("BBB");
	}
}
  • javac WhatYourName.java 명령어를 이용하여 컴파일 하면

    각 자바 파일에 해당하는 클래스 파일이 만들어진다. 이 후 java WhatYourName 명령어를 입력하면 AAA, BBB 가 출력되는 결과를 확인할 수 있다. 만약 AAA.class, BBB.class 파일을 옮긴다면? pathtest라는 새로운 디렉터리를 만든 후 AAA.class, BBB.class 파일을 옮긴 후에 다시 한번 java WhatYourName을 실행시켜봤다.

    AAA 클래스를 찾을 수 없다는 에러가 나왔다. 이 뜻은 WhatYourName에서 AAA 클래스를 참조하고 있는데 참조하고 있는 AAA 클래스를 찾을 수 없다는 것이다. 그 이유는 위에서 AAA.class, BBB.class 파일을 pathtest 디렉터리로 옮겼기 때문이다. 그럼 다른 디렉터리에 있는 class파일을 참조하고 싶으면 어떻게 할까 ? 바로 이 때 사용하는 옵션이 -classpath 옵션이다. 바로 결과부터 보면
  • classpath 뒤에 오는 "파일 절대 경로" 를 입력해주면 된다.
  • classpath 옵션은 자바를 실행할 때 사용할 클래스들의 위치를 JVM에게 알려주는 역할을 한다. 즉 WhatYourName.class가 실행할 때 필요한 AAA.class, BBB.class의 위치를 가상머신에게 알려준다는 것이다.

    : -> 현재 디렉터리에서 클래스를 찾는다는 뜻.
    ;(:) (윈도우에선 ;, 리눅스나, macOS인 경우 : 사용) -> 경로와 경로를 구분해주는 구분자.
    pathtest (개인별로 디렉터리 명이 다르기 때문에 구분해서 사용하자) -> 현재 디렉터리에 없으면 현재 디렉터리의 하위 디렉터리 중 pathtest에서 찾으라는 의미이다.

접근 제어자(Access Modifier)

자바에서 접근제어자는 클래스와 클래스의 멤버(필드, 생성자, 메서드)를 사용할 때, 접근 할 수 있는 범위를 지정해주는 역할을 한다. 클래스나 클래스 멤버 앞에 붙어있는 public, private, protected등의 키워드가 바로 접근제어자이다.

  • private : 같은 클래스 내에서만 접근 가능.
  • default : 같은 패키지 내에서만 접근 가능.
  • protected : 같은 패키지 내에서, 그리고 다른 패키지에 있어도 부모 클래스를 상속받은 자식 클래스에서 접근 가능.
  • public : 접근 제한 없음
대 상사용 가능한 접근 제어자
클래스public, (default)
필드public, protected, (default), private
메서드public, protected, (default), private
지역변수없음

접근제어자를 이용한 캡슐화

접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위함이다. 데이터가 유효한 값을 유지하도록 또는 개인정보(예를들어 비밀번호)와 같은 데이터를 외부에서 함부로 변경하지 못하도록 하기 위해서는 외부로부터의 접근을 제한하는 것이 필요하다. 이것을 데이터 감추기 또는 객체지향 개념에선 캡슐화(encapsulation)라고 한다.

제어자의 조합

대 상사용 가능한 접근 제어자
클래스public, final, abstract, (default)
필드모든 접근제어자, final, static
메서드모든 접근제어자, final, abstract, static
지역변수final

제어자를 조합해서 사용할 때 주의사항

  • 메서드에 static과 abstract를 함께 사용할 수 없다.
    • static은 구현이 되어있는 메서드에서만 사용할 수 있기 때문.
  • 클래스에 final과 abstract를 동시에 사용할 수 없다.
    • 클래스에 사용되는 final은 더이상 확장 할 수 없다는 의미이고, abstract는 상속을 통해서 완성이 되어야 한다는 의미로써 서로 모순되기 때문에 동시에 사용할 수 없다.
  • abstract 메서드의 접근 제어자가 private일 수 없다.
    • abstract메서드는 자식 클래스에서 구현하기 위해 접근해야 하기 때문에 private로 접근을 제한하면 자식 클래스에서 메서드를 구현할 수 없다.
  • 메서드에 private와 final을 같이 사용할 필요는 없다.
    • 접근제어자가 private인 메서드는 오버라이딩 될 수 없기때문. 이 둘 중 하나만 사용해도 의미는 충분하다.

끝!


휴 이번주도 어케 함 잘 살아보자 완성,,

[참고]
https://88240.tistory.com/448
https://velog.io/@ljs0429777/7주차-과제-패키지#classpath-

profile
⋆。゚★⋆⁺₊⋆ ゚☾ ゚。⋆ ☁︎。₊⋆

0개의 댓글