Package
package 패키지명 (현재 파일이 있는 경로)
Class가 많아지고 한 폴더에 파일이 많아지면 관리가 어렵기 때문에
관련된 파일들을 폴더별로 나눠서 관리한다 자바에서는 이 폴더를 package라고 한다.
패키지의 특징
- 한 폴더에는 같은 이름의 클래스가 여러 개 올 수 없다.
- 내가 만든 패키지와 상대방이 만든 패키지가 같고 그 안의 파일명도 같다면 함께 사용할 수 없다.
- 클래스를 만든 사람들은 고유의 패키지를 만들 필요가 있다.
보통 패키지는 도메인 이름을 반대로 적는다.
whiteship.study.com => com.study.whiteship
패키지 이름은 모두 lowercase로 작성하고 underscore없이 연속되는 단어로 작성한다.
com.study.whiteShip 이나 com.study.white_ship 으로 작성하지 않는다
패키지는 자바 파일의 최상단에 위치하고
Java 파일이 위치할 수 있는 경로부터 하위 폴더 표시한다(구분은 .)
import
import 패키지이름.클래스이름;
import 패지키이름.*;
import는 다른 패키지 안에 클래스를 접근하기 위해 사용된다.
- 클래스 이름을 명시하면 특정 클래스 접근
- *를 사용하면 패키지내의 모든 클래스를 접근할 수 있다
static import
static import를 사용하면 static member를 class name을 명시하지않고 접근할 수 있다.
가독성을 위해 static import를 사용하기도 한다. 상황에 고려없이 너무 남용하면 오히려 가독성을 해친다
package com.study.whiteship;
import static java.lang.System.*;
public class Main {
public static void main(String[] args) {
out.println();
}
}
java.lang
docs.oracle.com/javase/7/docs/api/java/lang/package-summary.html
- 기본 패키지
- .java 파일에 자동으로 import
- System은 java.lang 안에 클래스이다.
public class Main {
public static void main(String[] args) {
System.out.println("hello world");
}
}
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
31
32
33
34
|
// class version 52.0 (52)
// access flags 0x21
public class com/study/whiteship/Main {
// compiled from: Main.java
// access flags 0x1
public <init>()V
L0
LINENUMBER 3 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
RETURN
L1
LOCALVARIABLE this Lcom/study/whiteship/Main; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x9
public static main([Ljava/lang/String;)V
L0
LINENUMBER 6 L0
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
LDC "hello world"
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
L1
LINENUMBER 7 L1
RETURN
L2
LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
MAXSTACK = 2
MAXLOCALS = 1
}
|
cs |
바이트코드의 12 번 라인을 확인하면 invokespeical로 java.lang을 호출함을 확인할 수 있다.
CLASSPATH
.class 파일의 위치를 알려준다.
java -classpath 클래스파일위치 클래스명
을 사용하여 java 명령어를 실행할 수 있다. 클래스 패스를 설정하지 않으면 자바는 기본적으로 현재 디렉토리 안에서 클래스를 찾게된다.
패키지명 없이 실행하면 오류가 발생한다.
환경변수
JVM이 시작될때 JVM 클래스 로더는 환경변수를 호출한다. 환경변수 CLASSPATH가 설정되면 실행할때마다 -classpath 옵션을 사용하지 않아도 된다.
opentutorials.org/course/1223/5527
접근 지시자
- public : 아무런 제약없이 외부 접근 가능
- protected: 같은 패키지의 상속 관계 있는 객체까지만 접근 허용
- default : 해당 패키지 내에서만 접근 허용
- private : 해당 class 내에서만 접근 허용
접근범위
public > protected > default > private
public class Wallet {
private int money;
public Wallet(int money) {
this.money = money;
}
public void pickMoney(int amount) {
int remain = this.money - amount;
if (remain < 0) {
throw new IllegalArgumentException();
}
this.money = remain;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
public class Main {
public static void main(String[] args) {
Wallet wallet = new Wallet(1000);
wallet.pickMoney(500);
System.out.println(wallet.getMoney()); // 500
}
}
함수를 통한 데이터 접근의 장점
- 맴버 변수를 저장하지 않고 필요할때마다 getter에서 계산 가능
- setter에서 추가 로직 실행 가능
- 상속을 통한 다형성 구현