본문 바로가기
Java/✿object*객체

[ Java ] 💻 캡슐화

by W_W_Woody 2021. 11. 4.

은닉화


(숨겨놓은 금고)
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

댓글