클래스기초2
1) 접근제한자
접근을 목적으로 하는 단어
종류
private , package(default) , protexted , public
왜 접근을 제한해야 하는가?
예시, 커피자판기가 잠겨있지 않다면?
자판기 주인이 생각하는 대로 사람들이 행동하지 않으므로 장사에 차질이 생기게 됨!
접근허용자
[1]private (내부에서만 접근가능, 멤버끼리만 접근)
*해당 클래스 안의 멤버에서만 접근이 가능
*외부객체에서는 절대로 접근을 할 수 없음
*멤버의 은닉화를 시킬 때 사용 -> 은닉, 감추는게 은닉,
*거의 대부분의 멤버필드에 적용
[2]default
*접근제한자를 명시하지 않은 경우에는 디폴트 접근제한자가 생김
*같은 패키지(폴더)내의 클래스들은 접근을 허용하고, 다른 곳에서는 접근 불가
[3] protected
*클래스 멤버를 자신과 같은 패키지(폴더), 상속받은 클래스에서만 접근을 허용
*상속 받는 클래스가 다른 패키지여도 상관없음
상속관계클래스 = > public
상속관계아닌 클래스 => private
[4]public
*다른 클래스에서 해당 멤버를 사용할 수 있음
*보통 멤버 메소드, 생성자에 사용을 함
접근 허용자
멤버필드 private
2) 접근 허용 범위

public > private
3)은닉화
멤버필드(변수)를 다른 곳에서 직접 접근 못하게 함
*멤버에 접근을 못하게 하기 위해 private을 사용
*접근을 하기 위해 접근 메소드를 만들어 줌
*값을 설정할 때는 sette메소드,
값을 가져올 때는 getter메소드를 사용함
*보통 멤버필드 값을 은닉화해서 값을 보호하는데 이용
package aaa;
class Sung{
String name;
int kor;
}
public class DSD {
public static void main(String [] args) {
Sung s = new Sung();
s.name ="홍길동";
s.kor = 1000;
}
}
--------------------
package aaa;
class Sung{
private String name;
private int kor;
public Sung(String name) {
this.name = name;
}
public void setKor(int kor) {
if(kor<0 || kor>100) return;
this.kor = kor;
}
public int getKor();{
return kor;
}
public String getName() {
return name;
}
}
public class DSD {
public static void main(String [] args) {
Sung s = new Sung();
s.name ="홍길동";
//이름을 바꿀수 없다
s.kor = 1000;
//국어값을 직접 바꿀 수 없다
s.setKor(1000);
//값의 범위가 벗어나 입력이 안된다
}
}

캡슐화 되었다.
------------------------------------------

package aaa;
import java.io.*;
import java.util.Scanner;
class SungJuk{
private String name;
private int kor,eng, mat;
private int tot,rank;
public void setName(String name) { //매개변수 반드시 하나 존재 //set 하고 필드명, 필드명은 대문자가 셋업메소드임
this.name = name;
}
public boolean setKor(int kor) {
if ( kor<0 || kor>100) return false;
this.kor = kor;
return true;
}
public boolean setEng(int eng) {
if ( eng<0 || eng>100) return false;
this.eng = eng;
return true;
}public boolean setMat(int mat) {
if ( mat<0 || mat>100) return false;
this.mat = mat;
return true;
}
public void sumTot() {
tot = kor +eng +mat;
}
public int getTot() {
return tot;
}
public void clearRank() {
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.print(rank+"\t");
}
}
public class Exam_07s {
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();
}
}
}
-----------------------------------------------
4)지정예약어
멤버나 클래스의 성질을 지정하는 단어
종류 : static , final, static , final, transient, abstract, synchronized, native
[1] static (공통의, 공용의)
*하나의 클래스로 발생된 모든 객체가 공유하는 필드를 선언할 때 사용
*클래스 명으로 접근
*메모리에 프로그램 시작 후 바로 올라감
*메소드에 선언이 되면 static멤버만 사용 가능
-> 메소드 파트 다시 보기 ㅜ_ㅜ
은행에제
package aaa;
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_0222222 {
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);
aaa.disp();
bbb.setIyul(0.03f);
bbb.disp();
ccc.disp();
}
}
--------------------
=====================
aaa님의 잔액은1000.0원이고,현재 적용되는 이율은2.0%입니다.
=====================
aaa님의 잔액은1000.0원이고,현재 적용되는 이율은1.0%입니다.
bbb님의 잔액은1000.0원이고,현재 적용되는 이율은1.0%입니다.
=====================
aaa님의 잔액은1000.0원이고,현재 적용되는 이율은3.0%입니다.
bbb님의 잔액은1000.0원이고,현재 적용되는 이율은3.0%입니다.
ccc님의 잔액은1000.0원이고,현재 적용되는 이율은3.0%입니다.

------------------------------------------
package aaa;
class Bank{
private String name;
private double money;
private static 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_0222222 {
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);
aaa.disp();
//bbb.setIyul(0.03f);
bbb.disp();
ccc.disp();
}
}
----------------
그래도 똑같은 값이 나온다. static에 저장되었기 때문에
---------------------
package aaa;
class Bank{
private String name;
private double money;
private static float iyul;
static {
iyul = 0.02f;
}
public Bank(String name,double money,float iyul) {
this.name = name;
this.money = money;
Bank.iyul = iyul;
}
public void setIyul(float iyul) {
Bank.iyul = iyul;
}
public void disp() {
System.out.println(name+"님의 잔액은"+money +"원이고,"
+"현재 적용되는 이율은"+Bank.iyul*100+"%입니다.");
}
}
public class Exam_0222222 {
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);
aaa.disp();
//bbb.setIyul(0.03f);
bbb.disp();
ccc.disp();
}
}
-----------------------------
[2] final(마지막 값 x)
변수에 사용되면 상수
public class FinalTest1{
public static void main(String[] args){
final int MAX SPEED = 100;
MAX_SPEED = 150;
에러발생! final 변수는 값을 바꿀 수 없다
}
}
-------------------------------------------------------
메소드에 사용되면 메소드 변경 불가
class Test1{
public fianal void (String[] args){
System.out.println("바꿀 수 없지롱!!");
}
}
class Test2 extends Test1{
public void disp(){
System.out.println("에러가 발생하네!!");
---------------------------
클래스에 설정하면 상속 불가
final class Test1{
public void disp(){
System.out.println("이클래스는 상속 못받아!");
}
}
class Test2 extends Test1{
}
(3) static final
*static 기능과 final기능을 합쳐놓은 것
*객체(인스턴스)가 여러개가 되더라도 모든 객체가 값을 따로 가질 필요가 없고
그 값을 상수처럼 사용하고자 할 때 사용하는 키워드
자바의 상수 선언
public static final 멤버필드 ;
(4) transient
*직렬화 (serializing), 역직렬화(deserializing)를 하지 않겠다는 뜻
*자바 I/O를 배운 후 공부해 보자
(5) abstract
*추상화를 의미
*추상화메소드가 존재하면 그 클래스는 추상화클래스
*추상화클래스를 상속받으면 반드시 추상화메소드를 구현하여야 함
*추상화클래스는 객체를 생성할 수 없음
(6) synchronized (멀티스레드)
*동기화를 의미
*2개 이상의 스레드가 실행될 때 사용
*스타크래프트의 미네랄을 캐논 것을 생각하면 됨

static 프로그램 시작시 1번만 올라감
일반구분 //공통의 멤버필드의 초기값
A04( )
일반구분 //
A04(int a)