Program Language/java

객체지ν–₯ μƒν™œμ²΄μ‘° 8, 일급 μ»¬λ ‰μ…˜μ΄λž€

κ°œλ°œν•˜λŠ” 주디씨 2023. 11. 23. 15:39

 

 

 

이건 일급 μ»¬λ ‰μ…˜μ„ μ μš©ν•˜μ‹œλ©΄
쒋을 것 κ°™μ•„μš”.

 

 

μš°ν…Œμ½” ν”„λ¦¬μ½”μŠ€λ₯Ό ν•˜λ©΄μ„œ, 뜨거운 감자πŸ₯”μ˜€λ˜ μΌκΈ‰μ»¬λ ‰μ…˜ λ„λŒ€μ²΄ 이게 뭐길래... 객체지ν–₯ μƒν™œμ²΄μ‘° μ›μΉ™μ—μ„œ μˆ˜λ„μ—†μ΄ κ°•μ‘°ν•˜κ³  μžˆλŠ” 이 λ‚΄μš©μ„ λ‹€λ€„λ³΄κ³ μž ν•œλ‹€.

 

일급 μ»¬λ ‰μ…˜(First Class Collection)

μ†ŒνŠΈμ›μŠ€ μ•€μ†”λ‘œμ§€μ˜ 객체지ν–₯ μƒν™œμ²΄μ‘° 파트의 κ·œμΉ™ 8μ—μ„œ μ–ΈκΈ‰λœ λ‚΄μš©μœΌλ‘œ λ‹€μŒκ³Ό 같은 κ·œμΉ™μ„ μ μš©ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•˜κ³  μžˆλ‹€.

- μ½œλ ‰μ…˜μ„ ν¬ν•¨ν•œ ν΄λž˜μŠ€λŠ” λ°˜λ“œμ‹œ λ‹€λ₯Έ 멀버 λ³€μˆ˜κ°€ μ—†μ–΄μ•Ό ν•œλ‹€.
- 각 μ½œλ ‰μ…˜μ€ κ·Έ 자체둜 포μž₯돼 μžˆμœΌλ―€λ‘œ 이제 μ½œλ ‰μ…˜κ³Ό κ΄€λ ¨λœ λ™μž‘μ€ 근거지가 λ§ˆλ ¨λœμ…ˆμ΄λ‹€.
- ν•„ν„°κ°€ 이 μƒˆ 클래슀의 일뢀가 됨을 μ•Œ 수 μžˆλ‹€.
- ν•„ν„°λŠ” λ˜ν•œ 슀슀둜 ν•¨μˆ˜ 객체가 될 수 μžˆλ‹€.
- λ˜ν•œ μƒˆ ν΄λž˜μŠ€λŠ” 두 그룹을 같이 λ¬ΆλŠ”λ‹€λ“ κ°€ 그룹의 각 μ›μ†Œμ— κ·œμΉ™μ„ μ μš©ν•˜λŠ” λ“±μ˜ λ™μž‘μ„ μ²˜λ¦¬ν•  수 μžˆλ‹€.
- μ΄λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ— λŒ€ν•œ κ·œμΉ™μ˜ ν™•μ‹€ν•œ ν™•μž₯μ΄μ§€λ§Œ κ·Έ 자체λ₯Ό μœ„ν•΄μ„œλ„ μ€‘μš”ν•˜λ‹€.
- μ½œλ ‰μ…˜μ€ μ‹€λ‘œ 맀우 μœ μš©ν•œ μ›μ‹œ νƒ€μž…μ΄λ‹€.
- λ§Žμ€ λ™μž‘μ΄ μžˆμ§€λ§Œ ν›„μž„ ν”„λ‘œκ·Έλž˜λ¨Έλ‚˜ μœ μ§€λ³΄μˆ˜ λ‹΄λ‹Ήμžμ— 의미적 μ˜λ„λ‚˜ λ‹¨μ΄ˆλŠ” 거의 μ—†λ‹€.

 

즉, Collection을 Wrapping ν•˜λ©΄μ„œ κ·Έ μ™Έμ˜ λ‹€λ₯Έ 멀버 λ³€μˆ˜κ°€ μ—†λŠ” μƒνƒœλ₯Ό 일급 μ»¬λ ‰μ…˜μ΄λΌκ³  λΆ€λ₯Έλ‹€. 

 

