Study/Java

Java 클래스_클래스기초Ⅱ

송호두 2023. 1. 6. 18:52

1. 접근제한자


2. 접근 허용 범위


3. 은닉화

 


4. 문제 풀어보기

package ch07;

import java.util.Scanner;

class SungJuk{
	private String name;
	private int kor, eng, mat;
	private int tot, rank;
	
	// setter메소드의 경우 값을 꼭 하나 받아야 하므로
	// 매개변수가 필수이다! 
	public void setName(String name) {
		this.name = name;
	}
	public boolean setKor(int kor) {
		if (kor < 0 || kor > 100) return false; // 국어점수가 0미만, 100초과 일때 거짓 
		this.kor = kor;
		return true; // 정상 값이 입력 되었을때는 참 
	}
	public boolean setEng(int eng) {
		if (eng < 0 || eng > 100) return false; // 영어점수가 0미만, 100초과 일때 거짓 
		this.eng = eng;
		return true; // 정상 값이 입력 되었을때는 참 
	}
	public boolean setMat(int mat) {
		if (mat < 0 || mat > 100) return false; // 수학점수가 0미만, 100초과 일때 거짓 
		this.mat = mat;
		return true; // 정상 값이 입력 되었을때는 참 
	}
	////////////////////////////////////////////////////////////
	public void sumTot() {
		tot = kor + eng + mat;
	}
	public int getTot() {
		return tot;
	}
	////////////////////////////////////////////////////////////	
	public void clearRank() {
		// 랭크 값을 1로 초기화 시키는 메소드 
		rank = 1;
	}
	public void plusRank() {
		rank++;
	}
	public void disp() {
		System.out.print(name + "\t");
		System.out.print(kor + "\t");
		System.out.print(eng + "\t");
		System.out.print(mat + "\t");
		System.out.print(tot + "\t");
		System.out.println(rank + "\t");
	}
}
	////////////////////////////////////////////////////////////
public class Exam_01 {
	public static void main(String[] args) {
		System.out.print("인원수를 입력 : ");
		Scanner sc = new Scanner(System.in);
		int inwon = sc.nextInt();
		
		SungJuk sj[] = new SungJuk[inwon];
		// 참조 변수의 갯수만 들어간 상태 
		for (int i = 0; i < inwon; ++i) {
			sj[i] = new SungJuk();
			// 생성자를 생성해 주어야지만 실제로 데이터가 만들어지고
			// 메모리상에 저장할 수 있는 공간이 생겨 값이 들어갈 수 있다.  
			System.out.print("이름 입력 : ");
			sj[i].setName(sc.next());
			do {
				System.out.print("국어점수 입력 : ");
			} while (!sj[i].setKor(sc.nextInt())); // 거짓이 들어오면 다시 실행 
			do {
			System.out.print("영어점수 입력 : ");
			} while (!sj[i].setEng(sc.nextInt()));
			do {
			System.out.print("수학점수 입력 : ");
			} while (!sj[i].setMat(sc.nextInt()));
			
			sj[i].sumTot();
			sj[i].clearRank();
		}
		for (int i = 0; i < inwon; ++i) {
			for (int j = 0; j < inwon; ++j) {
				if(sj[i].getTot() < sj[j].getTot()) sj[i].plusRank();
			}
		}
		System.out.print("이름\t국어\t영어\t수학\t총점\t순위\n");
		for (int i = 0; i < inwon; ++i) {
			sj[i].disp();
		}
	}
}

[출력]


5. 지정예약어

 


6. 문제 풀어보기

static 사용하기 전

package ch07;
class Bank{
	private String name;
	private double money;
	private float iyul;
	
