λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Today I Learned(TIL)/μ„Έμ…˜

Java μ„Έμ…˜_객체 ν™œμš©

by carrot0911 2024. 11. 19.

객체 ν™œμš© μ„Έμ…˜

11/19 15:00 ~ 16:15 (μ•½ 1μ‹œκ°„ 15λΆ„κ°„ 진행)

 

μ„Έμ…˜μ˜ λͺ©μ  : 클래슀λ₯Ό 잘 μ‚¬μš©ν•΄ 보자!

JVM λ©”λͺ¨λ¦¬ μ˜μ—­

  1. μžλ°”μ»΄νŒŒμΌλŸ¬κ°€ .java νŒŒμΌμ„ λ°”μ΄νŠΈμ½”λ“œλ‘œ λ³€ν™˜
  2. JVM이 λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ½μ–΄μ„œ λ©”λͺ¨λ¦¬μ— 적재
βœ”οΈ λ°”μ΄νŠΈμ½”λ“œ(.class)

λ°”μ΄νŠΈμ½”λ“œλŠ” μžλ°” ν”„λ‘œκ·Έλž¨μ΄ 컴파일된 ν›„ μƒμ„±λ˜λŠ” 쀑간 ν˜•νƒœμ˜ μ½”λ“œμ΄λ‹€. μ‚¬λžŒμ΄ 읽을 수 μžˆλŠ” μ†ŒμŠ€ μ½”λ“œμ™€ 기계가 μ‹€ν–‰ν•˜λŠ” κΈ°κ³„μ–΄μ˜ 쀑간 단계에 ν•΄λ‹Ήν•œλ‹€.
μžλ°”μ˜ JVM(Java Virtual Machine)μ—μ„œ μ‹€ν–‰λ˜λ©° ν”Œλž«νΌ 독립성을 κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” 핡심 μš”μ†Œμž…λ‹ˆλ‹€.

 

⭐ μžλ°” λ©”λͺ¨λ¦¬ ꡬ쑰 ⭐ 

  • Method Area(λ„μ„œκ΄€) : .class 파일의 정보가 μ˜¬λΌκ°€λŠ” 곳이닀. μžλ°” ν”„λ‘œκ·Έλž¨μ΄ 싀행될 λ•Œ λͺ¨λ“  ν΄λž˜μŠ€μ™€ λ©”μ„œλ“œ 정보(클래슀 ꡬ쑰, λ©”μ„œλ“œ 정보, μƒμˆ˜ λ“±)κ°€ μ €μž₯λ˜λŠ” 곳이닀.
  • Stack Area(μ ‘μ‹œ μŒ“κΈ°) : FILO(First In Last Out, μ„ μž…ν›„μΆœ) ꡬ쑰이닀. λ©”μ„œλ“œκ°€ 호좜될 λ•Œλ§ˆλ‹€ λ©”μ„œλ“œμ˜ 정보λ₯Ό 가진 μƒˆλ‘œμš΄ Stack ν”„λ ˆμž„μ΄ μŒ“μΈλ‹€. κ°€μž₯ μœ„μ— μžˆλŠ” μ ‘μ‹œλ₯Ό λ¨Όμ € κΊΌλ‚΄μ„œ μ‚¬μš©ν•˜λ“―μ΄ λ§ˆμ§€λ§‰μ— 호좜된 λ©”μ„œλ“œκ°€ λ¨Όμ € μ‹€ν–‰λœλ‹€.
  • Heap Area(풍선) : ν•„μš”μ— 따라 크기가 λ³€ν•˜λŠ” 객체가 μ €μž₯λ˜λŠ” 곡간이닀.

μ½”λ“œ 흐름

https://cscircles.cemc.uwaterloo.ca/java_visualize/

 

 

μΊ‘μŠν™” : λ‚΄λΆ€ κ΅¬ν˜„μ„ 외뢀에 감좔고 ν•„μš”ν•œ μ •λ³΄λ§Œ μ œκ³΅ν•΄μ„œ 데이터와 λ‘œμ§μ„ λ³΄ν˜Έν•œλ‹€.

μ ‘κ·Ό μ œμ–΄μž

μ ‘κ·Ό μ œμ–΄μž 같은 클래슀 같은 νŒ¨ν‚€μ§€ μƒμ†ν•œ 클래슀 λ‹€λ₯Έ νŒ¨ν‚€μ§€
public βœ”οΈ βœ”οΈ βœ”οΈ βœ”οΈ
protected βœ”οΈ βœ”οΈ βœ”οΈ ❌
default βœ”οΈ βœ”οΈ ❌ ❌
private βœ”οΈ ❌ ❌ ❌

