JAVA STUDY(with whiteship) 7주차

hwk·2021년 1월 14일
0

JAVA STUDY

목록 보기
6/12
post-custom-banner

제어문

목표

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

목차

  1. package 키워드
  2. import 키워드
  3. 클래스패스
  4. CLASSPATH 환경변수
  5. -classpath 옵션
  6. 접근지시자

1. package 키워드

  • 동일한 이름의 클래스 파일 해결
    한 프로젝트를 여러 팀에서 개발하고 있는 경우, 기능이 다른 동일한 이름의 클래스 파일이 생성되기 쉽다.
    이것을 서로 간에 동일한 이름의 클래스는 지양하자고 약속하는 것 보다는,
    이름이 동일하더라도 정보를 표시해서 클래스를 구분하는 것이 바람직하다.
    기본적으로 아래와 같이 해결할 수 있다.
  1. 컴파일 완료된 동일한 이름의 클래스파일을 서로 다른 디렉터리에 저장.
  2. 인스턴스 생성시, 저장되어 있는 디렉터리 정보를 표시해서 클래스를 구분하게 함.

이렇게 클래스 파일이 저장되어 있는 디렉터리 정보를 표시해서 인스턴스를 생성하기 위해
'package'라는 문법적 요소이다.

  • package의 이해
    패키지를 이용하면 클래스의 디렉터리 정보를 표시하는 방식으로 인스턴스 생성이 가능해진다.
    우선 1. 디렉터리를 나눈 후, 2. 소스파일 내에 package 선언을 한다.
    예를 들어 maindir이라는 이름의 디렉터리 안에 subdir_1와 subdir_2 라는 서브디렉터리가 있다.
    각각의 서브디렉터리 안에 컴파일된 SameNameClass라는 이름의 클래스파일을 저장한다.
    여기까지가 '1.' 의 디렉터리 나누기다.
    그리고 '2'를 하고 난 후 아래와 같은 방식으로 인스턴스를 생성할 수 있다.
maindir.subdir_1.SameNameClass s1 = new maindir.subdir_1.SameNameClass();
maindir.subdir_2.SameNameClass s2 = new maindir.subdir_2.SameNameClass();

그리고 maindir의 상위 디렉토리를 classpath로 추가한다.
그래야 JVM이 maindir을 찾을 수 있기 때문이다.

그리고 각각의 subdir_1안에 있는 SameNameClass 소스 파일에는 package maindir.subdir_1;,
subdir_2안에 있는 SameNameClass 소스 파일에는 package maindir.subdir_2; 을 선언한다.
이 package 선언은 소스파일의 맨 앞부분에 써서 파일 안에 정의된 모든 클래스에 영향을 미친다.
이로써 SameNameClass 라는 클래스의 인스턴스 생성시에는 반드시 패키지명을 명시해야만 인스턴스 생성이 가능하게 된다.

2. import 키워드

  • package 선언의 불편함 해소
    다른 패키지의 클래스를 참조하기 위해서는
    위의 1. 에서 언급한 패키지와 클래스를 명시하여 참조할 수 있다.
    하지만 일일히 클래스를 언급할 때 마다 패키지와 클래스를 계속 명시하면 불편할 것인데,
    이것을 해결하기 위해 import 키워드가 있다.
    사용하고자 하는 패키지를 import 문으로 선언함으로써 이후에 클래스를 사용할 때는 패키지를 생략할 수 있다.
    어떤 패키지에 포함된 다수의 클래스를 사용하려면 기호를 이용하여 사용하면 되는데,
    보통은
    기호를 사용하지 않고 사용할 클래스를 명시하여 적어줌으로써
    코드를 읽는 사람이 "이 파일에는 이러한 클래스를 사용합니다."라고 인지할 수 있는 효과가 있다.

  • 사용법
    import 패키지명.클래스명;
    import 패키지명.*;

import 문의 작성 위치는 패키지선언과 클래스선언 사이에 한다.

3. 클래스패스

class path는 말 그대로 클래스가 존재하는 경로를 뜻한다.
자바 가상머신은 프로그램의 실행과정에서 실행에 필요한 클래스를 찾을 때 바로 이 class path를 기준으로 찾게 된다.

  • 기본 구조

