λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⌨️ Language/Java

[Java] 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP) κΈ°λ³Έ κ°œλ…κ³Ό ꡬ쑰

by hyebin (Helia) 2025. 5. 11.
λ°˜μ‘ν˜•

 


λͺ©μ°¨

     

    ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ—λŠ” μ—¬λŸ¬ κ°€μ§€κ°€ μžˆμ§€λ§Œ, κ·Έμ€‘μ—μ„œλ„ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(Object-Oriented Programming, OOP)은 ν˜„λŒ€ ν”„λ‘œκ·Έλž˜λ°μ˜ ν•΅μ‹¬μž…λ‹ˆλ‹€.

     

    JavaλŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μž…λ‹ˆλ‹€.

    즉, μš°λ¦¬κ°€ ν˜„μ‹€ μ„Έκ³„μ˜ 사물을 객체둜 보고, 이λ₯Ό μ½”λ“œλ‘œ λͺ¨λΈλ§ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ„ κ΅¬μ„±ν•˜λŠ” 방식이죠.

     

    이번 ν¬μŠ€νŒ…μ—μ„œλŠ” 객체지ν–₯의 μ‹œμž‘μ μΈ ν΄λž˜μŠ€μ™€ 객체, μƒμ„±μžμ™€ this ν‚€μ›Œλ“œ, μΊ‘μŠν™”μ™€ μ ‘κ·Ό μ œμ–΄μžκΉŒμ§€ OOP의 κΈ°λ³Έ ꡬ쑰λ₯Ό 정리해 λ³Όκ²Œμš”!


    πŸ“¦ ν΄λž˜μŠ€μ™€ 객체

    클래슀(Class)λž€?

    ν΄λž˜μŠ€λŠ” 객체λ₯Ό λ§Œλ“€κΈ° μœ„ν•œ 섀계도 λ˜λŠ” ν…œν”Œλ¦Ώμž…λ‹ˆλ‹€. 객체가 κ°€μ Έμ•Ό ν•  속성(ν•„λ“œ)κ³Ό κΈ°λŠ₯(λ©”μ„œλ“œ)을 μ •μ˜ν•΄ 놓은 틀이라고 μƒκ°ν•˜λ©΄ λΌμš”.

    public class Car {
        String color;
        int speed;
    
        void drive() {
            System.out.println("μ°¨κ°€ λ‹¬λ¦½λ‹ˆλ‹€.");
        }
    }

     

    객체(Object)λž€?

    κ°μ²΄λŠ” 클래슀λ₯Ό 기반으둜 μƒμ„±λœ μ‹€μ œ μΈμŠ€ν„΄μŠ€μž…λ‹ˆλ‹€. ν΄λž˜μŠ€κ°€ μžλ™μ°¨ 섀계도라면, κ°μ²΄λŠ” μ‹€μ œ λ„λ‘œ μœ„λ₯Ό λ‹¬λ¦¬λŠ” μžλ™μ°¨μž…λ‹ˆλ‹€.

    클래슀λ₯Ό new ν‚€μ›Œλ“œλ‘œ μƒμ„±ν•˜λ©΄ 그것이 κ°μ²΄μž…λ‹ˆλ‹€.

    Car myCar = new Car();      // 객체 생성
    myCar.color = "λΉ¨κ°•";        // 속성 μ„€μ •
    myCar.drive();              // λ©”μ„œλ“œ 호좜
    πŸ’‘ ν•˜λ‚˜μ˜ 클래슀(섀계도)둜 μ—¬λŸ¬ 개의 객체(μ œν’ˆ)λ₯Ό λ§Œλ“€ 수 μžˆμ–΄μš”!

     

    μΈμŠ€ν„΄μŠ€(Instance)λž€?

    μΈμŠ€ν„΄μŠ€λŠ” 클래슀λ₯Ό 톡해 μƒμ„±λœ 객체λ₯Ό μ§€μΉ­ν•˜λŠ” 또 λ‹€λ₯Έ μš©μ–΄μž…λ‹ˆλ‹€.

    "myCarλŠ” Car 클래슀의 μΈμŠ€ν„΄μŠ€μž…λ‹ˆλ‹€"라고 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    Car car1 = new Car();  // car1은 Car 클래슀의 μΈμŠ€ν„΄μŠ€
    Car car2 = new Car();  // car2λŠ” Car 클래슀의 μΈμŠ€ν„΄μŠ€

    두 κ°μ²΄λŠ” 같은 ν΄λž˜μŠ€μ—μ„œ μƒμ„±λ˜μ—ˆμ§€λ§Œ, λ©”λͺ¨λ¦¬μ— λ³„λ„λ‘œ μ‘΄μž¬ν•˜λŠ” λ‹€λ₯Έ κ°μ²΄μž…λ‹ˆλ‹€.


    πŸ› οΈ μƒμ„±μžμ™€ this ν‚€μ›Œλ“œ

    μƒμ„±μž(Constructor)λž€?

    μƒμ„±μžλŠ” 객체가 생성될 λ•Œ μžλ™μœΌλ‘œ ν˜ΈμΆœλ˜λŠ” νŠΉλ³„ν•œ λ©”μ„œλ“œμž…λ‹ˆλ‹€. 객체의 초기 μƒνƒœλ₯Ό μ„€μ •ν•  λ•Œ μ‚¬μš©λΌμš”.

    public class User {
        String name;
        int age;
    
        // μƒμ„±μž
        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }
    
    User user = new User("혜빈", 25);  // μƒμ„±μž 호좜

    μƒμ„±μžμ˜ νŠΉμ§•:

    • 클래슀 이름과 동일
    • λ°˜ν™˜ νƒ€μž…μ΄ μ—†μŒ (void도 μ“°μ§€ μ•ŠμŒ)
    • 객체 생성 μ‹œ new ν‚€μ›Œλ“œμ™€ ν•¨κ»˜ 호좜됨
    πŸ“Œ μƒμ„±μžλ₯Ό μ •μ˜ν•˜μ§€ μ•ŠμœΌλ©΄ μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ κΈ°λ³Έ μƒμ„±μžλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.
    ν•˜μ§€λ§Œ ν•˜λ‚˜λΌλ„ μƒμ„±μžλ₯Ό 직접 μ •μ˜ν•˜λ©΄, κΈ°λ³Έ μƒμ„±μžλŠ” μžλ™μœΌλ‘œ μΆ”κ°€λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

     

    this ν‚€μ›Œλ“œ

    thisλŠ” ν˜„μž¬ 객체 μžμ‹ μ„ κ°€λ¦¬ν‚€λŠ” μ°Έμ‘° λ³€μˆ˜μž…λ‹ˆλ‹€.

    μƒμ„±μžλ‚˜ λ©”μ„œλ“œμ—μ„œ λ§€κ°œλ³€μˆ˜μ™€ λ©€λ²„λ³€μˆ˜ 이름이 같을 λ•Œ κ΅¬λΆ„ν•΄μ£ΌλŠ” 역할을 ν•˜μ£ .

     

    1. λ§€κ°œλ³€μˆ˜μ™€ ν•„λ“œλͺ…이 같을 λ•Œ κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄

    Car(String model, String color, int maxSpeed) {
        this.model = model;  // this.model은 ν•„λ“œ, model은 λ§€κ°œλ³€μˆ˜
        this.color = color;
        this.maxSpeed = maxSpeed;
    }

    2. μƒμ„±μžμ—μ„œ λ‹€λ₯Έ μƒμ„±μž ν˜ΈμΆœν•˜κΈ° (μƒμ„±μž 체이닝)

    Car() {
        this("μ•Œ 수 μ—†μŒ", "흰색", 120);  // λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μž 호좜
    }
    
    Car(String model, String color, int maxSpeed) {
        this.model = model;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
    πŸ’‘ this()λ₯Ό μ΄μš©ν•œ λ‹€λ₯Έ μƒμ„±μž ν˜ΈμΆœμ€ μƒμ„±μžμ˜ 첫 μ€„μ—μ„œλ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€!

     

    3. λ©”μ„œλ“œμ—μ„œ μžμ‹ μ˜ 객체λ₯Ό λ°˜ν™˜ν•  λ•Œ

    public Car setModel(String model) {
        this.model = model;
        return this;  // λ©”μ„œλ“œ 체이닝을 κ°€λŠ₯ν•˜κ²Œ 함
    }
    
    // μ‚¬μš© 예
    myCar.setModel("μ•„λ°˜λ–Ό").setColor("νŒŒλž€μƒ‰");

    πŸ” μ ‘κ·Ό μ œμ–΄μžμ™€ μΊ‘μŠν™”

    μ ‘κ·Ό μ œμ–΄μž(Access Modifier)

    μ ‘κ·Ό μ œμ–΄μžλŠ” 클래슀, ν•„λ“œ, λ©”μ„œλ“œ, μƒμ„±μž λ“±μ˜ μ ‘κ·Ό λ²”μœ„λ₯Ό μ œν•œν•˜λŠ” ν‚€μ›Œλ“œμž…λ‹ˆλ‹€.

    Javaμ—λŠ” 4κ°€μ§€ μ ‘κ·Ό μ œμ–΄μžκ°€ μžˆμŠ΅λ‹ˆλ‹€

    μ œμ–΄μž μ„€λͺ…
    public λˆ„κ΅¬λ‚˜ μ ‘κ·Ό κ°€λŠ₯
    private 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯
    protected 같은 νŒ¨ν‚€μ§€ λ˜λŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯
    (default) 같은 νŒ¨ν‚€μ§€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯ (λͺ…μ‹œ X)
    public class Sample {
        private int hidden;         // μ™ΈλΆ€μ—μ„œ μ ‘κ·Ό ❌
        public String visible = ""; // μ™ΈλΆ€μ—μ„œ μ ‘κ·Ό β­•
    
        protected void sayHello() {
            System.out.println("Hello");
        }
    }

     

    μΊ‘μŠν™”(Encapsulation)

    객체의 속성(ν•„λ“œ)을 μ™ΈλΆ€μ—μ„œ 직접 μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 막고, λ©”μ„œλ“œλ₯Ό 톡해 μ œμ–΄ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

    → λ‚΄λΆ€ κ΅¬ν˜„μ€ 숨기고, ν•„μš”ν•œ κΈ°λŠ₯만 외뢀에 κ³΅κ°œν•˜λŠ” λ°©μ‹μ΄μ—μš”!

     

    μΊ‘μŠν™”μ˜ μž₯점:

    • 데이터 보호 (데이터 무결성 μœ μ§€)
    • μœ μ§€λ³΄μˆ˜ μš©μ΄μ„± ν–₯상
    • μ‚¬μš©μžμ—κ²Œ ν•„μš”ν•œ κΈ°λŠ₯만 제곡

    κ°€μž₯ 일반적인 μΊ‘μŠν™” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

    1. ν•„λ“œλ₯Ό private으둜 μ„ μ–Έ
    2. ν•„λ“œμ— μ ‘κ·Όν•˜κΈ° μœ„ν•œ 곡개 getter/setter λ©”μ„œλ“œ 제곡
    public class Student {
        // ν•„λ“œλ₯Ό private으둜 μ„ μ–Έ
        private String name;
        private int age;
        private int score;
        
        // μƒμ„±μž
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
        
        // getter λ©”μ„œλ“œ
        public String getName() {
            return name;
        }
        
        public int getAge() {
            return age;
        }
        
        public int getScore() {
            return score;
        }
        
        // setter λ©”μ„œλ“œ
        public void setName(String name) {
            this.name = name;
        }
        
        public void setAge(int age) {
            if (age > 0) {  // μœ νš¨μ„± 검사
                this.age = age;
            }
        }
        
        public void setScore(int score) {
            if (score >= 0 && score <= 100) {  // μœ νš¨μ„± 검사
                this.score = score;
            } else {
                System.out.println("μ μˆ˜λŠ” 0~100 사이여야 ν•©λ‹ˆλ‹€.");
            }
        }
    }

     

    πŸ“Œ μΊ‘μŠν™”μ˜ 핡심은 ν•„λ“œλ₯Ό private으둜 μ„ μ–Έν•˜κ³ , getter/setterλ₯Ό ν†΅ν•΄μ„œλ§Œ μ ‘κ·Όν•˜λ„λ‘ μ œν•œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ setterμ—μ„œ μœ νš¨μ„± 검사λ₯Ό 톡해 잘λͺ»λœ 값이 μ„€μ •λ˜λŠ” 것을 λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    πŸ™Œ 마무리

    μ˜€λŠ˜μ€ Java의 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° κΈ°λ³Έ κ°œλ…μΈ 클래슀, 객체, μƒμ„±μž, this ν‚€μ›Œλ“œ, 그리고 μ ‘κ·Ό μ œμ–΄μžμ™€ μΊ‘μŠν™”μ— λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

     

    객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ ν˜„μ‹€ μ„Έκ³„μ˜ κ°œλ…κ³Ό 사물을 객체둜 λͺ¨λΈλ§ν•˜μ—¬ ν”„λ‘œκ·Έλž˜λ°ν•˜λŠ” λ°©λ²•λ‘ μœΌλ‘œ, λ³΅μž‘ν•œ 문제λ₯Ό μž‘μ€ 객체 λ‹¨μœ„λ‘œ λ‚˜λˆ„μ–΄ ν•΄κ²°ν•˜λŠ” 데 큰 강점이 μžˆμŠ΅λ‹ˆλ‹€.

    μ΄λŸ¬ν•œ κ°œλ…λ“€μ€ Java ν”„λ‘œκ·Έλž˜λ°μ˜ κΈ°μ΄ˆκ°€ λ˜λ―€λ‘œ ν™•μ‹€νžˆ μ΄ν•΄ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

     

    λ‹€μŒ μ‹œκ°„μ—λŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 또 λ‹€λ₯Έ μ€‘μš” κ°œλ…μΈ 상속, λ‹€ν˜•μ„±, 좔상화에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

    κΆκΈˆν•œ λ‚΄μš©μ΄λ‚˜ μΆ”κ°€λ‘œ μ•Œκ³  싢은 κ°œλ…μ΄ μžˆλ‹€λ©΄ λŒ“κΈ€λ‘œ λ‚¨κ²¨μ£Όμ„Έμš” 😊

    λ°˜μ‘ν˜•