ν‹°μŠ€ν† λ¦¬ λ·°

πŸ“Œ 상속

: κΈ°μ‘΄ 클래슀λ₯Ό μž¬μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” 것

: (+) μ½”λ“œ μž¬μ‚¬μš©μ„±↑, ν”„λ‘œκ·Έλž¨ 생산성↑, μœ μ§€λ³΄μˆ˜πŸ‘πŸ»

: extends ν‚€μ›Œλ“œ μ‚¬μš©

class Child extends Parent { ... }

Childν΄λž˜μŠ€λŠ” Parent클래슀의 멀버듀을 포함

: μƒμ„±μžμ™€ μ΄ˆκΈ°ν™” λΈ”λŸ­μ€ 상속X

: Object ν΄λž˜μŠ€λŠ” λͺ¨λ“  클래슀의 쑰상

❗ μžλ°”λŠ” 단일 μƒμ†λ§Œ 지원 (λͺ…λ£Œν•˜κ³  μ‹ λ’°μ„± μžˆλŠ” μ½”λ“œλ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄)

 

βœ”οΈ ν΄λž˜μŠ€κ°„μ˜ 관계

1️⃣ 상속관계(is-a)

2️⃣ 포함관계(has-a) : ν•œ 클래슀의 λ©€λ²„λ³€μˆ˜λ‘œ λ‹€λ₯Έ 클래슀 νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 것

 

 

πŸ“Œ μ˜€λ²„λΌμ΄λ”©

: 쑰상 ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 λ©”μ„œλ“œμ˜ λ‚΄μš©μ„ λ³€κ²½ν•˜λŠ” 것

 

βœ”οΈ μ˜€λ²„λΌμ΄λ”© 쑰건

1️⃣ 쑰상 ν΄λž˜μŠ€μ™€ μ„ μ–ΈλΆ€(λ©”μ„œλ“œλͺ…, λ§€κ°œλ³€μˆ˜, λ°˜ν™˜κ°’)κ°€ μΌμΉ˜ν•΄μ•Όλ¨!

2️⃣ μ ‘κ·Ό μ œμ–΄μžλ₯Ό 쑰상 클래슀의 λ©”μ„œλ“œλ³΄λ‹€ 쒁은 λ²”μœ„λ‘œ λ³€κ²½X

3️⃣ μ˜ˆμ™ΈλŠ” 쑰상 클래슀의 λ©”μ„œλ“œλ³΄λ‹€ 많이 μ„ μ–ΈX

4️⃣ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό static λ©”μ„œλ“œλ‘œ λ˜λŠ” κ·Έ λ°˜λŒ€λ‘œ λ³€κ²½X

 

βœ”οΈ super

: μžμ† ν΄λž˜μŠ€μ—μ„œ 쑰상 ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 멀버λ₯Ό μ°Έμ‘°ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” μ°Έμ‘°λ³€μˆ˜

: μžμ†ν΄λž˜μŠ€μ˜ 멀버가 쑰상 클래슀의 멀버와 쀑볡 μ •μ˜λ˜μ–΄ μ„œλ‘œ ꡬ별해야 λ˜λŠ” κ²½μš°μ—λ§Œ μ‚¬μš©!

 

βœ”οΈ super()

: 쑰상 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ”λ° μ‚¬μš©

: 직접 ν˜ΈμΆœν•˜μ§€ μ•ŠμœΌλ©΄ μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μžμ† 클래슀 μƒμ„±μž 첫 쀄에 super();λ₯Ό μΆ”κ°€

: 쑰상 클래슀의 μƒμ„±μž ν˜ΈμΆœμ€ 클래슀의 상속관계λ₯Ό 거슬러 μ˜¬λΌκ°€λ©΄μ„œ λ§ˆμ§€λ§‰μ—λŠ” λͺ¨λ“  클래슀의 졜고 쑰상인 Object()κΉŒμ§€ 도달

 

 

πŸ“Œ μ œμ–΄μž

: 클래슀, λ³€μˆ˜ λ˜λŠ” λ©”μ„œλ“œμ˜ 선언뢀에 ν•¨κ»˜ μ‚¬μš©λ˜μ–΄ 뢀가적인 의미λ₯Ό λΆ€μ—¬

 

βœ”οΈ static

: 클래슀 λ³€μˆ˜(static λ³€μˆ˜), 클래슀 λ©”μ„œλ“œ(static λ©”μ„œλ“œ)λ₯Ό 생성할 λ•Œ μ‚¬μš©!

: 클래슀 λ©€λ²„λŠ” μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ ν΄λž˜μŠ€μ— 관계 됨. κ·Έλž˜μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ μ‚¬μš©O

→ static λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€ 멀버λ₯Ό μ‚¬μš©ν•  수 μ—†μŒ!

→ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ³΄λ‹€ λΉ λ₯΄κ²Œ 호좜 κ°€λŠ₯!

 

βœ”οΈ final

: λ³€μˆ˜μ— μ‚¬μš©λ˜λ©΄ 값을 λ³€κ²½ν•  수 μ—†λŠ” μƒμˆ˜κ°€ 됨

: λ©”μ„œλ“œμ— μ‚¬μš©λ˜λ©΄ μ˜€λ²„λΌμ΄λ”©X

: ν΄λž˜μŠ€μ— μ‚¬μš©λ˜λ©΄ λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ 상속할 μˆ˜ μ—†μŒ

: final이 뢙은 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” μƒμ„±μžμ—μ„œ μ΄ˆκΈ°ν™” κ°€λŠ₯O! → λ”°λΌμ„œ 각 μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ final이 뢙은 λ©€λ²„λ³€μˆ˜κ°€ λ‹€λ₯Έ 값을 갖도둝 ν•  수 있음!

 

βœ”οΈ abstract

: 좔상 λ©”μ„œλ“œ(μ„ μ–ΈλΆ€O, κ΅¬ν˜„λΆ€X)와 좔상 클래슀(좔상 λ©”μ„œλ“œλ₯Ό κ°€μ§€κ³  μžˆμŒμ„ 의미)λ₯Ό μ„ μ–Έν•˜λŠ” 데 μ‚¬μš©!

: 좔상 클래슀둜 μΈμŠ€ν„΄μŠ€ 생성 λΆˆκ°€λŠ₯!

: 좔상 λ©”μ„œλ“œλŠ” 상속을 톡해 μžμ‹ 클래슀의 μ˜€λ²„λΌμ΄λ”©μœΌλ‘œ κ΅¬ν˜„λ  수 있음!

 

βœ”οΈ μ ‘κ·Ό μ œμ–΄μž(public, protected, default, private)

: 멀버 λ³€μˆ˜, λ©”μ„œλ“œ, 클래슀λ₯Ό μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 μ œν•œν•˜λŠ” μ—­ν• 

1️⃣ private

    : 같은 클래슀 λ‚΄μ—μ„œλ§Œ μ ‘κ·ΌO

2️⃣ default

    : 같은 νŒ¨ν‚€μ§€ λ‚΄μ—μ„œλ§Œ μ ‘κ·ΌO

3️⃣ protected

    : μžμ† ν΄λž˜μŠ€μ—μ„œ μ ‘κ·ΌO, 같은 νŒ¨ν‚€μ§€ λ‚΄μ—μ„œ μ ‘κ·ΌO

4️⃣ public

    : μ ‘κ·Ό μ œν•œX

 

πŸ“Œ μΊ‘μŠν™”

: 클래슀 내뢀에 μ„ μ–Έλœ λ°μ΄ν„°λ₯Ό λ³΄ν˜Έν•˜λŠ” 것

: 데이터(멀버 λ³€μˆ˜)κ°€ μœ νš¨ν•œ 값을 μœ μ§€ν•˜λ„λ‘, μ™ΈλΆ€μ—μ„œ ν•¨λΆ€λ‘œ λ³€κ²½ν•˜μ§€ λͺ»ν•˜λ„둝 데이터λ₯Ό κ°μΆ”λŠ” 것!

: μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  ν•„μš”κ°€ μ—†λŠ” 멀버듀을 private으둜 μ§€μ •ν•˜μ—¬ λ³΅μž‘μ„±μ„ μ€„μ΄λŠ” 것 μ—­μ‹œ μΊ‘μŠν™”!

 

❗ λ³΄ν˜Έν•΄μ•Ό ν•˜λŠ” λ©€λ²„λ³€μˆ˜(데이터)λ₯Ό private, protected(상속을 톡해 ν™•μž₯될 것이 μ˜ˆμƒλ˜λŠ” 클래슀일 λ•Œ)둜 μ œν•œν•˜κ³  멀버 λ³€μˆ˜μ˜ 값을 읽고 λ³€κ²½ν•  수 μžˆλŠ” publicλ©”μ„œλ“œ(ex. getter(), setter())λ₯Ό μ œκ³΅ν•˜μž!

❕(μ°Έκ³ ) ν•˜λ‚˜μ˜ μ†ŒμŠ€νŒŒμΌ(.java)μ—λŠ” public ν΄λž˜μŠ€κ°€ 단 ν•˜λ‚˜λ§Œ 쑴재O, μ†ŒμŠ€νŒŒμΌμ˜ 이름은 λ°˜λ“œμ‹œ public 클래슀의 이름과 κ°™μ•„μ•Ό 함!

 

βœ”οΈ μƒμ„±μžμ˜ μ ‘κ·Ό μ œμ–΄μž

