πŸ“‚ 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 ..

    μžλ°”μ˜ 컴파일 κ³Όμ •

    μžλ°”λŠ” JVM(Java Virtual Machine) 덕뢄에 OS에 독립적인 νŠΉμ§•μ„ 가지고 μžˆλ‹€. JVM의 μ–΄λ– ν•œ κΈ°λŠ₯ λ•Œλ¬Έμ— OS에 λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰μ‹œν‚¬ 수 μžˆλŠ”μ§€ μžλ°”μ˜ 컴파일 과정을 톡해 μ•Œμ•„λ³΄μž. πŸ“™ 1. 컴파일 κ³Όμ • μžλ°”μ˜ 컴파일 과정은 λ‹€μŒκ³Ό κ°™λ‹€. κ°œλ°œμžκ°€ μž‘μ„±ν•œ μžλ°” μ†ŒμŠ€νŒŒμΌ(*. java)을 μžλ°” 컴파일러(Java Compiler)κ°€ λ°”μ΄νŠΈνŒŒμΌ(*.class)둜 μ»΄νŒŒμΌν•œλ‹€. (CPUκ°€ 이해할 수 μžˆλŠ” 언어인 λ°”μ΄λ„ˆλ¦¬ μ½”λ“œκ°€ μ•„λ‹ˆλΌ JVM이 이해할 수 μžˆλŠ” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό 가진 λ°”μ΄νŠΈ 파일둜 λ³€ν™˜ν•œλ‹€.) 클래슀 λ‘œλ”(Class Loader)λ₯Ό 톡해 λ°”μ΄νŠΈ 파일(*.class)듀을 JVM에 μ˜¬λ¦°λ‹€. JVM에 μžˆλŠ” λ°”μ΄νŠΈ 파일(*.class)듀은 μ‹€ν–‰ 엔진(Execution Engine)의 인터프..

    μΆ”μƒν΄λž˜μŠ€(Abstract Class) VS μΈν„°νŽ˜μ΄μŠ€(Interface)

    μ§€κΈˆκΉŒμ§€ μΆ”μƒν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚΄νŽ΄λ³΄μ•˜λ‹€. μΆ”μƒν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€λŠ” 각각 κ³ μœ ν•œ λͺ‡λͺ‡ νŠΉμ§•μ„ 가지고 μžˆμ§€λ§Œ, "좔상 λ©”μ„œλ“œλ₯Ό 톡해 상속/κ΅¬ν˜„μ„ ν†΅ν•œ λ©”μ„œλ“œ κ°•μ œ κ΅¬ν˜„ κ·œμΉ™μ„ κ°€μ§€λŠ” 좔상화 클래슀"λΌλŠ” μ μ—μ„œ 맀우 λΉ„μŠ·ν•˜λ‹€λŠ” λŠλ‚Œμ„ 받을 것이닀. λ˜ν•œ, 'κ·Έλ ‡λ‹€λ©΄ λͺ¨λ“  λ©”μ„œλ“œλ₯Ό 좔상 λ©”μ„œλ“œλ‘œ λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•˜λ©΄ 좔상 ν΄λž˜μŠ€κ°€ μΈν„°νŽ˜μ΄μŠ€ μ—­ν•  ν•  수 μžˆλŠ”λ° μ™œ ꡳ이 μΈν„°νŽ˜μ΄μŠ€κ°€ μ‘΄μž¬ν•˜λŠ” 걸까? 'λΌλŠ” μ˜λ¬Έλ„ 생길 수 μžˆλ‹€. κΈ°λŠ₯적인 츑면을 λ‹€ μ œμ™Έν•˜κ³ , 두 개λ₯Ό λ‚˜λˆ„μ–΄μ„œ μ‚¬μš©ν•˜λŠ” κ°€μž₯ 큰 μ΄μœ λŠ” μ‚¬μš© λͺ©μ κ³Ό μ‚¬μš© μ‹œκΈ°κ°€ λ‹€λ₯΄λ‹€λŠ” 것이닀. κ·ΈλŸ¬λ―€λ‘œ '좔상 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ μ‚¬μš© λͺ©μ κ³Ό μ‚¬μš© μ‹œκΈ°μ˜ 차이'λ₯Ό μ•Œμ•„λ³΄κ³ , 'κΈ°λŠ₯적인 차이점'에 λŒ€ν•΄μ„œλ„ μΆ”κ°€μ μœΌλ‘œ 정리해 보도둝 ν•˜μž. πŸ“™ 1. μ‚¬μš© λͺ©μ κ³Ό μ‚¬μš©..

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

    JDK1.8λΆ€ν„° λ””ν΄νŠΈ λ©”μ„œλ“œμ™€ static λ©”μ„œλ“œλ„ μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ‚¬μš©ν•  수 있게 λ˜μ—ˆλ‹€. 일단은 JDK1.8 μ΄μ „μ˜ μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•΄μ„œ λ¨Όμ € μ‚΄νŽ΄λ³΄κ³ , 그리고 JDK1.8μ—μ„œ μΆ”κ°€λœ κΈ°λŠ₯(λ””ν΄νŠΈ λ©”μ„œλ“œ, static λ©”μ„œλ“œ)κ³Ό Java9λΆ€ν„° μ‚¬μš©ν•  수 μžˆλŠ” private λ©”μ„œλ“œμ— λŒ€ν•΄μ„œ μ‚΄νŽ΄λ³΄λŠ” κ²ƒμœΌλ‘œ ν•˜μž. πŸ“™ 1. μΈν„°νŽ˜μ΄μŠ€λž€ μΈν„°νŽ˜μ΄μŠ€λž€ μΌμ’…μ˜ μΆ”μƒν΄λž˜μŠ€μ΄λ‹€. μΈν„°νŽ˜μ΄μŠ€λŠ” μΆ”μƒν΄λž˜μŠ€μ²˜λŸΌ μΆ”μƒλ©”μ„œλ“œλ₯Ό κ°–μ§€λ§Œ μΆ”μƒν΄λž˜μŠ€λ³΄λ‹€ 좔상화 정도가 λ†’μ•„μ„œ μΆ”μƒν΄λž˜μŠ€μ™€ 달리 λͺΈν†΅μ„ κ°–μΆ˜ 일반 λ©”μ„œλ“œ λ˜λŠ” λ©€λ²„λ³€μˆ˜λ₯Ό κ΅¬μ„±μ›μœΌλ‘œ κ°€μ§ˆ 수 μ—†λ‹€. 였직 μΆ”μƒλ©”μ„œλ“œμ™€ μƒμˆ˜λ§Œμ„ λ©€λ²„λ‘œλ§Œ κ°€μ§ˆ 수 있으며, κ·Έ μ™Έμ˜ λ‹€λ₯Έ μ–΄λ– ν•œ μš”μ†Œλ„ ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€. μΈν„°νŽ˜μ΄μŠ€λ„ μΆ”μƒν΄λž˜μŠ€μ²˜λŸΌ μ™„μ„±λ˜μ§€ μ•Šμ€ λΆˆμ•ˆμ „ν•œ 것이기 λ•Œλ¬Έμ— κ·Έ 자체..

    좔상 클래슀(Abstract Class)

    πŸ“™ 1. μΆ”μƒν΄λž˜μŠ€λž€? public abstract class Player { abstract void play(); abstract void stop(); } 클래슀λ₯Ό 섀계도라고 ν•œλ‹€λ©΄, μΆ”μƒν΄λž˜μŠ€(Abstract Class)λŠ” λ―Έμ™„μ„± 섀계도라고 ν•  수 μžˆλ‹€. μ—¬κΈ°μ„œ λ§ν•˜λŠ” 미완성은 단지 λ―Έμ™„μ„± λ©”μ„œλ“œ(좔상 λ©”μ„œλ“œ)λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλ‹€λŠ” μ˜λ―Έμ΄λ‹€. λ―Έμ™„μ„± μ„€κ³„λ„λ‘œ μ™„μ„±λœ μ œν’ˆμ„ λ§Œλ“€ 수 없듯이 좔상 클래슀둜 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†λ‹€. 좔상 ν΄λž˜μŠ€λŠ” 상속을 ν†΅ν•΄μ„œ μžμ†ν΄λž˜μŠ€μ— μ˜ν•΄μ„œλ§Œ 완성될 수 μžˆλ‹€. 좔상 클래슀 μžμ²΄λ‘œλŠ” ν΄λž˜μŠ€λ‘œμ„œμ˜ 역할을 λ‹€ λͺ»ν•˜μ§€λ§Œ, μƒˆλ‘œμš΄ 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” 데 μžˆμ–΄μ„œ 바탕이 λ˜λŠ” 쑰상 ν΄λž˜μŠ€λ‘œμ„œ μ€‘μš”ν•œ 의미λ₯Ό κ°–λŠ”λ‹€. 좔상 ν΄λž˜μŠ€λŠ” ν΄λž˜μŠ€μ— 좔상화λ₯Ό μ ‘λͺ©μ‹œμΌœ 보닀 ꡬ쑰적이게 객체λ₯Ό..

    νƒ€μž… μ•ˆμ „ 이쒅 μ»¨ν…Œμ΄λ„ˆλ₯Ό κ³ λ €ν•˜λΌ - [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 (λŸ°νƒ€μž„μ— λ°œμƒ) //..

    μ œλ„€λ¦­(Generics) - 곡변(Covariant), λΆˆκ³΅λ³€(Invariant), λ°˜κ³΅λ³€(Contravariant)

    1. 곡변, λΆˆκ³΅λ³€, λ°˜κ³΅λ³€μ˜ κ°œλ… πŸŒ‚ λ³€μ„±(Variance)μ΄λž€ νƒ€μž…μ˜ 계측 κ΄€κ³„μ—μ„œ μ„œλ‘œ λ‹€λ₯Έ νƒ€μž… 간에 μ–΄λ– ν•œ 관계가 μžˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 것이닀. λ³€μ„±μ˜ 3가지 μ’…λ₯˜μΈ 곡변(Covariant), λΆˆκ³΅λ³€(Invariant), λ°˜κ³΅λ³€(Contravariant)은 λ‹€μŒκ³Ό 같은 νŠΉμ„±μ„ 가진닀. 곡변 Sκ°€ T의 ν•˜μœ„ νƒ€μž…μ΄λ©΄, S[]λŠ” T[]의 ν•˜μœ„ νƒ€μž…μ΄λ‹€. λΆˆκ³΅λ³€ List와 ListλŠ” 관계가 μ—†λ‹€. λ°˜κ³΅λ³€ Sκ°€ T의 ν•˜μœ„ νƒ€μž…μ΄λ©΄, T[]λŠ” S[]의 ν•˜μœ„ νƒ€μž…μ΄λ‹€. 2. μ œλ„€λ¦­μ€ 곡변성이 μ—†λ‹€. β˜” μžλ°”μ—μ„œ 배열은 곡변이고, μ œλ„€λ¦­μ€ λΆˆκ³΅λ³€μ΄λ‹€. 즉, 객체 νƒ€μž…μ˜ κ΄€κ³„μ—μ„œ Aκ°€ B의 ν•˜μœ„ νƒ€μž…μΌ λ•Œ, λ°°μ—΄ A[]λŠ” B[]의 ν•˜μœ„ νƒ€μž…μ΄μ§€λ§Œ Listsms List의 ν•˜μœ„ νƒ€μž…μ΄ μ•„λ‹ˆλ‹€. public stat..