SKSDUD

[객체지향 프로그래밍 심화] (2) 캡슐화 본문

CodeStates/Section 01

[객체지향 프로그래밍 심화] (2) 캡슐화

NYinJP 2023. 2. 7. 02:15

자바 객체지향 프로그래밍의 핵심 기술 중 하나이다.

캡슐화란
특정 객체 안에 관련된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것을 말합니다.
  • 데이터의 보호를 위함
  • 내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출을 방지

캡슐화를 통해 정보 은닉이 가능하다. 

캡슐화를 구현하기 위해 자바는 접근 제어자, getter/setter 메서드를 이용합니다.

  • 접근 제어자(Access Modifier)
  • getter와 setter 메서드

패키지 : 특정한 목적을 공유하는 클래스와 인터페이스의 묶음

패키지는 클래스들을 그룹 단위로 묶어 효과적으로 관리하기 위해 사용합니다. 

패키지별로 클래스를 묶어놓으면 클래스의 충돌을 방지할 수 있습니다.

같은 이름의 클래스들이 서로 다른 패키지에 존재한다면 그 둘은 이름명으로 인한 충돌이 일어나지 않습니다.

패키지 명은 소문자로
클래스 명은 대문자로

import문은 다른 패키지 안에 있는 클래스를 사용하기 위해 사용합니다.

파일구조와 똑같다

접근 제어

자바 객체지향 프로그래밍의 캡슐화를 구현하기 위한 핵심적인 방법입니다.

접근 제어자를 사용하면

  • 클래스 외부로의 불필요한 데이터 노출 방지
  • 외부로부터 클래스 내의 데이터가 임의로 변경되지 않도록 방지

할 수 있습니다.

접근 제어자 접근 제한 범위
private 제한 X
default 동일 패키지
protected 동일 패키지 + 다른 패키지의 자식 클래스
private 동일 클래스에서만 접근 가능

public > protected > default > private

변수명 앞에 아무것도 없다면 이는 default 접근 제어자가 됩니다.

 

package practice.encapsulation.package1;

//파일명: Parent.java
class Test { // Test 클래스의 접근 제어자는 default
    public static void main(String[] args) {
        Parent p = new Parent();

//        System.out.println(p.a); // 동일 클래스가 아니기 때문에 에러발생!
        System.out.println(p.b);
        System.out.println(p.c);
        System.out.println(p.d);
    }
}

public class Parent { // Parent 클래스의 접근 제어자는 public
    private int a = 1; // a,b,c,d에 각각 private, default, protected, public 접근제어자 지정
    int b = 2; // default 동일 패키지 + 다른 패키지의 하위 클래스
    protected int c = 3; // 동일 패키지
    public int d = 4; // 접근 제한 X

    public void printEach() { // 동일 클래스이기 때문에 에러발생하지 않음
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
    }
}

구조

package1 패키지

ㄴ Parent 클래스

ㄴ Test 클래스

포인트

  • private 로 접근 제어자를 지정할 시 다른 클래스에서 접근할 수 없다!
  • 동일 패키지이기 때문에 protected, default도 접근할 수 있다!
  • 아무것도 없다면 default이다.
  • 상속을 받아도 다른 패키지에 있다면 private, default 사용 불가
  • 상속받지 않은 다른 패키지에 존재하는 클래스라면 protected 사용 불가

 

getter와 setter 메서드

객체지향의 캡슐화의 목적을 달성하면서 데이터의 변경이 필요한 경우는??

접근 연산자가 private 일 때,

 

setter 메서드

외부에서 메서드에 접근하여 조건에 맞을 경우 데이터 값을 변경 가능하게 해 준다.

getter 메서드

설정한 변수 값을 읽어오는 데 사용하는 메서드이다. 

 

데이터를 효과적으로 보호하면서 의도하는 값으로 값을 변경할 때 사용합니다. 

return으로 데이터를 읽어오거나 this.age=age;와 같이 데이터를 변경할 수 있습니다.

 

alt + Ins로 생성자, getter/setter를 자동으로 만들 수 있다.

public class Worker {
    private String name; //변수의 은닉화. 외부로부터 접근 불가. 동일 클래스에서만 접근 가능
    private int age;
    private int id;

    public String getName(){ //멤버변수의 값
        return name;
    }
    public void setName(String name){ //멤버변수의 값 변경
        this.name=name;
    }
    public int getAge(){
        return age;
    }
    public void setAge(int age){
        if(age<1) return;
    }
    public int getId(){
        return id;
    }
    public void setId(int id){
        this.id=id;
    }

}

 

멤버변수를 private나 protected로 제한하여 외부에서 직접 접근할 수 없도록 하고, 

멤버변수의 값을 읽고 변경할 수 있는 public메서드를 getter와 setter로 제공함으로써 간접적으로 멤버변수의 값을 다룰 수 있도록 한다. 

 

💬
객체지향 프로그래밍의 궁극적인 코드를 작성하기 위해서 캡슐화라는 것이 필요하다.
이는 외부로부터 불필요한 정보 노출과 외부에서 내부 데이터에 쉽게 접근하여 값을 변경하는 것을 막고자 함이다.
정보 은닉!이라고 생각하면 될 거 같다.
말이 거창하지만 캡슐화를 구현하기 위해서 개념은 간단했다!
패키지에 대해 공부하고 동일 패키지 존재 여부에 따라 접근 제어자가 나뉜다. 4가지가 존재한다.
그중 private 가 가장 중요한데, 이는 동일 클래스 내에서만 접근할 수 있도록 한다.
만약 private로 설정된 변수들의 값을 읽거나 변경할 때는 캡슐화의 취지를 살리면서 어떻게 접근하는가?
이때 getter/setter 메서드를 사용하였다. 
get 값을 읽어올 때
set 값을 변경할 때 
return 하거나 this.name =name으로 변경한다. 

다양한 코드들을 보며 익숙해져야겠다!

 

 

'CodeStates > Section 01' 카테고리의 다른 글

[객체지향 프로그래밍 심화] (3) 다형성  (0) 2023.02.08
[객체지향 프로그래밍 심화] (1) 상속  (0) 2023.02.07
객체지향 기초  (0) 2023.01.18
[Section01] 한달 회고  (0) 2023.01.11
Pair 활동  (0) 2023.01.06