: 보톡 μƒμ„±μžμ˜ μ ‘κ·Ό μ œμ–΄μžλŠ” 클래슀의 μ ‘κ·Ό μ œμ–΄μžμ™€ κ°™μŒ

: μƒμ„±μžλ₯Ό private으둜 μ§€μ •ν•˜λ©΄, μ™ΈλΆ€μ—μ„œ μƒμ„±μžμ— μ ‘κ·ΌX → μΈμŠ€ν„΄μŠ€ 생성X

: private μƒμ„±μžλ‘œ μ§€μ •ν•΄ μΈμŠ€ν„΄μŠ€ 생성을 막고 public λ©”μ„œλ“œλ₯Ό 톡해 μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•˜κ²Œ ν•¨μœΌλ‘œμ¨ μ‚¬μš©ν•  수 μžˆλŠ” μΈμŠ€ν„΄μŠ€μ˜ 개수λ₯Ό μ œν•œO

: μƒμ„±μžκ°€ private이면 λ‹€λ₯Έ ν΄λž˜μŠ€κ°€ 상속할 수 μ—†μœΌλ―€λ‘œ class에 final ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ£ΌλŠ” 것이 μ’‹μŒ! (μžμ‹μ˜ μƒμ„±μžμ—μ„œ λΆ€λͺ¨μ˜ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•˜λŠ”λ° 그럴 수 μ—†κΈ° λ•Œλ¬Έ!)

 

❗싱글톀 νŒ¨ν„΄

: 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ 였직 1개만 μƒμ„±λ˜λŠ” νŒ¨ν„΄

: (+) λ©”λͺ¨λ¦¬λ₯Ό λ‚­λΉ„λ₯Ό λ§‰μŒ

: (+) λ‹€λ₯Έ 클래슀 κ°„ 데이터 κ³΅μœ κ°€ 쉬움

: (-) λ™μ‹œμ„± λ¬Έμ œκ°€ λ°œμƒν•  수 있음

: (-) ν…ŒμŠ€νŠΈκ°€ 어렀움

: (-) ν΄λΌμ΄μ–ΈνŠΈκ°€ ꡬ체 ν΄λž˜μŠ€μ— 의쑴(SOLID원칙 쀑 DIP원칙 μœ„λ°˜)

class Singleton {

    private static Singleton s = new Singleton();
    
    private static Singleton() { ... }
    public static Singleton getInstance() {
        return s;
    }
}

 

 

πŸ“Œ λ‹€ν˜•μ„±

: μ‘°μƒν΄λž˜μŠ€ νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μžμ†ν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” 것(ex. Object o = new String())

: 객체지ν–₯의 μ€‘μš”ν•œ νŠΉμ§•(상속, μΊ‘μŠν™”, λ‹€ν˜•μ„±, 좔상화) 쀑 ν•˜λ‚˜

//μ•žμœΌλ‘œ 계속 μ“Έ 예제
class Animal {
    String name;
    String food;
    
    void move() { ... }
}

class Rabbit extends Animal { ... }
class Cat extends Animal { ... }

 

βœ”οΈ μ°Έμ‘°λ³€μˆ˜μ˜ νƒ€μž…μ€ (1)μ°Έμ‘°ν•  수 μžˆλŠ” 객체의 μ’…λ₯˜μ™€ (2)μ‚¬μš©ν•  수 μžˆλŠ” λ©€λ²„μ˜ 수λ₯Ό κ²°μ •!

    - μ°Έμ‘°λ³€μˆ˜κ°€ μ‚¬μš©ν•  수 μžˆλŠ” λ©€λ²„μ˜ κ°―μˆ˜λŠ” μΈμŠ€ν„΄μŠ€ 멀버 κ°―μˆ˜λ³΄λ‹€ κ°™κ±°λ‚˜ μž‘μŒ

    - λ”°λΌμ„œ, μ‘°μƒνƒ€μž… μ°Έμ‘°λ³€μˆ˜ → μžμ†νƒ€μž… μΈμŠ€ν„΄μŠ€ O / μžμ†νƒ€μž… μ°Έμ‘°λ³€μˆ˜ → μ‘°μƒνƒ€μž… μΈμŠ€ν„΄μŠ€ X

    - μ‘°μƒνƒ€μž… μ°Έμ‘°λ³€μˆ˜  μžμ†νƒ€μž… μΈμŠ€ν„΄μŠ€ Ok 이기 λ•Œλ¬Έμ— μ°Έμ‘°λ³€μˆ˜μ˜ νƒ€μž…κ³Ό μΈμŠ€ν„΄μŠ€μ˜ νƒ€μž…μ΄ 항상 μΌμΉ˜ν•˜μ§€λŠ” μ•ŠμŒ!