Getter & Setter

  • Getter : 객체의 데이터(속성 κ°’)λ₯Ό 읽을 수 μžˆλ„λ‘ μ œκ³΅ν•˜λŠ” λ©”μ„œλ“œ
  • Setter : 객체의 데이터(속성 κ°’)λ₯Ό μˆ˜μ •ν•  수 μžˆλ„λ‘ μ œκ³΅ν•˜λŠ” λ©”μ„œλ“œ

⭐ λ¬΄λΆ„λ³„ν•œ μ„Έν„° ⭐

객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 클래슀의 속성(attribute)을 μˆ˜μ •ν•  수 μžˆλ„λ‘ ν•˜λŠ” setter λ©”μ„œλ“œκ°€ κ·œμΉ™ 없이 λ‚¨λ°œλ˜κ±°λ‚˜, μ œν•œ 없이 μ™ΈλΆ€μ—μ„œ 호좜 κ°€λŠ₯ν•œ μƒνƒœλ₯Ό λ§ν•œλ‹€. μ΄λŠ” μ†Œν”„νŠΈμ›¨μ–΄ μ„€κ³„μ˜ μ€‘μš”ν•œ 원칙인 μΊ‘μŠν™”(encapsulation)λ₯Ό μœ„λ°˜ν•˜λ©° μ—¬λŸ¬ 문제λ₯Ό μ•ΌκΈ°ν•  수 μžˆλ‹€.

 

μ‹€μŠ΅ : λ„μ„œκ΄€ ν”„λ‘œκ·Έλž¨ 같이 λ§Œλ“€κΈ°

더보기
  • Book.java
package librarySystem;

public class Book {

    // 1. 속성 (λ³€μˆ˜)
    // 제λͺ©(title)
    private String title;
    // μ €μž(author)
    private String author;
    // λŒ€μ—¬μ—¬λΆ€(isAvailable)
    private boolean isAvailable;


    // 2. μƒμ„±μž (쑰립섀λͺ…μ„œ)
    public Book (String title, String author, boolean isAvailable) {
        this.title = title;
        this.author = author;
        this.isAvailable = isAvailable;
    }


    // 3. κΈ°λŠ₯ (λ©”μ„œλ“œ)
    // μ±… 제λͺ© 쑰회 -> getter
    public String getTitle () {
        return this.title;
    }

    // μ±… λŒ€μ—¬μ—¬λΆ€ 쑰회 -> getter
    public boolean getIsAvailable () {
        return this.isAvailable;
    }

    // μ±… λŒ€μ—¬μ—¬λΆ€ μ„€μ • -> setter
    public void setIsAvailable (boolean flag) {
        this.isAvailable = flag;
    }

    // μ±… 상세 정보 좜λ ₯ -> getter
    public void printBookInfo () {
        System.out.println("μ±… 제λͺ©μ€ " + this.title + "μž…λ‹ˆλ‹€.");
        System.out.println("μ €μžλŠ” " + this.author + "μž…λ‹ˆλ‹€.");

        if (this.isAvailable) {
            System.out.println("책을 λŒ€μ—¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.");
        } else {
            System.out.println("책을 λŒ€μ—¬ν•  수 μ—†μŠ΅λ‹ˆλ‹€.");
        }
    }
}
  • Library.java
package librarySystem;

import java.util.ArrayList;

public class Library {

    // 1. 속성 (λ³€μˆ˜)
    // μ±…λͺ©λ‘(books): ArrayList
    private ArrayList<Book> books;


    // 2. μƒμ„±μž (쑰립섀λͺ…μ„œ)
    public Library () {
        books = new ArrayList<>();
    }


    // 3. κΈ°λŠ₯ (λ©”μ„œλ“œ)
    // λ„μ„œκ΄€μ— μ±… μΆ”κ°€ -> Setter
    public void addBook (Book book) {
        this.books.add(book);
    }

    // λ„μ„œκ΄€μ—μ„œ μ±… 제거 -> Setter
    public void removeBook(Book book) {
        this.books.remove(book);
    }

    // λ„μ„œκ΄€μ—μ„œ μ±… μ΄λ¦„μœΌλ‘œ 검색 -> getter
    public String searchByTitle (String title) {
        for (Book book : books) {
            String foundBook = book.getTitle();

            // 찾으렀고 ν•˜λŠ” μ±…μ˜ 제λͺ©κ³Ό book λ¦¬μŠ€νŠΈμ— μ €μž₯된 μ±…μ˜ 제λͺ©μ΄ μΌμΉ˜ν•  λ•Œ μ‹€ν–‰
            if (foundBook.equals(title)) {
                return foundBook;
            }
        }
        return null;
    }

