λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Note for moment

[OOP] μΆ”μƒν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€, λ‚˜μ—΄ν˜•(Enum)

by πŸ’œautumn 2020. 9. 3.

1. μΆ”μƒν΄λž˜μŠ€ (abstract class)

   : 상속 μ „μš© 클래슀public abstract class 클래슀λͺ… { }

   : 상속을 λͺ©μ μœΌλ‘œ ν•˜μ—¬ λ§Œλ“€μ–΄μ§„ 클래슀둜 직접적인 μΈμŠ€ν„΄μŠ€ 생성 λΆˆκ°€λŠ₯

   : 좔상 클래슀의 λ©”μ†Œλ“œλŠ” λͺ…령이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”(λΉ„μ–΄μžˆλŠ”) λ©”μ†Œλ“œλ‘œ λ―Έμ™„μ„± 된 λ©”μ†Œλ“œ

     → 즉, μ˜€λ²„λΌμ΄λ“œλ₯Ό κ°•μ œν•˜κΈ°μœ„ν•œ λ©”μ†Œλ“œ (μž‘μ—…μ§€μ‹œμž μ—­ν•  : κ°•μ œμ  κ·œμΉ™ 제곡) - μžμ‹ν΄λž˜μŠ€λŠ” 무쑰건 μ˜€λ²„λΌμ΄λ“œ

     → μ„ μ–Έ : μ ‘κ·Όμ§€μ •μž abstract λ°˜ν™˜ν˜• λ©”μ†Œλ“œλͺ…(νŒŒλΌλ―Έν„°) { };

   : μΆ”μƒν΄λž˜μŠ€μ˜ λͺ¨λ“  λ©”μ†Œλ“œκ°€ μΆ”μƒλ©”μ†Œλ“œμΈκ²ƒμ€ μ•„λ‹ˆλ‹€!

   : 닀쀑상속 λΆˆκ°€, λ‹¨μΌμƒμ†λ§Œ κ°€λŠ₯

 

  # μΆ”μƒν΄λž˜μŠ€κ°€ ν•„μš”ν•œ 이유?

  1) λ‹¨μˆœνžˆ 곡톡적인 속성을 λ¬Άμ–΄ μ½”λ“œμ˜ 쀑볡을 μ΅œμ†Œν™”, μƒμ†μ˜ λͺ©μ λ§Œ μ§€λ‹Œ 경우

    → κ·ΈλŸ¬λ‚˜ 이 λͺ©μ μΈ 경우 κΌ­ μΆ”μƒν΄λž˜μŠ€λ‘œ μ„ μ–Έν•˜μ§€ μ•Šμ•„λ„ 무관

  2) 클래슀 내뢀에 좔상 λ©”μ†Œλ“œκ°€ μ‘΄μž¬ν•˜λŠ” κ²½μš°λ°˜λ“œμ‹œ μΆ”μƒν΄λž˜μŠ€λ‘œ 선언해야함

    즉, μž‘μ—…μ§€μ‹œμžμ˜ 역할을 ν•˜κΈ° μœ„ν•œ 클래슀! "μƒμ†λ°›λŠ” ν΄λž˜μŠ€μ•Ό~ λ„ˆ 이 λ©”μ†Œλ“œ κΌ­ λ§Œλ“€μ–΄μ•Όν•΄(μ˜€λ²„λΌμ΄λ“œ)"

  

 