Animal animal = new Rabbit();

 

βœ”οΈ μ°Έμ‘°λ³€μˆ˜ ν˜•λ³€ν™˜

μžμ†νƒ€μž… → μ‘°μƒνƒ€μž…(Up-casting) : ν˜•λ³€ν™˜ μƒλž΅ Ok

μ‘°μƒνƒ€μž… → μžμ†νƒ€μž…(Down-casting) : ν˜•λ³€ν™˜ μƒλž΅ X

Cat cat = new Cat();
Animal animal = cat; // Up-casting
Cat cat2 = (Cat) animal; // Down-casting

β—ν˜•λ³€ν™˜μ€ μ°Έμ‘°λ³€μˆ˜μ˜ νƒ€μž…μ„ λ³€ν™˜ν•˜λŠ” 것! μΈμŠ€ν„΄μŠ€λ₯Ό λ³€ν™˜ν•˜λŠ” 것이 μ•„λ‹˜!

Animal animal = new Animal();
Cat cat = (Cat) animal; //λŸ°νƒ€μž„ μ—λŸ¬!

 

πŸ’πŸ»‍♀️ 이런 μ‹€μˆ˜λ₯Ό ν•˜μ§€ μ•ŠμœΌλ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?

πŸ’‘ instanceOf μ—°μ‚°μžλ₯Ό 이용! μ—°μ‚°κ²°κ³Ό trueλ₯Ό μ–»μ—ˆλ‹€λ©΄ μ°Έμ‘°λ³€μˆ˜κ°€ κ²€μ‚¬ν•œ νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€λŠ” 것을 의미!

if(animal instanceOf Cat)
    Cat cat = (Cat)animal;

 

βœ”οΈ μ°Έμ‘°λ³€μˆ˜μ˜ νƒ€μž…μ— 관계없이 항상 μ‹€μ œ μΈμŠ€ν„΄μŠ€μ˜ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜μ§€λ§Œ, λ©€λ²„λ³€μˆ˜μ˜ 경우 μ°Έμ‘°λ³€μˆ˜μ˜ νƒ€μž…μ— 의쑴.

class Animal {
    static int count = 10;
    String name = "animal_name";
    String food;
    
    void move() { 
        System.out.println("Animal is moving");
    }
}

class Dog extends Animal { 
    static int count = 0;
    String name = "dog_name";
    String food;
    
    @Override
    void move() { 
        System.out.println("A dog is moving");
    }
}
Dog dog = new Dog();
Animal animal = dog;

 

1️⃣ μ€‘λ³΅λœ λ©€λ²„λ³€μˆ˜

 : μ°Έμ‘°λ³€μˆ˜ νƒ€μž…κ³Ό 같은 클래슀의 λ©€λ²„λ³€μˆ˜ λ°˜ν™˜!

dog.name //dog_name
animal.name //animal_name

 

2️⃣ μ˜€λ²„λΌμ΄λ”©λœ λ©”μ„œλ“œ

 : μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 호좜!

dog.move(); //A Dog is moving
animal.move() //A Dog is moving

 

3️⃣ static λ©”μ„œλ“œ

 : μ°Έμ‘°λ³€μˆ˜ νƒ€μž…μ— 의쑴. 클래슀λͺ….λ©”μ„œλ“œ()둜 ν˜ΈμΆœν•˜κΈ°

dog.count() //0
animal.count() //10

→ μ°Έμ‘°λ³€μˆ˜ νƒ€μž…μ— 따라 μ‚¬μš©λ˜λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜κ°€ λ‹¬λΌμ§ˆ 수 μžˆμœΌλ―€λ‘œ λ©€λ²„λ³€μˆ˜λ“€μ€ 주둜 private으둜 접근을 μ œν•œν•˜κ³ , μ™ΈλΆ€μ—μ„œλŠ” λ©”μ„œλ“œλ₯Ό ν†΅ν•΄μ„œλ§Œ μ ‘κ·Όν•  수 μžˆλ„λ‘ 해야함! (μΊ‘μŠν™”)

 

πŸ’πŸ»‍♀️ 그럼 λ‹€ν˜•μ„±μ„ μ“°λ©΄ 뭐가 쒋은데?

πŸ’‘ μ—¬λŸ¬ νƒ€μž…(Class)λ₯Ό ν•˜λ‚˜μ˜ νƒ€μž…μœΌλ‘œ λ‹€λ£° 수 있음! → μœ μ—°ν•˜κ³  ν™•μž₯μ„±μžˆκ³ , μœ μ§€λ³΄μˆ˜κ°€ νŽΈλ¦¬ν•œ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€ 수 있음

