[Become a Java-MastaπŸ‘¨β€πŸ« 5μ£Όμ°¨] 상속, μ˜ˆμ™Έμ²˜λ¦¬, νŒ¨ν‚€μ§€

λ°°λ­‰Β·2021λ…„ 9μ›” 15일
0
post-thumbnail

🎯 λͺ©ν‘œ

μžλ°”μ˜ 상속, μ˜ˆμ™Έμ²˜λ¦¬, νŒ¨ν‚€μ§€μ— λŒ€ν•΄ ν•™μŠ΅ν•˜κΈ°.

πŸ“Œ ν•™μŠ΅ν•  것

상속

μ˜ˆμ™Έ 처리

νŒ¨ν‚€μ§€


상속

κΈ°μ‘΄ 클래슀λ₯Ό ν™•μž₯ν•˜μ—¬ μƒˆλ‘œμš΄ λ‚΄μš©μ„ λ§λΆ™μ΄κ±°λ‚˜ λ‚΄μš©μ˜ 일뢀λ₯Ό λ°”κΏ” μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것.

extends ν‚€μ›Œλ“œλ‘œ 상속받을 수 μžˆλ‹€.

  • 클래슀 <- 클래슀 : extends ν‚€μ›Œλ“œλ‘œ 단일 상속
  • μΈν„°νŽ˜μ΄μŠ€ <- μΈν„°νŽ˜μ΄μŠ€ : extends ν‚€μ›Œλ“œλ‘œ 닀쀑 상속
  • 클래슀 <- μΈν„°νŽ˜μ΄μŠ€ : implements ν‚€μ›Œλ“œλ‘œ 닀쀑 상속 & κ΅¬ν˜„

μž₯점 : μ½”λ“œμ˜ μž¬μ‚¬μš© (ζœ‰ -> 또 λ‹€λ₯Έ ζœ‰ μ°½μ‘°), ν™•μž₯용이
단점 : 높은 결합도

  • ν΄λž˜μŠ€μƒμ† (κ΅¬ν˜„μƒμ†)

    • Concrete클래슀 상속 : μ˜¨μ „ν•œ 클래슀 -> μž¬μ •μ˜ μ˜΅μ…˜

    • Abstract클래슀 상속 : λ―Έμ™„μ„± 클래슀

      • μΆ”μƒλ©”μ†Œλ“œ κ΅¬ν˜„λΆ€ 없이 μ„ μ–ΈμœΌλ‘œλ§Œ 이루어진 λ©”μ†Œλ“œ
        섀계상 μ˜λ„μ μœΌλ‘œ μΆ”μƒν΄λž˜μŠ€λ‘œ λ§Œλ“œλŠ” 경우
      • μΆ”μƒλ©”μ†Œλ“œ ζœ‰ : XXX(); -> μž¬μ •μ˜ ν•„μˆ˜
      • μΆ”μƒλ©”μ†Œλ“œ η„‘ : XXX(){}; -> μž¬μ •μ˜ μ˜΅μ…˜

      1) μΆ”μƒν΄λž˜μŠ€λŠ” 직접 new둜 객체 생성을 λͺ»ν•œλ‹€.

      2) λ°˜λ“œμ‹œ ν•˜μœ„ 클래슀 μš”κ΅¬!

    extends XXX (단일상속)

    "μΌλ°˜ν™”"

  • μΈν„°νŽ˜μ΄μŠ€μƒμ† (ν‘œμ€€, 약속, spe, 방법)

    • μ‚¬μš©μž 관점 : μ‚¬μš©λ°©λ²•, 약속
    • 제곡자 관점 : κ΅¬ν˜„μ˜ μ±…μž„

    implements XXX,YYY (닀쀑상속)
    "μ‹€ν˜„"
    μΆ”μƒλ©”μ†Œλ“œμ™€ μƒμˆ˜λ‘œ 이루어진 νŠΉλ³„ν•œ νƒ€μž… -> μž¬μ •μ˜ ν•„μˆ˜


관계성

1. is a : 상속관계 (μΌλ°˜ν™”)

2. has a : μ†Œμœ  (연관관계 - 영ꡬ적)

3. use a : μ‚¬μš© (μ˜μ‘΄κ΄€κ³„ - μΌμ‹œμ )


λ©”μ†Œλ“œ μž¬μ •μ˜

논리적 μž¬μ •μ˜