2. μΈν„°νŽ˜μ΄μŠ€ (Interface)

   : κ°€μž₯ 좔상적 κ°œλ…μ˜ μžλ£Œν˜•μœΌλ‘œ, μƒμˆ˜ν•„λ“œ(Constant Field)와 μΆ”μƒλ©”μ†Œλ“œ(abstract Method)둜만 κ΅¬μ„±λ˜μ–΄μžˆμŒ

     => 좔상 λ©”μ†Œλ“œ μ„ μ–Έμ‹œ public abstractλŠ” μƒλž΅κ°€λŠ₯ : μ™œλƒλ©΄ μ–΄μ§œν”Ό μΆ”μƒλ©”μ†Œλ“œλ§Œ μ„ μ–Έν•  수 μžˆκΈ°λ•Œλ¬Έμ—!

   : μΆ”μƒν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μž‘μ—…μ§€μ‹œμžμ˜ μ—­ν•  → μΆ”μƒλ©”μ†Œλ“œ = 무쑰건 μ˜€λ²„λΌμ΄λ“œ

   : μ΄λ•Œ defaultλ©”μ†Œλ“œλŠ” μ˜€λ²„λΌμ΄λ“œ ν•„μˆ˜κ°€ μ•„λ‹˜(상속은 되며 μ˜€λ²„λΌμ΄λ“œλ„ κ°€λŠ₯)

   : λ‹¨μΌμƒμ†μ˜ λ¬Έμ œμ μ„ λ³΄μ™„ν•˜κΈ° μœ„ν•œ κ²ƒμœΌλ‘œ, κ°œλ…λ§Œ μƒμ†λ°›κΈ°λ•Œλ¬Έμ— 닀쀑 상속 κ°€λŠ₯

   : μžμ‹ν΄λž˜μŠ€λ“€μ˜ 결합성이 μš°μˆ˜ν•˜μ—¬ μ‹œμŠ€ν…œ λ³€κ²½μ‹œ 영ν–₯ λ―ΈλΉ„ > μœ μ§€λ³΄μˆ˜ νš¨μœ¨μ„± 증가

  # μΈν„°νŽ˜μ΄μŠ€κ°€ ν•„μš”ν•œ 이유?

  1) 단일 μƒμ†μ˜ 문제점 보완 : κ°œλ…λ§Œ μƒμ†λ°›κΈ°λ•Œλ¬Έμ— 닀쀑상속이 κ°€λŠ₯

      => μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•œ 상속 : Realization

  2) μž‘μ—…μ§€μ‹œμ„œ : κ·œμΉ™μ œκ³΅

      => λ™μΌν•œ ν˜•νƒœμ˜ 클래슀만 λ§Œλ“€μ–΄μ§€κ²Œ 함

      => μžμ‹ν΄λž˜μŠ€ κ°„ 결합성이 μš°μˆ˜ν•˜μ—¬ μ‹œμŠ€ν…œ λ³€κ²½μ‹œ λ‹€λ₯Έ 클래슀둜 κ΅μ²΄λ˜μ–΄λ„ 영ν–₯ λ―ΈλΉ„

           (μœ μ§€λ³΄μˆ˜ νš¨μœ¨μ„± κ·ΉλŒ€ν™”)

 

 

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

   μΆ”μƒν΄λž˜μŠ€   μΈν„°νŽ˜μ΄μŠ€ 
λͺ©μ  μž‘μ—…μ§€μ‹œμž μ—­ν• (μ˜€λ²„λΌμ΄λ“œ κ°•μ œ)
상속 λͺ©μ 
μΆ”μƒλ©”μ†Œλ“œν˜•νƒœ λͺ…령이 μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ λͺ…령이 μ‘΄μž¬ν•΄λ„ 무관
상속 κ°€λŠ₯ 개수 단일상속 닀쀑상속

 

 

4.  상속 ν‚€μ›Œλ“œ

 

 

5. λ‚˜μ—΄ν˜• (Enum)

   : μƒμˆ˜ν•„λ“œ 선언이 λͺ©μ μΈ Interface의 λ¬Έμ œμ μ„ λ³΄μ™„ν•˜κΈ°μœ„ν•œ μ°Έμ‘°ν˜•

       * μƒμˆ˜ν•„λ“œμ„ μ–Έμ„ μœ„ν•΄ λ§Œλ“  μΈν„°νŽ˜μ΄μŠ€μ˜ 문제점 

       1) μ˜λ―ΈμžˆλŠ” λ¬Έμžμ—΄λ‘œ ν‘œν˜„λ˜μ§€ μ•ŠμŒ : 각각 λ‹€λ₯Έ 값인 것 ꡬ뢄 λΆˆκ°€(μˆ«μžκ°’μ΄ 좜λ ₯λ˜μ–΄ 무슨 의미λ₯Ό κ°–λŠ”μ§€ λͺ¨λ¦„)

       2) 값을 λŒ€ν‘œμ μœΌλ‘œ ν‘œν˜„ν•˜κΈ°μ— λΆ€μ μ ˆ : μƒμˆ˜ ν•„λ“œκ°€ μ„ μ–Έλœ μžλ£Œν˜•(클래슀)이 무의미

   : μ•„λž˜ μ˜ˆμ œλŠ” λ‹€λ₯Έ 것을 λŒ€ν‘œν•˜λŠ” μƒμˆ˜ν•„λ“œλ₯Ό μΈν„°νŽ˜μ΄μŠ€λ‘œ κ΅¬ν˜„ν–ˆμ„λ•Œ λ¬Έμ œμ μ΄λ‹€.

