package: 성격이 비슷한 클래스들을 임의의 패키지(폴더)에 저장해 두고,
import를 이용해 원하는 클래스를 호출(보조기억장치에서 주기억장치로 loading)한다.
package pack2;//Bank클래스의 폴더
//230102(3)
//패키지를 사용 안 하고 만들 수 있지만 바람직하지 않다.
//이름을 aa.bb.cc로 만들면 aa폴더 내에 bb내에 폴더 내에 cc폴더에 생긴다.
public class Bank {
//접근지정자가 영향을 미치는 범위
private int money=10000; //현재 클래스에서만 유효
//잘못된 데이터 저장을 방지하거나 보안을 위해 외부 클래스에서의 접근을 제어할 필요가 있을 때 사용.
int money2=20000; //default
public int money3=30000;
public Bank() {//돈 없이 계좌 개설
}
public Bank(int money) {//돈 가지고 계좌 개설
this.money+=money;
}
public void dePosit(int amount) {//입금
if(amount>0)
money+=amount;
}
public void withDraw(int amount) {//출금
if((amount>0)&&(money-amount>=0)) {
money-=amount;
}
else {
System.out.println("출금액이 너무 많아요~");
}
}
public int getMoney() {//잔고 확인용
return money;
}
//------------------------------------------------
void abcMethod() {
System.out.println("abdMethod 수행");
}
private void defMethod() { //현재 클래스에서만 유효
System.out.println("defMethod 수행");
}
public void ghiMethod() {
System.out.println("ghiMethod 수행");
}
}
package pack2;
//230102(3)
public class BankMain {
public static void main(String[] args) {
Bank tom=new Bank();
tom.dePosit(5000);
tom.withDraw(3000);
System.out.println("tom의 잔고: "+tom.getMoney());
System.out.println();
Bank oscar = new Bank(10000);
oscar.dePosit(3000);
oscar.withDraw(36000);
oscar.withDraw(6000);
System.out.println("oscar의 잔고: "+oscar.getMoney());
System.out.println();
//System.out.println(oscar.hashCode());//557041912
//System.out.println(oscar);//pack2.Bank@2133c8f8 출력(2133c8f8은 557041912의 16진수)
Bank james=null; // == Bank james;
//james.dePosit(3000);//java.lang.NullPointerException error
System.out.println(james);//null 출력
james=oscar;//특정 인스턴스를 두개의 변수가 참조. 별명을 가짐.
System.out.println("james의 잔고: "+james.getMoney());
System.out.println(james+" "+oscar);//pack2.Bank@2133c8f8 pack2.Bank@2133c8f8
//제임스와 오스카는 완전히 똑같다.
System.out.println();
if(james==oscar) {
System.out.println("둘은 같은 객체의 주소를 기억");
}
else {
System.out.println("달라요");
}
if(james==tom) {
System.out.println("둘은 같은 객체의 주소를 기억함");
}
else {
System.out.println("달라");
}
if(james instanceof Bank) {//instanceof: 클래스 타입 비교 연산자
System.out.println("Bank 타입 맞아요");
}else {
System.out.println("허걱 Bank타입 아니에요");
}
//스트링 주의 --------------------
System.out.println("\nString type 값 비교 ------");
//방법 1
String ss1 = "kor"; //객체 생성됨(편의 제공)
String ss2 = new String();
ss2 = "kor";
//방법2
String ss3 = new String("kor");
System.out.println(ss1+" "+ss2+" "+ss3+" ");
//스트링의 주소 비교
if(ss1==ss2) {//같음
System.out.println("같음");
}else {
System.out.println("다름");
}
if(ss1==ss3) {//다르구나
System.out.println("같구나");
}else {
System.out.println("다르구나");
}//=> 비교할 때는 다르다.
System.out.println(ss1.hashCode()+" "+ss2.hashCode()+" "
+ss3.hashCode()); //106382 106382 106382 => 주소를 구하면 같게 나온다.
//=> 방법1,2가 같은 값이면 같은 주소를 가지게 함.
//방법 1,2의 메모리 구성
//방법1: 힙의 리터럴 풀에 저장 같은 문자열이면 변수가 달라도 같이 참조
// 리터럴 풀에 넣고 자원을 재활용함.
//방법2: 힙에 저장
//문자열 비교 메소드(equals())를 별도로 제공 (문자열만 equal equal을 쓰지 않는다. 스트링은 항상 equals를 쓴다.)
System.out.println();
if(ss1.equals(ss2)) //객체가 가진 값 비교!(대소문자 구분)
//String 클래스의 equals는 객체의 값 비교, (Object 클래스의 equals는 == 로 구현됨)
System.out.println("와우 같다");
else
System.out.println("흠 다르다");
if(ss1.equalsIgnoreCase(ss3)) //대소문자 구분 안 함
System.out.println("와우 같다2");
else
System.out.println("흠 다르다2");
System.out.println("\n접근지정자 유효 범위 연습 ------");
Bank sujan = new Bank();
//System.out.println(sujan.money); //접근불가 private이므로
System.out.println(sujan.money2); //접근가능 default이므로
System.out.println(sujan.money3); //접근가능 public이므로
sujan.abcMethod(); //접근가능 default이므로
sujan.ghiMethod(); //접근가능 public이므로
//sujan.defMethod //접근 불가. private 이므로
}
}
다른 프로젝트의 BankMain
package pack3;
//프로젝트가 바뀌면 안됨. -> bank를 압축해서 가져옴
//여러개 한번에 압축 가능
//자바에서는 자바 파일을 압축시킬 수 있다.
//확장자는 jar
import pack2.Bank;
public class BankMain {
public static void main(String[] args) {
Bank tom=new Bank();
tom.dePosit(5000);
tom.withDraw(3000);
System.out.println("tom의 잔고: "+tom.getMoney());
System.out.println("\n접근지정자 유효 범위 연습 ------");
Bank sujan = new Bank();
//System.out.println(sujan.money); //접근불가 private이므로
//System.out.println(sujan.money2); //접근불가 default이므로
System.out.println(sujan.money3); //접근가능 public이므로
//sujan.abcMethod(); //다른 패키지에서 접근불가 default이므로
sujan.ghiMethod(); //접근불가 public이므로
//sujan.defMethod //접근 불가. private 이므로
}
}