💡 목표 : 자바의 패키지에 대해 학습해보자.
⚡️ 목차
- 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();
java, lang, javax, net, io, util, math 등 Java API에 포함된 모든 패키지들을 말한다.
사용자(개발자)가 정의한 패키지를 말한다.
어떤 package 내부에 존재하는 package를 Sub package라고 한다. 이는 하나의 package에서도 객체의 행위를 기반으로 다시 분류하기 위함이다.
_
과 $
를 제외한 특수 문자 사용 금지자바에서 import란 자바의 라이브러리 패키지의 클래스를 사용하거나 다른 패키지 안의 클래스를 사용할 때 import
명령어를 사용하면 클래스 이름으로 사용할 수 있게 해주는 명령어 이다.
자바에서 import문은 다음과 같이 선언할 수 있다.
1. import 패키지이름.클래스이름;
2. import 패키지이름.*;
패키지 이름에는 패키지의 경로를 포함한 풀 네임을 명시해야 한다.
첫번째 방법은 해당 패키지의 특정 클래스만을 사용하고자 할 때 사용한다.
두번째 방법은 해당 패키지의 모든 클래스를 클래스 이름만으로 사용하고 싶을 때 사용한다.
소스 코드를 컴파일 하면 바이트 코드로 변환되고 JVM이 이 바이트 코드로 된 파일을 실행하려면 파일을 찾아야 하는데 이 바이트 코드까지의 경로를 classpath라고 한다. classpath는 콜론(:)
으로 구분된 디렉터리 및 파일 목록이며, JVM이나 Java 컴파일러에 사용자 정의 클래스와 패키지의 위치를 지정해주는 파라미터이다. 쉽게 말해 자바가 클래스를 찾아 사용을 해야하는데 클래스들이 어디에 있는지 위치를 지정해주는 값이다. classpath를 지정할 수 있는 방법은 두가지가 있는데 하나는 환경변수 CLASSPATH
를 사용하는 방법이고, 또 하나는 java runtime에 -classpath 플래그
를 사용하는 방법이다.
환경변수 PATH를 사용하는 이유는 macOS의 터미널 같은 창에서 자바가 설치된 경로까지 이동하지 않고 java, javac를 사용하려고 설정하는 것이다. 예를 들어 /Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk
경로에 자바가 설치되었다고 가정해보면 우리가 아는 바이트 코드를 보기 위해선 컴파일을 해야하는데 이 때 환경변수가 설정되어 있지 않으면 위 경로로 이동하여 javac 명령을 실행해야만 한다. 하지만 자바가 설치되어있는 경로를 시스템 변수로 설정하면 디렉터리를 이동하지 않고도 컴파일이 가능하다.
예제를 하나 퍼왔다 예제로 정확히 이해해보자
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");
}
}
WhatYourName.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 옵션이다. 바로 결과부터 보면WhatYourName.class
가 실행할 때 필요한 AAA.class
, BBB.class
의 위치를 가상머신에게 알려준다는 것이다.
:
-> 현재 디렉터리에서 클래스를 찾는다는 뜻.
;
(:
) (윈도우에선;
, 리눅스나, macOS인 경우:
사용) -> 경로와 경로를 구분해주는 구분자.
pathtest
(개인별로 디렉터리 명이 다르기 때문에 구분해서 사용하자) -> 현재 디렉터리에 없으면 현재 디렉터리의 하위 디렉터리 중pathtest
에서 찾으라는 의미이다.
자바에서 접근제어자는 클래스와 클래스의 멤버(필드, 생성자, 메서드)를 사용할 때, 접근 할 수 있는 범위를 지정해주는 역할을 한다. 클래스나 클래스 멤버 앞에 붙어있는 public
, private
, protected
등의 키워드가 바로 접근제어자이다.
대 상 | 사용 가능한 접근 제어자 |
---|---|
클래스 | public, (default) |
필드 | public, protected, (default), private |
메서드 | public, protected, (default), private |
지역변수 | 없음 |
접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위함이다. 데이터가 유효한 값을 유지하도록 또는 개인정보(예를들어 비밀번호)와 같은 데이터를 외부에서 함부로 변경하지 못하도록 하기 위해서는 외부로부터의 접근을 제한하는 것이 필요하다. 이것을 데이터 감추기 또는 객체지향 개념에선 캡슐화(encapsulation)라고 한다.
대 상 | 사용 가능한 접근 제어자 |
---|---|
클래스 | public, final, abstract, (default) |
필드 | 모든 접근제어자, final, static |
메서드 | 모든 접근제어자, final, abstract, static |
지역변수 | final |
휴 이번주도 어케 함 잘 살아보자 완성,,
[참고]
https://88240.tistory.com/448
https://velog.io/@ljs0429777/7주차-과제-패키지#classpath-