-
[TIL #13-2][JAVA] 객체지향 프로그래밍 심화, 캡슐화(패키지, 접근 제어자, getter, setter)CodeStates_Backend/TIL (Today I Learned) 2022. 5. 21. 11:24
코드스테이츠 백엔드 부트캠프 39기 18일차, 05/12
캡슐화 (Encapsulation)
🧲 개요
속성 , 기능 을 하나의 캡슐로 감싸는 것. 목적은 크게 3가지로 나뉜다.
1️⃣ 데이터의 보호 👉 외부로부터 속성과 기능이 함부로 변경되지 못하게 막음, 데이터가 수정되어도 다른 객체에 영향을 주지 않아 독립성 확보(=정보 은닉; Data Hiding)
2️⃣ 데이터의 불필요한 외부 노출을 방지
3️⃣ 유지보수, 코드 확장 시 오류 범위를 최소화
🛟 '캡슐'이라 함은 개념적인 표현으로, 감싸서 보호한다는 의미가 중요한 것이라고 생각한다. 클래스가 될 수도 있고 접근제어자가 될 수도 있고 객체가 될 수도 있고 블록이 될 수도 있을 것이다.
🛟 자바에서는 접근 제어자(Access Modifier)가 캡슐화의 핵심이다.
🧲 패키지
특정한 목적을 공유하는 클래스와 인터페이스의 묶음이다.
🛟 자바에서 패키지는 하나의 물리적인 디렉토리라 할 수 있다. 디렉토리이기 때문에 계층 구조이며 점(.)으로 경로를 표현한다.
🛟 패키지에 포함하고 싶다면 코드의 첫 째줄에 package 패키지명; 으로 패키지를 선언해야하고 패키지 선언이 없으면 '이름없는 패키지'에 속하게 된다.
🛟 자바의 대표적인 기본 패키지
java.lang : 기본 클래스들을 모아둔 패키지
java.util : 확장 클래스들을 모아둔 패키지
java.io , java.nio : 입출력과 관련된 클래스들을 모아둔 패키지🛟 장점은 클래스 이름이 같더라도 다른 패키지에 포함되어 있으면 구분이 가능하므로 협업 시 충돌을 방지할 수 있다. 규모가 큰 프로젝트에서는 클래스명 중복이 빈번히 발생할 수 있는데, 이 충돌을 방지할 수 있는 장치이다.
🛟 import 문으로 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 미리 제공할 수 있다. import 문은 컴파일 시 처리되므로 프로그램 성능에는 영향이 없다.
🧲 제어자
클래스, 필드, 메소드, 생성자 등에 부가적인 의미를 부여하는 키워드이다. 크게 두 종류로 나뉜다.
접근 제어자 public, protected, default(생략 가능), private 기타 제어자 static, final, abstract, native, transient, synchronized 등 🛟 제어자는 원칙적으로 하나의 대상에 여러개의 제어자를 적용할 수 있지만, 그 중 접근제어자는 하나의 대상에 하나만 적용가능하다.
🧲 접근 제어자
단! 현재 다루는 접근 제어자는 필드 단위에서만의 내용이다. 클래스의 접근 제어자는 내용이 다르다. 추가 학습 필요.
자바의 객체지향 프로그래밍의 캡슐화를 구현하기 위한 핵심적인 방법이다.
private 동일 클래스 default 동일 패키지 protected 동일 패키지 or 상속받았을 경우 public ALL 이 중 default 는 아무런 접근 제어자를 붙이지 않은 경우이다.
package package1; // 패키지명 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; protected int c = 3; public int d = 4; public void printEach() { // 동일 클래스이기 때문에 에러발생하지 않음 System.out.println(a); System.out.println(b); System.out.println(c); System.out.println(d); } } // 출력값 2 3 4
주의할 점은 Parent 클래스로 생성한 p 객체일지라도 Parent 클래스 내부의 private 변수에 접근할 수 없다는 것이다. private은 그냥 같은 클래스 내부에서만 접근이 가능하다.
🧲 getter 와 setter 메소드
객체지향의 캡슐화가 이뤄져야하지만, 외부에서 내부 데이터의 접근이 필요할 경우가 당연히 있을 것이다. 캡슐화된 여러 캡슐들이 서로 상호작용을 해야 전체 프로그램이 잘 동작하는 것이기 때문이다. 캡슐화를 달성하면서도 외부에서 데이터 접근이 필요한 경우 getter 와 setter 메소드를 사용한다. 이때 getter 와 setter 라는 용어는 특정한 메소드 이름이 아닌 '가져오는 역할' , 'setting하는 역할'의 개념적인 표현이다. 실제 메소드명은 'get~' , 'set~' 이런식으로 사용한다.
🛟 getter 제공 / setter 미제공 : 읽기전용
🛟 getter 미제공 / setter 제공 : 쓰기전용
🛟 데이터의 무결성을 위해 개발자가 의도한 데이터만 get 및 set 이 가능하게 활용할 수도 있다. 아래 예시를 보자.
'CodeStates_Backend > TIL (Today I Learned)' 카테고리의 다른 글
[TIL #14-2][JAVA] 객체지향 프로그래밍 심화, 추상화 (0) 2022.05.22 [TIL #14-1][JAVA] 객체지향 프로그래밍 심화, 다형성 (0) 2022.05.21 [TIL #13-1][JAVA]객체지향 프로그래밍 심화, 상속(오버라이딩, super()와 super) (0) 2022.05.18 [TIL #12][JAVA] 생성자, this 와 this() (0) 2022.05.16 [TIL #11-2][JAVA] 객체지향 프로그래밍(OOP, Object Oriented Programming) 개념, 클래스, 객체, 필드, 메서드 (0) 2022.05.16