백기선 자바스터디

백기선 자바스터디 07주차

까마귀코딩 2023. 1. 31. 15:20
더보기
왜? 라는 생각을 달고 살자!

<< 총 15주차 까지 진행되며 주어지는 키워드를 가지고 블로그에 정리하며 공부하는 스터디 입니다 ! >>


 

목표

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

학습할 것 (필수)

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

 

 

 


package 키워드


패키지란?? 뭘 뜻하나요?

 

 

-> 클래스, 인터페이스 들의 묶음 !!

 

 

 

패키지를 왜 사용하나요 ?

연관된 클래스와 인터페이스들 끼리 묶어서 효율적으로 관리하려고 !!

 

 

== 

자바에서 패키지란 ?

 

서로 관련 있는 클래스나 인터페이스의 컴파일된 클래스(.class)파일들을 한곳에 묶어 놓은 것을 말함 !

그러므로  -> 패키지는 파일 시스템의 디렉터리(혹은 폴더)와 연관 !!

하나의 패키지는 ? 하나의 디렉터리에 저장된 클래스 파일들을 말한다 ~!

==

 

 

 

 

클래스는 어떤 특징이 있나요 ?

 

1. 클래스 첫문장에 그 클래스가 속한 패키지를 선언해 줘야함 !

2. 모든 클래스들은 모두 하나의 패키지에 속해야함 !

3. 패키지는 도트연산자를 이용해서 계층구조를 구분함 !

4. 패키지도 물리적 클래스 파일을 포함하는 하나의 디렉토리임 ! (.class)

5. 패키지를 선언하지 않으면 자바에서 기본적으로 제공하는 이름없는 패키지에 속하게 됨 ! ( unnamed package )

6. sub 패키지는 패키지의 패키지를 말함 !

7. 디폴트 패키지는 임포트 불가능함 !!!

 

 

 

디폴트 패키지는 뭐임 ? 

 

 프로그램을 실행하는 데 필요한 기본 설정을 제공하는 기능 집합입니다.

 특정 패키지가 선택되지 않은 경우??

컴파일러는 이 기본패키지(디폴트패키지)를 선택하여 Java 코드가 더 잘 작동하도록 합니다. 

내장 패키지를 사용하거나 필요할 때 사용할 수 있는 사용자 정의 패키지를 만들 수도 있습니다. 

선언해야 하며 필요한 경우 프로그램으로 가져와야 합니다. 

패키지는 코드를 재사용 가능하고 효율적으로 만듭니다. 이름 충돌을 피할 수 있으며 코드도 잘 구성되어 있습니다.

 

 

 

 

 

 

 

어떻게 사용하는지?

소스파일 제일 위에 아래 문장을 넣어 준다.

package 패키지명;

 

 

어떤 특정 패키지에 속한 클래스를 사용하고 싶으면 패키지의 full경로를 적어 사용하면 되지만

일반적으론 import방식을 이용한다.

// 패키지 full 경로를 이용

java.util.Date date = new java.util.Date();

 

 

 

 

 

어떤 제약 사항이 있는지?

 

1. 패키지 선언은 반드시 주석과 공백을 제외한 첫번째 문장이어야 한다. 

2. 하나의 소스파일에 단 한번만 ! 선언될 수 있다 !

3. 소스파일에 포함된 모든 클래스나 인터페이스는 선언된 패키지에 속해야 한다. 

4. 클래스명과 구분하기 위해서 소문자로 주로 쓴다 !

5. 숫자로 시작해서는 안된다 ! 특수문자를 쓰면 안된다 ! ( _와 $만 가능)

6. java로 시작하는 패키지는 자바 표준api 에서만 사용하므로 사용해서는 안된다 !

 

 

 

< 자바에서의 주요 패키지 >

 

 

 

java.lang 패키지 

 

lang 패키지는 java 프로그래밍에 필요한 가장 기본적인 클래스들이 모여있는 패키지이다. 

import 구문으로 호출해야만 사용할수 있는 다른 패키지들과는 다르다 

 

뭐가 다를까 ? 

 

lang 패키지는 import 안해도 자동으로 포함된다.

