백기선 자바 스터디 1기 7주차

2022. 5. 18. 11:18Java/java-live-study

728x90
반응형

목표

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

학습할 것

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

package 키워드

패키지(package)는 비슷한 성격의 자바 클래스들을 모아 놓은 자바의 디렉토리이다. 패키지를 사용하면 비슷한 성격의 클래스들끼리 묶을 수 있어 클래스의 분류가 용이하다. 그리고 다른 사람이 작성한 자바 클래스나 라이브러리를 사용할 경우 클래스명이 동일한 경우도 발생할 수 있을 것이다. 하지만 패키지명이 다르면 클래스명이 동일해도 충돌없이 사용할 수 있다.

위의 사진과 같이 pack1, pack2 패키지 하위에 Foo라는 동일한 이름의 클래스가 있지만 클래스 앞에 패키지를 명시해주어 main함수 내에서 두 클래스 모두 충돌없이 사용이 가능하다. 단, 패키지명을 생략할 수 없기 때문에 import는 불가능하다.

 

Built-in 패키지

패키지의 종류는 사용자 정의 패키지와 Built-in 패키지 2가지가 있다. 위의 사진에서와 같이 사용자가 정의한 것이 사용자 정의 패키지이고 자바에서 사용자가 사용할 수 있도록 기본적으로 제공하는 여러 클래스들이 포함된 패키지를 Built-in 패키지라고 한다.

 

예로 자바에서 String 클래스는 우리가 정의하지 않았는데 사용할 수 있다.

 

빌트인 패키지 종류

  • java.lang : language suppoart 클래스들을 포함사는 패키지
    • 프리미티브 타입이나 수학 연산의 정의가 되는 클래스들
    • 자동으로 import되기 때문에 해당 패키지의 클래스를 바로 사용할 수 있다.
  • java.io : 입출력 기능을 지원하는 클래스들을 포함하는 패키지
  • java.util : 자료구조 구현을 위한 유틸리티 클래스를 포함하는 패키지
  • java.applet : Applets을 생성하기 위한 클래스들을 포함하는 패키지
  • java.awt : GUI 컴포넌트를 구현하기 위한 클래스들을 포함하는 패키지
  • java.net : 네트워킹 기능을 지원하기 위한 클래스를 포함하는 패키지

improt 키워드

다른 패키지에 있는 클래스를 사용하려면 import 키워드로 그 경로를 명시해서 컴파일러에게 알려주어야한다. 

import pack1.Foo; //패키지.클래스 형식으로 명시

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Foo> foos = Arrays.asList(new Foo(), new Foo());
        foos.forEach(Foo::print);
    }
}

improt 형식의 클래스 부분에 와일드카드를 사용하는 것도 가능하다.

import pack1.Foo;

import java.util.*; //java.util에 있는 모든 클래스를 import

public class Main {
    public static void main(String[] args) {
        List<Foo> foos = Arrays.asList(new Foo(), new Foo());
        foos.forEach(Foo::print);
    }
}

클래스패스

클래스패스는 말 그대로 클래스가 있는 경로이다. JVM과 컴파일러가 바이트코드(.class)를 실행하거나 소스 코드(.java)를 컴파일할때 해당 클래스를 찾아야하는데 이때 클래스패스를 기준으로 클래스를 찾는다.

//HelloJava.java 소스 코드
public class HelloJava {
	public static void main(String args[]) {
		System.out.println("Hello, Java");
	}
}

위와 같이 HelloJava.java 라는 소스 코드가 있다.

sochong@hongseogjuui-MacBookPro cpStudy % ls
HelloJava.java
sochong@hongseogjuui-MacBookPro cpStudy % javac HelloJava.java
sochong@hongseogjuui-MacBookPro cpStudy % ls
HelloJava.class	HelloJava.java
sochong@hongseogjuui-MacBookPro cpStudy %

이 HelloJava.java 를 javac 로 컴파일하면 HelloJava.class 라는 바이트코드 파일이 생성된다.

sochong@hongseogjuui-MacBookPro cpStudy % java HelloJava
Hello, Java
sochong@hongseogjuui-MacBookPro cpStudy %

이를 실행하면 위와 같이 정상적으로 실행 된 것을 알 수 있다. 그런데 다른 디렉토리로 이동한 후 같은 명령어로 실행하면 어떻게 될까?

sochong@hongseogjuui-MacBookPro temp % ls
sochong@hongseogjuui-MacBookPro temp %

다른 디렉토리로 이동하였다. temp 디렉토리는 하위에 어떠한 파일도 존재하지 않는다.

sochong@hongseogjuui-MacBookPro temp % java HelloJava
오류: 기본 클래스 HelloJava을(를) 찾거나 로드할 수 없습니다.
원인: java.lang.ClassNotFoundException: HelloJava
sochong@hongseogjuui-MacBookPro temp %

java 명령어로 HelloJava 를 실행하면 ClassNotFoundException 즉, 클래스를 찾을 수 없다는 예외가 발생하여 실행이 되지 않는다.


CLASSPATH 환경변수

환경변수는 운영체제 단위의 변수로 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들의 모임이다. JVM 또한 CLASSPATH 라는 환경변수 값을 참고하여 동작하게 된다.

sochong@hongseogjuui-MacBookPro temp % export CLASSPATH=/Users/sochong/jvm-study
sochong@hongseogjuui-MacBookPro temp % env | grep CLASSPATH
CLASSPATH=/Users/sochong/jvm-study
sochong@hongseogjuui-MacBookPro temp %

export 명령어로 HelloJava.class 파일이 있는 디텍토리 경로를 CLASSPATH 환경변수를 설정해준다.

sochong@hongseogjuui-MacBookPro temp % java HelloJava
Hello, Java
sochong@hongseogjuui-MacBookPro temp %

위와 같이 JVM이 CLASSPATH 환경변수를 참고하여 ClassNotFoundException 예외가 발생하지 않고 잘 실행되는 것을 확인할 수 있다.


-classpath 옵션

java 명령어에 -classpath (혹은 -cp) 옵션으로 클래스패스를 넘겨줄 수 있다.

sochong@hongseogjuui-MacBookPro temp % java -classpath /Users/sochong/jvm-study HelloJava
Hello, Java
sochong@hongseogjuui-MacBookPro temp %
sochong@hongseogjuui-MacBookPro temp % java -cp /Users/sochong/jvm-study HelloJava
Hello, Java
sochong@hongseogjuui-MacBookPro temp %

접근지시자

접근지시자는 클래스에 접근할 수 있는 범위를 지정하는 것이다.

 

접근지시자는 객체의 상태가 무분별한 접근으로 인해 개발자가 원하지 않는 상태로 바뀌는 것을 막기위해 사용된다.

 

접근 지정자는 public, protected, default, private 네 가지가 있다.

접근 지정자 클래스 내부 동일 패키지 하위 클래스 그 외 영역
public o o o o
protected o o o x
default(기본, 생략가능) o o x x
private o x x x

 

728x90
반응형