- 일시 : 4/21(월) 14:00
- 진행 : 김기용 튜터님
- 장소 : zoom
📙 목차
1. 캡슐화
내부 정보를 외부로 부터 보호하는 것
2. 정보 은닉
캡슐화와 추상화는 정보은닉을 하기 위한 수단이다
- 캡슐화: 접근제어자를 활용해 내부 데이터에 직접 접근하지 못하게 하고 메서드를 통해서만 제어하게 한다.
- 추상화: 불필요한 구체적인 구현을 숨겨 사용하기 편하게 합니다. (인터페이스, 상속)
정보를 은닉시켜야 하는 이유
- 정보를 숨기지 않으면 외부에서 객체 내부를 직접 조작하거나 의도하지 않는 방식으로 사용될 수 있다.
- 정보에 대한 과도한 자유는 오히려 객체를 사용하는 입장에서 혼란을 줄 수 있다.
3. 접근 제어자
- 접근제어자를 통해 객체의 캡슐화를 할 수 있다.
- 접근제어자는 클래스, 속성, 생성자, 기능 부분에 활용할 수 있다.
접근제어자 | 클래스 내부 | 패키지 내부 | 상속한 클래스 | 전체 공개 |
public | ✅ | ✅ | ✅ | ✅ |
protected | ✅ | ✅ | ✅ | ❌ |
default | ✅ | ✅ | ❌ | ❌ |
private | ✅ | ❌ | ❌ | ❌ |
클래스에서 활용
// default 접근제어자
class Util1 {
public void utilMethod() {
...
}
}
import example1.service1.Util1; // ⚠️ 패키지 외부에서 사용불가
public class Service2 {
Util1 util1; // ⚠️
}
속성에서 활용
public class Account {
private int balance; // 속성을 private 으로 숨김
// 게터 / 세터를 통해 접근
public int getBalance() {
return balance;
}
public void setBalance(int amount) {
if (amount < 0) { // 변경 조건 설정
System.out.println("설정할 수 없는 금액입니다.");
} else {
this.balance = amount;
}
}
}
생성자에서 활용
public class User {
private String name;
private int age;
private String nickname;
// 직접 생성 막고
private User(String name) {
this.name = name;
}
// 직접 생성 막고
private User(String name, int age, String nickname) {
this.name = name;
this.age = age;
this.nickname = nickname;
}
// 정적 메서드로만 생성 허용
public static User createGuest(String nickname) {
return new User(nickname);
}
public static User createUser(String name, int age, String nickname) {
return new User(name, age, nickname);
}
}
기능에 활용
public class UserService {
public void customerRegister(String email, String password) {
if (!isValidEmail(email)) {
throw new IllegalArgumentException("이메일 형식 오류");
}
}
private boolean isValidEmail(String email) { // 내부 전용 메서드
return email.contains("customer");
}
}
4. 게터 / 세터
기본적인 Getter Setter
- 객체의 데이터(속성 값) 을 읽을 수 있도록 제공하는 메서드
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
조금더 복잡하게 동작하는 Getter Setter
// 단순히 데이터를 반환하는 게터가 아니라 가공된 데이터를 반환
public String getFormattedName() {
return "이름: " + this.name;
}
// 단순히 값을 설정하는 것이 아니라 특정 규칙을 적용해 업데이트
public void updateName(String name) {
this.name = name + "님";
}
5. 객체 설계 체크리스트
속성 체크리스트
- 이 속성은 외부에서 접근이 꼭 가능해야할까?
생성자 체크리스트
- 이 생성자는 외부에서 접근이 가능해야할까?
- 객체 초기화에 필요한 속성을 꼭 외부에서 받아와야할까?
기능 체크리스트
- 이 기능은 객체의 역할일까?
- 이 기능은 외부에서 접근할 필요가 있을까?
6. 실습
직접 도서관 시스템을 설계해봅시다.
package object.library;
public class Book {
private final String title;
private final String author;
private boolean isAvailable;
public Book(String title, String author) {
this.title = title;
this.author = author;
this.isAvailable = true;
}
public boolean getIsAvailable(){
return isAvailable;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
void setIsAvailable(boolean isAvailable) {
this.isAvailable = isAvailable;
}
}
package object.library;
import java.util.ArrayList;
import java.util.List;
public class Library {
private final String name;
private final List<Book> books = new ArrayList<>();;
public Library(String name) {
this.name = name + " 도서관";
}
public String getName() {
return name;
}
public void addBook(Book book) {
books.add(book);
}
public Book findBookByName(String BookName) {
for (Book book : books) {
if(book.getTitle().equals(BookName)){
return book;
}
}
return null;
}
public void borrowBook(Book book) {
book.setIsAvailable(false);
}
public void returnBook(Book book) {
book.setIsAvailable(true);
}
}
package object;
import object.library.Book;
import object.library.Library;
public class main {
public static void main(String[] args) {
Library library = new Library("A");
library.addBook(new Book("book1", "a1"));
library.addBook(new Book("book2", "a2"));
library.addBook(new Book("book3", "a3"));
Book findBook = library.findBookByName("book1");
System.out.println(findBook.getTitle());
System.out.println(findBook.getAuthor());
System.out.println(findBook.getIsAvailable());
library.borrowBook(findBook);
System.out.println(findBook.getIsAvailable());
library.returnBook(findBook);
System.out.println(findBook.getIsAvailable());
}
}
'내일배움캠프(Spring 7기) > 특강' 카테고리의 다른 글
Java 프로그래밍 기초 세션 (0) | 2025.04.16 |
---|---|
Git & Github으로 협업하는 법 (0) | 2025.04.15 |
TIL 작성 가이드 (1) | 2025.04.14 |
GIT 기초 특강 (0) | 2025.04.07 |