그래서 lang 패키지에 포함되는 클래스는 따로 명시하지 않아도 최상위 클래스가 된다

 

 

java.lang 패키지에 포함된 클래스

 

String, StringBuffer

Process, Runtime, Thread

Math, StrictMath

Exception Thorwable,

Error, Package, Class,

ClassLoader, Wrapper

System, Stream

 

java.util 패키지 

 

java.util 패키지는  뭘까 ? 

 

java 프로그래밍에 유용한 클래스들을 모아둔 것으로 

대표적인 클래스 로는

날짜 관련된 : Date, Calandar 가 있으며 

자료구조 관련된 : Collection 프레임워크 관련 클래스

 

들이 포함되어있다. 

 

 

java.util 에 속한 클래스 

 

AbstractCollection,

AbstractList, AbstractSequentialList,

LinkedList, ArrayList, Vector, Stack,

AbstractSet, HashSet, LinkedHashSet, TreeSet,

AbstractMap, HashMap, LinkedHashMap, TreeMap,

Arrays, BitSet, Calendar GregorianCalendar,

Collection, Date, Dictionary, Hashtable, Properties,

EventObject, Locale, Observable, Random,

Scanner, StringTokenizer

 

 

 

java.io 패키지 

 

java.io 패키지는 java.nio패키지와 함께 파일이나 통신 등 

디지털 정보의 입출력을 처리하는 클래스가 정의된 패키지이다.

패키지의 대표적인 바이트 스트림 처리 인터페이스는 

inputStream 과 outputStream 이 있으며, 문자열 (Character Stream) 방식 

입출력 처리를 위한 클래스로는 Reader 와 Writer 추상 클래스가 정의되어있다. 

 

 

java.time 패키지

 

java 에서 날짜, 시간, 날짜와시간에 대한 파싱, timezone 등을 정의한 패키지이다. 

 

 


import 키워드


위의 예에서 보았듯이 다른 패키지의 클래스를 사용하려면 ??

클래스가 포함된 패키지 이름을 import 시켜줘야 한다고 했다 !

 

import 문은 일반적으로 package문 다음에 위치한다 !

 

 

어떻게 임포트 선언하나?

 

import 패키지명.클래스명;

 

하거나 

 

import 패키지명. * ; 하면 된다.

 

"import 패키지명. * ; " 요거의 의미가 뭘까 ? 

 

해당 패키지에 있는 모든 클래스를 사용하겠다는 의미이다 !!

 

필요하지 않는 클래스까지 임포트 시키면 성능문제 없을까?

 

실행시 성능상의 차이는 전~~~~~혀 없다 !

 

 

지금까지 우리가 System 이나 String 같은 java.lang 의 패키지의 클래스들을 

패키지 명 없이도 사용할수 있었던 이유가 뭘까 ??

 

-> 모든 소스파일에 묵시적으로 import java.lang. * ;  이 선언되어 있기 때문이다.

 

 

 

 

= 이클립스 = 

 

패키지 자동 import 기능 : 

ctrl + shift + o

 

= 인텔리제이 = 

 

사용하지 않는 import 지우는 기능 :

mac >

 

ctrl + option + O

 

자동 import 설정: 

 

1. action 검색 

2. optimize imports on 

3. Auto import 

4. OFF -> ON 으로 설정 

 

 

스태틱 임포트

 

static import 문을 사용하는 이유 ? 

-> static 멤버를 호출할때 클래스 이름을 생략할수 있다. 

 

만일 static import 문을 선언하였다면 첫번째 코드를 두번째 코드와 같이 간략하게 할수 있다. 

 

1. Double  pi. = Math.PI ; 

import static  java.lang.Math.*; 추가 후에는???

 

= > 

2. Double pi = PI ;

 

 

이렇게 간략하게 만들어줄수가 있다 !

 

 

 

 


클래스패스


클래스 패스??

 

말 그대로 클래스를 찾기 위한 경로이다. 

 ->  컴파일러나 JVM 의 클래스로더는

runtime 시에 찾는것이 있다 !

 

 

== .class 파일 찾는데 그걸 찾는 기준이 되는 경로를 