    // λ„μ„œκ΄€μ— λͺ¨λ“  μ±… 쑰회 -> getter
    public void lookUpAllBook () {
        for (Book book : books) {
            // μ±…μ˜ 정보 좜λ ₯
            book.printBookInfo();
        }
    }

    // λ„μ„œκ΄€μ—μ„œ μ±… λŒ€μ—¬
    public void rentBook (String title) {
        for (Book book : books) {
            String foundBook = book.getTitle();

            // λŒ€μ—¬ν•˜λ €κ³  ν•˜λŠ” μ±…μ˜ 제λͺ©κ³Ό book λ¦¬μŠ€νŠΈμ— μ €μž₯된 μ±…μ˜ 제λͺ©μ΄ μΌμΉ˜ν•  λ•Œ μ‹€ν–‰
            if (foundBook.equals(title)) {

                // λŒ€μ—¬ν•˜κ³ μž ν•˜λŠ” 책이 λŒ€μ—¬ κ°€λŠ₯ν•œ μƒνƒœμΌ λ•Œ μ‹€ν–‰
                if (book.getIsAvailable()) {
                    // μ±…μ˜ λŒ€μ—¬ μƒνƒœλ₯Ό false κ°’μœΌλ‘œ λ³€κ²½
                    book.setIsAvailable(false);
                    System.out.println("λŒ€μ—¬ 성곡");
                } else {  // 이미 λ‹€λ₯Έ μ‚¬λžŒμ΄ λŒ€μ—¬ 쀑일 경우
                    System.out.println("λ‹€λ₯Έ μ‚¬λžŒμ΄ 이미 λŒ€μ—¬ μ€‘μž…λ‹ˆλ‹€.");
                }
            }
        }
    }

    // λ„μ„œκ΄€μ—μ„œ μ±… λ°˜λ‚©
    public void returnBook(String title) {
        for (Book book : books) {
            String foundBook = book.getTitle();

            // λ°˜λ‚©ν•˜λ €κ³  ν•˜λŠ” μ±…μ˜ 제λͺ©κ³Ό book λ¦¬μŠ€νŠΈμ— μ €μž₯된 μ±…μ˜ 제λͺ©μ΄ μΌμΉ˜ν•  λ•Œ μ‹€ν–‰
            if (foundBook.equals(title)) {

                // λ°˜λ‚©ν•˜κ³ μž ν•˜λŠ” μ±…μ˜ λŒ€μ—¬ μƒνƒœλ₯Ό 확인
                if (book.getIsAvailable()){ // λŒ€μ—¬ μƒνƒœκ°€ true인 경우
                    System.out.println("책이 이미 λ°˜λ‚©λœ μƒνƒœμž…λ‹ˆλ‹€.");
                } else { // λŒ€μ—¬ μƒνƒœκ°€ false인 경우
                    book.setIsAvailable(true);
                    System.out.println("λ°˜λ‚© 성곡");
                }
            }
        }
    }
}
  • Main.java
package librarySystem;

public class Main {

    public static void main(String[] args) {

        // λ„μ„œκ΄€ 객체 생성
        Library library = new Library();

        // μ±… 객체 4개 생성
        Book bookA = new Book("μžλ°”μ˜μ •μ„", "xxx", true);
        Book bookB = new Book("μžλ°”μ˜μ •μ„2", "ooo", false);
        Book bookC = new Book("μžλ°”μ˜μ •μ„3", "aaa", false);
        Book bookD = new Book("μžλ°”μ˜μ •μ„4", "uuu", true);

        // λ„μ„œκ΄€μ— μ±… μΆ”κ°€
        library.addBook(bookA);
        library.addBook(bookB);
        library.addBook(bookC);
        library.addBook(bookD);

        // λ„μ„œκ΄€μ—μ„œ μ±… 제거
        library.removeBook(bookD);

        // λ„μ„œκ΄€μ˜ λͺ¨λ“  μ±… 좜λ ₯
        library.lookUpAllBook();

        // λ„μ„œκ΄€μ—μ„œ μ±… λŒ€μ—¬
        library.rentBook(bookA.getTitle());
        library.rentBook(bookB.getTitle());

        // λ„μ„œκ΄€μ—μ„œ μ±… λ°˜λ‚©
        library.returnBook(bookA.getTitle());
        library.returnBook(bookD.getTitle());
    }
}