2023. 3. 7. 10:59γJAVA/Effective JAVA
[μ΄νν°λΈ μλ°] Item21. μΈν°νμ΄μ€λ ꡬννλ μͺ½μ κ³ λ €ν΄ μ€κ³νλΌ.
μλ°8 μ μλ μΈν°νμ΄μ€μ λ©μλλ₯Ό μΆκ°ν λ°©λ²μ΄ μμλλ° μλ° 8μ μμ κΈ°μ‘΄ μΈν°νμ΄μ€μ λ©μλλ₯Ό μΆκ°ν μ μκ² λλ€.
λν΄νΈ λ©μλλ‘ μ μΈνλ©΄ κ·Έ μΈν°νμ΄μ€λ₯Ό ꡬνν ν λν΄νΈ λ©μλλ₯Ό μ¬μ μνμ§ μμ λͺ¨λ ν΄λμ€μμ λν΄νΈ ꡬνμ΄ μ°μ΄κ² λλ€.
μ΄μ μλ°μμλ κΈ°μ‘΄ μΈν°νμ΄μ€μ λ©μλλ₯Ό μΆκ°ν μ μμ§λ§ λͺ¨λ κΈ°μ‘΄ ꡬν체λ€κ³Ό 맀λλ½κ² μ°λλλ€λ 보μ₯μ μλ€.
- κΈ°μ‘΄ μΈν°νμ΄μ€μ λν΄νΈ λ©μλ ꡬνμ μΆκ°νλ κ²μ μνν μΌμ΄λ€.
κΈ°μ‘΄ μΈν°νμ΄μ€μ λν΄νΈ λ©μλ ꡬνμ μΆκ°νλ κ²μ μννκΈ΄νλ€.
μλνλ©΄ λν΄νΈ λ©μλλ ꡬν ν΄λμ€μ λν΄ μ무κ²λ λͺ¨λ₯Έ μ± ν©μ μμ΄ λ¬΄μμ μ½μ λκΈ° λλ¬Έμ΄λ€.
μλ° λΌμ΄λΈλ¬λ¦¬μ λν΄νΈ λ©μλλ μ½λ νμ§μ΄ λκ³ λ²μ©μ μ΄λΌ λλΆλΆμ μν©μμ μ μλνμ§λ§ μκ°ν μ μλ λͺ¨λ μν©μμ λΆλ³μμ ν΄μΉμ§ μλ λν΄νΈ λ©μλλ₯Ό μμ±νκΈ°λ μ΄λ €μ΄ λ²μ΄λ€.
/**
* Removes all of the elements of this collection that satisfy the given
* predicate. Errors or runtime exceptions thrown during iteration or by
* the predicate are relayed to the caller.
*
* @implSpec
* The default implementation traverses all elements of the collection using
* its {@link #iterator}. Each matching element is removed using
* {@link Iterator#remove()}. If the collection's iterator does not
* support removal then an {@code UnsupportedOperationException} will be
* thrown on the first matching element.
*
* @param filter a predicate which returns {@code true} for elements to be
* removed
* @return {@code true} if any elements were removed
* @throws NullPointerException if the specified filter is null
* @throws UnsupportedOperationException if elements cannot be removed
* from this collection. Implementations may throw this exception if a
* matching element cannot be removed or if, in general, removal is not
* supported.
* @since 1.8
*/
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
μλ° 8 Collection μΈν°νμ΄μ€μ μΆκ°λ removeIf λ©μλλ₯Ό μλ₯Ό λ€μ΄ 보면 μ΄ λ©μλλ μ£Όμ΄μ§ λΆλ¦¬μΈ ν¨μ Predicate κ° trueλ₯Ό λ°ννλ λͺ¨λ μμλ₯Ό μ κ±°νλ€.
μ΄ μ½λμμ νμ‘΄νλ λͺ¨λ Collection ꡬν체μ μ μ΄μΈλ¦¬λ κ²μ μλλ° SynchronizedCollectionμ΄ λνμ μΈ μμ΄λ€.
μ΄ ν΄λμ€λ λͺ¨λ λ©μλμμ μ£Όμ΄μ§ λ½ κ°μ²΄λ‘ λκΈ°νν ν λ΄λΆ 컬λ μ κ°μ²΄μ κΈ°λ₯μ μμνλ λνΌ ν΄λμ€μ΄λ€.
κ·Όλ° μ΄ ν΄λμ€μμ remveIf λν΄νΈ ꡬνμ λ¬Όλ €λ°κ² λλ€λ©΄ μκΈ°μΉ λͺ»ν κ²°κ³Όλ‘ μ΄μ΄μ§ μ μλ€..!!
removeIfμ ꡬνμ λκΈ°νμ κ΄ν΄μλ μ무κ²λ λͺ¨λ₯΄κΈ° λλ¬Έμ λ½ κ°μ²΄λ₯Ό μ¬μ©ν μ μλ€.
SynchronizedCollection μΈμ€ν΄μ€λ₯Ό μ¬λ¬ μ€λ λκ° κ³΅μ νλ νκ²½μμ ν μ€λ λκ° removeIf λ₯Ό νΈμΆνλ©΄ ConcurrentModificationExceptionμ΄ λ°μνκ±°λ μκΈ°μΉ λͺ»ν κ²°κ³Όλ‘ μ΄μ΄μ§ μ μλ€.
- λν΄νΈ λ©μλλ μ»΄νμΌμ μ±κ³΅νλλΌλ κΈ°μ‘΄ ꡬν체μ λ°νμ μ€λ₯λ₯Ό μΌμΌν¬ μ μλ€.
public class Superclass
{
private void hello()
{
System.out.println("Superclass.hello");
}
}
public interface MakerInterface
{
default void hello()
{
System.out.println("MakerInterface.hello");
}
}
public class SubClass extends Superclass implements MakerInterface
{
public static void main(String[] args)
{
SubClass subClass = new SubClass();
subClass.hello();
}
}
μ΄ μ½λλ₯Ό μ€νν΄λ³΄λ©΄ λ°νμ μ€λ₯κ° λ°μνλ€.
'Exception in thread "main" java.lang.IllegalAccessError: class chapter03.item21.SubClass tried to access private method chapter03.item21.Superclass.hello()V'
νμ ꡬ체μ μΈ κ²μ΄ λ μ°μ νκ² λμ΄μκΈ° λλ¬Έμ ν΄λμ€κ° μΈν°νμ΄μ€λ₯Ό μ΄κΈ°λλ° μ΄ κ·μΉ?μ λ°λΌμ Subclassμμ helloλ₯Ό νΈμΆν κ²μ μΈν°νμ΄μ€μ helloκ° μλλΌ SuperClassμ helloμ΄λ€. κ·Όλ° SuperClassμ helloλ privateμΈλ°λ νΈμΆμ΄ λλ μλ¬? λ²κ·Έκ° μκ³ ,
κ·Έ κ²°κ³Ό μ΄λ₯Ό μ€ννλ©΄ private λ©μλμ μ κ·Όνλ€κ³ λ°νμ μ€λ₯λ₯Ό λ΄λ κ²μ΄λ€.
π μ 리
κΈ°μ‘΄ μΈν°νμ΄μ€μ λν΄νΈ λ©μλλ‘ μ λ©μλλ₯Ό μΆκ°νλ μΌμ κΌ νμν κ²½μ°κ° μλλΌλ©΄ νΌν΄μΌ νλ€.
μΆκ°νλ €λ λν΄νΈ λ©μλκ° κΈ°μ‘΄ ꡬν체λ€κ³Ό μΆ©λνμ§λ μμμ§ μ¬μ¬μκ³ ν΄μΌ ν¨λ λΉμ°νλ€.
λ°λ©΄μ μλ‘μ΄ μΈν°νμ΄μ€λ₯Ό λ§λλ κ²½μ°λΌλ©΄ νμ€μ μΈ λ©μλ ꡬνμ μ 곡νλ κ²μ μμ£Ό μ μ©ν μλ¨μ΄ λκ³ , μΈν°νμ΄μ€λ₯Ό λ μ½κ² ꡬνν΄ ν μ νμ©ν μ μκ² ν΄μ€λ€.