정보 은닉(Information Hiding)
public class BankAccount {
// private 필드: 외부에서 직접 접근 불가
private double balance;
// public 생성자
public BankAccount(double initialBalance) {
if (initialBalance > 0) {
this.balance = initialBalance;
}
}
}
정보 은닉(Information Hiding)은 객체 지향 프로그래밍(OOP)에서 중요한 개념 중 하나로, 객체 내부의 데이터와 구현 세부 사항을 외부로부터 숨기고, 객체가 제공하는 공개 인터페이스를 통해서만 접근하도록 제한하는 방법을 말합니다. 이는 소프트웨어의 복잡성을 줄이고, 유지보수성을 높이며, 모듈화와 재사용성을 향상시키는 데 중요한 역할을 합니다.
정보 은닉의 목적
- 데이터 보호: 객체의 내부 데이터가 무분별하게 변경되는 것을 방지하여 객체의 일관성을 유지합니다.
- 캡슐화: 객체의 데이터와 메드를 하나의 단위로 묶고, 외부로부터의 접근을 제어하여 코드의 모듈화를 촉진합니다.
- 유지보수성 향상: 내부 구현이 외부에 노출되지 않으므로, 내부 구조를 변경하더라도 외부에 영향을 주지 않습니다.
- 인터페이스 중심 설계: 객체가 제공하는 기능을 외부에 명확히 정의하고, 사용자가 그 기능만을 통해 객체와 상호작용하도록 유도합니
정보 은닉의 이점
- 데이터 무결성 유지: 필드를 private으로 설정함으로써 외부에서 잘못된 데이터를 삽입하거나 변경하는 것을 방지할 수 있습니다.
- 변경의 용이성: 클래스 내부의 구현을 변경하더라도 외부의 코드에 영향을 주지 않으므로, 유지보수가 용이합니다.
- 코드의 가독성 및 관리 용이성: 코드가 명확하게 분리되어 모듈화되므로, 이해하기 쉽고 관리하기 편합니다.
정보 은닉을 구현하는 방법
public class BankAccount {
private double balance;
protected int amount;
public int age;
String name;
}
- private
- 클래스 내부에서만 접근이 가능합니다.
- 필드나 메소드를 private으로 선언하여 외부에서 직접 접근하지 못하도록 할 수 있습니다.
- default
- 같은 패키지 내에서만 접근이 가능합니다.
- 접근 제어자를 명시하지 않으면 default 접근 수준이 됩니다.
- protected
- 같은 패키지 내에서, 그리고 다른 패키지의 하위 클래스에서 접근이 가능합니다.
- 주로 상속 관계에서 사용됩니다.
- public
- 어디서나 접근이 가능합니다.
- 클래스, 메드, 필드를 public으로 선언하여 외부에서 접근할 수 있도록 합니다.
지시자 | 클래스 내부 | 동일 패키지 | 상속 받은 클래스 | 이외의 영역 |
private | O | X | X | X |
default | O | O | X | X |
protected | O | O | O | X |
public | O | O | O | O |
접근수준 지시자 private에 접근하는 방법들
Getter와 Setter 메소드 사용
public class Person {
// private 필드
private String name;
private int age;
// 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter 메소드
public String getName() {
return name;
}
public int getAge() {
return age;
}
// Setter 메소드
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
if (age >= 0) { // 나이의 유효성 검사
this.age = age;
}
}
}
Getter 메소드
- Getter 메소드는 클래스의 private 필드 값을 읽을 수 있도록 해주는 메소드입니다. 보통 get이라는 접두어를 사용하고 필드 이름과 연결하여 메소드를 정의합니다.
- 읽기 전용: 필드의 값을 반환만 하고, 필드 값을 변경하지 않습니다.
- 접근 허용: 외부 클래스에서 private 필드의 값을 읽을 수 있도록 합니다.
- 데이터 무결성 보장: 필드 값에 대한 직접 접근을 막고, 필요한 경우 필터링이나 추가 로직을 적용할 수 있습니다.
Setter 메소드
- Setter 메소드는 클래스의 private 필드 값을 수정할 수 있도록 해주는 메소드입니다. 보통 set이라는 접두어를 사용하고 필드 이름과 연결하여 메소드를 정의합니다.
- 쓰기 전용: 필드의 값을 변경하기 위해 사용됩니다.
- 유효성 검사: 값을 설정하기 전에 유효성을 검사하거나 추가 로직을 수행할 수 있습니다.
- 캡슐화 유지: 외부에서 직접 필드에 접근하지 않고, 메소드를 통해서만 수정 가능하게 합니다.
내부 클래스 사용
public class Outer {
private String secret = "Hidden message";
// 내부 클래스
class Inner {
void revealSecret() {
System.out.println("Secret: " + secret);
}
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.revealSecret();
}
}
내부 클래스는 외부 클래스의 모든 멤버에 접근할 수 있는 권한을 가집니다. 내부 클래스의 메소드를 통해 private 필드에 접근할 수 있습니다.
캡슐화(Encapsulation)
public class BankAccount {
// private 필드: 외부로부터 보호
private double balance;
// 생성자
public BankAccount(double initialBalance) {
if (initialBalance > 0) {
this.balance = initialBalance;
}
}
// public 메소드: 외부에 공개
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
public boolean withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
return true;
}
return false;
}
// Getter 메소드: balance를 안전하게 읽기
public double getBalance() {
return balance;
}
}
캡슐화(Encapsulation)는 객체 지향 프로그래밍(OOP)의 핵심 원칙 중 하나로, 객체의 데이터(속성)와 메드(동작)를 하나의 단위로 묶어 외부로부터 데이터를 보호하고, 객체의 사용 방법을 정의하는 것을 말합니다. 이를 통해 데이터 무결성을 유지하고, 코드의 복잡성을 줄이며, 유지보수성을 향상시킬 수 있습니다.
캡슐화의 개념
캡슐화는 객체의 내부 구현을 외부에 숨기고, 필요한 부분만 공개하여 외부 객체와 상호작용할 수 있도록 하는 것입니다. 이를 통해 객체의 내부 상태를 보호하고, 외부의 잘못된 사용으로부터 객체를 안전하게 지킬 수 있습니다.
캡슐화의 목적
- 데이터 보호: 객체의 내부 데이터를 직접 접근하지 못하게 하여 데이터의 일관성과 무결성을 유지합니다.
- 유지보수성 향상: 내부 구현이 외부에 노출되지 않으므로, 객체의 내부를 변경하더라도 외부에 영향을 주지 않고 쉽게 수정할 수 있습니다.
- 코드의 재사용성 증가: 객체의 인터페이스를 통해 명확한 사용 방법을 제공함으로써, 코드의 재사용성이 증가합니다.
- 응집도 증가: 관련된 데이터와 동작을 하나의 객체로 묶음으로써, 응집도가 높아지고 모듈화가 향상됩니다.
캡슐화를 구현하는 방법
캡슐화를 구현하기 위해서는 주로 접근 제어자(Access Modifiers)를 사용하여 객체의 필드와 메소드의 접근 수준을 제어합니다.
캡슐화의 장점
- 데이터 무결성 유지: 객체의 필드에 직접 접근하지 못하도록 하여, 잘못된 데이터가 입력되는 것을 방지합니다.
- 코드의 모듈화: 관련 있는 데이터와 기능을 하나의 클래스에 묶어 관리함으로써, 코드의 응집도를 높이고 모듈화를 촉진합니다.
- 변경 용이성: 객체의 내부 구현을 외부에 노출하지 않으므로, 내부 구조를 변경하더라도 외부에 영향을 주지 않고 쉽게 수정할 수 있습니다.
- 가독성과 유지보수성 향상: 캡슐화를 통해 명확한 인터페이스를 제공함으로써, 코드의 가독성과 유지보수성을 향상시킵니다.
출처
W3Schools.com
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
www.w3schools.com
'Programming > Java' 카테고리의 다른 글
문자열 클래스 (0) | 2024.08.03 |
---|---|
메소드 오버로딩(Method overloading) (0) | 2024.08.03 |
클래스와 생성자 (0) | 2024.08.02 |
Java 메소드와 변수의 스코프 (0) | 2024.08.01 |
실행 흐름의 컨트롤 (0) | 2024.08.01 |