μ•„λž˜ μ˜ˆμ‹œλ₯Ό 보면 μ–΄λ–»κ²Œ μƒκ²ΌλŠ”μ§€ λ°”λ‘œ 이해할 수 μžˆλ‹€.

 public class Cars {
    // 멀버 λ³€μˆ˜κ°€ ν•˜λ‚˜λ°–μ— μ—†μŒ
    private List<Car> carList;

    public Cars(List<Car> carList) {
        this.carList = carList;
    }
}

 

μ™œ μ‚¬μš©ν• κΉŒ?

1) λΉ„μ§€λ‹ˆμŠ€μ— 쒅속적인 자료ꡬ쑰
2) Collection의 λΆˆλ³€μ„±μ„ 보μž₯
3) μƒνƒœμ™€ ν–‰μœ„λ₯Ό ν•œ κ³³μ—μ„œ 관리
4) 이름이 μžˆλŠ” μ»¬λ ‰μ…˜

 

λΉ„μ¦ˆλ‹ˆμŠ€μ— 쒅속적인 자료ꡬ쑰

μ„œλΉ„μŠ€ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•  λ•Œ ν•΄λ‹Ή λ©”μ„œλ“œ λ‚΄μ—μ„œ νŠΉμ • validation 쑰건듀을 ν•¨κ»˜ κ΅¬ν˜„ν•œλ‹€λ©΄ λͺ¨λ“  μž₯μ†Œμ—μ„œ validation κ²€μ¦μ½”λ“œκ°€ λ“€μ–΄μ•Όν•˜λŠ” 문제점이 λ°œμƒν•œλ‹€. μ΄λŸ¬ν•œ λ¬Έμ œλŠ” 일급 μ»¬λ ‰μ…˜μ„ λ§Œλ“€μ–΄ νŠΉμ • 쑰건으둜 λ§Œλ“€ 수 μžˆλŠ” μƒˆλ‘œμš΄ 자료ꡬ쑰λ₯Ό μƒμ„±ν•˜λ©΄ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

 

 

public class Cars {

    private List<Car> carList;

    public Cars(List<Car> carList) {
        validateCarName(carList);
        validateDuplicateName(carList);
        this.carList = carList;
    }

    ...

}

 

μ΄λŸ°μ‹μœΌλ‘œ 객체 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ° μ „, validation 을 확인해주고 톡과 μ‹œμ—λ§Œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ„λ‘ μ’€ 더 λͺ…ν™•ν•˜κ²Œ 객체λ₯Ό λ§Œλ“€ 수 μžˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ 자료ꡬ쑰λ₯Ό λΉ„μ¦ˆλ‹ˆμŠ€μ— μ’…μ†μ μœΌλ‘œ κ΅¬ν˜„ν•  수 μžˆλ‹€. 

 

Collection의 λΆˆλ³€μ„±μ„ 보μž₯

λ§Žμ€ μ‚¬λžŒλ“€μ΄ ν—·κ°ˆλ¦¬λŠ” 것 쀑 ν•˜λ‚˜κ°€ Javaμ—μ„œ final 선언이 λΆˆλ³€μ„ λ§Œλ“€μ–΄μ€€λ‹€κ³  μ˜€ν•΄ν•˜λŠ” 것이닀.

 

final List<Car> carList;

 

μœ„μ™€ 같은 μ½”λ“œμ—μ„œ CarListλŠ” add, remove 처럼 데이터λ₯Ό λ³€κ²½ ν•  수 μ—†μ„κΉŒ? ❌No. 변경이 κ°€λŠ₯ν•˜λ‹€.

μ •ν™•νžˆ λ§ν•˜μžλ©΄ final은 μž¬ν• λ‹Ήμ€ λΆˆκ°€λŠ₯ν•˜λ„λ‘ ν•˜λŠ” 것이지 λΆˆλ³€κ°μ²΄λ‘œ λ§Œλ“€μ–΄μ£ΌλŠ” 것은 μ•„λ‹ˆλ‹€. λ”°λΌμ„œ add, remove 와 같은 λ©”μ„œλ“œλ‘œ λ‚΄μš©μ„ λ³€κ²½ν•  수 μžˆλŠ” 것이닀.

 