4. CLASSPATH 환경변수

  • 기본 개념
    다른 프로그램의 실행 능력을 지니는 명령 프롬프트는 환경변수 path를 참조하여 실행파일의 위치를 탐색하게 된다.
    환경변수 path는 필요에 따라서 얼마든지 추가할 수 있는데, 자바에서는 클래스의 검색 경로를 지정할 수 있도록
    classpath라는 환경변수를 정의하고 있다. 따라서 클래스의 경로 정보를 classpath라는 환경변수에 추가함으로써 클래스의 검색 경로를 확장할 수 있다.

  • %classpath%
    cmd에서 echo %classpath% 를 입력하여 classpath에 설정되어 있는 문자열 정보를 확인할 수 있다.
    아무런 classpath도 설정되어 있지 않다면 %classpath%로 출력된다.

  • classpath 추가 하기
    set 명령어를 사용하여 classpath를 설정할 수 있다.
    아래는 현재 디렉터리의 'subclass'라는 이름의 하위 디렉터리를 환경변수 classpath에 추가하는 명령어다. (사실 현재 디렉터리는 별도로 classpath에 추가하지 않아도 기본적인 클래스 파일의 탐색경로에 포함된다.)
    set classpath=.\subclass;
    세미콜론은 path에서와 마찬가지로 정보를 구분하는용도로 사용된다. 따라서 세미콜론을 이용해서 얼마든지 경로를 여러 개 추가할 수 있다.

5. -classpath 옵션

환경변수를 통하지 않고 classpath를 설정할 수 있다.
컴파일 할 때 -classpath 옵션을 사용하는 것이다.

classpath 환경 변수 설정과 -classpath 옵션을 동시에 진행하면,
-classpath의 우선순위가 높게 적용된다.

  • 사용법
    javac -classpath classpath경로 파일이름
    javac -cp classpath경로 파일이름

세미콜론을 구분자로 하여 여러 경로를 지정할 수 있다.

6. 접근지시자

  • 접근제어 지시자

    명시형으로 public, private, protected 로 세가지이며 접근제어 지시자의 생략도 가능하기 때문에 총 네가지 형태의 접근제어 선언이 가능하다.
    private으로 선언되는 인스턴스 변수와 메소드는 선언된 클래스 내부에서만 접근이 가능하다.
    객체지향 특성상 대부분의 인스턴스변수는 private으로 선언한다.(그러나 클래스 중에 데이터의 표현에만 초점을 맞춰서 설계된 매우 간단하게 정의된 클래스는 public으로 선언하는 예외도 있다.)
    외부에서 private으로 선언된 이 변수의 간접접근을 허용하기 위한 유형의 메소드를 가리켜 'Access 메소드'라 한다.

  • 클래스와 변수,메소드의 접근
    접근제어 지시자로 데이터의 접근 허용을 제어한다.
    변수, 메소드의 접근이라 함은 그 초기화나 호출을 뜻한다.
    클래스의 접근이라 함은 어떤 영역에서 인스턴스 생성을 의미한다.
    예를 들면 어떤 클래스가 default로 생성되었을 때, 접근 허용 규칙에 따라
    다른 패키지에서는 default 클래스의 인스턴스를 생성할 수 없다.

  • public 클래스
    1) 하나의 소스파일에는 하나의 클래스만 public으로 선언할 수 있다.
    2) public 클래스의 이름과 소스파일의 이름은 일치해야 한다.

이 규칙은 프로그램의 기능이나 내용을 이해하는 것에 중요한 역할을 하는 public클래스와 소스파일의 관계 형성을 하기 위함이다.

  • 어떤 클래스를 public으로 선언할지...
    가장 대표적인 것은 라이브러리로 활용하고자 하는 클래스를 예로 들 수 있다.
    계산기 라이브러리를 만들기 위해
    계산기 클래스, 덧셈 클래스, 뺄셈 클래스가 있다고 가정하자.
    덧셈 클래스와 뺄셈 클래스는 계산기 클래스의 기능이다.
    계산기 클래스 안에서 덧셈클래스와 뺄셈 클래스의 인스턴스를 생성하여 값을 주고 받을 수 있다.
    값을 주고 받기 위해서는 계산기, 덧셈, 뺄셈 클래스가 같은 패키지에 있어야 한다.
    이 때, 계산기 클래스는 public으로 선언하여 밖으로 노출 시킴으로써 라이브러리로 활용한다.
    하지만 덧셈 클래스와 뺄셈 클래스는 계산기 클래스를 완성하기 위해서 정의한 것일 뿐, 라이브러리의 형태로 제공하기 위한 클래스는 아니기 때문에 디폴트 선언을 하고 계산기 클래스와 같은 패키지에만 두면 된다.

이 라이브러리의 사용자는 계산기클래스에만 접근하면 될 뿐, 덧셈 클래스와 뺄셈 클래스에는 접근하지 않아도
계산기 클래스를 통해 그 기능을 사용할 수 있다. 덧셈과 뺄셈 클레스는 디폴트로 선언되었지만 계산기 클래스와 같은 패키지이기 때문이다. 꼬리에 꼬리를 물어 데이터와 기능에 접근할 수 있다는 개념이다.
그렇기 때문에 라이브러리의 사용자는 계산기 클래스만 알면 되지, 이외의 클래스는 알지도 못하고 알 필요도 없다.

profile
Elegant Dev
post-custom-banner

0개의 댓글