클래스패스라고 한다 !

 

클래스 파일이 포함된 경로는 윈도우 기준으로 ;로 구분짓는다. 

 

ex>

.;C:\windows\system32;c:\ProgramFiles\Java\Jdk1.8.0\bin; 이라고 하면 

 

 

 

그중에 3가지 

1. .(점)

2.  C:\windows\system32

3. :\Program Files\Java\Jdk1.8.0\bin

 

이 세 경로들은 명령 프롬프트 상에서 프로그램을 실행시킬때 실행파일을 찾는 경로정보로 활용이된다.

 

 

 

 

클래스 이동시 문제점 

 

 

 

myclass 디렉터리 안에서 정상 실행되던 것이

mysubclass에 AAA.class와 BBB.class를 옮기면 ???

-> 실행이 되지 않으며 클래스가 보이지 않는다는 오류가 발생한다 !!

 

 

이유???

 

 

기본적으로 아무설정하지 않으면 

-> java.exe가 실행된 디렉터리 에서만 가상머신에 올려진 클래스를 찾기 때문

 

 

 

어떻게 해???

 

 

" java.exe 를 실행시킨 현재 디렉터리의 서브 디렉터리인

mysubclass 디렉터리에서 해당 클래스를 찾아보세요" 

라는 설정을 해주면 된당 ~!

 

 

즉, set classpath=.;C:\myclass\mysubclass; 대강 이런식으로 지정해주면 된다.

 

 

 

 

*

클래스 로더의 3가지 종류 !

*

 

 

클래스 로더는 계층구조 ! 차례대로 실행 !

 

부트스트랩 클래스로더 - JAVA_HOME\lib 에 잇는 코어 자바 API를 제공 !

최상위 우선순위를 가진 클래스로더

 

플랫폼 클래스로더 -

JAVA_HOME\lib\ext 폴더 또는 

java.ext.dirs 시스템 변수에 해당하는 위치

에 있는 클래스를 읽는다 

 

 

애플리케이션 클래스로더 -

애플리케이션 클래스패스

( 애플리케이션 실행할 때 주는 

-classpath 옵션 또는 java.class.path 환경변수의 값에 해당하는 위치 )

에서 클래스를 읽는다. 

 

 

 


CLASSPATH 환경변수


환경변수 PATH 는 ??

windows 가 명령 프롬프트 상에서 실행파일을 찾는 경로의 정보가 된다 !

 

 

명령 프롬프트 상에서 디렉터리 경로에 상관없이 

프로그램의 이름을 입력하여, 해당 프로그램을 실행하기 원한다면??

 

환경변수 PATH 에 실행파일의 위치를 등록해야한다. ( windows 만 해당 )

 

 

윈도우즈 에서는

제어판 - 시스템 - 고급시스템 설정 - 환경변수 에서 추가 가능하다 

 

 

 

예시)

JAVA_HOME의 변수 값이 어떻게 저장되어 있는지 확인한다.

시스템 변수의 - path로 들어가 편집을 누른다.

아래와 같이 %JAVA_HOME%가 포함되어 있는지 확인한다.

 

새로만들기를 통해 클래스패스를 추가한다

 

아래와 같이 나타나면 성공이다.

 

 

 

 

[MacOS] 맥에서 환경변수 설정 및 확인하는 법 총정리

 

 

사실 윈도우에 관심없다. 

맥을 알아보자

 

 

환경변수 설정

1.  새 임시 환경변수 설정하기

터미널에서 export 새임시환경변수명=새임시환경변수값 입력

 

userMacBookPro:~ username$ export ENVIRONMENT_VARIABLE=value

 

 

 

2.기존 환경변수에 임시 환경변수 값 추가 설정하기

터미널에서 export 기존환경변수명=새임시환경변수값:$기존환경변수명 입력

 

userMacBookPro:~ username$ export ENVIRONMENT_VARIABLE=new_value:$ENVIRONMENT_VARIABLE

 

 

 3. 영구 환경변수 설정하기

1. .bach_profile 파일 확인

 

userMacBookPro:~ username$ ls -a

