본문 바로가기

컴퓨터학원(복습)(수료)

자바(JAVA)기반 안드로이드 웹&앱 개발 7일차(클래스 패스, 패키지, import, 접근수준 지시자, 캡슐화, static, 클래스 변수, 클래스 메소드 등)

클래스 패스(Class Path)

- 클래스 패스 = ‘자바 가상머신의 클래스 탐색 경로’

- ‘클래스 패스’라는 것을 지정하지 않으면 자바 가상머신은 필요한 클래스를 ‘현재 디렉토 리’에서 찾는다.

- C:\PackageStudy>set classpath = 클래스 패스의 확인

- C:\PackageStudy>set classpath=.;C:\PackageStudy\MyClass

- ‘,’ 은 현재 디렉토리를 표시한다.

- ‘;’ 현재 디렉토리와 추가 디렉토리를 구분하는 칸이다.

- ‘\’ 하위 디렉토리를 의미한다.

- ‘절대 경로’ 지정방식과 ‘상대 경로’지정방식이 있는데, 보안때문에 상대경로 지정방식을 주로 사용한다.

- C:\PackageStudy\MyClass 절대경로 방식은 C:\ 또는 D:\를 기준으로 지정한 경로를 가 리킨다.

 

패키지(Package)의 이해

- 패키지 선언은 클래스의 접근 방법을 구분할 뿐만 아니라 클래스 파일이 공간적으로도 구 분되게 한다.

- 클래스 접근 방법의 구분 : 서로 다른 패키지의 두 클래스는 인스턴스 생성 시 사용하는 이름이 다르다.

- 클래스의 공간적인 구분 : 서로 다른 패키지의 두 클래스 파일은 저장되는 위치가 다르다.

- 클래스의 이름과 구분이 되도록 패키지의 이름은 모두 소문자로 구성한다.

- 인터넷 도메인 이름의 역순으로 패키지 이름을 구성한다.

- 패키지 이름의 끝에 클래스를 정의한 주체 또는 팀을 구분하는 이름을 추가한다.

> com.wxfx.smart : wxfx.com인 회사의 smart팀에서 개발한 클래스를 묶은 패키지이름

- 패키지로 묶인 파일을 컴파일 할 때에는 다음과 같이 –d 옵션을 추가한다.

> C:\PackageStudy>javac –d

> : 패키지를 생성할 위치 정보

> : 컴파일할 파일의 이름

 

import 선언

- import com.wxfx.smart.Circle;

> 지금부터 Circle이라 하면 com.wxfx.smart.Circle을 의미하는 것이다.

- 동일한 이름의 클래스를 대상으로 동시에 import 선언을 하는 것은 불가능하다. ‘이름충 돌’이 발생하기 때문이다.

 

정보 은닉(Information Hiding)

- 자바에서 ‘정보’는 클래스의 ‘인스턴스 변수’를 의미한다. 따라서 정보를 은닉한다는 것은 인스턴스 변수를 숨긴다는 뜻이다.

 

정보 은닉을 위한 private 선언

- 인스턴스 변수의 앞에 private 선언을 추가한다.

- private 선언을 한 값을 가져오기 위한 세터(값의 설정을 위한 메소드)와 게터(값의 참조를 위한 메소드)가 필요하다.

> 게터 : 인스턴스 변수의 값을 참조하는 용도로 정의된 메소드, 변수의 이름이 name 일 때, 메소드의 이름은 getName으로 짓는 것이 관례

> 세터 : 인스턴스 변수의 값을 설정하는 용도로 정의된 메소드, 변수의 이름이 name일 때, 메소드의 이름은 setName으로 짓는 것이 관례

 

접근 수준 지시자(Access-level Modifiers)

- 접근의 허용 수준을 결정할 때 선언하는 키워드이다.

- 클래스 정의 대상 : public, default

- 인스턴스 변수와 메소드 대상 : public, protected, private, default

- 클래스 정의 대상의 public 과 default 선언이 갖는 의미

> public : 어디서든 인스턴스 생성이 가능하다.

> default : 동일 패키지로 묶인 클래스 내에서만 인스턴스 생성을 허용한다.

- 인스턴스 멤버의 public과 default 선언이 갖는 의미

