일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 백준#BOJ#8012#한동이는영업사원
- 백준#BOJ#2615#오목
- 백준#boj#16932#모양만들기
- 백준#boj#12755
- 백준#BOJ#1939#중량제한
- 백준#BOJ#12865#평범한배낭
- 백준#BOJ#14501#퇴사#브루트포스
- Today
- Total
순간을 성실히, 화려함보단 꾸준함을
7주차 과제: 패키지 본문
목표
자바 패키지에 대해 학습하자
학습할 것 (필수)
- package 키워드
- import 키워드
- 클래스패스
- 접근지시자
package 키워드
package란?
- 클래스들의 모음집을 뜻한다. 이를 통해 편리하게 프로젝트들을 관리할 수 있다.
왜 package를 사용하는가?
- 각 클래스들의 고유성을 보장하기 위해서이다. 서로 다른 라이브러리에서 동일한 클래스명을 가지고 있는 파일이 존재한다면 이는 다른 패키지를 사용함으로써 충돌을 피할 수 있다.
선언방법과 규칙
상위패키지명.하위패키지명.클래스
- 숫자로 시작하면 안된다.
- _, $ 를 제외한 특수문자를 사용해서는 안된다.
- java로 시작하는 패키지는 자바 표준 api 에서만 사용하므로 사용해서는 안된다.
- package 안의 클래스명은 고유해야한다. 다른 패키지라면 상관 없다.
FQCN(Fully Qualified Class Name)
FQCN 이란 클래스가 속한 모든 패키지명을 포함한 이름을 뜻한다.
예를 들어String str = new String();
과 java.lang.String str = new java.lang.String();
이 둘중에 후자가 FQCN 이다.
빌트-인 패키지(Built-In Package)
패키지는 크게 2가지로 나뉜다.
사용자 패키지와 Built-In 패키지로 나뉜다.
빌트-인 패키지란?
- Java API에 포함되는 다수의 클래스를 포함하는 패키지이다.
java.lang
: language support 클래스들을 포함하는 패키지java.lang
은 따로 선언을 하지 않고도 자동으로 import가 되어 있는 상태이다.
java.io
: 입출력 기능을 지원하는 클래스들을 포함하는 패키지java.util
: 자료 구조 구현을 위한 유틸리티 클래스를 포함하는 패키지java.applet
: Applets을 생성하기 위한 클래스들을 포함하는 패키지java.awt
: GUI 컴포넌트를 구현하기 위한 클래스들을 포함하는 패키지java.net
: 네트워킹 기능을 지원하기 위한 클래스를 포함하는 패키지
import 키워드
import 키워드란?
- 같은 패키지내에 존재하는 클래스들은 별다른 처리 없이 사용을 할 수 있지만, 다른 패키지에 존재하는 클래스들을 사용하고 싶을땐 import
키워드를 사용하여 사용할 수 있다.
선언방법
import 상위패키지.하위패키지.클래스
ex)
package com.mycompany;
import com.Animal.Rabbit; // 혹은, import com.Animal.*;
public class Cat{
Rabbit rabbit = new Rabbit();
}
[인텔리제이] Alt
+ Enter
키를 입력하여 바로 해당 패키지를 import
할 수 있다.
+static import
- static import는 자바5부터 지원하는 문법. 클래스에 대한 인스턴스 생성없이 바로 메소드를 사용할 수 있다
int x = Math.abs(-1);
이랬던 소스가
import static java.lang.Math.abs;
int x = abs(-1);
이렇게 사용이 가능하다
import static 패키지명.클래스명;
으로 선언하여 사용할 수 있다
클래스명 충돌(conflicts) 처리해주기
만약 서로다른 라이브러리를 import
하고 같은 클래스명을 가진 클래스가 존재한다면 이를 구분해주어야 할 필요가 있다.
import java.util.*;
import java.sql.*;
// 모두 Date라는 이름의 클래스가 존재, 어떤 패키지에 속한 클래스인지 명시해주지 않으면 에러가 발생한다.
Date yesterday; // Compile Error
만약 두개의 패키지 중에 한개에 패키지에 속한 클래스만 사용하고 싶을땐
import java.util.Date;
import java.sql.*;
Data yesterday;
이렇게 더 상세히 클래스명을 명시하여 import
시키면 된다.
그러나 두 패키지에 속한 Data
를 모두 사용하고 싶은 경우에는
java.util.Date yesterday = new java.util.Date();
java.sql.Date today = new java.sql.Date();
이렇게 모든 패키지명과 클래스명을 명시해주면 된다.
클래스패스
클래스패스란?
- 클래스를 찾기 위한 경로를 뜻한다. 자바에서 소스코드(.java)를 컴파일 하면 바이트코드(.class)로 변환이 된다. 이때 .class 파일에 포함되어있는 명령어들을 실행시 먼저 이 .class 파일이 있는 위치를 찾아야되는데 이 위치가 바로 클래스패스
에 지정한 경로가 된다.
클래스패스를 사용해야 되는 경우는?
- 현재 Directory 나 Sub Directory 에 없는 class를 사용해야 하는 경우
- 지정한 위치에 존재하지 않는 class를 불러와야 하는 경우
package com.example.demo;
public class Animal {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
이런 java 파일이 존재하고 있다. 이 자바파일의 경로는 /c/Users/myname/IdeaProjects/spring-boot-inf/demo2/src/main/java/com/example/demo
이다. 즉, 이 경로 안에 Animal.java
파일이 존재하고 있는 것이다.(저의 개인적인 경로입니다. 각자 다릅니다 이 위치는)
myname@DESKTOP-JDTS6BG MINGW64 ~/IdeaProjects/spring-boot-inf/demo2/src/main/java/com/example/demo
$ ls
Animal.java
자 이 java 파일을 컴파일 해보자.
$ javac Animal.java
그러면 .class
파일이 새롭게 생성되는 것을 확인할 수 있을 것이다.
$ ls
Animal.class Animal.java
이 클래스 파일을 실행하면 Hello World
가 출력되는 것을 확인할 수 있다.
이때 주의할 점은 .class
파일을 실행시킬때 패키지안에서 실행시키는 것이 아닌 패키지 밖의 위치에서 실행시켜야 한다.
예를 들어서 현재 .....JAVA/abc/Animal.class
라고 하면 abc
패키지 밖에서 java abc.Animal
이라고 명령어를 입력시켜야 정상적으로 실행이 된다.
만약 이를 지키지 않으면 java.lang.NoClassDefFoundError
에러가 발생하는 것을 확인할 수 있다.
$ java com.example.demo.Animal
Hello World
이러듯 우린 별다른 설정없이 잘만 실행해 왔다. 아무 설정없이 잘 실행해온 이유는 바로 .class
가 있는 위치에서 실행했기 때문이다. 그러나 위에서 언급한데로 다른 위치에 존재하는 .class
파일들을 실행하고 싶을 때 클래스패스를 설정하는 것이다.
이런 클래스패스를 설정하는 방법은 2가지가 존재한다.
- 클래스패스 환경변수 사용
- javac 와 java 의 옵션인 -classpath 사용
클래스패스 환경변수
// set CLASSPATH=_path1_;_path2_
set CLASSPATH=.;C;/Program Files\Java\jdk-15.0.1\bin
CMD 창에서 java 클래스패스 환경변수를 세팅하는 방법이다(windows 에서 설정하는 방법)
javac 와 java 의 옵션인 -classpath 사용
-classpath
키워드를 사용하여 클래스패스를 설정할 수 있다.
class Life{
int x=4;
Life(){
System.out.println("Hello Life");
}
}
public class Animal extends Life{
public static void main(String[] args) {
Life life = new Life();
}
}
이 소스를 컴파일 하면 Life.class
와 Animal.class
파일이 생성될 것이고, Animal.java
파일이 존재할 것이다.
그럼 현재 경로에서 lib
이라는 폴더를 만들고 Life.class
파일을 넣어보자.
$ ls
Animal.class Animal.java lib/
그럼 현재 경로에 Life.class
는 확인할 수 없다.
이 상태에서 한번 실행해 보자
$ java Animal
Error: Could not find or load main class Animal
Caused by: java.lang.NoClassDefFoundError: Life
Life
라는 클래스를 찾을 수 없다는 에러메세지가 뜨는 것을 확인할 수 있다.
한번 -classpath
키워드를 사용해 보자
$ java -classpath ".;lib" Animal
Hello Life
원하던 결과값을 도출해 내는 것을 확인 할 수 있다.
.;lib
이 무엇인지 한번 알아보자
.
은 현재 디랙토리에서 해당 클래스를 찾는 다는 의미이다.;
은 경로와 경로를 구분해 주는 구분자이다.
즉, java -classpath ",;lib" Animal
이라는 명령어는 현재 디랙토리에서 Animal.class
이라는 클래스를 실행하고 만약 Animal.class
를 실행하는데 사용되는 다른 클래스들이 필요하다면 해당 클래스들도 실행한다. 그러나 현재 디랙토리에 존재하지 않는 클래스들이라면 lib
이라는 하위디랙토리로 들어가 찾아서 실행하게 된다.
이와 같이 클래스패스란 자바를 실행할때 클래스들의 위치를 지정해주는 역할을 한다.
접근제한자
접근제한자란?
- 지정된 클래스,맴버변수,메소드 등을 외부(같은 패키지 또는 다른 패키지)에서 접근할 수 있도록 권한을 설정하는 것을 뜻한다.
- public : 모든 경로에서 접근이 가능하다.
- protected : 같은 패키지 또는 상속을 받은 경우에 접근이 가능하다
- default : 접근제한자를 적어주지 않은 경우이며, 같은 패키지내에서 접근이 가능하다.
- private : 해당 클래스 내에서만 접근이 가능하다.
'백기선님과 함께 하는 자바 스터디' 카테고리의 다른 글
9주차 과제: 예외 처리 (0) | 2021.06.26 |
---|---|
8주차 과제: 인터페이스 (0) | 2021.06.22 |
6주차 과제: 상속 (0) | 2021.06.12 |
5주차 과제 : 추가사항 (0) | 2021.06.06 |
5주차 과제: 클래스 (0) | 2021.06.06 |