public void feed(Rabbit rabbit) {
    System.out.println(rabbit.name + "μ—κ²Œ " + rabbit.food + "λ₯Ό μ£Όμ—ˆλ‹€!");
}
public void feed(Animal animal) {
    System.out.println(animal.name + "μ—κ²Œ " + animal.food + "λ₯Ό μ£Όμ—ˆλ‹€!");
}

 

 

πŸ“Œ μΆ”μƒν΄λž˜μŠ€

: λ―Έμ™„μ„± 클래슀. abstract ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ 생성!

: λ”°λΌμ„œ 좔상 ν΄λž˜μŠ€λ‘œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ 수 μ—†μŒ!

: 좔상 λ©”μ„œλ“œ(μ„ μ–ΈλΆ€O, κ΅¬ν˜„λΆ€X)λ₯Ό ν¬ν•¨ν•˜κ³  있음. 상속을 ν†΅ν•΄μ„œ μΆ”μƒλ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ£Όμ–΄μ•Ό 함!(ν•„μˆ˜!)

 

βœ”οΈ 좔상화

: ν΄λž˜μŠ€κ°„μ˜ 곡톡점을 μ°Ύμ•„λ‚΄μ„œ κ³΅ν†΅μ˜ 쑰상(μƒμœ„ν΄λž˜μŠ€)을 λ§Œλ“œλŠ” μž‘μ—…

 

βœ”οΈ ꡬ체화

: 상속을 톡해 클래슀λ₯Ό κ΅¬ν˜„, ν™•μž₯ν•˜λŠ” μž‘μ—…

 

βœ”οΈ  μ‘°μƒν΄λž˜μŠ€ λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”© VS μΆ”μƒλ©”μ„œλ“œ κ΅¬ν˜„

: μΆ”μƒλ©”μ„œλ“œλŠ” κ΅¬ν˜„μ΄ ν•„μˆ˜μ§€λ§Œ λΆ€λͺ¨ν΄λž˜μŠ€ λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•˜λŠ” 것은 선택!

 

πŸ’πŸ»‍♀️ 그럼 μΆ”μƒν΄λž˜μŠ€λ₯Ό μ™œ μ“°λŠ”κ±΄λ°?

1️⃣ κ°μ²΄λ“€μ˜ λ©€λ²„λ³€μˆ˜μ™€ λ©”μ„œλ“œμ˜ 이름을 ν†΅μΌν•˜μ—¬ μ†ŒμŠ€μ˜ 가독성↑

    : κ°œλ°œμžκ°€ λ©€λ²„λ³€μˆ˜μ™€ λ©”μ„œλ“œλ₯Ό μΆ”μΈ‘ν•  수 있음(ex. rabbit에 foodκ°€ μžˆμœΌλ‹ˆκΉŒ dog에도 foodκ°€ μžˆκ² μ§€?)

2️⃣ 상속과 λ‹€ν˜•μ„±μ˜ μž₯점을 λˆ„λ¦΄ 수 있음!

   : μΆ”μƒν΄λž˜μŠ€λ₯Ό μƒμ†ν•œ ν•˜μœ„ 클래슀λ₯Ό μΆ”μƒν΄λž˜μŠ€λ‘œ λ‹€λ£° 수 있음!

 

 

πŸ“Œ μΈν„°νŽ˜μ΄μŠ€

: μΌμ’…μ˜ μΆ”μƒν΄λž˜μŠ€(but 좔상화↑) 

: 일반 λ©”μ„œλ“œ λ˜λŠ” 멀버 λ³€μˆ˜λ₯Ό κ΅¬μ„±μ›μœΌλ‘œ X. 였직 좔상 λ©”μ„œλ“œ(public abstract)와 μƒμˆ˜(public static final)λ§Œμ„ λ©€λ²„λ‘œ 가짐!

: μ œμ–΄μž μƒλž΅ κ°€λŠ₯(μƒλž΅λœ μ œμ–΄μžλŠ” μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μ μœΌλ‘œ μΆ”κ°€)

: μΈν„°νŽ˜μ΄μŠ€μ˜ Object같은 졜고 쑰상은 λ”°λ‘œ μ—†μŒ!

: μ—¬λŸ¬κ°œμ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†ν•˜λŠ” 것이 κ°€λŠ₯!

: μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†ν•˜κ³  μ‹ΆμœΌλ©΄ implements ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©!

interface Movable {
    void move(int x, int y);
}

class Rabbit extends Animal implements Movable {
    public void move(int x, int y) { ... }
}

 

βœ”οΈ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•œ λ‹€ν˜•μ„±

: μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 있음!

: λ¦¬ν„΄νƒ€μž…μ΄ μΈν„°νŽ˜μ΄μŠ€λΌλŠ” 것은 λ©”μ„œλ“œκ°€ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€λŠ” 것을 의미! 

 