package enumerate;
// 단지 μƒμˆ˜ν•„λ“œλ₯Ό μ„ μ–Έν•˜κΈ°μœ„ν•΄ λ§Œλ“œλŠ” μΈν„°νŽ˜μ΄μŠ€
// μƒμˆ˜ν•„λ“œ : κ°’λŒ€μ‹  μ‚¬μš©ν•˜κΈ° μœ„ν•œ ν•„λ“œ
// μƒμˆ˜ν•„λ“œλ₯Ό ꡳ이 μΈν„°νŽ˜μ΄μŠ€μ— λ§Œλ“œλŠ” 이유? 선언이 κ°„λ‹¨ν•˜μž–μ•„ γ…Žνž£
public interface InterfaceOne {
	int INSERT=1, UPDATE=2, DELETE=3, FIND=4;
}

package enumerate;
//μΌλΆ€λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ‘œ μƒμˆ˜ν•„λ“œλ₯Ό μ„ μ–Έν•΄μ„œ ν™œμš©ν•˜λŠ”κ²ƒμ˜ 단점을 λ³΄μ—¬μ£ΌκΈ°μœ„ν•΄
//λ‹€λ₯Έ μƒμˆ˜ν•„λ“œλͺ…에 λ™μΌν•œ 값을 넣은 μƒμˆ˜ν•„λ“œλ₯Ό μ„ μ–Έ
public interface InterfaceTwo {
	int ADD=1, MODIFY=2, ERASE=3,SEARCH=4;
}
public static void main(String[] args) {
		// μƒμˆ˜ν•„λ“œλ₯Ό 좜λ ₯ν•˜λ©΄ κ·Έ 값이 좜λ ₯됨 > μ˜λ―ΈμžˆλŠ” μˆ«μžμ΄κΈ΄ν•˜μ§€λ§Œ λŒ€ν‘œμ„±μ΄ μ—†μŒ(무엇을 λŒ€ν‘œν•˜λŠ”κ°€λ₯Ό λͺ¨λ¦„)
		System.out.println("μž…λ ₯ = "+InterfaceOne.INSERT);
		System.out.println("λ³€κ²½ = "+InterfaceOne.UPDATE);
		System.out.println("μ‚­μ œ = "+InterfaceOne.DELETE);
		System.out.println("검색 = "+InterfaceOne.FIND);
		System.out.println("===============================");
		System.out.println("μž…λ ₯ = "+InterfaceTwo.ADD);
		System.out.println("λ³€κ²½ = "+InterfaceTwo.MODIFY);
		System.out.println("μ‚­μ œ = "+InterfaceTwo.ERASE);
		System.out.println("검색 = "+InterfaceTwo.SEARCH);
		System.out.println("===============================");
		
		//μƒμˆ˜ν•„λ“œμ™€ λ™μΌν•œ μžλ£Œν˜•μ˜ λ³€μˆ˜μ— μƒμˆ˜ν•„λ“œκ°’μ €μž₯κ°€λŠ₯
		int choice=InterfaceTwo.ADD;
		
		switch (choice) {
		//caseλŠ” λ³€μˆ˜λ‘œ 숫자만 받을 수 있음 => "μƒμˆ˜λ³€μˆ˜λ„ κ°€λŠ₯!"
		case InterfaceOne.INSERT:
			System.out.println("# 학생정보λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.");
			break;
		case InterfaceOne.UPDATE:
			System.out.println("# 학생정보λ₯Ό λ³€κ²½ν•©λ‹ˆλ‹€.");
			break;
		case InterfaceOne.DELETE:
			System.out.println("# 학생정보λ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.");
			break;
		case InterfaceOne.FIND:
			System.out.println("# 학생정보λ₯Ό κ²€μƒ‰ν•©λ‹ˆλ‹€.");
			break;
		}
		// 자 봐봐, μΌ€μ΄μŠ€κ΅¬λ¬Έμ—μ„œ InterfaceTwo.ADDλŠ” 
		// 사싀 InterfaceOne.INSERT κ°€ μ•„λ‹ˆμ•Ό!
		// κ·ΈλŸ¬λ‚˜ 값이 λ™μΌν•˜λ‹€κ³  κ°™λ‹€κ³  μ²˜λ¦¬ν•΄λ²„λ Έμ§€?
		// 이게 μΈν„°νŽ˜μ΄μŠ€μƒμˆ˜ν•„λ“œμ˜ λ¬Έμ œμ μ΄μ•Ό!
		
		//μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•œ μƒμˆ˜κ°’μΆœλ ₯의 단점
		// 1) μ˜λ―ΈμžˆλŠ” λ¬Έμžμ—΄λ‘œ ν‘œν˜„λ˜μ§€ μ•ŠμŒ : 각각이 λ‹€λ₯Έκ°’μž„μ„ ꡬ뢄할 수 μ—†μŒ
		// 2) 값을 λŒ€ν‘œμ μœΌλ‘œ ν‘œν˜„ν•˜κΈ° λΆ€μ μ ˆ : μƒμˆ˜ν•„λ“œκ°€ μ„ μ–Έλœ μžλ£Œν˜•μ΄ 무의미
		
		// 이것을 λ³΄μ™„ν•˜κΈ°μœ„ν•΄μ„œ Enumν˜•μ΄ λ‚˜μ˜¨κ±°μ•Ό
		// λ‚˜μ—΄ν˜• (Enumerate) => Since JDK1.5
		
	}

   * λ‚˜μ—΄ν˜•μ„ μ„ μ–Έν•˜λŠ” 방법 : public enum λ‚˜μ—΄ν˜•λͺ… { λ³€μˆ˜λͺ…, λ³€μˆ˜λͺ…, λ³€μˆ˜λͺ…, ... } 

      => 단지 λ³€μˆ˜λͺ…을 μ°¨λ‘€λŒ€λ‘œ λ‚˜μ—΄λ§Œ ν•˜λ©΄ 끝! 

      => μ΄ˆκΈ°κ°’μ„ μƒλž΅ν•˜κ³  λ³€μˆ˜λͺ…λ§Œ λ‚˜μ—΄μ‹œ μ„ μ–Έλ˜λŠ” μˆœμ„œλŒ€λ‘œ 0~ 1μ”© μ¦κ°€ν•˜λŠ” 값을 μžλ™μœΌλ‘œ μ§€λ‹˜

      => 값을 직접 μ§€μ •ν•˜λŠ” 것도 κ°€λŠ₯

      => μ΄λ ‡κ²Œ μ„ μ–Έν•˜λ©΄ 같은 μˆ«μžκ°’μ„ 가져도 λ‹€λ₯Έ μƒμˆ˜ ν•„λ“œ(λ‹€λ₯Έν΄λž˜μŠ€,λ³€μˆ˜λͺ…)λ₯Ό ꡬ뢄할 수 있음!

 

   * λ‚˜μ—΄ν˜•μ„ ν™œμš©ν•œ 예

