JAVA/자바의정석

자바(JAVA) : 객체지향 프로그래밍 II (3) - 패키지, 제어자

tigre 2022. 1. 10. 23:24
728x90
반응형

이전글

https://tigre911.tistory.com/44

https://tigre911.tistory.com/45

package 와 import

 

[1] 패키지(package)

패키지란, 클래스의 묶음이다. 패키지에는 클래스 또는 인터페이스를 포함시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있다.

같은 이름의 클래스 일지라도 서로 다른 패키지에 존재하는 것이 가능하므로, 자신만의 패키지 체계를 유지함으로써 다른 라이브러리의 클래스와 이름이 충돌하는 것을 피할 수 있다.

 

클래스가 물리적으로 하나의 클래스파일(.class)인 것과 같이 패키지는 물리적으로 하나의 디렉토리이다.

 

디렉토리가 하위 디렉토리를 가질 수 있는 것처럼, 패키지도 다른 패키지를 포함할 수 있으며, 점 '.'으로 구분한다.

예시로 com.office 라는 패키지가 있다면 com이라는 폴더안에 office라는 폴더가 있는 것이다.

- 하나의 소스파일에는 첫 번째 문장으로 단 한번의 패키지 선언만을 허용한다.
- 모든 클래스는 반드시 하나의 패키지에 속해야한다.
- 패키지는 점(.)을 구분자로 하여 계층구조로 구성할 수 있다.
- 패캐지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리이다.

 

[2] 패키지의 선언

클래스나 인터페이스의 소스파일(.java)에 한줄만 적어주면 된다

pakage 패키지명;

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

패키지명은 대소문자를 모두 허용하나, 클래스명과 구분을 위해 소문자를 하는 것을 원칙으로 한다.

 

[3] import문과 선언

import 문의 역할은 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것이다.

패키지문과 달리 한 소스파일에 여러번 선언할 수 있다.

 

선언 방법

import 패키지명.클래스명;
또는
import 패키지명.*;

[4] static import문

import문을 사용하면 클래스의 패키지명을 생략할 수 있는 것과 같이 static import문을 사용하면 static멤버를 호출할 때 클래스 이름을 생략할 수 있다.

 

제어자

 

[1] 제어자란?

제어자는 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.

제어자의 종류는 크게 접근 제어자와 그 외의 제어자로 나눌 수 있다.

접근 제어자 - public, protected, default, private
그 외 - static, final, abstract, native, transient, synchronized, volatile, strictfp

[2] static - 클래스의, 공통적인

static은 '클래스의' 또는 '공통적인' 의 의미를 가지고 있다.

인스턴스 변수는 하나의 클래스로부터 생성되었더라도 각기 다른값을 유지하지만, 클래스변수(static멤버변수)는 인스턴스에 관계없이 같은 값을 갖는다.

 

static이 붘은 멤버변수와 메서드, 그리고 초기화 블럭은 인스턴스가 아닌 크랠스에 관계된 것이기 때문에 인스턴스를 생성하지 않고도 사용할 수 있다.

 

stactic 이 사용될 수 있는 곳 - 멤버변수, 메서드 , 초기화 블럭

class StaticTest{
	static int width = 200;		//static변수
	static int height = 120;	//static변수
	
	static {					//클래스 초기화 블럭
		//static 변수의 복잡한 초기화 수행
	}
	
	static int max(int a, int b) {	//클래스 메서드(static메서드)
		return a > b ? a : b;
	}
}

[3] final - 마지막의, 변경될 수 없는

변수에 'final'이 사용되면 값을 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩을 할 수 없게되고 클래스에 사용되면 자신을 확장하는 자손클래스를 정의하지 못하게 된다.

 

final이 사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 지역변수

클래스 - 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. final로 지정된 클래스는 조상이 될 수 없다.
메서드 - 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
멤버변수, 지역변수 - 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.

<예시>

final class FinalTest{
	final int Max_Size = 10;
	
	final void getMaxSize() {
		final int LV = Max_Size;
		return Max_Size;
	}
}

 

[4] abstract - 추상의, 미완성의

메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상 메서드를 선언하는데 사용된다.

그리고 클래스에 사용되어 클래스 내에 추상메서드가 존재한다는 것을 쉽게 알 수 있게한다.

 

abstract 클래스 - 클래스 내에 추상 메서드가 선언되어 있음을 의미

              메서드 - 선언부만 적성하고 구현부는 작성하지 않은 추상메서드 임을 알림

<예시>

abstract class AbstractTest{
	abstract void move();
}

클래스 자체로는 쓸모가 없지만, 다른 클래스가 이 추상 클래스를 상속 받아서 일부 원하는 메서드만 오버라이딩 해도 된다는 장점이 있다.

 

[5] 접근 제어자(access modifier)

접근제어자는 멤버 또는 클래스에 사용되어 해당하는 멤버 또는 클래스르 외부에서 접근하지 못하도록 제한하는 역할을 한다.

 

접근 제어자가 사용될 수 있는 곳 - 클래스, 멤버변수 , 메서드, 생성자

private - 같은 클래스 내에서만 접근이 가능하다.

default - 같은 패키지 내에서만 접근이 가능하다.

protected - 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.

public - 접근 제한 없음

제어자 클래스 내부  동일 패키지  자손 클래스  전체
 public  o  o   o   o 
 protected  o   o   o   x 
 default (기본, 생략가능)  o   o   x   x 
 private  o   x   x   x 

접근 범위가 넓은 순으로 나열하면

public > pritected > (default) > private

 

대상에 따라 사용할 수 있는 접근 제어자

대상 사용가능한 접근 제어자
클래스 public, (default)
메서드 public, protected, (default), private
멤버변수
지역변수 없음

 

접근 제어자를 사용하는 이유

- 외부로부터 데이터를 보호하기 위해서

- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서

 

생성자의 접근 제어자

생성자에 접근 제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다.

보통생성자의 접근 제어자는 클래스의 접근 제어자와 같지만, 다르게 지정할 수도 있다.

 

생성자의 접근 제어자를 private으로 지정하면, 외부에서 생성자에 접근할 수 없으므로 인스턴스를 생성할 수 없게 된다.

그래도 클래스 내부에서는 인스턴스를 생성할 수 있다.

 

[5] 제어자의 조합

 

1. 메서드에 static과 abstract를 함께 사용할 수 없다.

 

2. 클래스에 abstract와 final을 동시에 사용할 수 없다.

 

3. abstract 메서드의 접근 제어자가 private일 수 없다.

 

4. 메서드에 private 과 final을 같이 사용할 필요는 없다.

728x90
반응형