ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • java :: OOP-2, 추상화, 은닉화, 다형성
    IT/Java & JSP & FW 2011. 12. 16. 12:38
    추상화 예제 프로그램
    (2개 클래스를 모드 생성하셔야 합니다. )

    예제-은행
    (bank.java)
    public class bank {
    	String acname;
    	String acnum;
    	private int money;  //private을 써서 은닉화를 시킨다.
    	static double iyel=0.07;  //static을 붙으면 선언과 동시에 메모리에 상주하게 되며, 바로 초기화를 해야한다.
    	//이런 변수를 클레스변수라 한다.
    	
    	//setter 반환타입X 매개변수O
    	public void setMouny(int mouny){
    		
    	}
    	//무조건 public을 써야하고 메소드명에 set- 을 붙인다.
    	
    	//getter 반환타입O 매개변수X
    	public int getMouny(){
    		return this.money;
    	}
    	
    	//생성자
    	public bank(){
    		acname="무명";
    		acnum="000-000";
    		money=0;
    		iyel=0.07;
    	}
    	
    	public void mInput(int m){
    		money=money+m;
    		System.out.println(m+"원이 입금되었습니다.");
    		System.out.println("잔액 "+money+"원이 남았습니다.");
    	}
    	
    	public void mOutput(int money){
    		
    		if(this.money-money<=0){
    			System.out.println("잔금이 부족하여 실행할 수 없습니다.");
    			return;
    		}
    		this.money=this.money-money;  //this. 를 붙이면 전역 변수가 됨.
    		System.out.println(money+"원이 출금되었습니다.");
    		System.out.println("잔액 "+this.money+"원이 남았습니다.");
    	}
    	
    	public void getInfo(){
    		System.out.println("예금주 : "+acname);
    		System.out.println("계좌번호 : "+acnum);
    		System.out.println("이자율 : "+iyel);
    		System.out.println("잔액 : "+(int)((money*iyel)+money));
    	}
    }
    출력부분
    (bankTest.java)
    public class bankTest {
    	public static void main(String[] args) {
    		
    		bank b1=new bank();
    		b1.acname="서시원";
    		b1.acnum="123123123";
    		b1.mInput(40000);
    		b1.mOutput(3000);
    		b1.getInfo();
    		
    		System.out.println("===========================");
    		
    		bank b2=new bank();
    		b2.acname="홍길동";
    		b2.acnum="321312321";
    		b2.mInput(100000);
    		b2.mOutput(70000);
    		b2.getInfo();
    		
    		System.out.println("===========================");
    		
    		bank b3=new bank();
    		b3.acname="콩쥐";
    		b3.acnum="101101010";
    		b3.mInput(300000);
    		b3.getInfo();
    		
    		System.out.println("===========================");
    		
    		bank.iyel=0.1;
    		
    		System.out.println("===========================");
    		
    		b1.getInfo();
    		b2.getInfo();
    		b3.getInfo();
    	}
    
    }
    

    * 변수의 활용 차이
    count와 count2의 차이가 무엇인지 알아 보자.
    (testA.java)
    public class testA {
    	static int count=0;
    	int count2=0;
    	//두 개의 변수의 차이가 무엇인지 알아보자.
    	
    	public testA(){
    		count++;
    		count2++;
    	}
    	
    	public static void getCount(){  //static을 사용해서 클레스.메소드 형식으로 사용할 수 있게한다.
    		System.out.println("지금까지 생성된 객체는 "+count+"개 입니다.");
    	}
    	//출력해보면 여태까지 생성된 객체의 수가 몇개 인지 알 수있다.
    	//이유는 메모리상의 count 변수가 객체가 생성될 때마다 공유가 되고 있기 때문이다.
    	
    	public void getCount2(){
    		System.out.println("지금까지 생성된 객체는 "+count2+"개 입니다.");
    	}
    	//출력해보면 개수는 무조건 1개로 나온다.
    	//하나의 객체에 대해서만 count변수가 사용이 되어지고 있기 때문이다.
    }
    
    출력부분
    (test.java)
    public class test {
    	public static void main(String[] args) {
    		testA a1=new testA();
    		testA a2=new testA();
    		testA a3=new testA();
    		
    		a2.getCount();
    		testA.getCount();
    		//위의 두 줄은 생성된 객체만큼의 값을 출력함을 알 수있다.
    		//testA.getcount2(); 는 사용할 수 없는데 메소드에 static이 붙어 있지 않기 때문이다.
    	}
    }
    

    2. 은닉화(캡슐화)
    Encapsulation 란?
    데이터의 회손을 방지하기 위한 기법

    접근지정자접근지정자의 종류 (4가지)

    1.Private
    자신의 클래스 내부에서만 접근허용

    접근시  2가지의 메소드를 만들어 접근한다. 
    -getter
    ex) getMoney
    특징 - 반환타입이 있고, 메개변수가 없는 타입이다.
    -setter
    ex) setMoney
    특징 - 반환타입은 없고, 매개변수가 있는 타입이다.

    이 두가지를 이클립스에서 쉽게 만들려면, 이클립스 메뉴 중
    Source > Genareate Gatters and Setters 
    를 선택하면 쉽게 생성이 가능하다.

    getter setter 생성예제
    (student.java)
    public class student {
    	private String name;
    	private int age;
    	private String address;
    	private int snum;
    	
    	private int s_kor;
    	private int s_eng;
    	private int s_math;
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public String getAddress() {
    		return address;
    	}
    	public void setAddress(String address) {
    		this.address = address;
    	}
    	public int getSnum() {
    		return snum;
    	}
    	public void setSnum(int snum) {
    		this.snum = snum;
    	}
    	public int getS_kor() {
    		return s_kor;
    	}
    	public void setS_kor(int s_kor) {
    		this.s_kor = s_kor;
    	}
    	public int getS_eng() {
    		return s_eng;
    	}
    	public void setS_eng(int s_eng) {
    		this.s_eng = s_eng;
    	}
    	public int getS_math() {
    		return s_math;
    	}
    	public void setS_math(int s_math) {
    		this.s_math = s_math;
    	}
    }
    

    2.Protected
    Private와 비슷하나 자기자신과 자신을 상속받은 자식에게 접근 허용
    다른 폴더까지 접근하나, 나를 상속받고 있는 자식에 한에서만 접근을 허용

    3.Default
    같은 폴더에 있을경우 접근허용

    4.Public
    누구나 접근가능

    크기를 따지면 Private가 가장 좁고 Public이 가장 크다.
    Private<<Default<<Protected<<Public


    3. 다형성
    OverLoading, OverRiding, Casting

    1. 오버로딩 - 다중정의
    생성자 오버로딩
    메소드 오버로딩

    오버로딩이란?
    Method 이름은 동일하게 주되, 매개변수의 데이터타입, 개수, 순서(<이것을 통해 다른 메소드임을 판별 함)를 다르게 주어 같은 이름의 메소드를 중복정의 하는 것.

    오버로딩의 조건
    오버로딩 대상 메소드와 이름이 동일해야 함
    매개변수의 타입, 개수, 순서는 달라야 함
    반환타입은 신경 안써도됌

    오버로딩 예제
    (tv.java)
    public class tv {
    	
    	int rgb;//색상
    	int mi;//명암
    	int ri;//밝기
    	
    	//기본 생성자
    	public tv(){
    		rgb=50;
    		mi=50;
    		ri=50;
    		return;
    	}
    	
    	//인자 생성자
    	//메소드명이 똑같이 생성자를 하나 더 만드는 것을 오버로딩이라 한다.
    	public tv(int r){  //매개변수의 차이로 자바는 다르게 인식한다.
    		rgb=r;
    		mi=50;
    		ri=50;
    	}
    	
    	public tv(int rgb, int mi){
    		this.rgb=rgb;
    		this.mi=mi;
    		ri=50;
    	}
    	
    	public tv(int rgb, int mi, int ri){
    		this.rgb=rgb;
    		this.mi=mi;
    		this.ri=ri;
    	}
    	
    	public void getInfo(){
    		System.out.println("색상:"+rgb);
    		System.out.println("명암:"+mi);
    		System.out.println("밝기:"+ri);
    	}
    	
    	public void getInfo(String title){
    		System.out.println(title);
    		this.getInfo();  // 나 자신의 기본 메소드를 호출해서 부르게된다.
    	}
    }
    
    출력부분
    (tvtest.java)
    public class tvtest {
    	public static void main(String[] args) {
    		
    		tv t1=new tv();
    		t1.getInfo();
    		
    		System.out.println("-------------------------");
    		
    		//인자 생성자 호출
    		tv t2=new tv(70); //<-인자 생성자로 초기화를 시킨다.
    		t2.getInfo();
    		
    		System.out.println("-------------------------");
    		
    		tv t3=new tv(40,50,80);
    		t3.getInfo();
    	}
    }
    
    오버로딩 예제 2
    (cat.java)
    public class cat {
    	String name;
    	String type;
    	int age;
    	
    	public cat(){
    		name="나미";
    		type="길고양이";
    		age=2;
    	}
    	
    	public cat(String name){
    		this();  //생성자에서 기본 생성자를 부르는 방법
    		this.name=name;
    	}
    	
    	public cat(String name, String type){
    		this(name);  //생성자에서 기본 생성자 다음에 네임만 부르는 생성자를 차례차례 부른다.
    		this.type=type;
    	}
    	
    	public cat(String name, String type, int age){
    		this(name,type);
    		this.age=age;
    	}
    	
    	public void getInfo(){
    		System.out.println("이름은 "+name+", 품종은 "+type+", 나이는 "+age+"살  고양이입니다.");
    	}
    	
    	public void getInfo(String title){
    		System.out.println(title);
    		this.getInfo();
    	}
    }
    
    출력부분
    (cattest.java)
    public class cattest {
    	
    	public static void xLine(){
    		System.out.println("----------------------------------------");
    	}
    	
    	public static void main(String[] args) {
    
    		cat c1=new cat();
    		c1.getInfo();
    		
    		xLine();
    		
    		cat c2=new cat("애기호랭");
    		c2.getInfo();
    		
    		xLine();
    		
    		cat c3=new cat("파워","진돗개",3);
    		c3.getInfo();
    		
    		xLine();
    		
    		c3.getInfo("제 고양이는요~!");
    	}
    
    }
Designed by Tistory.