# [Java] 좔상 클래슀(abstract class)에 λŒ€ν•΄
Study Repository

[Java] 좔상 클래슀(abstract class)에 λŒ€ν•΄

by rlaehddnd0422

μžλ°”μ—μ„œ abstarct μ œμ–΄μžλŠ” '좔상적인'μ΄λΌλŠ” 의미둜 μ‚¬μš©λ©λ‹ˆλ‹€.

 

μ„ μ–ΈλΆ€λ§Œ 있고 κ΅¬ν˜„λΆ€κ°€ μ—†λŠ” λ©”μ†Œλ“œλ₯Ό 좔상 λ©”μ†Œλ“œλΌ ν•˜κ³ , ν•˜λ‚˜ μ΄μƒμ˜ 좔상 λ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” ν΄λž˜μŠ€λŠ” λ°˜λ“œμ‹œ abstract μ œμ–΄μžλ₯Ό λΆ™μ—¬μ•Ό ν•˜λ©° 이λ₯Ό 좔상 클래슀라고 λΆ€λ¦…λ‹ˆλ‹€.

 

좔상 ν΄λž˜μŠ€λŠ” ν•˜λ‚˜ μ΄μƒμ˜ 좔상 λ©”μ†Œλ“œλ₯Ό κ°–λŠ”λ‹€κ³  ν–ˆλŠ”λ° κ·Έλ ‡λ‹€λ©΄ 좔상 ν΄λž˜μŠ€λŠ” λ°˜λ“œμ‹œ 좔상 λ©”μ†Œλ“œλ₯Ό 가진닀고 λ³Ό 수 μžˆμ„κΉŒ? 

  •  ν•­μƒ κ·Έλ ‡μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.
    • 좔상 λ©”μ†Œλ“œλ₯Ό κ°–λŠ” ν΄λž˜μŠ€λŠ” λ°˜λ“œμ‹œ 좔상 클래슀둜 μ„€μ •ν•΄μ•Ό ν•˜λŠ” 것은 λ§žμ§€λ§Œ, λ°˜λŒ€λ‘œ 좔상 ν΄λž˜μŠ€κ°€ λ°˜λ“œμ‹œ 좔상 λ©”μ†Œλ“œλ₯Ό κ°€μ Έμ•Ό ν•˜λƒκ³  λ¬»λŠ”λ‹€λ©΄ κΌ­ 그렇진 μ•ŠμŠ΅λ‹ˆλ‹€. 

 

μΆ”μƒν΄λž˜μŠ€λ₯Ό μ“°λŠ” μ΄μœ λŠ”?

  •  μΆ”상 클래슀λ₯Ό ν•œλ§ˆλ””λ‘œ μ •μ˜ν•˜λ©΄ λ―Έμ™„μ„± μ„€κ³„λ„μž…λ‹ˆλ‹€.

미완성이기 λ•Œλ¬Έμ— 였직 상속을 톡해 ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œλ§Œ 완성될 수 μžˆμŠ΅λ‹ˆλ‹€. 좔상 클래슀 λŒ€μ‹ μ— μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ“Έ μˆ˜λ„ μžˆμ§€λ§Œ, μΈν„°νŽ˜μ΄μŠ€μ—μ„œλŠ” μ„ μ–ΈλΆ€λ§Œ 있기 λ•Œλ¬Έμ— 이λ₯Ό κ΅¬ν˜„ν•œ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œλŠ” 곡톡적인 κΈ°λŠ₯이 μ€‘λ³΅λ˜λ”λΌλ„ λͺ¨λ‘ μ€‘λ³΅μ μœΌλ‘œ κ΅¬ν˜„λΆ€μ— μž‘μ„±μ„ ν•΄μ•Όν•˜μ§€λ§Œ, 좔상 클래슀λ₯Ό μ‚¬μš©ν•˜λ©΄ 좔상 클래슀λ₯Ό 상속받은 ν•˜μœ„ ν΄λž˜μŠ€λ“€μ΄ 좔상 ν΄λž˜μŠ€μ—μ„œ μ„€κ³„λœ 곡톡적인 κΈ°λŠ₯듀에 λŒ€ν•œ λ©”μ†Œλ“œλ₯Ό ꡳ이 κ΅¬ν˜„ν•  ν•„μš”κ°€ μ—†λ‹€λŠ” μ μ—μ„œ μž₯점을 κ°–μŠ΅λ‹ˆλ‹€.

 

 

<μš”μ•½>

 

1) κ°μ²΄λ“€μ˜ ν•„λ“œμ™€ λ©”μ†Œλ“œμ˜ 이름을 좔상 λ©”μ†Œλ“œμ— ν†΅μΌν•˜μ—¬ μ†ŒμŠ€μ˜ 가독성을 높일 수 있고, 

 

