ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 210421_2(접근제한자)
    JAVA(Sol)(정리대기중..언젠가) 2021. 4. 21. 11:49

    접근제한자

    은닉화와 밀접한 관계가 있다.

     

    완전개방 public - 다른패키지에서도 참조가능

    범위제한 friendly(default) - 같은 패키지에서 참조가능

    상속제한 protected - 상속관계에서 참조가능

    완전폐쇄 private - 다른클래스에서 접근 불가, 동일 클래스 내부에서는 접근허용

     

    컴포넌트          <--참조       동일패키지         

    ---------------                      -----------------

    public     a                          a   -- O

    default    b                          b   -- O

    protected c                          c   -- O

    private    d                          d   -- 동일클래스

     

    컴포넌트          <--참조      상속 다른패키지       

    ---------------                      -----------------

    public     a                          a   -- O

    default    b                          b   -- X

    protected c                          c   -- O

    private    d                          d   -- X

    컴포넌트          <--참조       다른패키지     

    ---------------                      -----------------

    public     a                          a   -- O

    default    b                          b   -- X

    protected c                          c   -- X

    private    d                          d   -- X

     

    결론 1. private은 setter/getter를 이용해서 접근할수있다.

           2. 복잡함을 피하기 위해 public과 private를 주로 사용한다. 

           3. 동일 클래스 내부에서는 접근제한자가 무력화 된다.

     

    package chapter11;
    
    class Jumsu {
    	public int kuk = 100;
    	public int eng = 90;
    
    	private int mat = 100;
    
    	public Jumsu() {
    
    	}
    
    	public int getMat() {
    		return mat;
    	}
    
    	public void setMat(int mat) {
    		this.mat = mat;
    	}
    
    //	public int getKuk() {
    //		return kuk;
    //	}
    //
    //	public void setKuk(int kuk) {
    //		this.kuk = kuk;
    //	}
    //	
    }
    
    public class Mod {
    
    	public static void main(String[] args) {
    		Jumsu sj = new Jumsu();
    		sj.kuk = 100; // not good
    //		sj.setKuk(100);
    		sj.setMat(200); // good
    
    		System.out.println(sj.kuk + "" + sj.getMat());
    
    	}
    
    }
    
    package chapter11;
    
    class Data {
    
    	private String name = null;
    	private String season = null;
    	private int year = 0;
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public void setSeason(String season) {
    		this.season = season;
    	}
    
    	public void setYear(int year) {
    		if (year >= 20 && year <= 30) { // 범위값을넣어 안정성을 올릴수있다.
    			this.year = year;
    		} else {
            	//this.year = year; 범위를벗어나도 year값 출력하기
    			System.out.println("입력될 수 있는 나이는 20~30세 사이입니다.");
    		}
    	}
    
    	public String getName() {
    		return name;
    	}
    	public String getSeason() {
    		return season;
    	}
    
    	public int getYear() {
    		return year;
    	}
    
    }
    
    public class DataAccess {
    
    	public static void main(String[] args) {
    		Data d = new Data();
    		d.setName("왕눈이");
    		d.setSeason("늦가을");
    		d.setYear(34);
    		
    		System.out.println("이름 : " +d.getName());
    		System.out.println("계절 : " +d.getSeason());
    				if(d.getYear()!= 0) 
    			System.out.println(d.getYear()); // 범위를 벗어나도 콘솔에 0이 출력되지않는다
    
    	}
    
    }
    
    

     

    캡슐화

    감추고 싶은 멤버를 private으로 설정하고, 그것을 public으로 감싸는 함수를 만들고 외부에서는 private멤버가 보이지 않고록 하고 public멤버로 호출하여 사용하도록 하는것. ex)setter getter

     

    package chapter11;
    class PrivateTest{
    	public int kuk=0;
    	public int eng=0;
    	public int sum=0;
    	
    	private void sum() {  // 메소드를 private로 막고
    		sum=kuk+eng;
    		if(sum>200) {
    			System.out.println("점수가 200을 초과했습니다");
    			sum=0;
    		}else {
    			System.out.println("합계가 정상적으로 처리됐습니다.");
    		}
    	}
    	public void call_sum() { // 여기서 public으로 메소드를 불러온다 (안정적로직)
    		sum();
    	}
    }
    public class PrivateTestMain {
    
    	public static void main(String[] args) {
    		PrivateTest pt = new PrivateTest();
    		pt.kuk=90;
    		pt.eng=95;
    		
    		pt.call_sum();
    		System.out.println("pt.sum() : " +pt.sum);
    
    	}
    
    }
    
    package chapter11;
    
    class PrivateTestVari {
    	private int kuk = 0;
    
    	public void setKuk(int kuk) {
    		if (kuk > 100) { //if (kuk > 100 || kuk<0)으로바꾸면 안정성 더
    			System.out.println("kuk 값을 다시 입력해주세요.");
    		} else {
    			this.kuk = kuk;
    		}
    	}
    
    	public int getKuk() {
    		return this.kuk;
    	}
    }
    
    public class PrivateTestVariMain {
    
    	public static void main(String[] args) {
    		PrivateTestVari ptv = new PrivateTestVari();
    		ptv.setKuk(-10);
    		int kuk = ptv.getKuk();
    		if(ptv.getKuk()!=0) // 범위를 벗어나도 0을 출력하지않는다
    		System.out.println("국어 : " + kuk);
    	}
    
    }
    
Designed by Tistory.