IT/Java

[Java] 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ§•

zi0_0 2025. 4. 2. 23:32

 

κ΅μˆ˜λ‹˜κ»˜μ„œ μžμ‹ μ΄ 면접관이면 λ¬Όμ–΄λ³Όλ§Œν•œ κ²ƒμœΌλ‘œ μ•„λž˜μ˜ 것듀을 λ§μ”€ν•˜μ…”μ„œ, 

μ •λ¦¬ν•΄λ³΄κ³ μž ν•œλ‹€~!


 

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°

: Object-oriented programming (OOP, 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°)

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 4κ°€μ§€ νŠΉμ§•μ€ μΊ‘μŠν™”, 상속, 좔상화, λ‹€ν˜•μ„±μ΄λ‹€. 

 

μΊ‘μŠν™” 

객체의 μƒνƒœ (데이터)λ₯Ό μ™ΈλΆ€μ—μ„œ 직접 μ ‘κ·Όν•˜μ§€ λͺ»ν•˜κ³ , 
λ©”μ„œλ“œλ₯Ό ν†΅ν•΄μ„œλ§Œ μ ‘κ·Όν•˜λ„λ‘ λ³΄ν˜Έν•˜λŠ” κ°œλ… 

데이터 (속성)와 κ·Έ 데이터λ₯Ό μ‘°μž‘ν•˜λŠ” λ©”μ„œλ“œ (행동)을 ν•˜λ‚˜μ˜ λ‹¨μœ„ (클래슀)둜 λ¬Άκ³ , 
μ™ΈλΆ€μ—μ„œ 직접 μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 μˆ¨κΈ°λŠ” 것 

  • λͺ©μ 
    • 데이터 보호, 무결성 μœ μ§€ 
    • 변경이 ν•„μš”ν•œ 경우 λ©”μ„œλ“œ μˆ˜μ€€μ—μ„œλ§Œ μˆ˜μ • κ°€λŠ₯ (μœ μ§€ λ³΄μˆ˜κ°€ μš©μ΄ν•΄μ§)
  • μ‚¬μš©
    • ν•„λ“œλŠ” private, protected λ“±μ˜ μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό μˆ¨κΉ€ 
    • 접근을 원할 경우 getter 및 setter λ©”μ„œλ“œλ₯Ό 톡해 접근을 μ œμ–΄ 
class Employee {
    private String name; // μ™ΈλΆ€μ—μ„œ 직접 μ ‘κ·Ό λΆˆκ°€
    private double salary;

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public double calculateTax() {
        return this.salary * 0.1; // λ‚΄λΆ€ 둜직만 λ…ΈμΆœ
    }
}

nameκ³Ό salaryλŠ” private둜 μ„€μ •λ˜μ–΄ μžˆμ–΄, μ™ΈλΆ€μ—μ„œ 직접 μ ‘κ·Όν•˜μ§€ λͺ»ν•¨. (= μΊ‘μŠν™”) 

ν•˜μ§€λ§Œ λ©”μ„œλ“œλ₯Ό ν†΅ν•΄μ„œ κ°„μ ‘μ μœΌλ‘œ 접근이 κ°€λŠ₯함 

 

상속

κΈ°μ‘΄ 클래슀 (λΆ€λͺ¨ 클래슀)의 속성과 λ©”μ„œλ“œλ₯Ό
μƒˆλ‘œμš΄ 클래슀 (μžμ‹ 클래슀)κ°€ λ¬Όλ €λ°›μ•„ μž¬μ‚¬μš©ν•˜κ±°λ‚˜ ν™•μž₯ν•  수 μžˆλŠ” κΈ°λŠ₯ 
  • λͺ©μ 
    • μ½”λ“œ μž¬μ‚¬μš©μ„± 증가 및 μœ μ§€λ³΄μˆ˜μ„±μ„ 높일 수 있음 
    • 곡톡 κΈ°λŠ₯을 λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ •μ˜ν•˜μ—¬ 쀑볡 제거 
  • μ‚¬μš©
    • extends ν‚€μ›Œλ“œλ₯Ό 톡해 상속 κ΅¬ν˜„ 
// λΆ€λͺ¨ 클래슀
public class Car {
    public void startEngine() {
        System.out.println("Engine started");
    }
}

// μžμ‹ 클래슀
public class SportsCar extends Car {
    public void turboBoost() {
        System.out.println("Turbo boost activated");
    }
}

SportsCar myCar = new SportsCar();
myCar.startEngine(); // λΆ€λͺ¨ 클래슀 λ©”μ„œλ“œ μ‚¬μš©
myCar.turboBoost(); // μžμ‹ 클래슀 고유 λ©”μ„œλ“œ μ‚¬μš©

SportsCarλŠ” Car클래슀λ₯Ό 상속 λ°›μ•„ λΆ€λͺ¨μ˜ κΈ°λŠ₯을 μž¬μ‚¬μš©ν•  수 있음. 

 

 

좔상화 

