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. 변수의 선언