μ „μ œμ‘°κ±΄ : 상속

  • μ „λΆ€λ‹€ λ’€κ°ˆμ•„ μ—ŽλŠ” μž¬μ •μ˜
  • 살짝 λ§λΆ™μ΄λŠ” κ΅¬ν˜•μ˜ μž¬μ •μ˜

1. λ©”μ†Œλ“œ 이름

2. λ§€κ°œλ³€μˆ˜ λͺ©λ‘

3. λ¦¬ν„΄νƒ€μž…

1 ~ 3κΉŒμ§€λŠ” κ°™μ•„μ•Ό 함

4. μ ‘κ·Όμ§€μ •μž κ°™κ±°λ‚˜ λ„“κ²Œ (넓어짐)

5. throws ꡬ문 μ˜ˆμ™Έ κ°™κ±°λ‚˜ ν•˜μœ„νƒ€μž…μœΌλ‘œ or μ•ˆλ˜μ§€κ±°λ‚˜ (쒁아짐)


λ‹€ν˜•μ„±

상속이 μ „μ œμ‘°κ±΄!

ν˜•νƒœκ°€ λ‹€μ–‘ν•œ μ„±μ§ˆ => λ‹€μ–‘ν•œ ν˜•νƒœλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

  • 객체 λ‹€ν˜•μ„± : Typeλ‹€ν˜•μ„±

  • λ©”μ†Œλ“œ λ‹€ν˜•μ„± : λ‹€μ€‘μ •μ˜(μ˜€λ²„λ‘œλ”©), μž¬μ •μ˜(μ˜€λ²„λΌμ΄λ”©)

Type λ‹€ν˜•μ„±

 Object <- Employee <- Engineer
 big ----------------- small
 
 Engineer e1 = new Engineer();
 Employee e2 = new Engineer();
 Object e3 = new Engineer();
 
 big >= small
 μž” = λ‚΄μš©λ¬Ό
 μ»€ν”Όμž” = 컀피
 ν…€λΈ”λŸ¬(withλΉ¨λŒ€) = 컀피
 
 μž”μ˜ ν˜•νƒœμ— 따라 μ»€ν”Όλ§ˆμ‹œλŠ” 방식이 κ²°μ •λœλ‹€.
 즉, 객체λ₯Ό 어디에 λ‹΄λŠλƒμ— 따라 객체의 μ‚¬μš©λ°©λ²•μ΄ 달라진닀.

 λ§Œμ•½ Object에 a, Employee에 b, Engineer에 cκ°€ μ„ μ–Έλ˜μ–΄ μžˆλ‹€κ³  ν•  λ•Œ,
 e3.a
 e2.a, e2.b
 e1.a, e1.b, e1.c μ‚¬μš©κ°€λŠ₯.

λ‹€ν˜•μ„±μ„ μ‚¬μš©(ν™œμš©)ν•˜λŠ” 경우

  1. μ΄ν˜• 집합 λ°°μ—΄

λ§Œμ•½ Engineer와 Managerλ“± λ‹€λ₯Έ 직무의 직원 총 100λͺ…μ˜ μƒλŸ¬λ¦¬λ₯Ό 관리할 리슀트λ₯Ό 생성할 λ•Œ μ‚¬μš©

Employee[] list = new Employee[100];
  1. λ§€κ°œλ³€μˆ˜ λ‹€ν˜•μ„±

Engineer와 Managerλ“± λ‹€μ–‘ν•œ 직무의 직원듀을 λ§€κ°œλ³€μˆ˜λ‘œ λ°›μ•„μ•Ό ν•  λ•Œ μ‚¬μš©


XXX(Employee e)

"직원듀 λͺ¨μ΄μ„Έμš”" -> "κ±°κΈ°μ„œ 직원듀 곡톡적인 이야기λ₯Ό 해야지, μ—”μ§€λ‹ˆμ–΄ or λ§€λ‹ˆμ € 이야기 ν•˜λ©΄ μ•ˆλ¨"

  1. λ¦¬ν„΄νƒ€μž… λ‹€ν˜•μ„±

κ²½μš°μ— 따라 λ¦¬ν„΄νƒ€μž…μ„ λ‹€λ₯΄κ²Œ 전달해야 ν•  λ•Œ μ‚¬μš©

Employee XXX(){
   if(...) return new Engineer();
   else return new Manager();
}

동적 바인딩

동적 바인딩 (Run-time) <-> 정적 바인딩 (Compile-time)