2) λͺ¨λ“  객체듀에 곡톡적인 λ©”μ„œλ“œμ™€, ν•„λ“œλ“€μ„ 좔상 클래슀둜 λ§Œλ“€κ³  이 좔상 클래슀λ₯Ό ν•˜μœ„ μžμ‹λ“€μ΄ 상속받아 ν•„μš”ν•œ ν•„λ“œμ™€ λ©”μ„œλ“œλ₯Ό κ·ΈλŒ€λ‘œ μƒμ†ν•˜κ³  좔상 ν΄λž˜μŠ€λŠ” μžμ‹μ—μ„œ μž¬μ •μ˜ν•˜λŠ” 방식을 톡해 개발의 νš¨μœ¨μ„±μ„ μ¦λŒ€μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ„€λͺ…ν•˜κ³  λ³΄λ‹ˆ 말이 μ΄ν•΄ν•˜κΈ° 쑰금 μ–΄λ €μš΄λ° μ½”λ“œλ‘œ μ΄ν•΄ν•΄λ΄…μ‹œλ‹€.

abstract class Animal {
    abstract void bark();
    public void sleep() {
        System.out.println("Sleeping...zZZ");
    }
}

bark()와 sleep() λ©”μ†Œλ“œλ₯Ό κ°–λŠ” λ―Έμ™„μ„± 섀계도인 좔상 클래슀 Animal이 μžˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ bark()λŠ” ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” 좔상 λ©”μ†Œλ“œμ΄κ³ , sleep()은 ν•˜μœ„ ν΄λž˜μŠ€λ“€μ΄ κ³΅ν†΅μ μœΌλ‘œ λ™μΌν•˜κ²Œ λ™μž‘ν•˜λŠ” λ©”μ†Œλ“œμž…λ‹ˆλ‹€.

public class Dog extends Animal{

    private String species;

    public Dog(String species) {
        this.species = species;
    }

    @Override
    void bark() {
        System.out.println("This puppy barks like " + this.species);
    }

}

barkλŠ” μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ κ΅¬ν˜„ν•˜μ˜€κ³ , 좔상 ν΄λž˜μŠ€μ—μ„œ 미리 κ΅¬ν˜„ν•΄λ‘” 일반 λ©”μ†Œλ“œ sleep()을 κ·ΈλŒ€λ‘œ μ‚¬μš©ν•œ 덕뢄에 sleep에 λŒ€ν•œ μ˜€λ²„λΌμ΄λ”© 및 κ΅¬ν˜„μ€ λ³„λ„λ‘œ ν•˜μ§€ μ•Šμ•„λ„ 되게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

public class AnimalTest {
    public static void main(String[] args) {
        Dog dog1 = new Dog("ν¬λ©”λΌλ‹ˆμ•ˆ");

        dog1.bark();
        dog1.sleep();
    }
}

좜λ ₯ κ²°κ³Ό

λ¬Όλ‘  ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ 좔상 클래슀의 일반 λ©”μ†Œλ“œλ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜μ§€ μ•Šκ³  일반 λ©”μ†Œλ“œ λ˜ν•œ μ˜€λ²„λΌμ΄λ”© ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
abstract class Animal {
    abstract void bark();
    public void sleep() {
        System.out.println("Sleeping...zZZ");
    }
}
public class Cat extends Animal {

    private String type;

    public Cat(String type) {
        this.type = type;
    }

    @Override
    void bark() {
        System.out.println("This Cat howl like " + this.type);
    }

    @Override
    public void sleep() {
        System.out.println("Meow...zZ");
    }
}

Cat ν΄λž˜μŠ€μ—μ„œλŠ” 좔상 클래슀의 일반 λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

public class AnimalTest {
    public static void main(String[] args) {
        Cat cat1 = new Cat("λ­”μΉ˜ν‚¨");

        cat1.bark();
        cat1.sleep();
    }
}

좜λ ₯ κ²°κ³Ό

Cat 클래슀의 μΈμŠ€ν„΄μŠ€μ˜ sleep() λ©”μ†Œλ“œκ°€ μ‹€ν–‰λœ 좜λ ₯ κ²°κ³Όλ₯Ό 보면 Animal에 κ΅¬ν˜„λœ sleep()을 μ‹€ν–‰ν•˜μ§€ μ•Šκ³ , ν•˜μœ„ 클래슀 Cat에 μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ κ΅¬ν˜„ν•œ sleep()을 μ‹€ν–‰ν•œ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 

 

μ΄λ ‡κ²Œ 곡톡기λŠ₯에 λŒ€ν•΄ μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ κ΅¬ν˜„ν•˜λŠ” 것을 막고 μ‹Άλ‹€λ©΄ 좔상 ν΄λž˜μŠ€μ—μ„œ 일반 λ©”μ†Œλ“œμ— final ν‚€μ›Œλ“œλ₯Ό 뢙이면 λ©λ‹ˆλ‹€.

 

μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 ν΄λž˜μŠ€λŠ” μ–΄λ–»κ²Œ λ‹€λ₯ΌκΉŒ?

μΈν„°νŽ˜μ΄μŠ€λ„ μΌμ’…μ˜ 좔상 클래슀라고 λ³Ό 수 μžˆλŠ”λ°, λ‹€λ₯Έ 점이 μžˆλ‹€λ©΄ μΈν„°νŽ˜μ΄μŠ€λŠ” 더 높은 좔상화 정도λ₯Ό 가지고 있기 λ•Œλ¬Έμ— 멀버 λ³€μˆ˜λ‚˜ κ΅¬ν˜„λΆ€κ°€ μžˆλŠ” 일반 λ©”μ†Œλ“œλ₯Ό κ΅¬μ„±μ›μœΌλ‘œ κ°€μ§ˆ 수 μ—†μŠ΅λ‹ˆλ‹€. λ‹€λ§Œ 클래슀 λ ˆλ²¨μ—μ„œ μ‚¬μš©ν•  static final은 κ°€μ§ˆ 수 μžˆλ‹€ ^^

public interface Car {
    public static final int wheel = 4;
    final String MADE_IN_COUNTRY = "KOREA"; // public & static이 μƒλž΅λ¨ 
    static String color = "BLACK"; // public & final이 μƒλž΅λ¨
}

λ°˜λ©΄μ— 좔상 ν΄λž˜μŠ€λŠ” 일반 λ©”μ†Œλ“œ 뿐만 μ•„λ‹ˆλΌ 멀버 λ³€μˆ˜λ„ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

abstract class Animal {

    int wakeUpHour = 9;

    public abstract void bark();
    public void sleep() {
        System.out.println("Sleeping...zZZ");
    }

    public void wakeUp() {
        System.out.println("Wake Up at" + wakeUpHour);
    }
}

 

좔상 ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€ 생성이 κ°€λŠ₯ν• κΉŒ?

  • 읡λͺ… μ΄λ„ˆ 클래슀둜 생성은 κ°€λŠ₯ν•˜μ§€λ§Œ, 좔상 클래슀의 μ˜λ„μ™€ λͺ©μ μ„ μ•Œκ³ λ‚˜λ©΄ 좔상 클래슀λ₯Ό μΈμŠ€ν„΄μŠ€λ‘œ μƒμ„±ν•΄μ„œ μ‚¬μš©ν•  μ΄μœ κ°€ μ „ν˜€ μ—†μŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.
public class AnimalTest {
    public static void main(String[] args) {

        // 읡λͺ… μ΄λ„ˆ 클래슀둜 생성은 κ°€λŠ₯ν•˜λ‹€λ§Œ, λ§Œλ“€μ–΄ μ‚¬μš©ν•  μ΄μœ κ°€ μ „ν˜€ μ—†λ‹€.
        Animal animal = new Animal() {
            @Override
            public void bark() {
                System.out.println("BARKS!");
            }
        };

        animal.bark();
    }
}

 

좔상 λ©”μ†Œλ“œ μ ‘κ·Ό μ œμ–΄μž 섀정에 μ£Όμ˜ν•  점

  • abstarct λ©”μ†Œλ“œλŠ” staticκ³Ό ν•¨κ»˜ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
    • abstract μ œμ–΄μžλŠ” μ„ μ–ΈλΆ€λ§Œ μžˆλŠ” λ©”μ†Œλ“œλ‘œ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” λ©”μ†Œλ“œμ΄κ³ 
    • static μ œμ–΄μžλ₯Ό κ°€μ§€λŠ” λ©”μ†Œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ μ‚¬μš©ν•  수 μžˆμ–΄μ•Ό ν•˜λ―€λ‘œ abstarct와 static은 곡쑴할 수 μ—†μŠ΅λ‹ˆλ‹€.
  • abstarct λ©”μ†Œλ“œλŠ” privateκ³Ό ν•¨κ»˜ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
    • abstract μ œμ–΄μžλŠ” μ„ μ–ΈλΆ€λ§Œ μžˆλŠ” λ©”μ†Œλ“œλ‘œ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” λ©”μ†Œλ“œ
    • 이 λ•Œ private μ ‘κ·Όμ œμ–΄μž κΉŒμ§€ ν•¨κ»˜ 섀정해버리면 ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Όν•  수 μ—†κΈ° λ•Œλ¬Έμ— abstarct와 private은 곡쑴할 수 μ—†μŠ΅λ‹ˆλ‹€.
  • abstarct λ©”μ†Œλ“œλŠ” finalκ³Ό ν•¨κ»˜ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
    • abstract μ œμ–΄μžλŠ” μ„ μ–ΈλΆ€λ§Œ μžˆλŠ” λ©”μ†Œλ“œλ‘œ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” λ©”μ†Œλ“œμΈλ°,
    • 이 λ•Œ final둜 μ˜€λ²„λΌμ΄λ”©μ„ 막아버리면 ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©μ΄ λΆˆκ°€λŠ₯ν•˜λ―€λ‘œ abstract와 final은 곡쑴할 수 μ—†μŠ΅λ‹ˆλ‹€.

 

