[01] 접근 한정자(Access Modifier, 제한자, 수정자)
- 클래스간에 멤버 변수나 멤버 메소드에 접근하는 것을 제한할 수 있습니다.
- 객체지향에서 캡슐화를 구현하는 핵심 기술입니다.
- 클래스간에 간섭을 막을 수 있음으로 콤포넌트의 독립성을 강화할 수 있습니다.
------------------------------------------------------------------------------------------
접근 제한자 같은 클래스 같은 패키지 상속관계의 다른 패키지 관련없는 다른 패키지
같은 폴더 다른 폴더 다른 폴더
------------------------------------------------------------------------------------------
public ○ ○ ○ ○ (중요)
------------------------------------------------------------------------------------------
friendly ○ ○ X X (생략시 기본)
------------------------------------------------------------------------------------------
protected ○ ○ ○ X
------------------------------------------------------------------------------------------
private ○ X X X (중요)
------------------------------------------------------------------------------------------
1. private, 보안성이 향상됨, 콤포넌트의 독립성이 보장됩니다.
- 콤포넌트간 간섭을 최소화하여 독립성을 유지할 수 있습니다.
- private변수는 해당클래스안에서만 접근할 수 있습니다.
따라서 이 변수에 접근하려면 public 형태의 메소드를 이용해야 합니다.
- 데이터 은닉 및 캡슐화에 사용됩니다.
2. public을 사용함으로 문제가 있는 pattern
>>>>> PublicData.java
//데이터 클래스
public class PublicData{
//인스턴스 변수, 멤버 변수
public String name;
public int kuk;
public int eng;
public int tot;
}
>>>>> PublicDataAccess.java
//데이터 이용 클래스
public class PublicDataAccess {
public static void main(String[] args) {
PublicData data = new PublicData();
data.name = "학생1";
// 점수는 0점 ~ 100점 사이입니다.
data.kuk = 100;
if (data.kuk < 0 || data.kuk > 100){
System.out.println("국어 점수는 0~100점 사이만 가능");
System.exit(1);
}
data.eng = 90;
if (data.eng < 0 || data.eng > 100){
System.out.println("영어 점수는 0~100점 사이만 가능");
System.exit(1);
}
data.tot = data.kuk + data.eng;
System.out.println("성명: " + data.name);
System.out.println("국어: " + data.kuk);
System.out.println("영어: " + data.eng);
System.out.println("총점: " + data.tot);
System.out.print("평가: ");
int avg = data.tot/2; //95
// 반올림, (int)(10.9) = 10
// (int)(9.4 + 0.5) = 9
// (int)(9.5 + 0.5) = 10
// (int)(9.6 + 0.5) = 10
int count = (int)((float)avg/10 + 0.5);
for(int i=0; i<count; i++){
System.out.print("★");
}
}
}
>>>>> PublicDataAccess2.java
public class PublicDataAccess2 {
public static void main(String[] args) {
PublicData data = new PublicData();
data.name = "학생2";
// 점수는 0점 ~ 100점 사이입니다.
data.kuk = 90;
if (data.kuk < 0 || data.kuk > 100){
System.out.println("국어 점수는 0~100점 사이만 가능");
System.exit(1);
}
data.eng = 50;
if (data.eng < 0 || data.eng > 100){
System.out.println("영어 점수는 0~100점 사이만 가능");
System.exit(1);
}
data.tot = data.kuk + data.eng;
System.out.println("성명: " + data.name);
System.out.println("국어: " + data.kuk);
System.out.println("영어: " + data.eng);
System.out.println("총점: " + data.tot);
System.out.print("평가: ");
int avg = data.tot/2; //95
int count = (int)((float)avg/10 + 0.5);
for(int i=0; i<count; i++){
System.out.print("★");
}
}
}
>>>>> PublicDataAccess3.java
public class PublicDataAccess3 {
public static void main(String[] args) {
PublicData data = new PublicData();
data.name = "학생3";
// 점수는 0점 ~ 100점 사이입니다.
data.kuk = 95;
if (data.kuk < 0 || data.kuk > 100){
System.out.println("국어 점수는 0~100점 사이만 가능");
System.exit(1);
}
data.eng = 80;
if (data.eng < 0 || data.eng > 100){
System.out.println("영어 점수는 0~100점 사이만 가능");
System.exit(1);
}
data.tot = data.kuk + data.eng;
System.out.println("성명: " + data.name);
System.out.println("국어: " + data.kuk);
System.out.println("영어: " + data.eng);
System.out.println("총점: " + data.tot);
System.out.print("평가: ");
int avg = data.tot/2; //95
int count = (int)((float)avg/10 + 0.5);
for(int i=0; i<count; i++){
System.out.print("★");
}
}
}
3. private을 이용한 데이터 은닉, 캡슐화를 구현한 경우
- private 필드에 값을 저장하는 경우
public void set + 첫자를 대문자로 시작하는 변수명(변수){...}
private String name;
public void setName(String name){ ... }
private int kuk;
public void setKuk(int kuk){ ... }
private String nameCard;
public void setNameCard(String nameCard){ ... }
- private 필드에서 값을 가져오는 경우
public 리턴 타입 get + 첫자를 대문자로 시작하는 변수명(){...}
private String name;
public String getName(){ ... }
private int kuk;
public int getKuk(){ ... }
private String nameCard;
public String getNameCard(){ ... }
>>>>> Data.java
//데이터 클래스
public class Data{
//인스턴스 변수, 멤버 변수
private String name;
private int kuk;
private int eng;
private int tot;
public Data() {
super();
}
public Data(String name, int kuk, int eng) {
super();
this.name = name;
this.kuk = kuk;
this.eng = eng;
}
// eng 값을 가져오는 메소드
public int getEng() {
return eng;
}
// eng 값을 저장하는 메소드
public void setEng(int eng) {
if (eng < 0 || eng > 100){
System.out.println("영어 점수는 0~100점 사이입니다.");
System.exit(1);
}
this.eng = eng;
}
// kuk 값을 가져오는 메소드
public int getKuk() {
return kuk;
}
// kuk 값을 저장하는 메소드
public void setKuk(int kuk) {
if (kuk < 0 || kuk > 100){
System.out.println("국어 점수는 0~100점 사이입니다.");
System.exit(1);
}
this.kuk = kuk;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getTot(){
this.tot = this.kuk + this.eng;
return this.tot;
}
public String getStar(){
String str = "";
int avg = this.tot/2;
int count = (int)((float)avg/10 + 0.5);
for(int i=0; i<count; i++){
str = str + "★";
}
return str;
}
}
>>>>> DataAccess.java
//데이터 이용 클래스
public class DataAccess {
public static void main(String[] args) {
Data data = new Data();
data.setName("학생1");
data.setKuk(100);
data.setEng(90);
// data.name = ""; // ERROR
System.out.println("성명: " + data.getName());
System.out.println("국어: " + data.getKuk());
System.out.println("영어: " + data.getEng());
System.out.println("총점: " + data.getTot());
System.out.println("평가: " + data.getStar());
}
}
>>>>> DataAccess2.java
public class DataAccess2 {
public static void main(String[] args) {
Data data = new Data("학생2", 90, 80);
// data.setName("학생2");
// data.setKuk(90);
// data.setEng(80);
System.out.println("성명: " + data.getName());
System.out.println("국어: " + data.getKuk());
System.out.println("영어: " + data.getEng());
System.out.println("총점: " + data.getTot());
System.out.println("평가: " + data.getStar());
}
}
>>>>> DataAccess3.java
public class DataAccess3 {
public static void main(String[] args) {
Data data = new Data();
data.setName("학생3");
data.setKuk(60);
data.setEng(50);
System.out.println("성명: " + data.getName());
System.out.println("국어: " + data.getKuk());
System.out.println("영어: " + data.getEng());
System.out.println("총점: " + data.getTot());
System.out.println("평가: " + data.getStar());
}
}
[02] eclipse에서 getter, setter를 자동으로 생성해 보세요.
1. 기초 소스
>>>>> AutoGenerate.java
public class AutoGenerate {
private String mauntain; // 산 이름
private int high; // 산 높이
private int time; // 등반시간
private String way; // 경로
private String traffic; // 교통편
private String cloth; // 복장
private String lunch; // 점심준비
private String place; // 모임장소
private String meeting; // 모임시간
private String etc; // 기타공지
// 변수가 10개일경우 생성되는
// getter, setter는 20개 됩니다.
}
2. 기본 생성자의 자동 생성
3. 인수 있는 생성자의 자동 생성
4. setter, getter 메소드의 자동 생성
[참고]
>>>>> Mountain.java
/**
* 산정보를 가지고 있습니다.
* @author stu
*
*/
public class Mountain {
/** 이름 */
private String name;
/** 산의 높이 */
private int high;
/** 등산 소유시간 */
private String hour;
/** 교통편 */
private String transport;
/**
*
*/
public Mountain() {
super();
// TODO Auto-generated constructor stub
}
/**
* @param name
* @param high
* @param hour
* @param transport
*/
public Mountain(String name, int high, String hour, String transport) {
super();
this.name = name;
this.high = high;
this.hour = hour;
this.transport = transport;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the high
*/
public int getHigh() {
return high;
}
/**
* @param high the high to set
*/
public void setHigh(int high) {
this.high = high;
}
/**
* @return the hour
*/
public String getHour() {
return hour;
}
/**
* @param hour the hour to set
*/
public void setHour(String hour) {
this.hour = hour;
}
/**
* @return the transport
*/
public String getTransport() {
return transport;
}
/**
* @param transport the transport to set
*/
public void setTransport(String transport) {
this.transport = transport;
}
public void print(){
System.out.println(this.name);
System.out.println(this.high);
System.out.println(this.hour);
System.out.println(this.transport);
}
public void setData(String name, int high, String hour, String transport){
this.name = name;
this.high = high;
this.hour = hour;
this.transport = transport;
}
}
>>>>> MountainUse.java
public class MountainUse {
public static void main(String[] args) {
Mountain m = new Mountain("관악산", 629, "6시간", "서울대입구, 신림역 3번 출구");
System.out.println(m.getName());
System.out.println(m.getHigh());
System.out.println(m.getHour());
System.out.println(m.getTransport());
m.setName("계양산");
m.setHigh(395);
m.setHour("4 시간");
m.setTransport("경인여자전문대역");
m.print();
m.setData("마니산", 469, "5시간", "신촌 출발");
m.print();
}
}
Daum 최고의 보안카페 정보보안 전문가 따라잡기 ★정전따★ 쥔장 두환쌤 입니다. 오늘도 항상 행복하시고 좋은 하루 되세요 ^^
기타 빠른문의는 쥔장 두환쌤에게 연락주시면 감사 하겠습니다. 02-747-5983