μ»΄νŒŒμΌμ‹œμ— μ»΄νŒŒμΌλŸ¬κ°€ μΈμ§€ν•œ 객체와 λŸ°νƒ€μž„μ‹œ μ‹€μ œ 객체λ₯Ό λ‹€λ₯΄κ²Œ 인지

// Employee에 μ •μ˜λœ getInfo()λ₯Ό 
// Engineerμ—μ„œ getInfo()λ₯Ό μ˜€λ²„λΌμ΄λ”© ν–ˆμ„ λ•Œ,

Employee e = new Engineer();
e.getInfo();
γ„΄ Compile-time : Employee
γ„΄ Run-time : Engineer

Employee e = new Engineer();μ—μ„œ 
eλŠ” Engineer에 μ—†λŠ” λ©”μ†Œλ“œλŠ” μ‚¬μš©ν•˜μ§€ λͺ»ν•˜μ§€λ§Œ
μœ μΌν•˜κ²Œ Engineerκ°€ 영ν–₯을 μ£ΌλŠ”κ²ƒμ€ μ˜€λ²„λΌμ΄λ”©λœ λ©”μ†Œλ“œμ΄λ‹€.

μ˜ˆμ™Έ 처리

μ˜ˆμ™Έ 처리 ν‚€μ›Œλ“œ 5가지 : try catch throw throws finally

μ˜ˆμ™Έ μ²˜λ¦¬λž€, ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 λ°œμƒν•  수 μžˆλŠ” 예기치 λͺ»ν•œ μ˜ˆμ™Έ λ°œμƒμ— λŒ€λΉ„ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것이며,

μ˜ˆμ™Έμ²˜λ¦¬μ˜ λͺ©μ μ€ μ˜ˆμ™Έμ˜ λ°œμƒμœΌλ‘œ μΈν•œ 싀행쀑인 ν”„λ‘œκ·Έλž¨μ˜ κ°‘μž‘μŠ€λŸ° 비정상 μ’…λ£Œλ₯Ό 막고 μ‹€ν–‰μƒνƒœλ₯Ό μœ μ§€ν•  수 μžˆλ„λ‘ 함

처리 방법

μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법은 크게 3κ°€μ§€λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

1. μ˜ˆμ™Έκ°€ λ°œμƒν•œ λ©”μ†Œλ“œ λ‚΄μ—μ„œ 직접 처리

try - catch - finally

try ꡬ문은 μ˜ˆμ™Έκ°€ λ°œμƒ ν•  κ°€λŠ₯성이 μžˆλŠ” λ²”μœ„λ₯Ό μ§€μ •ν•œλ‹€.

try κ΅¬λ¬Έμ—λŠ” μ΅œμ†Œ ν•˜λ‚˜ μ΄μƒμ˜ catch ꡬ문이 따라와 μœ„μΉ˜ν•΄μ•Ό ν•œλ‹€.

finally ꡬ문은 μ„ νƒμ μœΌλ‘œ μ‚¬μš© κ°€λŠ₯ν•˜λ©°, μ˜ˆμ™Έ λ°œμƒ, catch μœ λ¬΄μ™€ 상관없이 λ°˜λ“œμ‹œ μˆ˜ν–‰λœλ‹€.

try{
	// μ˜ˆμ™Έκ°€ λ°œμƒν•  λ§Œν•œ μ½”λ“œ
}catch (Exception e) {
    System.out.println(e.getMessage()); 
}finally{
    System.out.println("μ’…λ£Œ");
}

2. μ˜ˆμ™Έκ°€ λ°œμƒν•œ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ 곳으둜 μ˜ˆμ™Έ 객체λ₯Ό λ„˜κ²¨μ€Œ

throws

throwsλŠ” μ–΄λ– ν•œ λ©”μ†Œλ“œμ˜ λ‚΄λΆ€ μ†ŒμŠ€μ½”λ“œμ—μ„œ μ—λŸ¬κ°€ λ°œμƒν–ˆμ„μ‹œ 1번 λ°©λ²•μ²˜λŸΌ μ˜ˆμ™Έλ₯Ό 직접 μ²˜λ¦¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ,

이 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” κ³³μ—μ„œ 처리λ₯Ό ν•˜λ„λ‘ μ˜ˆμ™Έ 객체λ₯Ό 전달함.

public void throwMethod() throws Exception{
    // μ˜ˆμ™Έκ°€ λ°œμƒν•  λ§Œν•œ μ½”λ“œ
}

