πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”

    μŠ€νŠΈλ¦Όμ€ μ£Όμ˜ν•΄μ„œ μ‚¬μš©ν•˜λΌ - [7μž₯. λžŒλ‹€μ™€ 슀트림(μ•„μ΄ν…œ45)]

    πŸ“™ 1. 슀트림의 νŠΉμ§• λ‹€λŸ‰μ˜ 데이터 처리 μž‘μ—…(μˆœμ°¨μ μ΄λ“  병렬적이든)을 λ•κ³ μž μžλ°” 8에 슀트림 APIκ°€ μΆ”κ°€λ˜μ—ˆλ‹€. 슀트림의 νŠΉμ§•μ€ μ•„λž˜μ™€ κ°™λ‹€. 슀트림 μ•ˆμ˜ 데이터 μ›μ†Œλ“€μ€ 객체 μ°Έμ‘°λ‚˜ κΈ°λ³Έ νƒ€μž… κ°’(int, long, double)이닀. 슀트림 νŒŒμ΄ν”„λΌμΈμ€ μ†ŒμŠ€ μŠ€νŠΈλ¦Όμ—μ„œ μ‹œμž‘ν•΄ 쒅단 μ—°μ‚°(terminal operation)으둜 λλ‚˜λ©°, κ·Έ 사이에 ν•˜λ‚˜ μ΄μƒμ˜ 쀑간 μ—°μ‚°(intermediate operation)이 μžˆμ„ 수 μžˆλ‹€. 각 쀑간 연산은 μŠ€νŠΈλ¦Όμ„ μ–΄λ– ν•œ λ°©μ‹μœΌλ‘œ λ³€ν™˜ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, 각 μ›μ†Œμ— ν•¨μˆ˜λ₯Ό μ μš©ν•˜κ±°λ‚˜ νŠΉμ • 쑰건을 만쑱 λͺ»ν•˜λŠ” μ›μ†Œλ₯Ό κ±ΈλŸ¬λ‚Ό 수 μžˆλ‹€. 슀트림 νŒŒμ΄ν”„λΌμΈμ€ 지연 평가(lazy evaluation)λœλ‹€. ν‰κ°€λŠ” 쒅단 연산이 호좜될 λ•Œ 이뀄지며, 쒅단 연산에 ..

    ν‘œμ€€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λΌ - [7μž₯. λžŒλ‹€μ™€ 슀트림(μ•„μ΄ν…œ44)]

    πŸ“™ 1. ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ μžλ°”κ°€ λžŒλ‹€λ₯Ό μ§€μ›ν•˜λ©΄μ„œ μƒμœ„ 클래슀의 κΈ°λ³Έ λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•΄ μ›ν•˜λŠ” λ™μž‘μ„ κ΅¬ν˜„ν•˜λŠ” ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄μ˜ 맀λ ₯이 크게 μ€„μ—ˆλ‹€. 이λ₯Ό λŒ€μ²΄ν•˜λŠ” λ°©λ²•μœΌλ‘œ ν•¨μˆ˜ 객체λ₯Ό λ°›λŠ” 정적 νŒ©ν„°λ¦¬λ‚˜ μƒμ„±μžλ₯Ό μ œκ³΅ν•˜λŠ” 방법이 μžˆλ‹€. 즉, ν•¨μˆ˜ 객체λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›λŠ” μƒμ„±μžμ™€ λ©”μ„œλ“œλ₯Ό 더 많이 μ‚¬μš©ν•˜λŠ” 것이닀. LinkedHashMap의 removeEldestEntryλ₯Ό μ‚΄νŽ΄λ³΄μž. removeEldestEntryλ₯Ό λ‹€μŒκ³Ό 같이 μž¬μ •μ˜ν•˜λ©΄, 맡에 μ›μ†Œκ°€ 100κ°œκ°€ 될 λ•Œλ§ˆλ‹€ κ°€μž₯ 였래된 μ›μ†Œλ₯Ό ν•˜λ‚˜μ”© μ œκ±°ν•œλ‹€. // κΈ°μ‘΄ public class LinkedHashMap extends HashMap implements Map { ... protected boolean removeEldestEntry..

    λžŒλ‹€λ³΄λ‹€λŠ” λ©”μ„œλ“œ μ°Έμ‘°λ₯Ό μ‚¬μš©ν•˜λΌ - [7μž₯. λžŒλ‹€μ™€ 슀트림(μ•„μ΄ν…œ43)]

    λžŒλ‹€κ°€ 읡λͺ… ν΄λž˜μŠ€λ³΄λ‹€ λ‚˜μ€ 점 μ€‘μ—μ„œ κ°€μž₯ 큰 νŠΉμ§•μ€ 간결함이닀. 그런데, μžλ°”μ—λŠ” ν•¨μˆ˜ 객체λ₯Ό 심지어 λžŒλ‹€λ³΄λ‹€λ„ 더 κ°„κ²°ν•˜κ²Œ λ§Œλ“œλŠ” 방법이 μžˆλŠ”λ°, 그것이 λ°”λ‘œ λ©”μ„œλ“œ μ°Έμ‘°(method reference)λ‹€. 이번 κΈ€μ—μ„œλŠ” λžŒλ‹€μ™€ λ©”μ„œλ“œ μ°Έμ‘°λ₯Ό 비ꡐ해 보고 μ–Έμ œ μ–΄λ–€ 것을 μ“°λ©΄ 쒋은지 μ•Œμ•„λ³΄λ„λ‘ ν•˜μž. πŸ“™ 1. λžŒλ‹€μ™€ λ©”μ„œλ“œ μ°Έμ‘° public static void main(String[] args) { Map map = new HashMap(); int myKey = 1; int myValue = 3; map.merge(myKey, myValue, (count, incr) -> count + incr); System.out.println(map.get(myKey)); // 3 myValue = 5; ..

    읡λͺ… ν΄λž˜μŠ€λ³΄λ‹€λŠ” λžŒλ‹€λ₯Ό μ‚¬μš©ν•˜λΌ - [7μž₯. λžŒλ‹€μ™€ 슀트림(μ•„μ΄ν…œ42)]

    πŸ“™ 1. 읡λͺ… ν΄λž˜μŠ€μ™€ λžŒλ‹€μ‹ μžλ°”μ—μ„œ ν•¨μˆ˜ νƒ€μž…μ„ ν‘œν˜„ν•  λ•Œ 좔상 λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜λ§Œ 담은 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν–ˆλ‹€. 이런 μΈν„°νŽ˜μ΄μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό ν•¨μˆ˜ 객체(function object)라고 ν•˜λ©°, νŠΉμ • ν•¨μˆ˜λ‚˜ λ™μž‘μ„ λ‚˜νƒ€λ‚΄λŠ” 데 μ‚¬μš©ν•˜μ˜€λ‹€. JDK 1.1이 λ“±μž₯ν•˜λ©΄μ„œ ν•¨μˆ˜ 객체λ₯Ό λ§Œλ“œλŠ” μ£Όμš” μˆ˜λ‹¨μ€ 읡λͺ… ν΄λž˜μŠ€κ°€ λ˜μ—ˆλ‹€. Collections.sort(words, new Comparator() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } }); ν•˜μ§€λ§Œ, μœ„μ˜ μ½”λ“œμ™€ 같이 읡λͺ… 클래슀 방식은 μ½”λ“œκ°€ λ„ˆλ¬΄ κΈΈκΈ° λ•Œλ¬Έμ— μžλ°”λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ— μ ν•©ν•˜μ§€ μ•Šμ•˜λ‹€. κ·Έλž˜μ„œ μžλ°” 8에 μ™€μ„œ..

    μ •μ˜ν•˜λ €λŠ” 것이 νƒ€μž…μ΄λΌλ©΄ 마컀 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λΌ - [6μž₯. μ—΄κ±° νƒ€μž…κ³Ό μ• λ„ˆν…Œμ΄μ…˜(μ•„μ΄ν…œ41)]

    // 마컀 μΈν„°νŽ˜μ΄μŠ€ public interface MarkerInterfaceEx { } 마컀 μΈν„°νŽ˜μ΄μŠ€(Marker Interface)λž€ 아무 λ©”μ„œλ“œλ„ λ‹΄κ³  μžˆμ§€ μ•Šκ³ , 단지 μžμ‹ μ„ κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€κ°€ νŠΉμ • 속성을 가짐을 ν‘œμ‹œν•΄ μ£ΌλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§ν•œλ‹€. μ˜ˆμ‹œλ‘œ Serializable μΈν„°νŽ˜μ΄μŠ€κ°€ μžˆλ‹€. Serializable을 κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” ObjectOutputStream을 톡해 μ“Έ(write) 수 μžˆλ‹€κ³ , 즉 직렬화(Serialization)ν•  수 μžˆλ‹€κ³  μ•Œλ €μ€€λ‹€. // 마컀 μ• λ„ˆν…Œμ΄μ…˜ public @interface MarkerAnnotationEx { } 마컀 μ• λ„ˆν…Œμ΄μ…˜μ΄ λ“±μž₯ν•˜λ©΄μ„œ 마컀 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μ—†λ‹€κ³  생각할 수 μžˆλ‹€. ν•˜μ§€λ§Œ 사싀이 μ•„λ‹ˆλ‹€. 이번 글을 톡해 마..

    @Override μ• λ„ˆν…Œμ΄μ…˜μ„ μΌκ΄€λ˜κ²Œ μ‚¬μš©ν•˜λΌ - [6μž₯. μ—΄κ±° νƒ€μž…κ³Ό μ• λ„ˆν…Œμ΄μ…˜(μ•„μ΄ν…œ40)]

    @Override μ• λ„ˆν…Œμ΄μ…˜μ€ λ©”μ„œλ“œ μ„ μ–Έμ—λ§Œ 달 수 있으며, 이 μ• λ„ˆν…Œμ΄μ…˜μ΄ λ‹¬λ Έλ‹€λŠ” 것은 μƒμœ„ νƒ€μž…μ˜ λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν–ˆμŒμ„ λœ»ν•œλ‹€. @Override μ• λ„ˆν…Œμ΄μ…˜μ„ μΌκ΄€λ˜κ²Œ μ‚¬μš©ν•˜λ©΄ μ—¬λŸ¬ 가지 μ•…λͺ… 높은 버그듀을 μ˜ˆλ°©ν•΄ μ€€λ‹€. 이번 글을 톡해 @Override μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ„ λ•Œμ˜ 문제점과 @Override μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν–ˆμ„ λ•Œμ˜ μž₯점 및 μ‚¬μš©μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž. πŸ“™ 1. @Override μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ„ λ•Œμ˜ 문제점 public class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this...

    λͺ…λͺ… νŒ¨ν„΄λ³΄λ‹€ μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λΌ - [6μž₯. μ—΄κ±° νƒ€μž…κ³Ό μ• λ„ˆν…Œμ΄μ…˜(μ•„μ΄ν…œ39)]

    πŸ“™ λͺ…λͺ… νŒ¨ν„΄μ˜ 문제점 μ „ν†΅μ μœΌλ‘œ λ„κ΅¬λ‚˜ ν”„λ ˆμž„μ›Œν¬κ°€ νŠΉλ³„νžˆ 닀뀄야 ν•  ν”„λ‘œκ·Έλž¨ μš”μ†Œμ—λŠ” λ”± κ΅¬λΆ„λ˜λŠ” λͺ…λͺ… νŒ¨ν„΄μ„ μ μš©ν•΄ μ™”λ‹€. 예λ₯Ό λ“€μ–΄, ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬μΈ JUnit은 버전 3κΉŒμ§€ ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ 이름을 test둜 μ‹œμž‘ν•˜κ²Œλ” ν–ˆλ‹€. 효과적인 λ°©λ²•μ΄μ§€λ§Œ μ•„λž˜μ™€ 같은 3가지 큰 단점이 μžˆλ‹€. μ˜€νƒ€κ°€ λ‚˜λ©΄ μ•ˆ λœλ‹€. μ‹€μˆ˜λ‘œ 이름을 tsetSafetyOverride둜 μ§€μœΌλ©΄ 이 λ©”μ„œλ“œλŠ” λ¬΄μ‹œλœλ‹€. μ˜¬λ°”λ₯Έ ν”„λ‘œκ·Έλž¨ μš”μ†Œμ—μ„œλ§Œ μ‚¬μš©λ˜λ¦¬λΌ 보증할 방법이 μ—†λ‹€. 클래슀 이름을 TestSafetyMechanisms둜 지어 이 ν΄λž˜μŠ€μ— μ •μ˜λœ ν…ŒμŠ€νŠΈ λ©”μ„œλ“œλ“€μ„ μˆ˜ν–‰ν•˜κΈΈ λ°”λΌμ§€λ§Œ JUnit은 클래슀 μ΄λ¦„μ—λŠ” 관심이 μ—†λ‹€. ν”„λ‘œκ·Έλž¨ μš”μ†Œλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 전달할 λ§ˆλ•…ν•œ 방법이 μ—†λ‹€. νŠΉμ • μ˜ˆμ™Έλ₯Ό λ˜μ Έμ•Όλ§Œ μ„±κ³΅ν•˜λŠ” ν…ŒμŠ€νŠΈκ°€ μžˆλ‹€..

    ν™•μž₯ν•  수 μžˆλŠ” μ—΄κ±° νƒ€μž…μ΄ ν•„μš”ν•˜λ©΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λΌ - [6μž₯. μ—΄κ±° νƒ€μž…κ³Ό μ• λ„ˆν…Œμ΄μ…˜(μ•„μ΄ν…œ38)]

    πŸ“™ 1. μ—΄κ±° νƒ€μž…μ˜ ν™•μž₯ νƒ€μž… μ•ˆμ „ μ—΄κ±° νŒ¨ν„΄κ³Ό 달리 μ—΄κ±° νƒ€μž…μ€ ν™•μž₯ν•  수 μ—†λ‹€. (이 점을 μ œμ™Έν•˜κ³ λŠ” 거의 λͺ¨λ“  μƒν™©μ—μ„œ μ—΄κ±° νƒ€μž…μ΄ νƒ€μž… μ•ˆμ „ μ—΄κ±° νŒ¨ν„΄(typesafe enum pattern) 보닀 μš°μˆ˜ν•˜λ‹€.) νƒ€μž… μ•ˆμ „ μ—΄κ±° νŒ¨ν„΄μ€ μ—΄κ±°ν•œ 값듀을 κ·ΈλŒ€λ‘œ κ°€μ Έμ˜¨ λ‹€μŒ 값을 더 μΆ”κ°€ν•˜μ—¬ λ‹€λ₯Έ λͺ©μ μœΌλ‘œ μ“Έ 수 μžˆλŠ” 반면, μ—΄κ±° νƒ€μž…μ€ κ·Έλ ‡κ²Œ ν•  수 μ—†λ‹€. 섀계가 잘 λͺ» 된 것은 μ•„λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ‹€μŒκ³Ό 같은 이유둜 λŒ€λΆ€λΆ„ μƒν™©μ—μ„œ μ—΄κ±° νƒ€μž…μ„ ν™•μž₯ν•˜λŠ” 건 쒋지 μ•Šμ€ 생각이기 λ•Œλ¬Έμ΄λ‹€ μ—΄κ±° νƒ€μž…μ„ ν™•μž₯ν•  수 없도둝 μ„€κ³„ν•œ 것이닀. ν™•μž₯ν•œ νƒ€μž…μ˜ μ›μ†ŒλŠ” 기반 νƒ€μž…μ˜ μ›μ†Œλ‘œ μ·¨κΈ‰ν•˜μ§€λ§Œ, 기반 νƒ€μž…μ˜ μ›μ†Œλ₯Ό ν™•μž₯ν•œ νƒ€μž…μ˜ μ›μ†Œλ‘œ μ·¨κΈ‰ν•  수 μ—†λŠ” 건 μ΄μƒν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 기반 νƒ€μž…κ³Ό ν™•μž₯된 νƒ€μž…λ“€μ˜ μ›μ†Œ λͺ¨λ‘λ₯Ό..

    ordinal 인덱싱 λŒ€μ‹  EnumMap을 μ‚¬μš©ν•˜λΌ - [6μž₯. μ—΄κ±° νƒ€μž…κ³Ό μ• λ„ˆν…Œμ΄μ…˜(μ•„μ΄ν…œ37)]

    λ°°μ—΄μ˜ 인덱슀λ₯Ό μ–»κΈ° μœ„ν•΄ ordinal을 μ“°λŠ” 거은 일반적으둜 쒋지 μ•ŠμœΌλ‹ˆ, λŒ€μ‹  EnumMap을 μ‚¬μš©ν•˜λ„λ‘ ν•˜μž. μ•„λž˜μ˜ 2가지 상황(일차원 관계, 닀차원 관계)을 톡해 μ™œ EnumMap을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”μ§€ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž. 1. 1차원 κ΄€κ³„μ—μ„œμ˜ EnumMap μ•„λž˜μ˜ Plant 클래슀λ₯Ό 톡해 μ‹λ¬Όμ˜ 이름(name)κ³Ό 생애주기(lifeCycle)λ₯Ό κ°„λ‹¨νžˆ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. public class Plant { enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } // ν•œν•΄μ‚΄μ΄, μ—¬λŸ¬ν•΄μ‚΄μ΄, 두해살이 final String name; final LifeCycle lifeCycle; public Plant(String name, LifeCycle lifeCycle) { thi..

    λΉ„νŠΈ ν•„λ“œ λŒ€μ‹  EnumSet을 μ‚¬μš©ν•˜λΌ - [6μž₯. μ—΄κ±° νƒ€μž…κ³Ό μ• λ„ˆν…Œμ΄μ…˜(μ•„μ΄ν…œ36)]

    πŸ“™ 1. λΉ„νŠΈ ν•„λ“œ μ—΄κ±°ν•œ 값듀이 주둜 μ§‘ν•©μœΌλ‘œ μ‚¬μš©λ  경우, μ˜ˆμ „μ—λŠ” 각 μƒμˆ˜μ— μ„œλ‘œ λ‹€λ₯Έ 2의 κ±°λ“­μ œκ³± 값을 ν• λ‹Ήν•œ μ •μˆ˜ μ—΄κ±° νŒ¨ν„΄μ„ μ‚¬μš©ν–ˆμ—ˆλ‹€. (λΉ„νŠΈλ§ˆμŠ€ν‚Ήμ„ μ΄μš©ν–ˆλ‹€κ³  ν•  수 μžˆλ‹€.) public class Text { public static final int STYLE_BOLD = 1

    ordinal λ©”μ„œλ“œ λŒ€μ‹  μΈμŠ€ν„΄μŠ€ ν•„λ“œλ₯Ό μ‚¬μš©ν•˜λΌ - [6μž₯. μ—΄κ±° νƒ€μž…κ³Ό μ• λ„ˆν…Œμ΄μ…˜(μ•„μ΄ν…œ35)]

    λŒ€λΆ€λΆ„μ˜ μ—΄κ±° νƒ€μž… μƒμˆ˜λŠ” μžμ—°μŠ€λŸ½κ²Œ ν•˜λ‚˜μ˜ μ •μˆ«κ°’μ— λŒ€μ‘λœλ‹€. 그리고 λͺ¨λ“  μ—΄κ±° νƒ€μž…μ€ ν•΄λ‹Ή μƒμˆ˜κ°€ κ·Έ μ—΄κ±° νƒ€μž…μ—μ„œ λͺ‡ 번째 μœ„μΉ˜μΈμ§€λ₯Ό λ°˜ν™˜ν•˜λŠ” ordinalμ΄λΌλŠ” λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€. κ·Έλž˜μ„œ μ—΄κ±° νƒ€μž… μƒμˆ˜μ™€ μ—°κ²°λœ μ •μˆ«κ°’μ΄ ν•„μš”ν•˜λ‹€λ©΄ ordinal λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λ˜μ§€ μ•Šμ„κΉŒλΌλŠ” 생각을 ν•  수 μžˆλ‹€. κ²°λ‘ λΆ€ν„° λ§ν•˜μžλ©΄ κ·Έλ ‡κ²Œ μ‚¬μš©ν•˜λ©΄ μ•ˆ λœλ‹€. 'μ™œ κ·Έλ ‡κ²Œ μ‚¬μš©ν•˜λ©΄ μ•ˆ λ˜λŠ”μ§€'와 '그러면 μ–Έμ œ ordinal을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”μ§€'에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž. πŸ“™ 1. μ—΄κ±° νƒ€μž… μƒμˆ˜μ™€ μ—°κ²°λœ μ •μˆ«κ°’μ„ μ–»κΈ° μœ„ν•΄ ordinal λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ•ˆ λ˜λŠ” 이유 public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONE..

    int μƒμˆ˜ λŒ€μ‹  μ—΄κ±° νƒ€μž…μ„ μ‚¬μš©ν•˜λΌ - [6μž₯. μ—΄κ±° νƒ€μž…κ³Ό μ• λ„ˆν…Œμ΄μ…˜(μ•„μ΄ν…œ34)] - (2)

    이전 글을 톡해 'μ •μˆ˜ μ—΄κ±° νŒ¨ν„΄μ˜ 단점, μ—΄κ±° νƒ€μž…μ˜ μž₯점, μ—΄κ±° νƒ€μž…μ˜ κΈ°λ³Έ μ‚¬μš©λ²•'을 μ•Œμ•„λ³΄μ•˜λ‹€. 이번 κΈ€μ—μ„œλŠ” μ—΄κ±° νƒ€μž…μ˜ λ‹€μ–‘ν•œ κΈ°λŠ₯듀에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž. πŸ“™ 1. μƒμˆ˜λ³„ λ©”μ„œλ“œ κ΅¬ν˜„ (constant-specific method implementation) 사칙연산 계산기와 같이 μƒμˆ˜λ§ˆλ‹€ λ™μž‘μ΄ 달라져야 ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€. κ°€μž₯ κ°„λ‹¨ν•˜κ²Œ 생각해 λ³Ό 수 μžˆλŠ” 것은 switch문을 ν†΅ν•˜μ—¬ λΆ„κΈ°ν•˜λŠ” 방법이닀. public enum Operation { PLUS, MINUS, TIMES, DIVIDE; // μƒμˆ˜κ°€ λœ»ν•˜λŠ” 연산을 μˆ˜ν–‰ν•œλ‹€. public double apply(double x, double y) { switch(this) { case PLUS: return x + y; case ..