[Java] 캡슐화

kai6666·2022년 5월 12일
0

TIL. Java

목록 보기
10/21
post-custom-banner

이미지출처


캡슐화 (encapsulation)

객체지향 프로그래밍의 핵심 중 하나인 캡슐화는, 특정 객체의 속성과 기능을 캡슐로 만들어 외부로부터 데이터를 보호하는 것이다. 캡슐화의 목적은 (1) 데이터 보호, (2) 내부적으로만 쓰이는 데이터에 대한 불필요한 외부 노출 방지가 있다.

패키지 (Package)

패키지란 클래스와 인터페이스의 묶음이다. 이 묶음은 특정한 목적을 공유하는 것들의 집합이다. 클래스에 속성과 기능을 묶어 관리하듯, 패키지는 클래스들을 묶어 관리하는 목적으로 쓰인다. 패키지는 디렉토리처럼 관리되기 때문에, 계층 구조를 가지고 있다. 계층 간 구분은 점 "."으로 표현된다. package 패키지명.~ 이러한 모습을 띤다.

자바에 기본 포함된 패키지의 예로는 java.lang, java.util, java.lang.String 등이 있다. 패키지를 통해 클래스를 관리한다는 것은, 같은 클래스 이름을 갖고 있더라도 패키지가 다르면 구별이 가능해서 충돌을 방지할 수 있다는 의미이기도 하다.

package exercise.test2;

import exercise.test.*

public class exerciseImport {
	public static void main(String[] args) {
    	...
        }

다른 패키지의 클래스를 현재 패키지로 불러오려면 import 키워드를 사용하면 된다. import 패키지명.클래스명; 또는 import 패키지명.*; 와 같은 구문을 패키지 구문과 클래스문 사이에 적으면 된다. import 구문을 사용하지 않고 다른 패키지의 클래스를 쓰려면 exercise.test.클래스명 e = new exercise.test.클래스명 같은 모양새로 패키지명을 모두 포함시켜 길게 작성해야 한다. 따라서 import문을 통해 필요한 클래스 혹은 클래스 전부를 불러온 후, 클래스명만 활용하여 현재 패키지에서 코딩을 하는 것이 효율적이다.


접근 제어자 (Access Modifier)

접근 제어자는 자바가 캡슐화를 수행할 때 쓰는 핵심 수단이다. private, (default), protected, public 총 4가지가 있다.

  • private : 동일 클래스 내 접근 가능
  • (default) : 동일 패키지 내 접근 가능 (디폴트기 때문에 입력 안 해주면 자동 설정)
  • protected : 동일 패키지, 타 패키지의 하위 클래스에서 접근 가능
  • public : 제한 없음
    나열된 순서 위에서 아래로 점점 접근 제한 범위가 넓어진다. 필요에 맞게 접근 제어자를 활용하면 불필요한 데이터 노출을 방지하고 외부로부터 데이터를 보호할 수 있다.

getter와 setter 메서드

getter와 setter 메서드는 캡슐화를 유지하면서도 데이터의 변경이 필요한 경우에 사용하는 메서드다. 대표적으로 private 접근 제어자가 달린 객체 변수의 데이터 값을 수정/추가하고 싶을 때가 있을 것이다.

public class GetterSetterExercise {
    public static void main(String[] args) {
        Student s = new Student();
        s.setName("김자바");
        s.setAge(20);
        s.setGrade(6);

        String name = s.getName();
        int age = s.getAge();
        int grade = s.getGrade();
        System.out.println("학생 이름은 " + name + ", 나이는 " + age + "살, 학년은 " + grade + "학년입니다. ");
    }
}

class Student {
    private String name; // 외부 클래스/패키지에서 접근 불가
    private int age;
    private int grade;

    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 int getGrade() {
        return grade;
    }
    public void setGrade (int grade) {
        this.grade = grade;
    }
}
// 출력: 학생 이름은 김자바, 나이는 20살, 학년은 6학년입니다. 

위 코드를 보면 Student 클래스의 변수가 private 접근 제어자로 은닉화 되어 있다. 캡슐화로 보호되고 있는 데이터를 GetterSetterExercise라는 타 클래스에서 접근하고자 한다.

  • getter : 데이터를 읽어오는 메서드
  • setter : 데이터를 변경/수정하는 메서드

우선 get을 메서드명 앞에 붙여서 getter 메서드를 만들어 같은 클래스내 private 변수 값을 읽는다. 그후 set을 메서드명 앞에 붙여 정의하고, 데이터를 조건에 맞게 변경한다. GetterSetterExercise 클래스에서 객체 인스턴스를 만들어 참조변수 s에 setter 메서드를 사용해 데이터 값을 할당한다. getter 메서드로 값을 불러와 변수에 담아 출력해준 결과가 "학생 이름은 김자바, 나이는 20살, 학년은 6학년입니다."이다.
이처럼 getter와 setter 메서드를 쓰면 데이터 보호를 포기할 필요없이 데이터를 변경할 수 있다. (데이터를 직접 수정하면 되지 않나 하는 생각이 들기도 했지만, getter setter 메서드를 사용하면 보호 받아야 할 값을 직접 건드리지 않고 잠시 꺼내와서 값을 바꿔서 쓴다고 생각하면 이해가 된다.)

profile
성장 아카이브
post-custom-banner

0개의 댓글