public static void main(String[] args) {
    try{ 
        throwMethod();
    }catch (Exception e) {
        System.out.println(e.getMessage()); 
    }finally{
        System.out.println("μ’…λ£Œ");
    }
}

3. μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έλ₯Ό μƒμ„±ν•˜μ—¬ 처리

throw

Exception 클래슀λ₯Ό μƒμ†λ°›λŠ” μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ 클래슀λ₯Ό μƒμ„±ν•˜μ—¬ ν•΄λ‹Ή μ˜ˆμ™Έ 객체λ₯Ό throwν•  수 μžˆλ‹€.

3번 방법은 μ•žμ„  1번 방법, 2번 방법을 λͺ¨λ‘ μ μš©κ°€λŠ₯ν•˜λ‹€.

public class CustomException extends Exception{
    public CustomException(){
        super("μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ λ°œμƒ!");
    }
}

1번 λ°©λ²•μ²˜λŸΌ try - catch문으둜 μ˜ˆμ™Έκ°€ λ°œμƒν•œ λ©”μ†Œλ“œ λ‚΄μ—μ„œ 직접 처리

try{
    throw new CustomException();
}catch (CustomException e) {
    System.out.println(e.getMessage()); 
}finally{
    System.out.println("μ’…λ£Œ");
}

2번 λ°©λ²•μ²˜λŸΌ ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ 곳으둜 μ˜ˆμ™Έ 객체λ₯Ό λ„˜κ²¨μ€Œ

public void thorwMethod() throws CustomException{
    if(μ˜ˆμ™Έ λ°œμƒ 쑰건) throw new CustomException();   
}

처리 κ·œμΉ™

1. try-catch

// μ μ ˆν•œ μ˜ˆμ™Έμ²˜λ¦¬
try{
	// μ˜ˆμ™Έκ°€ λ°œμƒν•  λ§Œν•œ μ½”λ“œ
} catch (XXException e){
	// μ²˜λ¦¬μ½”λ“œ
} catch (YYException e){
	// μ²˜λ¦¬μ½”λ“œ
} catch (Exception e){
	// μ²˜λ¦¬μ½”λ“œ
}
// μ μ ˆν•˜μ§€ μ•Šμ€ μ˜ˆμ™Έμ²˜λ¦¬
try{
	// μ˜ˆμ™Έκ°€ λ°œμƒν•  λ§Œν•œ μ½”λ“œ
} catch (Exception e){
	// μ²˜λ¦¬μ½”λ“œ
} catch (YYException e){
	// μ²˜λ¦¬μ½”λ“œ
} catch (XXException e){
	// μ²˜λ¦¬μ½”λ“œ
}

JVM이 λ˜μ§„ μ˜ˆμ™ΈλŠ” catchλ¬Έμž₯을 찾을 λ•Œ λ‹€ν˜•μ„±μ΄ 적용됨.

μƒμœ„ νƒ€μž…μ˜ μ˜ˆμ™Έκ°€ λ¨Όμ € μ„ μ–Έλ˜λŠ” 경우 뒀에 λ“±μž₯ν•˜λŠ” catchλŠ” μ ˆλŒ€ μ‹€ν–‰λ˜μ§€ μ•ŠμŒ.

Unreachable catch block for Exception.

상속 관계가 μ—†λŠ” κ²½μš°λŠ” λ¬΄κ΄€ν•˜λ‹€.

μž‘μ€ λ²”μœ„(μžμ‹)μ—μ„œ 큰 λ²”μœ„(λΆ€λͺ¨)순으둜 catch문을 μ •μ˜ν•˜λŠ”κ²ƒμ΄ μ μ ˆν•˜κ²Œ μ˜ˆμ™Έμ²˜λ¦¬ν•˜λŠ” λ°©λ²•μž„.

2. throws

class Parent {

    void methodA() throws IOExeption{}
    
    void methodB() throws ClassNotFoundException{}
    
}

class Child extends Parent {

    @override
    void methodA() throws FileNotFoundException{}

    @override
    void methodB() throws Exception{} // 문제 λ°œμƒ!
    
}

μžμ‹μ΄ λΆ€λͺ¨μ˜ λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•  λ•Œ, λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ λ˜μ§€λŠ” μ˜ˆμ™Έλ³΄λ‹€ 더 λΆ€λͺ¨μ˜ μ˜ˆμ™Έλ₯Ό 던질 수 μ—†λ‹€!

