-
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); } }
'JAVA(Sol)(정리대기중..언젠가)' 카테고리의 다른 글
210421_4(상속) (0) 2021.04.21 210421_3(garbageCollecting) (0) 2021.04.21 210420_5~7_210421_1chapter11.(Call by value/reference, 문자열) (0) 2021.04.20 210420_3~4(변수 유효범위,생성자특징) (0) 2021.04.20 210420_1~2(static변수,singleton pattern,final) (0) 2021.04.20