캡슐화

develop.u·2022년 9월 14일
0

캡슐화(은닉화)란?

  • 멤버변수메서드가 객체에 노출되지 않도록 설정하는 기법
  • 객체를 사용하는 측의 실수로 인한 기능의 오작동을 방지하기 위해, 클래스의 일부를 숨기는 처리

<1> 적용하는 방법

  • 변수의 이름/메서드 이름 앞에 "접근 한정자"를 지정

<2> 접근 한정자

  • public

    • 모든 곳에서 접근이 가능
    • 일반적으로 모든 메서드 앞에 명시
    • private로 잠긴 멤버변수는 public으로 명시된 메서드로 사용 가능함(getter, setter)
  • private

    • 클래스 내부에서만 접근 가능, 외부에서는 접근 불가능(객체를 통해 접근 불가능)
    • 일반적으로 모든 멤버변수 앞에 명시
  • protected

    • 현재 클래스 내의 다른 자원이나 같은 패키지 안에 존재하는 클래스, 하위 클래스에서 접근 가능
    • 잘 사용하지 않음
  • default

    • 접근 한정자를 명시하지 않은 경우 발생
    • 현재 클래스 내의 다른 자원이나 같은 패키지 내의 다른 클래스에서 접근 가능
    • 잘 사용하지 않음

🖥️ 예시

class User{
  public String name = "학생";
  private int age = 20;
 }

public class Main01 {

	public static void main(String[] args) {
		User user = new User();
		
		// public 이므로 접근 가능
		System.out.println( user.name );
		
		//private 이므로 접근 불가능
//		System.out.println(user.age);	
	}
}

결과값

학생

2-1. getter, setter

  • 멤버변수가 은닉된 형태로 선언된 경우 메서드를 통하여 간접적으로 접근하는 방법이 필요
    getter setter는 은닉된 멤버변수에 간접적으로 접근하기 위하여 정의된 메서드

getter

  • 은닉된 멤버 변수의 값을 리턴하기 위한 메서드

setter

  • 파라미터로 전달된 값을 멤버변수에 복사하기 위한 메서드

🖥️ 예시

class Student{
	// 은닉된 멤버변수 → 현재 블록 안에서만 접근 가능함
	private String name;
	private int age;
	
	// name getter
	public String getName() {
		return this.name;
	}
	
	// name setter (세팅이기 때문에 return 값이 없음)
	// 세팅할 값을 파라미터로 받아옴
	public void setName(String name) {
		this.name = name;
	}
	
	// age getter
	public int getAge() {
		return this.age;
	}
	
	// age setter
	public void setAge(int age) {
		this.age = age;
	}
}

public class Main02 {

	public static void main(String[] args) {
    	// getter, setter 사용
		Student student = new Student();
		student.setAge(20);
		student.setName("학생1");
		
		String name = student.getName();
		System.out.println("이름: " + name);
		System.out.println("나이: "+student.getAge());
	}

}

결과값

이름: 학생1
나이: 20

get set 접두사 뒤에 변수이름을 첫 글자가 대문자인 형태로 명시
getter는 연결된 멤버변수의 데이터 타입을 리턴형으로 명시
setter는 연결된 멤버변수의 데이터 타입을 파라미터 형으로 명시


클래스의 접근 한정자도 알아보자

<1> 클래스의 접근 한정자

  • public

    • 객체 생성 가능
    • 서로 다른 소스코드에 정의된 클래스끼리도 객체 생성이 가능
    • 일반적으로 클래스 정의에는 public 접근 한정자만 사용
  • private

    • 클래스에 적용 불가능
  • protected

    • 클래스에 적용 불가능
  • default

    • 동일한 소스코드에 정의된 클래스끼리만 객체로 생성 가능

1-2. 클래스의 분리

  • 하나의 소스코드에서 프로그램의 모든 기능을 구현하게 되면 유지보수에 비효율적

    → 기능단위로 소스코드를 분리해야 한다 !

  • 소스코드가 분리된 클래스끼리는 public이 명시 되어야만 서로 객체 생성이 가능

  • 하나의 소스코드에는 하나의 public 클래스만 존재 가능

0개의 댓글