내일배움캠프(Spring 7기)/특강

Java 객체 활용 첫걸음(실습) 세션

가지코딩 2025. 4. 22. 20:59
  • 일시 : 4/21(월) 14:00
  • 진행 : 김기용 튜터님
  • 장소 : zoom

📙 목차

 

  1. 캡슐화
  2. 정보 은닉
  3. 접근 제어자
  4. 게터 / 세터
  5. 객체 설계 체크리스트
  6. 실습

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