λΆˆν•„μš”ν•œ μ„ΈλΆ€ 사항을 숨기고, ν•„μš”ν•œ κΈ°λŠ₯λ§Œμ„ λ…ΈμΆœν•˜λŠ” κ°œλ… 
객체의 μ€‘μš”ν•œ 속성과 λ™μž‘λ§Œμ„ λͺ¨λΈλ§ν•˜μ—¬ λΆˆν•„μš”ν•œ 세뢀사항은 μˆ¨κΉ€ 

이λ₯Ό 톡해 μ‚¬μš©μžλŠ” λ³΅μž‘ν•œ λ‚΄λΆ€ κ΅¬ν˜„μ„ μ•Œ ν•„μš” 없이, ν•„μš”ν•œ κΈ°λŠ₯만 μ‚¬μš©ν•  수 있음 

  •  λͺ©μ 
    • λ³΅μž‘μ„±μ„ 쀄이고 κ°„λ‹¨ν•œ 섀계λ₯Ό μ œκ³΅ν•  수 있음 
    • 객체 κ°„μ˜ μƒν˜Έμž‘μš©μ„ λ‹¨μˆœν™”
    • μœ μ—°ν•œ 섀계 : λ‚΄λΆ€ κ΅¬ν˜„μ΄ λ³€κ²½λ˜λ”λΌλ„ μ™ΈλΆ€ μΈν„°νŽ˜μ΄μŠ€λŠ” κ·Έλž˜λ„ μœ μ§€λ˜μ–΄ μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•΄μ§ 
  • μ‚¬μš© : ν”„λ‘œκ·Έλž˜λ°μ—μ„œμ˜ 좔상화 
    • 좔상 ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 κ΅¬ν˜„ 

 

1️⃣ 좔상 클래슀 

: κ·Έλƒ₯ 클래슀의 μΌμ’…μœΌλ‘œ, κ΅¬ν˜„λœ λ©”μ„œλ“œμ™€ κ΅¬ν˜„λ˜μ§€ μ•Šμ€ λ©”μ„œλ“œλ₯Ό λ‘˜ λ‹€ 포함할 수 있음.

  • λͺ©μ 
    • κ³΅ν†΅λœ κΈ°λŠ₯ (μ½”λ“œ)을 일뢀 μ œκ³΅ν•˜λ©΄μ„œ ν™•μž₯ν•  λ•Œ μ‚¬μš© 
  • νŠΉμ§•
    • 상속 λ°›λŠ” ν΄λž˜μŠ€κ°€ 좔상 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜λ„λ‘ κ°•μ œν•  수 있음 
    • 일반 λ©”μ„œλ“œ(κ΅¬ν˜„λœ λ©”μ„œλ“œ)와 좔상 λ©”μ„œλ“œ(κ΅¬ν˜„λ˜μ§€ μ•Šμ€ λ©”μ„œλ“œ)λ₯Ό λͺ¨λ‘ κ°€μ§ˆ 수 있음 
    • 멀버 λ³€μˆ˜(ν•„λ“œ)와 μƒμ„±μžλ₯Ό κ°€μ§ˆ 수 있음
    • 단일 μƒμ†λ§Œ κ°€λŠ₯ (닀쀑 상속 λΆˆκ°€) 
단일 μƒμ†λ§Œ κ°€λŠ₯ν•˜λ‹€λŠ” 의미?
= ν•˜λ‚˜μ˜ ν΄λž˜μŠ€κ°€ 였직 ν•˜λ‚˜μ˜ λΆ€λͺ¨ 클래슀만 상속받을 수 μžˆλ‹€λŠ” 의미 
λ‹€μ€‘μœΌλ‘œ 상속 λ°›κ³  μ‹ΆμœΌλ©΄, interfaceλ₯Ό ν™œμš©ν•΄μ•Ό 함. 
ex) class Dog implements Animal, Pet {~
abstract class Animal {
    String name;

    abstract void makeSound(); // 좔상 λ©”μ„œλ“œ

    void eat() { // 일반 λ©”μ„œλ“œ
        System.out.println(name + " is eating.");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Bark");
    }
}

 

 

2️⃣ μΈν„°νŽ˜μ΄μŠ€ 

: ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•΄μ•Ό ν•  λ™μž‘μ„ μ •μ˜ν•˜λŠ” μΌμ’…μ˜ λͺ…μ„Έμ„œ!!!!

1λ²ˆμ—μ„œ 일반 λ©”μ„œλ“œμ™€ 좔상 λ©”μ„œλ“œλ₯Ό λͺ¨λ‘ κ°€μ§ˆ 수 있던 것과 달리 μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨λ“  λ©”μ„œλ“œλŠ” 기본적으둜 κ΅¬ν˜„λ˜μ§€ μ•Šμ€ μƒνƒœλ‘œ μ œκ³΅ν•œλ‹€

  • λͺ©μ 
    • νŠΉμ • λ™μž‘μ„ μ—¬λŸ¬ ν΄λž˜μŠ€μ—μ„œ λ™μΌν•˜κ²Œ κ΅¬ν˜„ν•˜λ„λ‘ κ°•μ œ 
  • νŠΉμ§•
    • 좔상 ν΄λž˜μŠ€λŠ” `상속`μ΄λΌλŠ” κ°œλ…μ΄μ§€λ§Œ, μΈν„°νŽ˜μ΄μŠ€λŠ” `κ΅¬ν˜„`μ΄λΌλŠ” κ°œλ…
    •  μžλ°” 8 μ΄ν›„μ—λŠ” `default` ν‚€μ›Œλ“œλ₯Ό 톡해 일뢀 κ΅¬ν˜„λœ λ©”μ„œλ“œλ₯Ό 포함할 수 있음 
    • 멀버 λ³€μˆ˜λŠ” public static final ν˜•νƒœλ‘œλ§Œ μ„ μ–Έν•  수 있음 
    • 닀쀑 κ΅¬ν˜„ κ°€λŠ₯ 
public static finalμ΄λž€?
μΈν„°νŽ˜μ΄μŠ€μ—μ„œ 주둜 μ‚¬μš©ν•˜λŠ” λ°©μ‹μœΌλ‘œ, λͺ¨λ“  객체가 κ³΅μœ ν•˜λŠ” λ³€κ²½ λΆˆκ°€λŠ₯ν•œ μƒμˆ˜λ₯Ό μ •μ˜ 
interface Animal {
    void makeSound(); // 좔상 λ©”μ„œλ“œ
}

class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("Bark");
    }
}

