자바를 공부해 보자

[중첩클래스 및 상속, 다형성, 추상화, 인터페이스] 클래스기초2

자바

클래스기초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)