πŸ’πŸ»‍♀️ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ™œ μ“°λŠ”λ°?

1️⃣ 개발 μ‹œκ°„ 단좕

    : μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” μͺ½μ—μ„œλŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ κ΅¬ν˜„λ˜μ§€ μ•Šμ•˜λ”λΌλ„ λ©”μ„œλ“œμ˜ μ„ μ–ΈλΆ€λ§Œ 보고 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  수 있음! μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” μͺ½κ³Ό κ΅¬ν˜„ν•˜λŠ” μͺ½μ΄ λ™μ‹œμ— 개발 κ°€λŠ₯!

2️⃣ ν‘œμ€€ν™”

    : ν”„λ‘œμ νŠΈμ— μ‚¬μš©λ˜λŠ” κΈ°λ³Έ 틀을 μΈν„°νŽ˜μ΄μŠ€λ‘œ μž‘μ„±ν•œ λ’€ 이λ₯Ό κ΅¬ν˜„ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λ©΄ μΌκ΄€λ˜κ³  μ •ν˜•ν™”λœ ν”„λ‘œκ·Έλž¨μ„ 개발 κ°€λŠ₯!

3️⃣ 클래슀 간에 관계λ₯Ό λ§Ίμ–΄ 쀌!

    : 상속 관계X, 같은 쑰상X인 경우 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ³΅ν†΅μ μœΌλ‘œ κ΅¬ν˜„ν•˜λ„λ‘ ν•¨μœΌλ‘œμ¨ 관계λ₯Ό λ§Ίμ–΄ 쀄 수 있음

    : 상속 관계(직접적인 관계)λ₯Ό μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•΄μ„œ 간접적인 κ΄€κ³„λ‘œ λ³€κ²½ν•  수 있음

4️⃣ 독립적 ν”„λ‘œκ·Έλž˜λ°(ex. νŠΉμ • DB에 μ˜μ‘΄μ μ΄μ§€ μ•ŠλŠ” ν”„λ‘œκ·Έλž¨)

    : μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•΄ ν΄λž˜μŠ€μ™€ 클래슀 κ°„μ˜ 직접적인 관계λ₯Ό 간접적인 κ΄€κ³„λ‘œ λ³€κ²½ν•˜λ©΄, ν•œ 클래슀의 변경이 κ΄€λ ¨λœ λ‹€λ₯Έ ν΄λž˜μŠ€μ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ” 독립적인 ν”„λ‘œκ·Έλž˜λ°μ΄ κ°€λŠ₯!

 

βœ”οΈ μΈν„°νŽ˜μ΄μŠ€μ˜ 이해

- 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” μͺ½(User)와 클래슀λ₯Ό μ œκ³΅ν•˜λŠ” μͺ½(Provider)

- λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” μͺ½(User)μ—μ„œλŠ” μ‚¬μš©ν•˜λ €λŠ” λ©”μ„œλ“œμ˜ μ„ μ–ΈλΆ€λ§Œ μ•Œλ©΄ 됨!

class User {
    private MySql db = new MySql();
    
    public void connectDb() {
        db.connectDb();
    }
}

↑ 클래슀 User와 MySql(Provider)λŠ” 직접적인 관계가 있음(MySqlκ°€ λ³€κ²½λ˜λ©΄ User도 영ν–₯을 λ°›μŒ)

 

(1) μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 Database의 μ„ μ–Έκ³Ό κ΅¬ν˜„μ„ 뢄리

interface Database {
    public abstract void connectDb();
}

(2) MySqlκ°€ Databaseλ₯Ό κ΅¬ν˜„

class MySql implements Database {
    public void connectDb() {
        // κ΅¬ν˜„λΆ€
    }
}

(3) Userκ°€ Database μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜λ„λ‘ λ³€κ²½

class User {
    Database db = new MySql();
    
    public void loadBd() {
        db.connectDb();
    }
}

- 이제 User와 MySqlλŠ” 간접적인 관계! (User - Database - MySql)

 

πŸ’πŸ»‍♀️ 어쨋든 Userκ°€ dbλ₯Ό μ΄ˆκΈ°ν™”ν•  λ•Œ, MySql()을 λ™μ μœΌλ‘œ μ œκ³΅λ°›μž–μ•„μš”! 그럼 Userκ°€ 아직 MySql에 μ˜μ‘΄ν•˜κ³  μžˆλŠ”κ±° μ•„λ‹Œκ°€μš”?

πŸ’‘ O! 사싀 UserλŠ” μ—¬μ „νžˆ MySql()에 μ˜μ‘΄μ μž„!! 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ 제 3의 ν΄λž˜μŠ€κ°€ Database κ΅¬ν˜„μ²΄λ₯Ό μ œκ³΅ν•΄μ£ΌλŠ” κ²ƒμœΌλ‘œ 이λ₯Ό 해결해쀄 수 μžˆλ‹€!