...
.bash_profile
...

 

 

 

2. .bash_profile 파일 열기

 

userMacBookPro:~ username$ open .bash_profile

 

 

3. .bash_profile 파일에 환경변수 추가

 

새 영구 환경변수 추가

.bash_profile 파일에 export 새영구환경변수명=새영구환경변수값 입력

export ENVIRONMENT_VARIABLE=new_value

기존 환경변수에 영구 환경변수 값 추가

.bash_profile 파일에 export 기존환경변수명=새영구환경변수값:$기존환경변수명 입력

export ENVIRONMENT_ENVIRONMENT_VARIABLE=new_value:$ENVIRONMENT_VARIABLE

 

 특수문자나 기호나 들어가는 경우 큰따옴표로 묶어주어야 함.

※ 터미널이 처음 실행될 때 .bash_profile 파일을 불러오므로 새 영구 환경변수를 설정한 후에는 터미널을 다시 실행해야 함.

 

 

환경변수 확인

- 모든 환경 변수 확인하기

터미널에서 printenv 입력

userMacBookPro:~ username$ printenv

...
TERM_PROGRAM=Apple_Terminal
SHELL=/bin/bash
...

- 특정 환경 변수값 확인하기

터미널에서 echo $환경변수명 입력

userMacBookPro:~ username$ echo $TERM_PROGRAM

Apple_Terminal

 

 

 

 

 


-classpath 옵션


javac와 java 명령어 실행시 고려해야 할 점이 여러가지 존재한다 !!



javac의 경우 ? 

컴파일하려는 해당 클래스와 관련된 클래스 혹은 jar 파일의 경로를 설정해줘야 제대로 된 컴파일이 수행된다 !


그렇지 않으면 컴파일하려는 클래스에서 참조한 클래스 및 상속받은 클래스 인터페이스 등에 의해서 에러가 발생한다.

 

 

 

 

더보기

-cp ( classpath ) 는 참조하려는 클래스가 위치한 경로를 설정하는 옵션이다 !

-d 는 생성한 클래스의 위치를 설정하는 옵션이다 

이외에도 아주많은 javac 옵션이 존재한다 !

 

 

 

-cp 옵션은 javac 에서 설명한 것과 같은 기능을 한다. 

  리눅스의 경우 java 옵션에서 클래스패스 요소를 구분하는 기호가

: (콜론) 이고, 윈도우는 ; (세미콜론) 이다.
    이 점 주의하여 사용토록 하자.

 

 

 

 

 


접근 제어 지시자(access modifier)

 


뭘까?

 

클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드

 

 

종류 : private, default, protected, public

  • private
    : 같은 클래스 내부에서만 접근 가능(외부 클래스, 상속 관계의 클래스에서도 접근 불가)
  • default
    : 접근 제어 지시자를 선언하지 않은 경우, 동일 패키지 내에서만 접근 가능(상속 관계라도 패키지가 다르면 접근 불가)
  • proteced
    : 동일 패키지나 상속관계의 클래스에서만 접근 가능하고 그 외 외부에서는 접근 불가
  • public
    : 어디서든 접근 가능한 인스턴수 변수 및 메소드

 

 

public > default > protected > public

 

 

 

접근 지시자

클래스, 필드, 메서드 단위로 외부에서 접근 가능한 범위를 설정하는 것을 말한다.

다른 표현으로는 접근 제한자(Access Modifier), 접근 수준 지시자(Access-level Modifier) 라고도 한다.

 

외부에서 접근 가능한 범위를 설정하기 때문에 아래와 같은 기능을 하게 된다.

  • 객체 생성을 막기 위해 생성자를 호출하지 못하게 함
  • 객체의 특정 데이터를 보호하기 위해 해당 필드에 접근하지 못하게 함
  • 특정 메서드를 호출할 수 없도록 제한하는 기능을 함

 

 

 

 

--

접근 지시자 사용이유 ? 

--

 

1. 외부로부터 접근제한 ! 데이터 보호하기 위함 !

2. 외부에서 불필요하고 내부적으로 사용되는 부분을 감추기 위함 ! - 캡슐화라고 표현함 ~

!