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

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

    μžλ°”λ₯Ό μ΄μš©ν•˜μ—¬ 코딩을 ν•˜λ‹€ 보면 μ •μˆ˜ μ—΄κ±° νŒ¨ν„΄(int enum pattern)κ³Ό μ—΄κ±° νƒ€μž…(enum type)을 μ‚¬μš©ν•΄ λ³Έ 적이 μžˆμ„ 것이닀. 이번 κΈ€μ—μ„œλŠ” μ •μˆ˜ μ—΄κ±° νŒ¨ν„΄μ˜ 단점듀을 μ‚΄νŽ΄λ³΄κ³ , μ™œ μ—΄κ±° νƒ€μž…μ„ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”μ§€ μ•Œμ•„λ³΄κ³ μž ν•œλ‹€. 그리고 기본적인 μ—΄κ±° νƒ€μž…μ˜ μ‚¬μš©λ²•λ„ μ•Œμ•„λ³Ό 것이닀. πŸ“™ 1. μ •μˆ˜ μ—΄κ±° νŒ¨ν„΄ (int enum pattern) public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ..

    νƒ€μž… μ•ˆμ „ 이쒅 μ»¨ν…Œμ΄λ„ˆλ₯Ό κ³ λ €ν•˜λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ33)]

    1. νƒ€μž… μ•ˆμ „ 이쒅 μ»¨ν…Œμ΄λ„ˆ πŸ™ νƒ€μž… μ•ˆμ „ 이쒅(Heterogeneous) μ»¨ν…Œμ΄λ„ˆλž€ ν•œ νƒ€μž…μ˜ 객체만 담을 수 μžˆλŠ” μ»¨ν…Œμ΄λ„ˆκ°€ μ•„λ‹Œ, μ—¬λŸ¬ λ‹€λ₯Έ νƒ€μž…(이쒅)을 담을 수 μžˆλŠ” νƒ€μž… μ•ˆμ „ν•œ μ»¨ν…Œμ΄λ„ˆλ₯Ό λ§ν•œλ‹€. μ§€κΈˆκΉŒμ§€ μš°λ¦¬κ°€ ν”νžˆ μ•Œκ³  μžˆλŠ” μ»¨ν…Œμ΄λ„ˆλŠ” ν•œ 가지 νƒ€μž…λ§Œ μ‚¬μš©ν•  수 μžˆλŠ” μ»¨ν…Œμ΄λ„ˆλ‹€. public static void main(String[] args) { Set names = new HashSet(); names.add("amenable"); // names.add(1); // λΆˆκ°€λŠ₯ Set numbers = new HashSet(); numbers.add(1); // numbers.add("amenable"); // λΆˆκ°€λŠ₯ } ν•˜μ§€λ§Œ, κ²½μš°μ— λ”°λΌμ„œλŠ” 이쒅 μ»¨ν…Œμ΄λ„ˆ(= 같은 쒅이 μ•„λ‹Œ νƒ€μž…..

    μ œλ„€λ¦­κ³Ό κ°€λ³€μΈμˆ˜λ₯Ό ν•¨κ»˜ μ“Έ λ•ŒλŠ” μ‹ μ€‘ν•˜λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ32)]

    1. κ°€λ³€μΈμˆ˜ & μ œλ„€λ¦­ πŸ’ͺ κ°€λ³€μΈμˆ˜(varargs)λž€ λ§€κ°œλ³€μˆ˜λ‘œ λ“€μ–΄μ˜€λŠ” κ°’μ˜ κ°œμˆ˜μ™€ 상관없이 λ™μ μœΌλ‘œ 인수λ₯Ό λ°›μ•„μ„œ κΈ°λŠ₯ν•˜λ„λ‘ ν•΄μ£ΌλŠ” 문법을 λ§ν•œλ‹€. public PrintStream printf(String format, Object ... args) { return format(format, args); } κ°€λ³€μΈμˆ˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ κ°€λ³€μΈμˆ˜λ₯Ό λ‹΄κΈ° μœ„ν•œ 배열이 μžλ™μœΌλ‘œ ν•˜λ‚˜ λ§Œλ“€μ–΄μ§„λ‹€. λ§Œμ•½ λ‹€μŒκ³Ό 같이 μ œλ„€λ¦­κ³Ό κ°€λ³€μΈμˆ˜λ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄ μ–΄λ–»κ²Œ 될까? static void dangerous(List... stringLists) { } 이 κ²½μš°μ—λ„ κ°€λ³€μΈμˆ˜ λ©”μ„œλ“œκ°€ 호좜되기 λ•Œλ¬Έμ— κ°€λ³€μΈμˆ˜λ₯Ό λ‹΄κΈ° μœ„ν•œ 배열이 μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ§„λ‹€. 즉, μ œλ„€λ¦­ 배열이 λ§Œλ“€μ–΄μ§€λŠ” 것이닀. μΌλ°˜μ μœΌλ‘œλŠ” μ œλ„€λ¦­ 배열을 ..

    ν•œμ •μ  μ™€μΌλ“œμΉ΄λ“œλ₯Ό μ‚¬μš©ν•΄ API μœ μ—°μ„±μ„ 높이라 - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ31)]

    1. PECS 🌞 PECS(Producer-Extends, Consumer-Super)λž€ λ§€κ°œλ³€μˆ˜ν™” νƒ€μž… Tκ°€ μƒμ‚°μžλΌλ©΄ μ—λŠ” null μ™Έμ—λŠ” μ–΄λ–€ 값도 넣을 수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. κ·Έλž˜μ„œ μ•„λž˜μ™€ 같이 λ„μš°λ―Έ λ©”μ„œλ“œλ₯Ό λ”°λ‘œ μž‘μ„±ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. public class Swap { public static void swap(List list, int i, int j) { swapHelper(list, i, j); } private static void swapHelper(List list, int i, int j){ list.set(i, list.set(j, list.get(i))); } } ν•΄λ‹Ή 글은 λ°±κΈ°μ„  λ‹˜μ˜ 'μ΄νŽ™ν‹°λΈŒ μžλ°” μ™„λ²½ 곡랡'을 μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

    이왕이면 μ œλ„€λ¦­ λ©”μ„œλ“œλ‘œ λ§Œλ“€λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ30)]

    ν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ, λ©”μ„œλ“œλ„ μ œλ„€λ¦­μœΌλ‘œ λ§Œλ“€ 수 μžˆλ‹€. μ œλ„€λ¦­ λ©”μ„œλ“œ 3가지λ₯Ό μ‚΄νŽ΄λ³΄λ©΄μ„œ μ–΄λ–»κ²Œ μ œλ„€λ¦­ λ©”μ„œλ“œλ₯Ό λ§Œλ“œλŠ”μ§€ μ•Œμ•„λ³΄μž. 1. λ§€κ°œλ³€μˆ˜ν™” νƒ€μž…μ„ λ°›λŠ” 정적 μœ ν‹Έλ¦¬ν‹° λ©”μ„œλ“œ 🌼 λ§€κ°œλ³€μˆ˜ν™” νƒ€μž…μ„ λ°›λŠ” 정적 μœ ν‹Έλ¦¬ν‹° λ©”μ„œλ“œλŠ” 보톡 μ œλ„€λ¦­μ΄λ‹€. (Collections의 μ•Œκ³ λ¦¬μ¦˜ λ©”μ„œλ“œλŠ” λͺ¨λ‘ μ œλ„€λ¦­μ΄λ‹€.) μš°μ„ , μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜μ§€ μ•Šμ€ λ©”μ„œλ“œλ₯Ό μ‚΄νŽ΄λ³΄μž public class Union { public static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } } ν•΄λ‹Ή λ©”μ„œλ“œλŠ” μ•„λž˜μ˜ μ˜ˆμ‹œμ—μ„œ μ‚΄νŽ΄λ³Ό 수 μžˆλŠ” κ²ƒμ²˜λŸΌ μ•ˆμ „ν•˜μ§€ μ•Šλ‹€. public static void main(S..

    이왕이면 μ œλ„€λ¦­ νƒ€μž…μœΌλ‘œ λ§Œλ“€λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ29)]

    1. λ“€μ–΄κ°€κΈ° μ „ πŸ„‍♀️ μ•„λž˜μ˜ Object 기반으둜 λ§Œλ“€μ–΄μ§„ Stack 클래슀λ₯Ό μ‚΄νŽ΄λ³΄μž. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if(size == 0) throw new EmptyStackException(); Object resu..

    λ°°μ—΄λ³΄λ‹€λŠ” 리슀트λ₯Ό μ‚¬μš©ν•˜λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ28)]

    1. λ°°μ—΄κ³Ό μ œλ„€λ¦­ νƒ€μž…μ˜ 차이 πŸ¦— πŸ“— 1. 배열은 곡변이고, μ œλ„€λ¦­μ€ λΆˆκ³΅λ³€μ΄λ‹€. 배열은 곡변(Convariant)이닀. Subκ°€ Super의 ν•˜μœ„ νƒ€μž…μ΄λΌλ©΄ Sub[]λŠ” λ°°μ—΄ Super[]의 ν•˜μœ„ νƒ€μž…μ΄λ‹€. μ œλ„€λ¦­μ€ λΆˆκ³΅λ³€(Invariant)이닀. μ„œλ‘œ λ‹€λ₯Έ νƒ€μž… Type1κ³Ό Type2κ°€ μžˆμ„ λ•Œ, List은 List의 ν•˜μœ„ νƒ€μž…λ„ μ•„λ‹ˆκ³  μƒμœ„ νƒ€μž…λ„ μ•„λ‹ˆλ‹€. 곡변과 λΆˆκ³΅λ³€ 쀑 μ–΄λŠ μͺ½μ΄ λ¬Έμ œκ°€ μžˆμ„κΉŒ? μ½”λ“œλ₯Ό 톡해 μ•Œμ•„λ³΄μž. public static void main(String[] args) { // λ°°μ—΄ Object[] objectArray = new Long[1]; objectArray[0] = "νƒ€μž…μ΄ λ‹¬λΌμ„œ 넣을 수 μ—†λ‹€."; // ArrayStoreException (λŸ°νƒ€μž„μ— λ°œμƒ) //..

    비검사 κ²½κ³ λ₯Ό μ œκ±°ν•˜λΌ - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ27)]

    1. 비검사 κ²½κ³  κ°œλ… 🦜 '비검사(unchecked) κ²½κ³ 'λž€ μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž… μ•ˆμ „μ„±μ„ ν™•μΈν•˜λŠ”λ° ν•„μš”ν•œ 정보가 μΆ©λΆ„ν•˜μ§€ μ•Šμ„ λ•Œ λ°œμƒμ‹œν‚€λŠ” 경고이닀. 비검사 경고의 μ˜ˆμ‹œ 쀑에 ν•˜λ‚˜λ‘œ λ‹€μŒκ³Ό 같이 둜 νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 경우λ₯Ό λ“€ 수 μžˆλ‹€. public static void main(String[] args) { // 비검사 κ²½κ³  λ°œμƒ // Raw use of parameterized class 'Set' Set names = new HashSet(); // 비검사 κ²½κ³  λ°œμƒ // Raw use of parameterized class 'HashSet' Set strings = new HashSet(); } 2. 비검사 κ²½κ³ λ₯Ό μ œκ±°ν•΄μ•Ό ν•˜λŠ” 이유 🦚 이번 μ•„μ΄ν…œμ—μ„œλŠ” '비검사 κ²½κ³ λ₯Ό μ œκ±°ν•˜λΌ'라고 λ§ν•˜κ³  ..

    둜 νƒ€μž…μ€ μ‚¬μš©ν•˜μ§€ 말라 - [5μž₯. μ œλ„€λ¦­(μ•„μ΄ν…œ26)]

    이번 μž₯(5μž₯)λΆ€ν„°λŠ” μ œλ„€λ¦­μ„ 닀룬닀. ν˜Ήμ‹œλ‚˜ μ œλ„€λ¦­μ— λŒ€ν•œ κΈ°λ³Έ κ°œλ…μ΄ ν•„μš”ν•˜λ‹€λ©΄ 이전 글을 λ¨Όμ € 보고 μ˜€λ„λ‘ ν•˜μž. 1. 둜 νƒ€μž… (Raw Type) κ°œλ… πŸ’½ 둜 νƒ€μž…μ΄λž€ μ œλ„€λ¦­ νƒ€μž…μ—μ„œ νƒ€μž… λ§€κ°œλ³€μˆ˜λ₯Ό μ „ν˜€ μ‚¬μš©ν•˜μ§€ μ•Šμ„ λ•Œλ₯Ό λ§ν•œλ‹€. 예λ₯Ό λ“€μ–΄ List의 둜 νƒ€μž…μ€ Listλ‹€. 2. 둜 νƒ€μž…μ„ μ‚¬μš©ν•˜λ©΄ μ•ˆ λ˜λŠ” 이유 πŸ’Ύ μ œλ„€λ¦­μ΄ μ•ˆκ²¨μ£ΌλŠ” μ•ˆμ „μ„±κ³Ό ν‘œν˜„λ ₯을 κ³ λ €ν•  λ•Œ 둜 νƒ€μž…μ€ μ ˆλŒ€λ‘œ μ¨μ„œλŠ” μ•ˆ λœλ‹€. 둜 νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” μ½”λ“œ(= μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ½”λ“œ)와 둜 νƒ€μž…μ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ½”λ“œ(= μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λŠ” μ½”λ“œ)λ₯Ό 비ꡐ해 보자. πŸ“’ 1. 둜 νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 경우 기본적인 λ™μž‘μ€ numbers에 숫자λ₯Ό λ„£κ³  λ°˜λ³΅λ¬Έμ„ 톡해 λ“€μ–΄κ°„ 숫자λ₯Ό ν™•μΈν•˜λ €κ³  ν•˜λŠ” μ½”λ“œλ‹€. μˆ«μžκ°€ λ“€μ–΄κ°€μ•Ό ν•˜μ§€λ§Œ λ¬Έμžμ—΄μ΄ ..

    ν†±λ ˆλ²¨ ν΄λž˜μŠ€λŠ” ν•œ νŒŒμΌμ— ν•˜λ‚˜λ§Œ λ‹΄μœΌλΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ25)]

    μ†ŒμŠ€ νŒŒμΌμ— ν•˜λ‚˜μ— ν†±λ ˆλ²¨ 클래슀(ν†±λ ˆλ²¨ ν΄λž˜μŠ€λž€ νŒŒμΌμ— μ •μ˜λ˜μ–΄ μžˆλŠ” κ°€μž₯ λ°”κΉ₯에 μžˆλŠ” 클래슀λ₯Ό λ§ν•œλ‹€)λ₯Ό μ—¬λŸ¬ 개 μ„ μ–Έν•˜λ”λΌλ„ μ»΄νŒŒμΌν•  λ•ŒλŠ” λ¬Έμ œκ°€ μ—†λ‹€. μœ νš¨ν•œ λ¬Έλ²•μ΄λΌλŠ” 것이닀. ν•˜μ§€λ§Œ 이것은 μ•„λ¬΄λŸ° 득이 μ—†μ„λΏλ”λŸ¬ μ‹¬κ°ν•œ μœ„ν—˜μ„ κ°μˆ˜ν•΄μ•Ό ν•œλ‹€. κ·Έ μ΄μœ λŠ” ν•œ μ†ŒμŠ€ νŒŒμΌμ— ν†±λ ˆλ²¨ 클래슀λ₯Ό μ—¬λŸ¬ 개 μ„ μ–Έν•˜λ©΄ 컴파일 μˆœμ„œμ— 따라 κ²°κ³Όκ°€ λ‹¬λΌμ§ˆ 수 있기 λ•Œλ¬Έμ΄λ‹€. 문제 상황에 λŒ€ν•œ μ˜ˆμ‹œλ₯Ό μ‚΄νŽ΄λ³΄κ³ , 해결책을 μ•Œμ•„λ³΄λ„λ‘ ν•˜μž. 1. 문제점 πŸ’ 집기(Utensil)와 λ””μ €νŠΈ(Dessert) ν΄λž˜μŠ€κ°€ Utensil.javaλΌλŠ” ν•œ νŒŒμΌμ— μ •μ˜λ˜μ–΄ μžˆλ‹€κ³  ν•˜μž. // Utensil.java class Utensil { static final String NAME = "pan"; } class Dessert {..

    멀버 ν΄λž˜μŠ€λŠ” λ˜λ„λ‘ static으둜 λ§Œλ“€λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ24)]

    쀑첩 클래슀(nested class)λž€ λ‹€λ₯Έ 클래슀 μ•ˆμ— μ •μ˜λœ 클래슀λ₯Ό λ§ν•œλ‹€. 쀑첩 ν΄λž˜μŠ€λŠ” μžμ‹ μ„ 감싼 λ°”κΉ₯ ν΄λž˜μŠ€μ—μ„œλ§Œ μ“°μ—¬μ•Ό ν•˜λ©°, κ·Έ μ™Έμ˜ μ“°μž„μƒˆκ°€ μžˆλ‹€λ©΄ ν†±λ ˆλ²¨ 클래슀둜 λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. 쀑첩 클래슀의 μ’…λ₯˜λŠ” μ•„λž˜μ˜ 4가지가 μžˆλ‹€. 정적 멀버 클래슀 (비정적) 멀버 클래슀 읡λͺ… 클래슀 지역 클래슀 '정적 멀버 클래슀'λ₯Ό μ œμ™Έν•˜κ³ λŠ” λͺ¨λ‘ λ‚΄λΆ€ 클래슀(inner class)에 ν•΄λ‹Ήν•œλ‹€. '정적 멀버 클래슀'와 '비정적 멀버 클래슀'λŠ” 멀버 ν΄λž˜μŠ€μ— ν•΄λ‹Ήν•œλ‹€. 이번 글을 톡해 4가지 쀑첩 ν΄λž˜μŠ€μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ³ , μ™œ 멀버 ν΄λž˜μŠ€λŠ” λ˜λ„λ‘ static으둜 λ§Œλ“€μ–΄μ•Ό ν•˜λŠ”μ§€ μ•Œμ•„λ³΄κ³ μž ν•œλ‹€. 1. 정적 멀버 클래슀 🧰 정적 멀버 ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ 클래슀 μ•ˆμ— μ„ μ–Έλ˜κ³ , λ°”κΉ₯ 클래슀의 private 멀버에도..

    νƒœκ·Έ 달린 ν΄λž˜μŠ€λ³΄λ‹€λŠ” 클래슀 계측ꡬ쑰λ₯Ό ν™œμš©ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ23)]

    1. νƒœκ·Έ 달린 클래슀 🎧 νƒœκ·Έ 달린 ν΄λž˜μŠ€λž€ 두 가지 μ΄μƒμ˜ 의미λ₯Ό ν‘œν˜„ν•  수 있으며, 그쀑 ν˜„μž¬ ν‘œν˜„ν•˜λŠ” 의미λ₯Ό νƒœκ·Έ κ°’μœΌλ‘œ μ•Œλ €μ£ΌλŠ” 클래슀λ₯Ό λ§ν•œλ‹€. μ•„λž˜ μ½”λ“œλŠ” 원과 μ‚¬κ°ν˜•μ„ ν‘œν˜„ν•  수 μžˆλŠ” νƒœκ·Έ 달린 ν΄λž˜μŠ€μ΄λ‹€. public class Figure { enum Shape {RECTANGLE, CIRCLE}; // νƒœκ·Έ ν•„λ“œ - ν˜„μž¬ λͺ¨μ–‘을 λ‚˜νƒ€λ‚Έλ‹€. final Shape shape; // λ‹€μŒ ν•„λ“œλ“€μ€ λͺ¨μ–‘이 μ‚¬κ°ν˜•(RECTANGLE)일 λ•Œλ§Œ 쓰인닀. double length; double width; // λ‹€μŒ ν•„λ“œλŠ” λͺ¨μ–‘이 원(CIRCLE)일 λ•Œλ§Œ 쓰인닀. double radius; // μ›μš© μƒμ„±μž Figure2(double radius){ shape = Shape.CIRCLE; this...