βš™οΈ backend/β˜•οΈ java

Day04. μžλ°” ν”„λ‘œκ·Έλž˜λ° κΈ°λ³Έ

dev!n 2023. 7. 7. 08:57

λͺ©μ°¨

    Object Oriented Programming

    Encapulattion(μΊ‘μŠν™”-은닉)

    • μ™ΈλΆ€μ—μ„œ μ‚¬μš©μžκ°€ 속성을 직접 쑰회, μˆ˜μ •ν•  수 없도둝 μ œν•œ
    • κ°œλ°œμžκ°€ λ§Œλ“€μ–΄ μ£ΌλŠ” λŒ€λ‘œλ§Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ©”μ†Œλ“œ 제곡 → setXxx, getXxx
    • κ΄€λ‘€) μƒμ„±μž 밑에 μž‘μ„±

    setXxx

    • ν•„λ“œλ₯Ό μˆ˜μ •ν•œλ‹€

    μž‘μ„±λ²•

    1. modefier ⇒ public
    2. returntype ⇒ void
    3. methodName ⇒ setXxx()
    4. parameter ⇒ Exist!

    μ™œ 쓰지?

    λ©”μ†Œλ“œμ΄λ‹ˆκΉŒ κΈ°λŠ₯을 λ§Œλ“€ 수 μžˆλ‹€! μœ μ €μ˜ μ˜ˆμƒμΉ˜ λͺ»ν•œ 상황을 μ œμ–΄.

    ⇒ μ˜ˆμ™Έ μ²˜λ¦¬ν•΄μ„œ ν”„λ‘œκ·Έλž¨μ˜ 라이프 사이클이 μ›ν•˜λŠ” λ°©ν–₯으둜 ν˜λŸ¬κ°€λ„λ‘.

    public void setAge(int age) { 
    		if (age > 18) this.age = age;
    }
    

    getXxx

    • ν•„λ“œλ₯Ό μ‘°νšŒν•œλ‹€

    μž‘μ„±λ²•

    1. modefier ⇒ public
    2. returntype ⇒ μ›ν•˜λŠ” 데이터 νƒ€μž…
    3. methodName ⇒ getXxx()
    4. parameter ⇒ null

    μ™œ 쓰지?

    κΈ°λŠ₯을 넣을 수 μžˆλ‹€. μ›ν•˜λŠ” λŒ€λ‘œ 데이터λ₯Ό κ°€κ³΅ν•˜μ—¬ 데이터λ₯Ό μ œκ³΅ν•  수 μžˆλ‹€!

    public int getAge() {
    		if(생일 지남) return age-1;
    		else return age-2;
    }
    

    Singleton Pattern

    • μ™ΈλΆ€μ—μ„œ 객체λ₯Ό 직접 μƒμ„±ν•˜μ§€ λͺ»ν•˜λ„둝 함
    • ν˜„μž¬ 객체λ₯Ό 직접 μƒμ„±ν•΄μ„œ λ¦¬ν„΄ν•΄μ£ΌλŠ” λ©”μ†Œλ“œ 제곡

    μ™œ 쓰지?

    κ°œλ°œμžκ°€ 직접 객체λ₯Ό λ§Œλ“€μ–΄ μ£ΌκΈ° λ•Œλ¬Έμ— κ°œλ°œμžκ°€ μ˜λ„ν•œλŒ€λ‘œλ§Œ μƒμ„±λœλ‹€

    μž‘μ„± 방법

    1. private κΈ°λ³Έ μƒμ„±μž
    2. λ©€λ²„ν•„λ“œλ‘œ static 자기 μžμ‹  νƒ€μž… μ„ μ–Έ
    3. public static methodλ₯Ό μ œκ³΅ν•˜μ—¬ 객체λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ λ°˜ν™˜
    public class Test {
    		private static Test instance = new Test();
    		
    		// μƒμ„±μž
    		private Test() {}
    		
    		// λ©”μ†Œλ“œ
    		public static Test getInstance([parameter]) {
    				return instance;
    		}
    }
    
    /* μ™ΈλΆ€ μ„œλΉ„μŠ€ */
    Test t1 = Test.getInstance(); // singleton!
    Test t2 = Test.getInstance(); // singleton!
    Test t3 = Test.getInstance(); // singleton!
    
    /* 좜λ ₯κ²°κ³Ό */
    t1 = day04.constructor.Test@6aaa5eb0
    t2 = day04.constructor.Test@6aaa5eb0
    t3 = day04.constructor.Test@6aaa5eb0
    

    cf) Calendar κ°μ²΄λŠ” 싱글톀이 μ•„λ‹˜! μ‹œκ°„μ€ 계속 λ‹¬λΌμ§€λ‹ˆκΉŒ.

    Calendar c1 = new Calendar // λΆˆκ°€
    Calendar c2 = Calendar.getInstance(); // λ‹€λ₯Έκ²Œ λ‚˜μ˜€κΈ΄ 함
    

    Inheritance(상속)

    객체지ν–₯의 🌸

    • μƒμ†μ΄λž€ λΆ€λͺ¨(Super) class의 속성(μ „μ—­λ³€μˆ˜ = Field)κ³Ό methodλ₯Ό 상속 λ°›λŠ” 것.
    • λΆ€λͺ¨ class의 μƒμ„±μžμ™€ private μš”μ†Œλ₯Ό μ œμ™Έν•œ λͺ¨λ“  것을 μƒμ†λ°›λŠ”λ‹€.
    • λΆ€λͺ¨ class의 method와 속성을 λ³„λ„μ˜ μ„ μ–Έ 없이 λ‚΄μ•ˆμ— μžˆλŠ” κ²ƒμ²˜λŸΌ μ ‘κ·Όν•˜μ—¬ μ‚¬μš©.
    • λ‹¨μΌμƒμ†λ§Œ κ°€λŠ₯(λΆ€λͺ¨λŠ” 단 ν•˜λ‚˜. ν•˜μ§€λ§Œ λŒ€λ¬Όλ¦Όμ€ κ°€λŠ₯.)
    • extends ν‚€μ›Œλ“œ μ‚¬μš©
    • ex) class A extends B { } ~> Aκ°€ Bλ₯Ό 상속 λ°›λŠ”λ‹€. AλŠ” B의 것듀을 λ‹€ μ‚¬μš©ν•œλ‹€.
    • java의 λͺ¨λ“  classλŠ” Object(class)λ₯Ό μƒμ†λ°›λŠ”λ‹€. (java의 졜고 쑰상. λΆ€λͺ¨κ°€ μ—†λŠ” κ°μ²΄λŠ” μ—†λ‹€.)
    • 자기만의 속성, κΈ°λŠ₯도 μΆ”κ°€λ‘œ λ§Œλ“€ 수 μžˆλ‹€.
    • λΆ€λͺ¨νƒ€μž…μœΌλ‘œλŠ” μžμ‹μ˜ 속성, λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.
    • μžμ‹μ„ λ§Œλ“€λ©΄ λΆ€λͺ¨λ„ ν•˜λ‚˜μ˜ 객체둜 ν•¨κ»˜ μƒμ„±λœλ‹€. νž™ μ˜μ—­μ— 객체가 λ§Œλ“€μ–΄μ§„λ‹€.

    μ™œ ν•„μš”ν• κΉŒ?

    μ‹œλ‚˜λ¦¬μ˜€ μ•ˆμ˜ 객체가 κ°€μ Έμ•Ό ν•˜λŠ” κ³΅ν†΅μ˜ 속성(ν•„λ“œ), κΈ°λŠ₯(λ©”μ†Œλ“œ)λ₯Ό λ§Œλ“€μ–΄ 두고 μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•΄

    Overriding

    μž¬μ •μ˜

    μƒμ†κ΄€κ³„μ—μ„œ Super(λΆ€λͺ¨)class에 μ •μ˜λ˜μ–΄ μžˆλŠ” methodλ₯Ό Sub(μžμ‹) classμ—μ„œ μž¬μ •μ˜ ν•˜λŠ” 것.

    μž¬μ •μ˜ 방법

    1. modifier의 μ ‘κ·Όμ œν•œμžλŠ” λ°˜λ“œμ‹œ λΆ€λͺ¨ class의 μ œν•œμž 보닀 ν¬κ±°λ‚˜ κ°™μ•„μ•Ό ν•œλ‹€. ⇨ μ ‘κ·Όμ œν•œμž μ΄μ™Έμ˜ modifier(abstract)λŠ” 같아도 달라도 상관없닀.
    2. returnType 무쑰건 κ°™λ‹€.
    3. method이름, 인수 무쑰건 κ°™λ‹€.
    4. κΈ°λŠ₯을 λ‹€λ₯΄κ²Œ λ§Œλ“ λ‹€. (κΈ°λŠ₯이 λ‹€λ₯΄μ§€ μ•ŠμœΌλ©΄ λ§Œλ“€ ν•„μš”κ°€ μ—†λ‹€) ⇨ 즉, λΆ€λͺ¨ class의 method κΈ°λŠ₯이 λ§ˆμŒμ— 듀지 μ•Šμ•„ λ‹€λ₯Έ κΈ°λŠ₯으둜 μž¬μ •μ˜.

    상속 관계일 λ•Œ μƒμ„±μžμ˜ κ°œλ…

    1. μžμ‹ classκ°€ 생성 될 λ•Œ λΆ€λͺ¨ class의 κΈ°λ³Έ μƒμ„±μž ν˜ΈμΆœλœλ‹€.
    2. μžμ‹ classκ°€ μΈμˆ˜κ°€ μžˆλŠ” μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λ”λΌλ„ λΆ€λͺ¨ class의 κΈ°λ³Έ μƒμ„±μžκ°€ ν•„μš”ν•˜λ‹€.⇨ μžμ‹ μƒμ„±μžμ˜ κ΅¬ν˜„λΆ€ 첫 번째 μ€„μ—μ„œ super(); μƒλž΅λœ 것과 κ°™λ‹€.
    3. ex) new Sub(5); 처럼 ν˜ΈμΆœν•˜λ”λΌλ„ super(); (κΈ°λ³Έμƒμ„±μž)κ°€ ν˜ΈμΆœλœλ‹€.
    4. μžμ‹ classμ—μ„œ μΈμœ„μ μœΌλ‘œ super(κ°’, κ°’, ... ); ν˜ΈμΆœν•˜λ©΄ λΆ€λͺ¨μ˜ κΈ°λ³Έμƒμ„±μž ν•„μš”μ—†λ‹€.
    5. ⇨ 단, λͺ¨λ“  μžμ‹μƒμ„±μžμ—μ„œ super(κ°’, κ°’, ... ); ν˜ΈμΆœλ˜μ–΄ μžˆμ–΄μ•Ό 문법에 였λ₯˜κ°€ μ—†λ‹€.
    6. μžμ‹ μƒμ„±μž κ΅¬ν˜„λΆ€ 첫 번째 μ€„μ—μ„œ this(κ°’, κ°’, ... );은 ν˜ΈμΆœν•˜λ©΄ λ¨Όμ € 호좜된 μžμ‹ μƒμ„±μžμ— κ°€μ„œ μ΄λ™ν•œ μžμ‹ μƒμ„±μž κ΅¬ν˜„λΆ€ 첫 번째 μ€„μ—μ„œ super(); ν˜ΈμΆœλœλ‹€.

    ex) toString(Object obj)

    https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#toString()

    Object에 μžˆλŠ”λ° Stringμ—μ„œ μž¬μ •μ˜

    @Override

    @Override 
    Indicates that a method declaration is intended to override a method declaration in a supertype. 
    If a method is annotated with this annotation type compilers are required to generate an error message unless at least one of the following conditions hold:
    
    The method does override or implement a method declared in a supertype.
    The method has a signature that is override-equivalent to that of any public method declared in Object.
    
    Since: 1.5
    

    super

    super의 μ‚¬μš©λ²• 3가지 (μžμ‹ ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨λ₯Ό 칭함)

    1. super.λ³€μˆ˜μ΄λ¦„ ⇨ μžμ‹classμ—μ„œ λΆ€λͺ¨ class의 μ „μ—­λ³€μˆ˜ 호좜 μžμ‹class의 λ³€μˆ˜μ΄λ¦„κ³Ό λΆ€λͺ¨class의 λ³€μˆ˜μ΄λ¦„ 같을 λ•Œ ꡬ뢄
    2. super.method이름( [κ°’, κ°’, ...] ); ⇨ μžμ‹classμ—μ„œ λΆ€λͺ¨class의 method호좜
    3. super( [κ°’, κ°’, ... ] ); ⇨ μžμ‹ class의 μƒμ„±μžκ΅¬ν˜„λΆ€ 첫 번째 μ€„μ—μ„œ λΆ€λͺ¨ class의 μƒμ„±μž 호좜

    super, this μƒμ„±μžμ—μ„œλ§Œ μ‚¬μš©!

    Polymorphsim(λ‹€ν˜•μ„±)

    상속관계여야 ν•œλ‹€

    • class A extends B{ } 일 λ•Œ Aλ₯Ό A라 λΆ€λ₯Ό 수 있고 Aλ₯Ό B라 λΆ€λ₯Ό 수 μžˆλ‹€. => class A extends B{ }일 λ•Œ
    • γ‰  A a = new A(); ⇨ O ㉑ B b = new A(); ⇨ O // polymorphism! γ‰’ B c = new B(); ⇨ O ㉣ A d = new B(); ⇨ X
    • 객체 μžμ²΄κ°€ λ°”λ€ŒλŠ” 것이 μ•„λ‹ˆλΌ 뭐라고 λΆ€λ₯΄λƒμ— 따라 μ ‘κ·Όν•  수 μžˆλŠ” λ²”μœ„κ°€ μ œν•œλœλ‹€

    방식

    1. λ§€κ°œλ³€μˆ˜λ₯Ό μ΄μš©ν•œ λ‹€ν˜•μ„±
    2. class Sonata extends Car {/*μ†Œλ‚˜νƒ€λ§Œμ˜ 속성, κΈ°λŠ₯이 μžˆλ‹€.*/} class Example { public void engineer(Car cd){ System.out.println(cd + " 수리λ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€."); } public static void main(String[] args) { // main Sonata sonata = new Sonata(); engineer(sonata); // polymorphism! } }
    3. ν•„λ“œλ₯Ό μ΄μš©ν•œ λ‹€ν˜•μ„± λΆ€λͺ¨νƒ€μž… λ³€μˆ˜ = μžμ‹κ°μ²΄;
    4. class Example { public static void main(String[] args) { Car car1 = new Car(); Car car2 = new Sonata(); // polymorphism! } }

    μ œμ•½

    1. Car을 λΆ€λͺ¨λ‘œ ν•˜λŠ” μ—¬λŸ¬κ°€μ§€ μ°¨κ°€ 듀어와야 ν•œλ‹€ → λ¬΄λΆ„λ³„ν•œ μΊμŠ€νŒ… κΈˆμ§€. 쑰건 κ±ΈκΈ°.
      if (car instanceof EfSonata) { // λ³€μˆ˜ instanceof νƒ€μž…
          System.out.println("car instanceof Sonata is true");
      } else {
          System.out.println("car instanceof Sonata is false");
      }
      
    2. Exception in thread "main" java.lang.ClassCastException: class day04.inheritance.Car cannot be cast to class day04.inheritance.Excel (day04.inheritance.Car and day04.inheritance.Excel are in unnamed module of loader 'app') at day04.inheritance.CarCenter.engineer(PolymorphismExam.java:18) at day04.inheritance.PolymorphismExam.main(PolymorphismExam.java:34)
    3. μœ μ—°ν•΄μ‘Œμ§€λ§Œ 접근에 μ œν•œμ΄ μžˆμ§€ ⇒ μžμ‹νƒ€μž…μœΌλ‘œ λ§Œλ“€λ©΄ μ ‘κ·Ό κ°€λŠ₯
      1. μ‹€μ œμ μœΌλ‘œ 정보λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” Object Down Casting이 ν•„μš”ν•˜λ‹€
      2. 의미적으둜 λΆ€λͺ¨>μžμ‹

    instanceof

    μ—°μ‚°μž. 결과값은 boolean.

    1. λ°˜λ“œμ‹œ 상속관계일 λ•Œλ§Œ μ‚¬μš©ν•œλ‹€. (μ•„λ‹ˆλ©΄ 컴파일 였λ₯˜)
    2. variable instanceof ObjectType
    3. ⇨ μ™Όμͺ½μ˜ λ³€μˆ˜κ°€ 였λ₯Έμͺ½μ˜ Type이 될 수 μžˆλŠλƒ?
    4. μ™Όμͺ½μ˜ λ³€μˆ˜ν˜•μ΄ 였λ₯Έμͺ½μ˜ Typeκ³Ό κ°™κ±°λ‚˜ μ„œλΈŒ class일 λ•Œ true이닀. (μ™Όμͺ½ <= 였λ₯Έμͺ½)
    5. μΊμŠ€νŒ… ν•  λ•Œ 맀우 ꢌμž₯.
    if (cd instanceof Excel) {
        // Object Down Casting
        Excel ex = (Excel) cd;
        System.out.println("ex = " + ex);
        System.out.println("ex.color = " + ex.color);
    }