본문 바로가기
JAVA

패키지

by e-pd 2020. 12. 28.

https://github.com/whiteship/live-study/issues/7

 

 

 


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.lang (Java Platform SE 7 )

Interface Summary  Interface Description Appendable An object to which char sequences and values can be appended. AutoCloseable A resource that must be closed when it is no longer needed. CharSequence A CharSequence is a readable sequence of char values.

docs.oracle.com

  • 기본 패키지
  • .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

 

클래스 패스 - 생활코딩

본 수업에서는 IDE(eclipse, intellij)를 사용하지 않고 운영체제의 기본 에디터를 사용 한다. 클래스 패스 빈 디렉터리에 아래와 같이 코드를 작성한다. 필자는 프로젝트 디렉토리에 /srcbin 이라는 디

opentutorials.org

 

 

 


접근 지시자

  • 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에서 추가 로직 실행 가능
  • 상속을 통한 다형성 구현

 

 

 

'JAVA' 카테고리의 다른 글

예외처리  (0) 2021.01.10
인터페이스  (0) 2021.01.03
상속  (0) 2020.12.21
클래스  (0) 2020.12.15
Java 코딩의 기술-4  (0) 2020.12.06