접근지정자, 문자열

ming·2023년 5월 27일
0

자바 기초

목록 보기
5/12

package: 성격이 비슷한 클래스들을 임의의 패키지(폴더)에 저장해 두고,
import를 이용해 원하는 클래스를 호출(보조기억장치에서 주기억장치로 loading)한다.

  • 문자열
    • 방법 1
      String ss1 = "kor"; //객체 생성됨(편의 제공)
      String ss2 = new String();
      ss2 = "kor";
      : 힙의 리터럴 풀에 저장. 같은 문자열이면 변수가 달라도 같이 참조
      리터럴 풀에 넣고 자원을 재활용함.
    • 방법2
      String ss3 = new String("kor");
      : 힙에 저장
  • 문자열을 비교할 때는 오브젝트의 equals()를 오버라이딩한 equals()로 비교한다.

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 이므로

	}
}

0개의 댓글