ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA μžλ°” μ€‘μ²©ν΄λž˜μŠ€, comparator μΈν„°νŽ˜μ΄μŠ€
    JAVA 2020. 8. 9. 12:54

    🎯 μžλ°” μ€‘μ²©ν΄λž˜μŠ€μ™€ comparator μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™œμš©ν•œ 배열정렬을 μ•Œμ•„λ³Έλ‹€.

     

     


    πŸ”– λͺ©μ°¨

    μ€‘μ²©ν΄λž˜μŠ€

    읡λͺ…ν΄λž˜μŠ€

    comparator μ •λ ¬ μΈν„°νŽ˜μ΄μŠ€


     

     

    μ€‘μ²©ν΄λž˜μŠ€

    public class Outer{
    
    	class Inner{
    
    	}//end Inner
    
    }//end Outer

    클래슀 μ•ˆμ— 또 λ‹€λ₯Έ 클래슀λ₯Ό 가진 ν˜•νƒœλ‹€. AλΌλŠ” ν΄λž˜μŠ€κ°€ B ν΄λž˜μŠ€μ—μ„œλ§Œ μ‚¬μš©λœλ‹€λ©΄, 독립적인 클래슀둜 μž‘μ„±ν•˜κΈ°λ³΄λ‹€ B클래슀의 μ€‘μ²©ν˜•νƒœλ‘œ μž‘μ„±ν•˜λŠ” 게 κ΄€λ¦¬ν•˜κΈ° μ‰¬μ›Œμ§„λ‹€.

    μ€‘μ²©λœ μ΄λ„ˆν΄λž˜μŠ€λŠ” μ•„μš°ν„° 클래슀의 멀버(λ³€μˆ˜, λ©”μ†Œλ“œ)λ₯Ό μžμ‹ μ˜ κ²ƒμ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλ‹€. Outer λ©€λ²„μ˜ μ ‘κ·Όμ§€μ •μžκ°€ private이라도 μ ‘κ·Όν•  수 μžˆλ‹€.

    μ΄λ„ˆν΄λž˜μŠ€ μ•ˆμ—μ„  static λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€. static 선언은 λ³€μˆ˜κ°€ μ•„λ‹Œ μ΄λ„ˆ ν΄λž˜μŠ€μ—λ§Œ 지정할 수 μžˆλ‹€. μ΄λ„ˆν΄λž˜μŠ€λŠ” μ•„μš°ν„° 클래슀λ₯Ό ν†΅ν•΄μ„œλ§Œ μ ‘κ·Όν•  수 μžˆμ§€λ§Œ μŠ€νƒœν‹± μ΄λ„ˆ ν΄λž˜μŠ€λŠ” 직접 μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.

    μ€‘μ²©ν΄λž˜μŠ€λŠ” μ •μ˜λ˜λŠ” μœ„μΉ˜μ— λ”°λΌμ„œ 4가지 ν˜•νƒœλ‘œ λ‚˜λ‰œλ‹€.

     

     

    member Inner 클래슀

    Outer 클래슀의 λ©€λ²„μ²˜λŸΌ μ •μ˜λœ 클래슀. 멀버와 같이 객체생성 ν›„ μ‚¬μš©ν•  수 μžˆλ‹€. λ°˜λ“œμ‹œ Outer 클래슀의 객체λ₯Ό λ¨Όμ € 생성해야 ν•œλ‹€.

    public class Outer {
    	// λ©€λ²„λ³€μˆ˜
    	public int n = 10;
    	protected int n2 = 20;
    	int n3 = 30;
    	private int n4 = 40;
    	static int n5 = 50;
    	// 멀버 λ©”μ„œλ“œ
    	public void x() {}
        
    	// 멀버 inner클래슀
    	class Inner {
    		int k = 10;
    		static final int NUM = 20; // μƒμˆ˜ κ°€λŠ₯
    		// static int k2 =20; //staticλ³€μˆ˜ μ‚¬μš© λΆˆκ°€
    
    		public void info() {
    			System.out.println(n);
    			System.out.println(n2);
    			System.out.println(n3);
    			System.out.println(n4);
    			System.out.println(n5);
    			System.out.println(k);
    			System.out.println(NUM);
    		}
    
    	}// end Inner
    	// 1. Outerμ—μ„œ Inner생성
    	public void innerCreate() {
    		Inner i = new Inner();
    		i.info();
    	}
    }

    Inner ν΄λž˜μŠ€κ°€ ν†΅μ§Έλ‘œ Outer 클래슀의 멀버 μžλ¦¬μ— μœ„μΉ˜ν•΄μžˆλ‹€. Outer의 λ©€λ²„λ³€μˆ˜μ—” λ‹€μ–‘ν•œ μ ‘κ·Όμ§€μ •μžκ°€ λΆ™μ–΄μžˆμ§€λ§Œ Innerν΄λž˜μŠ€λŠ” μ œν•œ 없이 Outer의 λͺ¨λ“  멀버λ₯Ό μžκΈ°κ²ƒμ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλ‹€. Outer의 innerCreate() λ©”μ†Œλ“œλ₯Ό 보면 Outerν΄λž˜μŠ€μ—μ„œ μ΄λ„ˆν΄λž˜μŠ€μ— μ ‘κ·Όν•  땐 직접 μ΄λ„ˆν΄λž˜μŠ€μ˜ 객체λ₯Ό μƒμ„±ν•˜κ³  μ΄λ„ˆν΄λž˜μŠ€μ˜ infoν•¨μˆ˜μ— μ ‘κ·Όν•˜λŠ” 것을 λ³Ό 수 μžˆλ‹€.

    public class TestOuter {
    	public static void main(String[] args) {
    		Outer outer = new Outer();
    		outer.innerCreate();
    		//2. Outerλ°–μ—μ„œ Inner 생성==>λ°˜λ“œμ‹œ OuterλΆ€ν„°μƒμ„±ν•œλ‹€.
    		Outer outer2 = new Outer(); //λ°”κΉ₯에 μžˆλŠ” 클래슀 생성
    		outer2.n=1; 
    		Outer.Inner inner = outer2.new Inner();
    		inner.info();
    	}
    }

    μ™ΈλΆ€ν΄λž˜μŠ€μ˜ main ν•¨μˆ˜ μ•ˆμ—μ„œ μ΄λ„ˆν΄λž˜μŠ€λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„  λ¨Όμ € Outer 클래슀의 객체생성을 ν•΄μ•Όν•œλ‹€. κ·Έ λ‹€μŒ Outer.Inner νƒ€μž…μœΌλ‘œ μ΄λ„ˆν΄λž˜μŠ€μ˜ 객체λ₯Ό μƒμ„±ν•˜κ³  μ΄λ„ˆν΄λž˜μŠ€μ˜ infoν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.

     

     

    local Inner 클래슀

    Outer클래슀의 νŠΉμ • λ©”μ†Œλ“œ μ•ˆμ—μ„œ λ‘œμ»¬λ³€μˆ˜μ²˜λŸΌ μ •μ˜λœ 클래슀λ₯Ό μ˜λ―Έν•œλ‹€. λ‘œμ»¬λ³€μˆ˜ μžλ¦¬μ— μ΄λ„ˆν΄λž˜μŠ€κ°€ μ„ μ–Έλ˜μ—ˆκΈ° λ•Œλ¬Έμ— λ©”μ†Œλ“œκ°€ μ’…λ£Œλ  λ•Œ μ΄λ„ˆν΄λž˜μŠ€λ„ 사라진닀. 

    class Outer2 {
    	int a = 10;
    	private int b = 20;
    	static int c = 30;
    	
    	public void info() {
    		int size = 100;
    			class Inner {
    				int d = 40;
    				public void print() {
    					System.out.println(a);
    					System.out.println(b);
    					System.out.println(c);
    					System.out.println(d);
    					System.out.println(size);
    				}
    			}
    			Inner inner = new Inner();
    			inner.print();
    	}
    }
    public class Ex07_5 {
    	public static void main(String[] args) {
    		Outer2 outer = new Outer2();
    		outer.info();
    	}
    }

    Outer클래슀의 info()λ©”μ†Œλ“œ μ•ˆμ—μ„œ μ΄λ„ˆν΄λž˜μŠ€μ˜ 객체λ₯Ό μƒμ„±ν•˜κ³  print() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€. 이 print λ©”μ†Œλ“œλŠ” info()λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλ˜μ–΄μ•Ό μ‹€ν–‰λœλ‹€.

     

     

    static Inner 클래슀

    static ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μ΄λ„ˆν΄λž˜μŠ€λ₯Ό μ •μ˜ν•œ ν˜•νƒœλ‹€. static μ΄λ„ˆν΄λž˜μŠ€λŠ” static λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 있고, Outer 클래슀λ₯Ό 생성할 ν•„μš”μ—†μ΄ μ΄λ„ˆν΄λž˜μŠ€μ— 직접 μ ‘κ·Όν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ 이 경우 Outer클래슀의 멀버에 μ ‘κ·Όν•  수 μ—†κΈ° λ•Œλ¬Έμ— static λ³€μˆ˜κ°€ ν•„μš”ν•œ μƒν™©μ—μ„œλ§Œ μ‚¬μš©ν•œλ‹€.

    public class Outer3 {
    	// λ©€λ²„λ³€μˆ˜
    	public int n = 10;
    	protected int n2 = 20;
    	int n3 = 30;
    	private int n4 = 40;
    	static int n5 = 50;
    
    	// 멀버 λ©”μ„œλ“œ
    	public void x() {}
    
    	static class Inner {
    		int k = 10;
    		static final int NUM = 20; // μƒμˆ˜ κ°€λŠ₯
    		static int k2 = 20;
    
    		public void info() {
    //			System.out.println(n);
    //			System.out.println(n2);
    //			System.out.println(n3);
    //			System.out.println(n4);  
    			System.out.println(n5);
    			System.out.println(k);
    			System.out.println(k2);
    			System.out.println(NUM);
    		}
    	}// end Inner
    }// end class

    static으둜 μ„ μ–Έλœ μ΄λ„ˆν΄λž˜μŠ€λŠ” staticλ³€μˆ˜λ₯Ό μ œμ™Έν•œ Outer의 멀버λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.

     

     

    anonymous Inner 클래슀(읡λͺ…ν΄λž˜μŠ€)

    μ΄λ¦„μ—†λŠ” μ΄λ„ˆν΄λž˜μŠ€μ΄λ©°, 일반적으둜 μΈν„°νŽ˜μ΄μŠ€λ‚˜ μΆ”μƒν΄λž˜μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©λœλ‹€. μ›λž˜ μΈν„°νŽ˜μ΄μŠ€λŠ” 객체생성을 ν•  수 μ—†μœΌλ©° implements둜 μ—°κ²°ν•œ ν•˜μœ„ν΄λž˜μŠ€λ₯Ό 톡해 μΆ”μƒλ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•œλ‹€. λ°˜λ©΄μ— 읡λͺ…ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν•˜μœ„ν΄λž˜μŠ€ κΈ°λŠ₯을 ν•˜λ©°, ν•˜μœ„ν΄λž˜μŠ€ 없이 λ°”λ‘œ new ν‚€μ›Œλ“œλ‘œ μžμ‹ μ„ μƒμ„±ν•˜κ³  블둝을 μ—΄μ–΄ μΆ”μƒλ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•œλ‹€. 맨 λ§ˆμ§€λ§‰μ— λ°˜λ“œμ‹œ μ„Έλ―Έμ½œλ‘ μ„ 뢙인닀.

    μΈν„°νŽ˜μ΄μŠ€λͺ… λ³€μˆ˜λͺ…  = new μΈν„°νŽ˜μ΄μŠ€λͺ…() {μΆ”μƒλ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©};

    public interface Flyer {
    	public abstract void takeOff();
    }

    takeOff() μΆ”μƒλ©”μ†Œλ“œλ₯Ό 가진 Flyer μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“ λ‹€.

    public class Bird implements Flyer {
    	@Override
    	public void takeOff() {
    		System.out.println("Bird.takeOff");
    	}
    }

    μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” Bird 클래슀λ₯Ό λ§Œλ“€κ³  μΆ”μƒλ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•΄μ„œ κ΅¬ν˜„ν•œλ‹€.

    public class TestOuter4 {
    	public static void main(String[] args) {
    		
    		//1. 일반적인 방법==> μ΄λ¦„μžˆλŠ” 클래슀둜 처리
    		Flyer b = new Bird();
    		b.takeOff();
    		
    		//2. 읡λͺ…ν΄λž˜μŠ€
    		Flyer b2 = new Flyer(){
    			@Override
    			public void takeOff() {
    				System.out.println("SuperMan.takeOff");
    			}
    		}; //μ„Έλ―Έμ½œλ‘ 
    		b2.takeOff();
    		
    		Flyer b3 = new Flyer() {
    			@Override
    			public void takeOff() {
    				System.out.println("Airplane.takeOff");
    			}
    		};
    		b3.takeOff();
    	}//end main
    }
    
    ---------
    Bird.takeOff
    SuperMan.takeOff
    Airplane.takeOff

    μΈν„°νŽ˜μ΄μŠ€λŠ” 객체생성이 λΆˆκ°€λŠ₯ν•˜μ§€λ§Œ Flyer b둜 λ‹€ν˜•μ„±μ„ μ΄μš©ν•œ 데이터 ν˜•μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ Bird의 객체λ₯Ό μƒμ„±ν•˜κ³  λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 것이 일반적인 방법이닀. 읡λͺ…ν΄λž˜μŠ€λŠ” 클래슀 이름이 μ—†μœΌλ©° μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°μ²΄μƒμ„±ν•˜λ“― μž‘μ„±ν•˜κ³  블둝을 μ—΄μ–΄ 직접 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜κ³  μ„Έλ―Έμ½œλ‘ μœΌλ‘œ λ§ˆλ¬΄λ¦¬ν•œλ‹€. 

     

     

     

    comparator μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™œμš©ν•œ λ°°μ—΄ μ •λ ¬

    배열에 μ €μž₯된 클래슀의 νŠΉμ • λ³€μˆ˜κ°’μœΌλ‘œ 배열을 μ •λ ¬ν•˜κ³  싢을 λ•Œ μžλ°”μ—μ„œ μ œκ³΅ν•˜λŠ” API인 java.util.Comparator μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

    import java.util.Arrays;
    import java.util.Comparator;
    
    class Person {
    	String name;
    	int age;
    	public Person(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
    	@Override
    	public String toString() {
    		return name + " " + age;
    	}
    }//end Person
    
    class PersonComp implements Comparator<Person>{
    
    	@Override
    	public int compare(Person o1, Person o2) {
    		
    		int result = 1;
    		if(o1.age >= o2.age) result = -1;
    		return result;
    	}
    }
    
    public class Ex07_8 {
    	public static void main(String[] args) {
    		Person p = new Person("홍길동", 20);
    		Person p2 = new Person("μ΄μˆœμ‹ ", 44);
    		Person p3 = new Person("μœ κ΄€μˆœ", 18);
    		Person p4 = new Person("강감찬", 66);
    		Person [] ps = {p, p2, p3, p4};
    		//age둜 μ •λ ¬
    		Arrays.sort(ps, new PersonComp());
    		for(Person person : ps) {
    			System.out.println(person);
    		}
    	}
    }

    이름과 λ‚˜μ΄ 정보λ₯Ό μ €μž₯ν•œ Person 클래슀λ₯Ό 배열에 λ„£κ³  λ‚˜μ΄λ₯Ό κΈ°μ€€μœΌλ‘œ 배열을 μ •λ ¬ν•œλ‹€. comparatorμΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•œ 일반클래슀 PersonCompλ₯Ό λ§Œλ“€κ³  compare λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•œλ‹€. resultκ°€ μŒμˆ˜κ°’μ„ λ¦¬ν„΄ν•˜λ©΄ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜λ©°, μ–‘μˆ˜κ°’μ΄λ‚˜ 0을 λ¦¬ν„΄ν•˜λ©΄ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€.  λ©”μΈν•¨μˆ˜ μ•ˆμ—μ„œ Arrays.sort()λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰ν•΄ 배열을 μ •λ ¬ν•˜κ³  λ°˜ν™˜ν•  수 μžˆλ‹€. 

     

     

     

    😜 NEXT : μžλ°” ν•΅μ‹¬ν΄λž˜μŠ€ κ³΅λΆ€ν•˜κΈ°

    λ°˜μ‘ν˜•

    λŒ“κΈ€

κ°œλ°œκ³΅λΆ€