	// 이름은 생성자에 만들어준다. (수정이 불가능)
	// 잔액 또한 처음 입금한 금액그대로, 잔액이 바뀌는 시점은 입/출금이 있을 때만! 그렇기에 생성자를 통해 
	public Bank(String name, double money, float iyul) {
		this.name = name;
		this.money = money;
		this.iyul = iyul;
	}
	public void setIyul(float iyul) {
		this.iyul = iyul;
	}
	public void disp() {
		System.out.println(name + "님의 잔액은" + money + "원이고, " 
				+ "현재 적용되는 이율은 " + iyul*100 + "% 입니다.");
	}
}
public class Exam_02 {
	public static void main(String[] args) {
		Bank aaa = new Bank("aaa", 1000, 0.02f);
		System.out.println("===================");
		aaa.disp();
		Bank bbb = new Bank("bbb", 1000, 0.01f);
		System.out.println("===================");
		//aaa.setIyul(0.01f);
		aaa.disp();
		bbb.disp();
		Bank ccc = new Bank("ccc", 1000, 0.03f);
		System.out.println("===================");
		//aaa.setIyul(0.03f);
		//bbb.setIyul(0.03f);
		aaa.disp();
		bbb.disp();
		ccc.disp();
	}
}

 

[출력]

static 사용 후

static 은 프로그램 시작과 동시에 메모리에 올라간다.

private 같은 경우는 객체가 생성될 때 메모리에 올라간다.

package ch07;
class Bank{
	private String name;
	private double money;
	private static float iyul; ////////// static 추가!!!!
	
	// 이름은 생성자에 만들어준다. (수정이 불가능)
	// 잔액 또한 처음 입금한 금액그대로, 잔액이 바뀌는 시점은 입/출금이 있을 때만! 그렇기에 생성자를 통해 
	public Bank(String name, double money, float iyul) {
		this.name = name;
		this.money = money;
		this.iyul = iyul;
	}
	public void setIyul(float iyul) {
		this.iyul = iyul;
	}
	public void disp() {
		System.out.println(name + "님의 잔액은" + money + "원이고, " 
				+ "현재 적용되는 이율은 " + iyul*100 + "% 입니다.");
	}
}
public class Exam_02 {
	public static void main(String[] args) {
		Bank aaa = new Bank("aaa", 1000, 0.02f);
		System.out.println("===================");
		aaa.disp();
		Bank bbb = new Bank("bbb", 1000, 0.01f);
		System.out.println("===================");
		//aaa.setIyul(0.01f);
		aaa.disp();
		bbb.disp();
		Bank ccc = new Bank("ccc", 1000, 0.03f);
		System.out.println("===================");
		//aaa.setIyul(0.03f);
		//bbb.setIyul(0.03f);
		aaa.disp();
		bbb.disp();
		ccc.disp();
	}
}

[출력]

 

가장 최적화 된 방법

static은 this가 아니라 클래스명을 사용해줘야 한다.

package ch07;
class Bank{
	private String name;
	private double money;
	private static float iyul;
	static {
		iyul = 0.02f; // 이율 초기값 0.2%
	}
	// 이름은 생성자에 만들어준다. (수정이 불가능)
	// 잔액 또한 처음 입금한 금액그대로, 잔액이 바뀌는 시점은 입/출금이 있을 때만! 그렇기에 생성자를 통해 
	public Bank(String name, double money, float iyul) {
		this.name = name;
		this.money = money;
		Bank.iyul = iyul; // this-->Bank

	}
	public void setIyul(float iyul) {
		Bank.iyul = iyul; // this-->Bank
	}
	public void disp() {
		System.out.println(name + "님의 잔액은" + money + "원이고, " 
				+ "현재 적용되는 이율은 " + Bank.iyul*100 + "% 입니다."); // this-->Bank
	}
}
public class Exam_02 {
	public static void main(String[] args) {
		Bank aaa = new Bank("aaa", 1000, 0.02f);
		System.out.println("===================");
		aaa.disp();
		Bank bbb = new Bank("bbb", 1000, 0.01f);
		System.out.println("===================");
		//aaa.setIyul(0.01f);
		aaa.disp();
		bbb.disp();
		Bank ccc = new Bank("ccc", 1000, 0.03f);
		System.out.println("===================");
		//aaa.setIyul(0.03f);
		//bbb.setIyul(0.03f);
		aaa.disp();
		bbb.disp();
		ccc.disp();
	}
}

[출력]


7. 변수의 선언