κ·Έλ ‡λ‹€λ©΄, Javaμ—μ„œ λΆˆλ³€κ°μ²΄λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•œλ‹€λ©΄ μ–΄λ–€μ‹μœΌλ‘œ μ‚¬μš©ν•΄μ•Όν• κΉŒ? λ°”λ‘œ, 일급 μ»¬λ ‰μ…˜ + wrapper classλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆλ‹€. μ΄λ•Œ μœ μ˜ν•  점 λ‘κ°€μ§€λŠ” λ‹€μŒκ³Ό κ°™λ‹€. (*μš°ν…Œμ½” 2κΈ° ν‹°κ±°λ‹˜μ˜ μΌκΈ‰μ»¬λ ‰μ…˜ λ‚΄μš©μ„ μ°Έκ³ ν•˜μ—¬ μ΄ν•΄ν–ˆμŠ΅λ‹ˆλ‹€.)

  • getter, setterλ₯Ό λ§Œλ“€μ§€ μ•Šμ•„ λ‚΄λΆ€ κ°’μ˜ 변경이 λΆˆκ°€λŠ₯ν•˜λ„λ‘ ν•΄μ•Όν•œλ‹€.
  • μƒμ„±μžλ₯Ό λ§Œλ“€ λ•Œ unmodifiableListλ₯Ό μ‚¬μš©ν•˜μ—¬ λΆˆλ³€μ„ 보μž₯ν•΄μ•Όν•œλ‹€.
return Collections.unmodifiableList(carList);

 

즉, 일급 μ»¬λ ‰μ…˜μ„ λ§Œλ“€ λ•ŒλŠ” collection 값을 κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•˜λŠ” κΈ°λŠ₯을 두지 μ•ŠλŠ” 것이 μ€‘μš”ν•˜λ‹€. λ°˜ν™˜ μ‹œ, κ°€κ³΅λœ 값을 λ°˜ν™˜ν•˜κ±°λ‚˜ unmodifiableList λ₯Ό μ‚¬μš©ν•˜μ—¬ λΆˆλ³€μ„±μ„ κΌ­ 보μž₯해주도둝 ν•˜μž.ᐟ.ᐟ 

 

μƒνƒœμ™€ ν–‰μœ„λ₯Ό ν•œ κ³³μ—μ„œ 관리

일급 μ»¬λ ‰μ…˜μ€ κ°’κ³Ό 둜직이 ν•¨κ»˜ μ‘΄μž¬ν•˜μ—¬ μ™ΈλΆ€μ—μ„œ μ€‘λ³΅λœ λ©”μ„œλ“œμ˜ 생성을 ν•˜λŠ” 것을 방지해쀀닀. 예λ₯Όλ“€μ–΄ λ‹€μŒκ³Ό 같은 μš”κ΅¬μ‚¬ν•­μ΄ μžˆλ‹€κ³  κ°€μ •ν•΄λ³΄μž.

 

문제) λŒ€ν•™κ΅ 학생듀을 ν•™λ…„ 별 정보λ₯Ό List둜 κ΄€λ¦¬ν•˜κ³ μž ν•  λ•Œ 각 ν•™λ…„μ˜ 평균 학점을 κ΅¬ν•˜μ‹œμ˜€.

List<Student> 1ν•™λ…„ = new ArrayList<>();
List<Student> 2ν•™λ…„ = new ArrayList<>();
List<Student> 3ν•™λ…„ = new ArrayList<>();
List<Student> 4ν•™λ…„ = new ArrayList<>();

 

λ§Œμ•½, ν•™λ…„ λ³„λ‘œ Listλ₯Ό κ΄€λ¦¬ν•œλ‹€λ©΄ νŠΉμ • ν•™λ…„μ˜ 평균학점을 κ΅¬ν•˜λŠ” λ™μΌν•œ λ‘œμ§μ„ 각각의 ν•™λ…„ 별 μ—¬λŸ¬ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— λΉ„νš¨μœ¨μ μ΄λΌλŠ” 것을 μ•Œ 수 μžˆλ‹€. μ΄λŸ¬ν•œ λ¬Έμ œλŠ” 일급 μ»¬λ ‰μ…˜μ„ μƒμ„±ν•˜κ³  ν•΄λ‹Ή λ©”μ„œλ“œλ“€μ„ 일급 μ»¬λ ‰μ…˜ 내에 λ§Œλ“€μ–΄λ‘μ–΄ μ™ΈλΆ€μ—μ„œλŠ” ν˜ΈμΆœν•˜λ„λ‘ ν•œλ‹€λ©΄ μƒνƒœμ™€ ν–‰μœ„λ₯Ό κ΄€λ¦¬ν•˜λ©° λ™μΌν•œ μ½”λ“œλ₯Ό μ€‘λ³΅ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

 