class User {
    Database db = DbManager.getDb();
    
    public void loadBd() {
        db.connectDb();
    }
}

class DbManager {
    public static Database getDb() {
        return new MySql();
    }
}

 

βœ”οΈ JDK1.8 λΆ€ν„° λ””ν΄νŠΈ λ©”μ„œλ“œμ™€ static ν΄λž˜μŠ€λ„ μΈν„°νŽ˜μ΄μŠ€μ— μΆ”κ°€ν•  수 있게 됨!

 

 

πŸ“Œ λ‚΄λΆ€ 클래슀

: 클래슀 내에 μ„ μ–Έλœ 클래슀

: μΈμŠ€ν„΄μŠ€ 클래슀, μŠ€νƒœν‹± 클래슀, μ§€μ—­ 클래슀, 읡λͺ… 클래슀(λ³€μˆ˜μ²˜λŸΌ λ‚΄λΆ€ 클래슀 μ„ μ–Έ μœ„μΉ˜μ— 따라 μœ νš¨λ²”μœ„μ™€ 접근성이 달라짐!)

 

πŸ’πŸ»‍♀️ λ‚΄λΆ€ 클래슀 μ™œ μ“°λŠ”λ°?

βœ”οΈ ν•΄λ‹Ή 클래슀(Outer Class)와 κΈ΄λ°€ν•œ 관계가 μžˆλŠ”λ° μ™ΈλΆ€μ—λŠ” λΆˆν•„μš”ν•œ 클래슀λ₯Ό λ‚΄λΆ€ 클래슀둜 λ§Œλ“¬!

βž• λ‚΄λΆ€ ν΄λž˜μŠ€μ—μ„œ μ™ΈλΆ€ 클래슀의 멀버듀을 μ‰½κ²Œ μ ‘κ·Όν•  수 있음

βž• μ½”λ“œμ˜ λ³΅μž‘μ„±μ„ 쀄일 수 있음(μΊ‘μŠν™”)

 

βœ”οΈ 읡λͺ… 클래슀

: 클래슀의 μ„ μ–Έκ³Ό 객체의 생성을 λ™μ‹œμ— ν•˜κΈ° λ•Œλ¬Έμ— 단 ν•œλ²ˆλ§Œ μ‚¬μš©! 였직 ν•˜λ‚˜μ˜ κ°μ²΄λ§Œμ„ 생성할 수 μžˆλŠ” 일회용 클래슀

class Outer {
    public static void main(String[] args) {
        Button b = new Button("Start");
        b.addActionListener(new ActionListener() { //ActionListenerκ°€ μΈν„°νŽ˜μ΄μŠ€!
            public void actionPerformed(ActionEvent e) {
                // ...
            }
        })
    }

}

 

 

πŸ“Œ package

: μ„œλ‘œ κ΄€λ ¨λœ ν΄λž˜μŠ€λ“€μ˜ 묢음

: 물리적으둜 ν•˜λ‚˜μ˜ 클래슀 파일(.class)을 ν¬ν•¨ν•˜λŠ” ν•˜λ‚˜μ˜ 디렉토리

: 클래슀의 μ‹€μ œ 이름은 νŒ¨ν‚€μ§€λͺ…을 ν¬ν•¨ν•œ 것 → λ”°λΌμ„œ 같은 μ΄λ¦„μ˜ 클래슀 일지라도 μ„œλ‘œ λ‹€λ₯Έ νŒ¨ν‚€μ§€μ— μ‘΄μž¬ν•˜λŠ” 것이 κ°€λŠ₯!

: νŒ¨ν‚€μ§€λŠ” 점(.)을 κ΅¬λΆ„μžλ‘œ ν•˜μ—¬ κ³„μΈ΅κ΅¬μ‘°λ‘œ ꡬ성할 수 있음

 

βœ”οΈ νŒ¨ν‚€μ§€ μ„ μ–Έ

package νŒ¨ν‚€μ§€λͺ…;

- ν•˜λ‚˜μ˜ μ†ŒμŠ€νŒŒμΌμ—λŠ” 첫 번째 λ¬Έμž₯으둜 단 ν•œ 번의 νŒ¨ν‚€μ§€ μ„ μ–Έλ§Œμ„ ν—ˆμš©

- λͺ¨λ“  ν΄λž˜μŠ€λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜μ˜ νŒ¨ν‚€μ§€μ— 속해야함!

- νŒ¨ν‚€μ§€λ₯Ό μ§€μ •ν•˜μ§€ μ•Šμ€ ν΄λž˜μŠ€λŠ” 'μ΄λ¦„μ—†λŠ” νŒ¨ν‚€μ§€'에 μ†ν•˜κ²Œ 됨!

 

