은닉화
(숨겨놓은 금고)
private 사용하여 같은 클래스에서만 접근 가능
캡슐화
객체의 필드, 메서드를 하나로 묶고, 실제 구현 내용을 감추는 것 (=중요한 요소를 내부에 감추는 것)
public한 메서드를 만드는 것
데이터를 받는 메소드 (돈을 받는 은행원)
Java에서 꽤 많이 사용되며,
표준적으로 get메소드(데이터반환할때) set메소드(데이터넣어줄때,셋팅할때) is메소드(불린형 타입)만들어주므로
권장사항이다.
필드와 메서드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는데 있다.
package kr.s03.capsule;
class Capsule{
//은닉화
//private은 같은 클래스에서만 접근 가능
private int a; //ex)숨겨놓은 금고
//캡슐화 .직접적으로 멤버변수 엑세스 못하게하는 것이 권장사항
public void setA(int n) { //데이터를 받는 메소드 ex)돈을 받는 은행원
if(n>=0) {
a = n;
}else {//음수
System.out.println("음수는 허용되지 않습니다.");
}
}
public int getA() { //ex)돈을 출금해주는 은행원
return a;
}
}
public class CapsuleMain {
public static void main(String[] args) {
Capsule cap = new Capsule();
//cap.a = -10;
//변수 a의 접근지정자(제한자)가 private이기 때문에 같은 클래스 내에서는 호출이 가능하지만 다른 클래스에서는 호출 불가능하므로 에러
cap.setA(100); //데이터저장
System.out.println(cap.getA()); //데이터 호출
System.out.println("-------------------");
cap.setA(-100);
System.out.println(cap.getA()); //데이터 호출
System.out.println("-------------------");
}
}
캡슐화를 하고 나서는 private로 은닉화하여 멤버변수를 직접 호출하여 사용하지 못하는 상황이다.
메서드를 이용해서 호출하기 위해 get메서드, set메서드를 만들어준다.
직접 작성할 수도 있지만 스크립트 빈 곳을 우클릭하고
[Source] - [Generate Getters and Setters...]를 사용해서 메서드를 생성한다.
(이클립스가 문법을 적용해서 표준적으로 만들어준다.)
* get, set 메서드 생성 후에 변수명 잘못적었거나 수정했을 시
생성됬던 거 지우고 변수명 수정하고 다시 [Generate Getters and Setters...]하면 새로 수정한 변수명이 뜨니까 새로 만들어주면 된다.
set메서드를 이용해서 정보를 셋팅하고
get메서드를 이용해서 정보를 출력한다. 이때 boolean형은 get대신 is를 붙인 메서드이다.
아래 코드의 예시와 설명을 한번 본다.
public class Animal {
//멤버변수 은닉화
private String name;
private int age;
private boolean fly;
public Animal() { //디폴트 생성자
}
public Animal(String name, int age, boolean fly) {
//멤버변수 = 지역변수
this.name = name;
this.age = age;
this.fly = fly;
}
//직접 호출을 못하는상황에서 메소드를 이용해서 호출한다.
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 boolean isFly() { //boolean형은 get메서드아님
return fly;
}
public void setFly(boolean fly) {
this.fly = fly;
}
}
public class AnimalMain {
public static void main(String[] args) {
//기본 생성자를 이용해서 객체 생성
Animal a1 = new Animal(); //디폴트 생성자를 생성 해놔서 에러없다.
//기본 정보 셋팅
a1.setName("기린");
a1.setAge(10);
a1.setFly(false);
//정보 출력
System.out.println("이름 : "+ a1.getName()); //겟메소드를이용
System.out.println("나이 : "+ a1.getAge()); //겟메소드를이용
System.out.println("비행 여부 : "+ a1.isFly()); //boolean형은is붙인다
// 또는 System.out.println("비행 여부 : "+ (a1.isFly() ? "가능" : "불가능") );
System.out.println("비행 여부 : "+ printFly(a1.isFly())); //boolean형은is붙인다
System.out.println("-----------------------");
//생성자로 데이터 셋팅
Animal a2 = new Animal("기러기",3,true);//기본정보를 셋팅할 필요가 없다(7~9라인)
//정보 출력
System.out.println("이름 : "+ a2.getName());
System.out.println("나이 : "+ a2.getAge());
System.out.println("비행 여부 : "+ a2.isFly());
System.out.println("비행 여부 : "+ (a2.isFly() ? "가능" : "불가능") );
System.out.println("비행 여부 : "+ printFly(a2.isFly())); //같은클래스이므로 클래스명생략
}
//메서드에서도 private접근지정자 붙일 수 있다.
private static String printFly(boolean fly){ //위치는main위에 생성해도 상관없다
//static한 메서드 호출로만 가능
return fly ? "가능" : "불가능";
}
}
'Java > ✿object*객체' 카테고리의 다른 글
[Java] 💻String과 StringBuffer,StringBuilder (0) | 2021.11.09 |
---|---|
[ Java ] 💻 생성자와 메서드 (0) | 2021.11.04 |
[Java] 💻접근제한자 (0) | 2021.11.04 |
댓글