좔상 클래슀 μ ‘κ·Ό μ œμ–΄μž 섀정에 μ£Όμ˜ν•  점

  • 좔상 ν΄λž˜μŠ€μ—λŠ” final ν‚€μ›Œλ“œλ₯Ό 뢙일 수 μ—†μŠ΅λ‹ˆλ‹€.
    • final ν‚€μ›Œλ“œκ°€ ν΄λž˜μŠ€μ— λΆ™κ²Œ 되면 클래슀λ₯Ό 상속을 λͺ»ν•˜λ„둝 λ§‰μ•„λ²„λ¦¬λŠ”λ°, abstract ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ ν΄λž˜μŠ€κ°€ μƒμ†ν•΄μ„œ μ˜€λ²„λΌμ΄λ”©ν•΄μ•Ό μ‚¬μš©ν•  수 μžˆμœΌλ―€λ‘œ abstarct와 final ν‚€μ›Œλ“œλŠ” 곡쑴할 수 μ—†μŠ΅λ‹ˆλ‹€. ( λ©”μ†Œλ“œμ—μ„œλ„ λ§ˆμ°¬κ°€μ§€ )

<참고 자료>

 

 

[JAVA/μžλ°”] 좔상 클래슀(abstract class), 좔상 λ©”μ†Œλ“œ

 μ΄λ²ˆ ν¬μŠ€νŒ…μ€ 좔상 ν΄λž˜μŠ€μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² λ‹€. μΆ”μƒμ΄λž€ 말처럼 곡톡적인 νŠΉμ„±μ΄λ‚˜ 속성듀...

blog.naver.com

 

 

μžλ°”(JAVA)의 좔상 클래슀 (abstract class)

좔상 클래슀(abstract class)λž€ ν•˜λ‚˜ μ΄μƒμ˜ 좔상 λ©”μ†Œλ“œ(abstract method)λ₯Ό ν¬ν•¨ν•˜λŠ” ν΄λž˜μŠ€μ΄λ‹€. 좔상 λ©”μ†Œλ“œλŠ” μ„ μ–Έλ§Œ 있고 λ³Έμ²΄λŠ” μ—†λŠ” ν•¨μˆ˜μ΄λ©° 선언뢀에 ‘abstract’ λΌλŠ” ν‚€μ›Œλ“œλ₯Ό 뢙인닀. 좔상 λ©”

studymake.tistory.com

 

 

μΆ”μƒν΄λž˜μŠ€μ˜ 객체 생성 (μΆ”μƒν΄λž˜μŠ€ μΈμŠ€ν„΄μŠ€) - μΆ”μƒν΄λž˜μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

πŸ‘πŸ» μš”μ•½ 더보기 객체생성을 ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€λŠ” μ˜λ„λ₯Ό λͺ…ν™•νžˆ ν•˜κΈ°μœ„ν•΄μ„œ + μ˜λ„μΉ˜μ•Šμ€ λ©”λͺ¨λ¦¬ λ‚­λΉ„λ₯Ό λ§‰κΈ°μœ„ν•΄ κΉ€μ˜ν•œλ‹˜ κ°•μ˜λ₯Ό λ³΄λŠ” 도쀑 μƒμˆ˜ μ •λ³΄λ§Œμ„ 가진 클래슀λ₯Ό λ§Œλ“€μ—ˆλŠ”λ°, 이

thalals.tistory.com

 

 

[JAVA] μΆ”μƒν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ 차이

μΆ”μƒν΄λž˜μŠ€(Abstract Class)λž€? 좔상 클래슀(Abstract Class)λŠ” 좔상 λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•΄ 놓고 상속을 톡해 μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ©”μ„œλ“œλ₯Ό μ™„μ„±ν•˜λ„λ‘ μœ λ„ν•˜λŠ” ν΄λž˜μŠ€μ΄λ‹€. μ΄λŸ¬ν•œ νŠΉμ„± 탓에 λ―Έμ™„μ„± 섀계도라

code-lab1.tistory.com

 

λΈ”λ‘œκ·Έμ˜ 정보

Study Repository

rlaehddnd0422

ν™œλ™ν•˜κΈ°