javac -d . PackageTest.java

- terminalμ—μ„œ -dμ˜΅μ…˜μ„ μ€˜μ„œ μžλ°”νŒŒμΌ(.java)을 μ»΄νŒŒμΌν•˜λ©΄ μ†ŒμŠ€νŒŒμΌμ— μ§€μ •λœ 경둜λ₯Ό 톡해 νŒ¨ν‚€μ§€ μœ„μΉ˜λ₯Ό μ°Ύμ•„μ„œ 클래슀파일(.class)을 생성

- -dλ’€μ—λŠ” ν•΄λ‹Ή νŒ¨ν‚€μ§€μ˜ 루트 디렉토리 경둜λ₯Ό μ μ–΄μ€Œ(↑ μœ„μ—μ„œλŠ” ν˜„μž¬ 디렉토리λ₯Ό μ˜λ―Έν•˜λŠ” . )

- 이후 νŒ¨ν‚€μ§€μ˜ 루트 디렉토리λ₯Ό 클래슀패슀(CLASSPATH)에 ν¬ν•¨μ‹œμΌœμ•Ό 함! κ·Έλž˜μ•Ό JVM이 ν•΄λ‹Ή 클래슀λ₯Ό 찾을 수 있음(ν™˜κ²½λ³€μˆ˜ μ„€μ •!)

 

 

πŸ“Œ import

: μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” 클래슀의 νŒ¨ν‚€μ§€λ₯Ό 미리 λͺ…μ‹œ (μ»΄νŒŒμΌλŸ¬μ—κ²Œ 클래슀의 νŒ¨ν‚€μ§€μ— λŒ€ν•œ 정보λ₯Ό 제곡)

→ μ†ŒμŠ€μ½”λ“œμ— μ‚¬μš©λ˜λŠ” ν΄λž˜μŠ€μ΄λ¦„μ—μ„œ νŒ¨ν‚€μ§€λͺ…을 μƒλž΅ν•  수 있게 ν•΄μ€Œ!

: μ»΄νŒŒμΌλŸ¬λŠ” 컴파일 μ‹œμ μ— import문을 톡해 ν΄λž˜μŠ€λ“€μ˜ νŒ¨ν‚€μ§€λ₯Ό μ•Œμ•„ λ‚Έ λ‹€μŒ, λͺ¨λ“  ν΄λž˜μŠ€μ΄λ¦„ μ•žμ— νŒ¨ν‚€μ§€λͺ…을 λΆ™μ—¬μ€Œ!

 → import문은 컴파일 속도λ₯Ό 쑰금 느리게 ν•  뿐, ν”„λ‘œκ·Έλž¨ μ„±λŠ₯에 μ „ν˜€ 영ν–₯X.

import java.util.*; // import java.*;둜 ν•˜λ©΄ μ•ˆλ¨!

- *을 μ‚¬μš©ν•˜λŠ” 것이 ν•˜μœ„ νŒ¨ν‚€μ§€μ˜ ν΄λž˜μŠ€κΉŒμ§€ ν¬ν•¨ν•œ 것은 X

❕ *을 μ‚¬μš©ν•˜λ©΄ importν•˜λŠ” νŒ¨ν‚€μ§€ μˆ˜κ°€ λ§Žμ„ λ•ŒλŠ” μ–΄λŠ ν΄λž˜μŠ€κ°€ μ–΄λŠ νŒ¨ν‚€μ§€μ— μ†ν•˜λŠ”μ§€ κ΅¬λ³„ν•˜κΈ° 어렀움!

 

βœ”οΈ java.lang νŒ¨ν‚€μ§€λŠ” 맀우 빈번히 μ‚¬μš©λ˜λŠ” ν΄λž˜μŠ€λ“€μ΄ μ†ν•œ νŒ¨ν‚€μ§€μ΄κΈ° λ•Œλ¬Έμ— λ”°λ‘œ import문으둜 μ§€μ •ν•˜μ§€ μ•Šμ•„λ„ 됨! (λͺ¨λ“  μ†ŒμŠ€νŒŒμΌμ— λ¬΅μ‹œμ μœΌλ‘œ import java.lang.*;문이 μ„ μ–Έλ˜μ–΄ 있음)

 

βœ”οΈ static importλ¬Έ

: static 멀버λ₯Ό ν˜ΈμΆœν•  λ•Œ 클래슀 이름을 μƒλž΅ν•  수 있게 ν•΄μ€Œ!

import static java.lang.Math.random; //Math.random()이 μ•„λ‹Œ random()으둜 μ‚¬μš© κ°€λŠ₯!

 

 

곡지사항
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€
Total
Today
Yesterday
링크
Β«   2025/05   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
κΈ€ 보관함