package enumerate;
// Enumν˜•μ—μ„œ μƒμˆ˜ν•„λ“œλ₯Ό μ„ μ–Έν•˜λŠ” 방법 : λ³€μˆ˜λͺ…μž‘μ„± 끝.
// μ΄ˆκΈ°κ°’μƒλž΅ : μƒμˆ˜ν•„λ“œμ—μ„œ μ„ μ–Έλ˜λŠ” μˆ«μžλŒ€λ‘œ 0λΆ€ν„° μ‹œμž‘ν•˜μ—¬ 1μ”© μ¦κ°€ν•œ 값을 μ§€λ‹˜
public enum EnumOne {
	INSERT,UPDATE,DELETE,FIND;
}

// 같은 μƒμˆ˜κ°’μ„ κ°™μ§€λ§Œ λ‹€λ₯Έ λ‚˜μ—΄ν˜•μ„ μ„ μ–Έ
package enumerate;

public enum EnumTwo {
	ADD,MODIFY,ERASE,SEARCH;
}
	public static void main(String[] args) {
		// μƒμˆ˜ν•„λ“œμΆœλ ₯ => μˆ«μžκ°’μ΄ 좜λ ₯X μƒμˆ˜ν•„λ“œλͺ…μΆœλ ₯O
		//             => μ˜λ―ΈμžˆλŠ” μˆ«μžλŒ€μ‹ , μ˜λ―ΈμžˆλŠ” λ¬Έμžμ—΄ 그자체둜 ν‘œν˜„ (λŒ€ν‘œμ„± 유)
		System.out.println("μž…λ ₯ = "+EnumOne.INSERT);
		System.out.println("λ³€κ²½ = "+EnumOne.UPDATE);
		System.out.println("μ‚­μ œ = "+EnumOne.DELETE);
		System.out.println("검색 = "+EnumOne.FIND);
		System.out.println("===============================");
		System.out.println("μž…λ ₯ = "+EnumTwo.ADD);
		System.out.println("λ³€κ²½ = "+EnumTwo.MODIFY);
		System.out.println("μ‚­μ œ = "+EnumTwo.ERASE);
		System.out.println("검색 = "+EnumTwo.SEARCH);
		System.out.println("===============================");
		
		//μƒμˆ˜ν•„λ“œλŠ” int값을 가지고 μžˆμ§€λ§Œ intν˜•μ˜ λ³€μˆ˜μ— μ €μž₯ λΆˆκ°€λŠ₯!
		// int choice=EnumOne.INSERT;  >>  Type Mismatch λ°œμƒ
        //μƒμˆ˜ν•„λ“œκ°€ μ„ μ–Έλœ Enumν˜•μ„ μ΄μš©ν•˜μ—¬ μƒμ„±λœ μ°Έμ‘°λ³€μˆ˜μ—λŠ” String으둜 μ €μž₯κ°€λŠ₯
		EnumOne choice=EnumOne.INSERT;   //μ΄λ•Œ μžλ£Œν˜•μ΄ EnumOneμ΄λ―€λ‘œ EnumOneκ°’λ§Œ μ €μž₯κ°€λŠ₯
		
		//μŠ€μœ„μΉ˜ ꡬ문에 λ“€μ–΄μžˆλŠ” Enumμžλ£Œν˜•μ€ λͺ¨λ‘ λ™μΌν•œ μžλ£Œν˜•μ˜ μƒμˆ˜ν•„λ“œλ‘œλ§Œ ν‘œν˜„κ°€λŠ₯
		switch (choice) {
		//case에 EnumOneμžλ£Œν˜•μ„ μ‚¬μš©ν–ˆμœΌλ―€λ‘œ μžλ£Œν˜•μƒλž΅ν•˜κ³  μƒμˆ˜ν•„λ“œλͺ…λ§Œ μ‚¬μš©ν•΄μ•Όν•¨
		case INSERT:    //같은 값인 ADDλ₯Ό 적으면 μ—λŸ¬! => 즉 값을 ꡬ뢄가λŠ₯ν•˜λ‹€λŠ” 것!
			System.out.println("# 학생정보λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.");
			break;
		case UPDATE:
			System.out.println("# 학생정보λ₯Ό λ³€κ²½ν•©λ‹ˆλ‹€.");
			break;
		case DELETE:
			System.out.println("# 학생정보λ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.");
			break;
		case FIND:
			System.out.println("# 학생정보λ₯Ό κ²€μƒ‰ν•©λ‹ˆλ‹€.");
			break;
		}
		System.out.println("===============================");
	
	}

 

 

 * Enumν˜•μ˜ μžλ£Œν˜• λ³€κ²½ μ°Έκ³  URL

https://blog.naver.com/irene-fts/221699036045

 

[DAY13] OOP(6) - μ§€μ •μž(modifier), μΈν„°νŽ˜μ΄μŠ€μ˜ ν™œμš©(Realization), extends, implements, default, enum, import

* μ§€μ •μž (Modifier)* JAVAμ°Έμ‘°ν˜• => 클래슀, μΈν„°νŽ˜μ΄μŠ€, λ‚˜μ—΄ν˜• => λŒ€λ¬Έμžλ‘œ μ‹œ...

blog.naver.com

 

λŒ“κΈ€