public class Student{

	private List<Student> studentList;
    
    public Student(List<Student> studentList){
    	this.studentList = studentList;
    
    }
    
    public float getGradeAvg(){
    	//ν•™λ…„ 별 학점 평균을 κ΅¬ν•˜λŠ” 둜직 κ΅¬ν˜„
        ...
    }

}

 

 

이름이 μžˆλŠ” μ»¬λ ‰μ…˜

ν•™λ…„ 별 List 정보λ₯Ό κ΄€λ¦¬ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 ν–ˆμ„ λ•Œ 별 λ‹€λ₯Έ 문제λ₯Ό λͺ»μ°Ύμ„ 수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜, ν”„λ‘œμ νŠΈκ°€ 컀지고 λ‹€λ₯Έ λ™λ£Œλ“€κ³Ό ν˜‘μ—…ν•˜κ²Œ λœλ‹€λ©΄ collection에 λͺ…ν™•ν•œ 넀이밍을 ν•„μš”λ‘œ ν•œλ‹€.

List<Student> 1ν•™λ…„ = new ArrayList<>();
List<Student> 2ν•™λ…„ = new ArrayList<>();
List<Student> 3ν•™λ…„ = new ArrayList<>();
List<Student> 4ν•™λ…„ = new ArrayList<>();

 

  • ν•΄λ‹Ή 객체듀을 검색할 λ•Œ λ³€μˆ˜λͺ… 만으둜 검색을 ν•  수 μžˆλ‹€. λ³€μˆ˜λͺ…을 λͺ¨λ₯Ό μ‹œ 검색을 ν•˜κΈ° μ–΄λ ΅λ‹€.
  • λ‹¨μˆœνžˆ λ³€μˆ˜λͺ…에 의미λ₯Ό 깊게 λΆ€μ—¬ν•˜κΈ° μ–΄λ ΅λ‹€.

λ”°λΌμ„œ ν•™λ…„ 이름을 일급 μ»¬λ ‰μ…˜ 자체둜 λ§Œλ“€μ–΄λ‘λ©΄ λ³€μˆ˜λͺ…을 λ„˜μ–΄μ„œ κ·Έ 의미λ₯Ό λͺ…ν™•ν•˜κ²Œ λΆ€μ—¬ν•  수 μžˆλ‹€.

 

Freshman freshman = new Freshman(~~);
Sophomore sophomore = new Sophomore(~~);
Junior junior = new Junior(~~);
Senior senior = new Senior(~~);

 

이처럼 일급 μ»¬λ ‰μ…˜μ€ 객체지ν–₯ 원칙을 잘 λ”°λ₯΄κ³  있으며, ν•„μš”ν•œ 뢀뢄에 μ μž¬μ μ†Œν•˜κ²Œ μ‚¬μš©ν–ˆμ„ λ•Œ λ”μš± 진가λ₯Ό λ°œνœ˜ν•œλ‹€.

 

끝으둜

μš°ν…Œμ½” ν”„λ¦¬μ½”μŠ€λ₯Ό μ§„ν–‰ν•˜λ©°, 쒋은 아이디어λ₯Ό 많이 얻은 것도 μ‚¬μ‹€μ΄μ§€λ§Œ μ œλŒ€λ‘œ μ•Œμ§€ λͺ»ν•˜κ³  잘λͺ»λœ 정보λ₯Ό μ „ν•˜λŠ” 것도 λ§Žμ•˜κΈ°μ— μ–΄λ–€ 것을 μ‚¬μš©ν•˜κ³  μ μš©ν•˜κ³ μž ν•œλ‹€λ©΄ λ‚˜μ˜ ν”„λ‘œμ νŠΈμ™€ μ†ŒμŠ€λ₯Ό 기반으둜 μ΄ν•΄ν•˜λŠ” μŠ΅κ΄€μ„ κ°€μ Έμ•Όκ² λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€ :)

 

참고자료

https://jojoldu.tistory.com/412
https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/
https://brainbackdoor.tistory.com/140