패키지 = 클래스의 묶음
패키지에는 클래스 또는 인터페이스를 포함시킬 수 있다.
서로 관련된 클래스들끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있음.
EX) String 클래스의 실제 이름은 java.lang.String이다.
= > java.lang 패키지에 속한 String 클래스라는 의미
(lang은 java 패키지의 하위패키지)
패키지 선언문
- 반드시 소스파일에서 주석과 공백을 제외한 첫번째 문장으로서 존재햐아 함.
- 하나의 소스파일에 단 한번만 선언 가능
- 해당 소스파일에 포함된 모든 클래스나 인터페이스는 선언된 패키지에 속함.
- 소문자 권장
이름없는 패키지(unnamed package)
모든 클래스는 반드시 하나의 패키지에 포함되어야 함.
그런데 패키지 딱히 선언 안해도 문제 안됐었음.
자바에서 기본적으로 제공하는 이름없는 패키지의 존재 때문이다.
== 패키지를 지정하지 않는 모든 클래스들은 같은 패키지에 속하게 되는 것.
package com.byeongttu.code;
public class Ex7_5 {
public static void main(String[] args) {
System.out.println("hello world. this package is 'com.byeongttu.code' ");
}
}
import문
컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공.
import 패키지명.클래스명;
import 패키지명.*;
위 아래의 다른 점은.. *를 사용했다는 것.
지정된 패키지에 속하는 모든 클래스를 패키지명 없이 사용할 수 있다.
컴파일러가 코드에서 사용되는 클래스를 찾아야하는 수고를 더 해야할 뿐, 다른 차이 없음.
실행 시 성능상의 차이는 없다.
※ 물론 컴파일 시에 처리되므로, 컴파일 시간이 걸릴 수는 있으나.. 실행 시 성능차이는 없는 것.
static import문
이를 사용하면 static 멤버를 호출할 때 클래스 이름을 생략할 수 있다. 특정 클래스의 static 멤버를 자주 사용할 때 편리함.
import static java.lang.System.out;
import static java.lang.Math.*; //Math 클래스의 모든 static 멤버
public class Ex7_6 {
public static void main(String[] args) {
// System.out.println(Math.random());
out.println(random());
// System.out.println("Math.PI: " + Math.PI);
// Math.PI가 static 멤버
out.println("Math.PI: " + PI);
}
}
제어자(modifier)
클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
- 접근 제어자: public, protected, default, private
- 그 외: static, final, abstract, native, transient, synchronized, volatile, strictfp
제어자는 클래스, 멤버변수, 메서드에 주로 사용됨.하나의 대상에 대해 여러 제어자를 조합하여 사용하는 것 가능하다. (물론 접근제어자는 하나만)
[자주 사용되는 제어자]
ⓐ static: 클래스의, 공통적인
인스턴스 변수는 하나의 클래스로부터 생성되었더라도 각기 다른 값을 유지.
그러나 클래스 변수(static 멤버변수)는 인스턴스에 관계없이 같은 값을 갖는다. 하나의 변수를 모든 인스턴스가 공유
"인스턴스를 생성하지 않고도 사용 가능"
인스턴스 멤버를 사용하지 않는 메서드는 static을 붙여서 선언하는 것을 고렿라자. 그게 더 빠름
<사용 가능한 곳 - 멤버변수, 메서드, 초기화 블럭>
class StaticTest{
static int width = 200; // 클래스 변수
static int height = 120; // 클래스 변수
static {
//static 변수의 복잡한 초기화
}
static int max(int a, int b){ // 클래스 메서드 (이 안에서는 인승턴스 멤버 직접사용 X)
return a > b ? a : b;
}
}
ⓑ final: 마지막의, 변경될 수 없는
변수에 사용 - 값 변경 불가능한 상수가 된다.
메서드에 사용 - 오버라이딩을 할 수 없음. ( 재정의 불가 )
클래스에 사용 - 자신을 확장하는 자손클래스를 정의하지 못함.
<사용 가능한 곳 - 클래스, 메서드, 멤버변수, 지역변수>
final class FinalTest{ // 자식 생성 불가능한 클래스
final int MAX_SIZE = 10; // 멤버변수 상수
final void getMaxSize() { // 오버라이딩 불가능한 메서드
final int LV = MAX_SIZE; //상수
return MAX_SIZE;
}
}
ⓒ abstrac: 추상의, 미완성의
메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 "추상 메서드" 선언 시 사용된다.
클래스에서 사용: 클래스 내 추상 메서드가 선언되어 있음을 의미
메서드에서 사용: 선언부만 작성, 구현부는 작성 X
<사용 가능한 곳 - 클래스, 메서드>
abstract class AbstractTest{
abstract void move();
}
추상 클래스는 아직 완성되지 않은 메서드가 존재하는 "미완성 설계도"이므로, 인스턴스 생성 불가능함.
AbstractTest a =new AbstractTest(); // 에러
미완성 클래스
- 추상 메서드를 보유하면 무조건 추상 클래스이다.
- 미완성 설꼐도 이므로, 제품 생성 불가능
- 사용하기 위해서는 상속 통해 구현부를 만들어야 한다. 완전한 설계도가 되어서야 객체 생성 가능.
접근 제어자(access modifier)
접근 제어자는 멤버 또는 클래스에 사용.
외부에서 접근하지 못하도록 제한하는 역할을 한다.
제어자 | 같은 클래스 | 같은 패키지 | 자손 클래스 | 전체 |
public | O | O | O | O |
protected | O | O | O | X |
(default) | O | O | X | X |
private | O | X | X | X |
#헷갈릴까봐 미리 써 놓자면, 자손 클래스는 프로젝트 내 다른 패키지에도 존재할 수 있다.
[ 접근 제어자 사용 이유 ]
- 외부로부터 데이터를 보호하기 위해서
- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서
"데이터 감추기", "캡슐화(encapsulation)"
public class Time{
// 접근 제어자를 private로하여 외부에서 직접 접근 못하도록 한다.
private int hour;
private int minute;
private int second;
public int getHour(){ return hour; }
public void setHour(int hour) {
if(hour < 0 || hour > 23) return;
this.hour = hour;
}
public getMinute() { return minute; }
public setMunute(int minute) {
if(minute < 0 || hour > 59) return;
this.minute = minute;
}
public getsecond() { return second; }
public setsecond(int second) {
if(second < 0 || second > 59) return;
this.second = second;
}
}
코드를 살펴보자.
get으로 시작하는 메서드는 단순히 멤버변수의 값을 반환하는 일을 함.
set으로 시작하는 메서드는 매개변수에 지정된 값을 검사하여 조건에 맞는 값일 때 멤버변수의 값을 변경.
상속을 통해 확장될 것이 예상되면 클래스라면, 멤버에 접근 제한을 주되 자손 클래스에서 접근하는 것이 가능하도록..
private 대신 protected를 사용한다.
보통..
get: 멤버변수의 값을 읽는 메서드 - 겟터(getter)
set: 멤버변수의 값을 변경하는 메서드 - 셋터(setter)
'프로그래밍 > java' 카테고리의 다른 글
[JAVA] 참조변수의 형변환 (0) | 2022.08.29 |
---|---|
[JAVA] 다형성(polymorphism) (0) | 2022.08.28 |
[JAVA] 오버라이딩(overriding)과 참조변수 super, super() 생성자 (0) | 2022.08.27 |
[JAVA] 상속 (0) | 2022.08.26 |
[JAVA] 객체, 인스턴스, 클래스, 메서드, 변수, static (0) | 2022.08.26 |