class Cat implements Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow");
    }
}

 

그럼 좔상 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ 차이?
  • 좔상 ν΄λž˜μŠ€λŠ” 곡톡 속성과 κΈ°λŠ₯을 κ°€μ§„ 클래슀λ₯Ό μœ„ν•œ κΈ°λ³Έ ν‹€λ‘œ μ‚¬μš©λ˜λ©°, ν™•μž₯κ³Ό μž¬μ‚¬μš©μ„±μ΄ λͺ©μ 
  • μΈν„°νŽ˜μ΄μŠ€λŠ” νŠΉμ • λ™μž‘μ„ μ—¬λŸ¬ ν΄λž˜μŠ€μ—μ„œ λ™μΌν•˜κ²Œ κ΅¬ν˜„ν•˜λ„λ‘ κ°•μ œ!! ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λ©°, λ‹€ν˜•μ„±μ„ κ·ΉλŒ€ν™”ν•˜κΈ° μœ„ν•΄ μ‚¬μš© 
  좔상 클래슀  μΈν„°νŽ˜μ΄μŠ€ 
λͺ©μ  상속을 톡해 곡톡 κΈ°λŠ₯ 제곡, 
곡톡 κΈ°λŠ₯을 상속 λ°›μ•„ ν™•μž₯ 
클래슀 κ°„ κ·œμ•½ μ •μ˜, 
λ™μΌν•œ λ™μž‘μ„ μ—¬λŸ¬ ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•˜λ„λ‘ κ°•μ œ 
상속 ν‚€μ›Œλ“œ  extends interface
λ©”μ„œλ“œ μœ ν˜• 일반 λ©”μ„œλ“œμ™€ 좔상 λ©”μ„œλ“œ λͺ¨λ‘ 포함 κ°€λŠ₯  기본적으둜 λͺ¨λ“  λ©”μ„œλ“œ (default μ œμ™Έ)
멀버 λ³€μˆ˜  일반 ν•„λ“œ 포함 κ°€λŠ₯  public static final ν˜•νƒœλ§Œ κ°€λŠ₯ 

 

 

λ‹€ν˜•μ„±

λ™μΌν•œ 이름을 κ°€μ§„ 두 개 μ΄μƒμ˜ λ©”μ„œλ“œκ°€ μ—¬λŸ¬ ν˜•νƒœλ‘œ λ™μž‘ν•  수 μžˆλŠ” κ°œλ… 
이름은 κ°–μ§€λ§Œ, μˆ˜ν–‰λ˜λŠ” ν–‰μœ„κ°€ λ‹€λ₯Ό 수 있음 
  • λͺ©μ 
    • λ‹€μ–‘ν•œ 객체λ₯Ό μΌκ΄€λœ λ°©μ‹μœΌλ‘œ μ²˜λ¦¬ν•  수 있음 

 

* λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”© (Method Overloading) 

: 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό λ§€κ°œλ³€μˆ˜ νƒ€μž…μ΄λ‚˜ κ°œμˆ˜μ— 따라 λ‹€λ₯΄κ²Œ μ •μ˜ 

class Calculator {
    int add(int a, int b) { return a + b; }
    double add(double a, double b) { return a + b; }
}

 

* λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”© (Method Overriding)

: λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ 

class Animal {
    void makeSound() {
        System.out.println("Animal sound");
    }
}

class Cat extends Animal {
    @Override // λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ“œ
    void makeSound() {
        System.out.println("Meow");
    }
}

Animal cat = new Cat();
cat.makeSound(); // Meow 좜λ ₯
Copy