> public : 어디서든 접근이 가능하다.

> default : 동일 패키지로 묶인 클래스 내에서만 접근이 가능하다.

지시자

클래스 내부

동일 패키지

상속받은 클래스

이외의 영역

private

O

X

X

X

default

O

O

X

X

protected

O

O

O

X

public

O

O

O

O

 

캡슐화(Encapsulation)

- 해당 클래스 안에 어떠한 내용들을 넣을까에 대한 것(Ex: 코감기약)

 

static 선언을 붙여서 선언하는 클래스 변수

- 클래스 내에 선언된 변수 앞에 static 선언을 붙이면 이는 인스턴스 변수가 아닌 ‘클래스 변수’가 된다.

- static 으로 선언된 변수는 변수가 선언된 클래스의 모든 인스턴스가 공유하는 변수이다.

- 어떠한 인스턴스에도 속하지 않는 상태로 메모리 공간에 딱 하나만 존재하는 변수이다.

- 인스턴스들은 이 변수에 바로 접근할 수 있는 권한이 있을 뿐이다.

- 클래스 변수도 ‘접근수준지시자’의 규칙을 그대로 적용받는다.

- 인스턴스 간에 데이터 공유가 필요한 상황에서 클래스 변수를 선언한다.(Ex.: PI)

 

클래스 변수(static 변수)의 접근 방법

- 클래스 내부 접근 : 변수의 이름을 통해 직접접근

> way.num

- 클래스 외부 접근 : 클래스 또는 인스턴스의 이름을 통해 접근

> AccessWay.num

- 클래스 변수는 인스턴스 내부에 있는 것이 아니다.

> 즉 생성자 안에다가 클래스 변수를 초기화해봤자 의미가 없다.

 

static 선언을 붙여서 선언하는 클래스 메소드

- ‘클래스 메소드’는 ‘클래스 변수’와 유사하다. 접근 방법도 동일하며 생성 이전부터 호출이 가능한, 그리고 어느 인스턴스에도 속하지 않는 메소드라는 점도 클래스 변수와 동일하다.

- 아래 NumberPrinter.showInt(20); 을 보면 인스턴스가 생성되기 전에 클래스 메소드가 호출된 것으로 보아 클래스 메소드는 어느 인스턴스에도 속하지 않는다.

- 클래스 메소드로 정의하는 것이 더 나은 경우

> 모두 외부에 기능을 제공하기 위한 메소드들이다.

> 모두 인스턴스 변수의 값을 참조하거나 수정하지 않는다.

- 클래스 메소드는 인스턴스에 속하지 않으므로 인스턴스 변수에 접근이 불가능하다.

> 같은 이유로 클래스 메소드는 인스턴스 메소드의 호출도 불가능하다.

 

System.out.println()

- java.lang.System.out.println() 에서 java.lang은 컴파일러가 문장을 삽입해주므로 패키 지의 이름부분(java.lang)은 생략이 가능하다.

- out은 System.out 으로 접근을 하니 static으로 선언된 클래스 변수(System 클래스)이다.

- println은 PrintStream 클래스의 인스턴스 메소드이다.

- System에 위치한 클래스 변수 out이 참조하는 인스턴스의 println 메소드를 호출

 

public static void main(String[] args)

- main 메소드의 호출이 이뤄지는 영역은 클래스 외부이므로 public으로 선언하는 것이 타 당하다.

- main 메소드는 인스턴스가 생성되기 이전에 호출된다. 따라서 static 선언하는 것이 옳음 을 알 수 있다.

- main 메소드를 담기 위한 별도의 클래스를 정의하는 것이 일반적이다.

 

또 다른 용도의 static 선언

- static 초기화 블록 (Static Initialization Block)

> 클래스 변수와 마찬가지로 가상머신이 클래스의 정보를 읽어들일 때 실행이 된다.

> 따라서, 다음과 같이 static 초기화 블록을 사용하면 클래스변수를 선언과 동시에 초기 화 할 수 있다.

- static import 선언

> 클래스 변수와 클래스 메소드에 대한 import 선언을 할 수 있다.

> Ex : import static java.lang.Math.PI;

> Ex : import static java.lang.Math.*;