패키지
- 서로 관련된 클래스의 묶음
- 클래스는 클래스 파일, 패키지는 폴더, 하위 패키지는 하위 폴더
- 클래스 실제 이름은 패키지를 포함.
-rt.jar는 클래스들을 압축한 파일 (이 안에 자바 관련 패키지/클래스 들어가 있음, Java9 부터는 모듈 개념)
- 패키지는 소스파일의 첫 번째 문장으로 단 한 번 선어
- 같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다.
- 패키지 선언이 없으면 이름 없는 패키지에 속하게 된다.
- bin 폴더 - 컴파일된 클래스 파일(*.class)이 있는 곳
- src 폴더 - 소스 파일(*.java)가 있는 곳
bin 폴더로 들어가서 하거나, 환경변수에 등록해서 실행시킬 수가 있다.
import 문
- 클래스를 사용할 때 피키지 이름을 생략할 수 있다.
- 컴파일러에게 클래스가 속한 패키지를 알려준다. (ctrl + shift + O 쓰면 매우 간단하게 import 할 수가 있다.)
- java.lang 패키지의 클래스는 import 하지 않고도 사용할 수 있다.
class ImportTest {
java.util.Date today = new java.util.Date();
}
import java.util.Date;
class ImportTest {
Date today = new Date();
}
- import 문을 선언하는 방법은 다음과 같다.
- import 문은 패키지문과 클래스 선언의 사이에 선언한다.
- import문은 컴파일 시에 처리되므로 프로그램의 성능에 영향없음.
- 이름이 같은 클래스가 속한 두 패키지를 import 할 때는 클래스 앞에 패키지명을 붙여줘야 한다.
import java.sql.*;
import java.util.*;
public class ImportTest {
public static void main(String[] agrs){
java.util.Date today = new java.util.Date();
}
}
- static 멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다.
import static java.lang.Integer.*; //Integer 클래스의 모든 static 메서드
import static java.lang.Math.random; //Math.random()만. 괄호 안 붙임
import static java.lang.System.out; //System.out을 out만으로 참조가능
System.out.println(Math.random());
out.println(random());
제어자 -> 형용사 명사
- 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
접근 제어자 public, protected, (default), private
그 외 static, final, abstract, native, transient, synchronized, volatile, strictfp
- 하나의 대상에 여러 제어자를 같이 사용 가능( 접근 제어자는 하나만)
public class ModifierTest {
public static final int WIDTH = 200;
public static void main(String[] args) {
System.out.println("WIDTH = "+WIDTH);
}
}
-> 접근 제어자를 제일 왼쪽에 쓴다!!
static - 클래스의, 공통적인
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;
}
}
final - 마지막의 변경될 수 없는
final class FinalTest{ //조상이 될 수 없는 클래스
final int MAX_SIZE = 10; // 값을 변경할 수 없는 멤버 변수(상수)
final void getMaxSize() { //오버라이딩할 수 없는 메서드(변경 불가)
final int LV = MAX_SIZE; //값을 변경할 수 없는 지역변수(상수)
return MAX_SIZE;
}
}
-> String, Math의 경우에도 보안 문제등으로 인해서 final로 해놓았음.!!
abstract - 추상의, 미완성의 (추상화)
abstract class AbstractTest { //추상 클래스(추상 메서드를 포함한 클래스)
abstract void move(); // 추상 메서드(구현부가 없는 메서드)
}
AbstractTest a = new AbstractTest(); // 에러, 추상 클래스의 인스턴스 생성불가
-> 추상 클래스를 상속받아서 완전 클래스(구상 클래스)를 만든 후에 객체 생성가능함!! ( 미완성 설계도)
접근 제어자( access modifier)
- private : 같은 클래스 내에서만 접근이 가능하다.
- (default) : 같은 패키지 내에서만 접근이 가능하다.
- protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.
- public : 접근 제한이 전혀 없다.
class MyParent {
private int prv; //같은 클래스
int dft; // 같은 패키지 (default)
protected int prt; 같은 패키지 + 자손(다른 패키지)
public int pub; //접근제한 없음.
public void printMembers() {
System.out.println(prv);
System.out.println(dft);
System.out.println(prt);
System.out.println(pub);
}
}
public class MyParentTest {
public static void main(String[] args) {
MyParent p = new MyParent();
System.out.println(p.prv); //에러
System.out.println(p.dft);
System.out.println(p.prt);
System.out.println(p.pub);
}
}
-> 다른 패키지에서도 쓰게 하려면 Myparent에 public을 써야한다. (이때 Source file 이름 변경해야함)
다른 패키지에서 동일하게 쓰면 자손 클래스에서는 DFFAULT에러, 테스트 클래스에서는 퍼블릭만 가능!
(자바에서는 default가 세모, protected가 마름모, privated가 네모, 동그라미가 퍼블릭이다!
캡슐화
- 접근 제어자를 사용하는 이유 ( 외부로부터 데이터를 보호하기 위해서)
public class Time P {
public int hour;
public int minute;
public int second;
}
Time t = new Time();
t.hour = 25;
public class Time {
private int hour; //접근 제어자를 private로 하여 외부에서 직접 접근하지 못하도록 한다
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;
}
}
-> 이경우 시간이 25가 되면 안되므로 return 시키고, 23이면 유효하니까 저장되게 함.
- 외부에서 불필요한, 내부적으롤만 사용되는, 부분을 감추기 위해서!!!
public class Time {
private int hour; //접근 제어자를 private로 하여 외부에서 직접 접근하지 못하도록 한다
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 class TimeTest {
public static void main(String[] args) {
Time t = new Time();
//t.hour = -100;
t.setHour(21);
System.out.println(t.getHour());
t.setHour(100);
System.out.println(t.getHour());
}
}
//21
//21 ->조건에 부합하지 않아서 그대로임
다형성은 다음에
'Develope_Web&App > 01_Java & JavaFX' 카테고리의 다른 글
[자바프로그래밍 입문]자바 CH2 변수와 자료형, CH3 연산자 (0) | 2021.02.08 |
---|---|
[Java의 정석] 객체지향 2-3 (0) | 2021.02.04 |
[Java의 정석] 객체지향 2- 1상속 (0) | 2021.02.03 |
[Java의 정석] 객체지향 1-1 (0) | 2021.02.03 |
[Java의 정석] 객체 지향 1 (0) | 2021.02.03 |