(κ°™κ±°λ‚˜ ν•˜μœ„νƒ€μž…μœΌλ‘œ or μ•ˆλ˜μ§€κ±°λ‚˜ (쒁아짐))

즉, λΆ€λͺ¨Aκ°€ λ˜μ§€λŠ” μ–΄λŠ μžμ‹bκ°€ μžˆλŠ”λ°, A의 μžμ‹μΈ aκ°€ 이 b의 λΆ€λͺ¨μΈ Bλ₯Ό 던질 μˆ˜λŠ” μ—†λ‹€.

aλŠ” b λ˜λŠ” b보닀 더 μž‘μ€ μžμ‹λΆ€ν„° 던질 수 있음.


νŒ¨ν‚€μ§€

  • 클래슀λ₯Ό κ΅¬λΆ„μ§“λŠ” 폴더 κ°œλ…
  • νŒ¨ν‚€μ§€μ΄λ¦„μ„ java 둜 μ‹œμž‘ν•˜λ©΄ μ•ˆλœλ‹€.
  • νŒ¨ν‚€μ§€ 이름과 μœ„μΉ˜ν•œ ν΄λ”μ˜ 이름이 κ°™μ•„μ•Όν•œλ‹€.
  • λͺ¨λ“  ν΄λž˜μŠ€μ—λŠ” μ •μ˜κ°€ λ˜μ–΄μžˆλŠ” 클래슀 이름과 νŒ¨ν‚€μ§€ 이름이 μ‘΄μž¬ν•œλ‹€ (νŒ¨ν‚€μ§€λ₯Ό λ”°λ‘œ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ λ””ν΄νŠΈ νŒ¨ν‚€μ§€).
  • νŒ¨ν‚€μ§€ 이름 + 클래슀 이름이 합쳐져야 클래슀λ₯Ό μ˜¨μ „νžˆ ν‘œν˜„ν•  수 있으며 이λ₯Ό FQCN(Fully Qualified Class Name)라고 ν•œλ‹€.

ex) com.ssafy νŒ¨ν‚€μ§€μ˜ JavaTest 클래슀λ₯Ό FQCN둜 ν‘œν˜„ν•˜λ©΄ com.ssafy.JavaTestκ°€ 됨

λͺ…λͺ… κ·œμΉ™

  • μžλ°” μ˜ˆμ•½μ–΄ μ‚¬μš©κΈˆμ§€
  • μ†Œλ¬Έμžλ§Œ μ‚¬μš©

νŒ¨ν‚€μ§€ μ‚¬μš©

  • importν‚€μ›Œλ“œλ‘œ νŒ¨ν‚€μ§€λͺ…을 지정
  • ν•΄λ‹Ή νŒ¨ν‚€μ§€μ˜ λͺ¨λ“  클래슀λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ import com.ssafy.*; 라고 μ„ μ–Έν•˜λ©΄ 됨
  • νŠΉμ • 클래슀만 μ‚¬μš©ν•˜λ €λ©΄, * λŒ€μ‹  클래슀λͺ…을 μ§€μ •ν•˜λ©΄ 됨

μ ‘κ·Ό μ œμ–΄μž

μ‚¬μš© μ˜ˆμ‹œ

  • νŒ¨ν‚€μ§€ μ„ μ–Έλ¬Έ (0 or 1)
package top.sub....;

// 물리적 : 폴더
// 보톡 domain name(Unique!) μ—­μˆœμ‚¬μš©
  • importλ¬Έ (0 ~ 倚)
import top.sub...ν΄λž˜μŠ€μ΄λ¦„;// μ†ŒμŠ€ 클래슀λͺ… λ°”λ‘œμ‚¬μš©
import top.sub...*;// all classes, interfaces

// (not package) : importλ‹¨μœ„λŠ” νŒ¨ν‚€μ§€κ°€ μ•„λ‹˜, 클래슀 λ‹¨μœ„!

ν˜„ ν΄λž˜μŠ€μ•ˆμ—μ„œ μ°Έμ‘°, μ‚¬μš©ν•˜λŠ” ν΄λž˜μŠ€κ°€ μžμ‹ κ³Ό 같은 νŒ¨ν‚€μ§€κ°€ μ•„λ‹Œ 경우 λͺ…μ‹œ
단, java.lang은 μžλ™μœΌλ‘œ 뢈러옴

profile
SSAFY 6th -> SEC VD SW πŸ‘¨β€πŸ’»πŸ”₯

0개의 λŒ“κΈ€