λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’»/JAVA

[Java] 14일차 : μ€‘μ²©ν΄λž˜μŠ€, μ—΄κ±°ν˜•, μ–΄λ…Έν…Œμ΄μ…˜, λ ˆμ½”λ“œ

by λ”°κΆˆ 2024. 3. 5.

 

 

쀑첩 클래슀(nested class)

 

쀑첩 클래슀 : ν΄λž˜μŠ€μ•ˆμ— 클래슀의 λ©€λ²„λ‘œ μ„ μ–Έλœ 클래슀

쀑첩 μΈν„°νŽ˜μ΄μŠ€ : ν΄λž˜μŠ€μ•ˆμ— 클래슀의 λ©€λ²„λ‘œ μ„ μ–Έλœ μΈν„°νŽ˜μ΄μŠ€ 

 

 

static 쀑첩 클래슀(static nested class)

ν΄λž˜μŠ€μ•ˆμ— 클래슀의 λ©€λ²„λ‘œ μ„ μ–Έλœ static 클래슀

  • μ™ΈλΆ€ 클래슀의 클래슀 λ³€μˆ˜(static λ³€μˆ˜)와 클래슀 λ©”μ†Œλ“œ(static λ©”μ†Œλ“œ)λŠ” λ°”λ‘œ μ ‘κ·Όν•˜μ—¬ μ‚¬μš© κ°€λŠ₯
  • μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œλŠ” static 쀑첩 클래슀 μ•ˆμ—μ„œ λ°”λ‘œ 접근이 λΆˆκ°€λŠ₯ν•˜λ©°, μ™ΈλΆ€ 클래슀의 객체λ₯Ό μƒμ„±ν•΄μ„œ μ ‘κ·Όν•œλ‹€.
  • μ™ΈλΆ€ 클래슀 객체 생성 없이 static 쀑첩 ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ λ°”λ‘œ 객체λ₯Ό μƒμ„±ν•΄μ„œ μ ‘κ·Ό ν•  수 μžˆλ‹€.
  • 컴파일 ν›„ μƒμ„±λ˜λŠ” μ™ΈλΆ€ ν΄λž˜μŠ€μ™€ 쀑첩 클래슀 μ™ΈλΆ€ν΄λž˜μŠ€λͺ….class μ™ΈλΆ€ν΄λž˜μŠ€λͺ…$μ€‘μ²©ν΄λž˜μŠ€λͺ….class

 

package ch08.unit07;

public class Ex01 {

	public static void main(String[] args) {
		// μ™ΈλΆ€μ—μ„œ static 쀑첩 클래슀 객체 생성 
		Test1.User1 u = new Test1.User1();
		
		u.write();
	}

}

class Test1 {
	int a = 10; // 객체 생성해야 μ‚¬μš© κ°€λŠ₯
	static int b = 0; // 객체 생성 없이도 μ‚¬μš© κ°€λŠ₯

	// static 쀑첩 클래슀
	// : μ™ΈλΆ€ 클래슀 (Test1) 객체 생성과 상관없이 객체λ₯Ό μƒμ„±ν•˜λ©° μ‚¬μš©ν• μˆ˜ μžˆλŠ”
	// : 컴파일 ν•˜λ©΄ "μ™ΈλΆ€ν΄λž˜μŠ€λͺ…$μ€‘μ²©ν΄λž˜μŠ€λͺ….class" 파일이 생성
	static class User1 {
		int x = 100;

		public void write() {
			// System.out.println(a); 컴였λ₯˜

			System.out.println(b);
			System.out.println(x);
		}

		public void disp() {
			Test1 t = new Test1();
			System.out.println(t.a);
		}

	}
	
	public void print () {
		System.out.println(a+","+b);
	}
}

 

 

package ch08.unit07;

public class Ex03 {

	public static void main(String[] args) {
		Button.OnClickListener Iistener = new Button.OnClickListener() {
			
			@Override
			public void onCkick() {
				
				System.out.println("클릭...");
			}
		};
		
		Iistener.onCkick();
				
	}

}
// 쀑첩 μΈν„°νŽ˜μ΄μŠ€ 
class Button {
	public interface OnClickListener {
		public void onCkick();
	}
	
	
	
}

 

 

 

λ‚΄λΆ€ 클래슀 (inner class)

Member class : ν΄λž˜μŠ€μ•ˆμ— 클래슀의 λ©€λ²„λ‘œ μ„ μ–Έλœ λ‚΄λΆ€ 멀버 클래슀(μΈμŠ€ν„΄μŠ€ 클래슀)

  • 멀버 ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 클래슀 λ³€μˆ˜(staticλ³€μˆ˜)와 클래슀 λ©”μ†Œλ“œ(static λ©”μ†Œλ“œ)λŠ” λ°”λ‘œ μ ‘κ·Όν•˜μ—¬ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.
  • 멀버 ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œλŠ” λ°”λ‘œ μ ‘κ·Όν•˜μ—¬ μ‚¬μš© κ°€λŠ₯
  • 멀버 ν΄λž˜μŠ€λŠ” 클래슀 λ³€μˆ˜ (static λ³€μˆ˜)와 클래슀 λ©”μ†Œλ“œ(staticλ©”μ†Œλ“œ)λ₯Ό κ°€μ§ˆ 수 μ—†λ‹€.
  • μ™ΈλΆ€ 클래슀의 λ©”μ†Œλ“œμ—μ„œ 멀버 클래슀λ₯Ό μ ‘κ·Όν•˜κΈ° μœ„ν•΄μ„œλŠ” 멀버 클래슀으 ㅣ객체λ₯Ό μƒμ„±ν•΄μ„œ μ ‘κ·Όν•΄μ•Ό ν•œλ‹€.
  • μ™ΈλΆ€ 클래슀 객체 생성 없이 멀버 ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ 객체λ₯Ό 생성할 수 μ—†λ‹€.
  • 컴파일 ν›„ μƒμ„±λ˜λŠ” μ™ΈλΆ€ ν΄λž˜μŠ€μ™€ 멀버 클래슀 μ™ΈλΆ€ν΄λž˜μŠ€λͺ….clas μ™ΈλΆ€ν΄λž˜μŠ€λͺ…$λ©€λ²„ν΄λž˜μŠ€λͺ….clas

β–Άλ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ λ‚΄λΆ€ 멀버 클래슀의 객체 생성

  1. μ™ΈλΆ€ν΄λž˜μŠ€λͺ… 객체1 = new μ™ΈλΆ€_클래슀λͺ…();
    μ™ΈλΆ€ν΄λž˜μŠ€λͺ….λ©€λ²„ν΄λž˜μŠ€λͺ… 객체2 = 객체1.new λ©€λ²„ν΄λž˜μŠ€λͺ…();
  2. μ™ΈλΆ€ν΄λž˜μŠ€λͺ….λ©€λ²„ν΄λž˜μŠ€λͺ… 객체 = new μ™ΈλΆ€ν΄λž˜μŠ€λͺ…().newλ©€λ²„ν΄λž˜μŠ€λͺ…();

 

 

 

package ch08.unit07;

public class Ex02 {

	public static void main(String[] args) {
		//λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” λ‹¨λ…μœΌλ‘œ 객체 생성 λΆˆκ°€ 
		//Test2.User2 uu = new Test2.User2(); // 컴였λ₯˜
		
		//λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 객체λ₯Ό 생성후 객체λ₯Ό μ΄μš©ν•˜μ—¬ μ‚¬μš© 
		// μ•„λž˜ 처럼 μ‚¬μš©ν•˜λŠ” κ²½μš°λŠ” μ—†μœΌλ©°
		// λ‚΄λΆ€ ν΄λž˜μŠ€λŠ”
		
		Test2 tt = new Test2();
		Test2.User2 uu = tt.new User2();
		uu.write();
		
	}

}
// λ‚΄λΆ€ 클래슀
// : μ™ΈλΆ€ 클래슀의 객체가 μƒμ„±λ˜μ–΄μ•Ό 객체λ₯Ό 생성할 수 μžˆλŠ” 클래슀 
class Test2 {
	int a = 10;
	static int b = 20;

	class User2 {
		int x = 100;

		public void write() {
			System.out.println(a + "," + b + "," + x);
		}
	}

	public void disp() {
		System.out.println(a + "," + b);
	}
	
	public void sub() {
		// λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” 일반적으둜 클래슀의 λ©”μ†Œλ“œ λ‚΄μ—μ„œ 객체λ₯Ό μƒμ„±ν•˜λ©° ν™œμš© 
		User2 u = new User2();
		u.write();
	}

}

 

 

 

Local class

  • 둜컬 ν΄λž˜μŠ€λŠ” μ΄ˆκΈ°ν™” λΈ”λ‘μ΄λ‚˜ 클래슀의 λ©”μ†Œλ“œ μ•ˆμ—μ„œ 클래슀λ₯Ό μ •μ˜ν•˜λŠ” κ²ƒμœΌλ‘œ μ„ μ–Έλœ μ˜μ—­ λ‚΄μ—μ„œλ§Œ μ‚¬μš©
  • λ‚΄λΆ€ 멀버 ν΄λž˜μŠ€μ™€ μœ μ‚¬ν•œ 성격을 κ°€μ§€κ³  μžˆμ§€λ§Œ μ ‘κ·Ό μ œμ–΄μžλŠ” 뢙일 수 μ—†λ‹€.
  • λ©”μ†Œλ“œ μ•ˆμ—μ„œ μ •μ˜λœ 둜컬 ν΄λž˜μŠ€λŠ” λ©”μ†Œλ“œμ˜ μ§€μ—­λ³€μˆ˜ 쀑 final λ³€μˆ˜λ§Œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.
  • λ©”μ†Œλ“œμ•ˆμ—μ„œ μ •μ˜λœ 둜컬 ν΄λž˜μŠ€μ—μ„œ λ©”μ†Œλ“œμ˜ final이 λΆ™μ§€ μ•ŠλŠ” μ§€μ—­λ³€μˆ˜λ₯Ό μ ‘κ·Όν•  경우 μ—λŸ¬κ°€ λ°œμƒν•˜μ§€λ§Œ μžλ°” 8λΆ€ν„°λŠ” μ ‘κ·Ό κ°€λŠ₯ν•˜λ©° 둜컬 ν΄λž˜μŠ€μ—μ„œ final이 μ—†λŠ” 둜컬 λ³€μˆ˜λ₯Ό μ ‘κ·Όν•œ 경우 final 속성을 κ°–λŠ”λ‹€.

 

 


 

μ—΄κ±°ν˜•(Enumeration Type)

 

  • enum은 μ—΄κ±°ν˜•μ΄λΌ ν•˜λ©°, μ—΄κ±°ν˜•μ€ μ„œλ‘œ μ—°κ΄€λœ μƒμˆ˜μ˜ 집합이라 ν•  수 μžˆλ‹€. 
  • μžλ°”λŠ” 1.5λΆ€ν„° μ—΄κ±°ν˜•μ„ μœ„ν•œ enum νƒ€μž…μ„ μ œκ³΅ν•œλ‹€.
  • enumνƒ€μž…μ€ λ³€μˆ˜κ°€ 미리 μ •μ˜λœ μƒμˆ˜ μ„ΈνŠΈκ°€ 될 수 μžˆλ„λ‘ ν•˜λŠ” 특수 데이터 μœ ν˜•(νŠΉμˆ˜ν•œ ν˜•νƒœμ˜ class)이닀.
  • μ—΄κ±°ν˜•μ€ enum ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜ν•œλ‹€.
  • enum은 newλ₯Ό μ‚¬μš©ν•˜μ—¬ 객체λ₯Ό 생성 ν•  수 μ—†λ‹€.
  • enum μΈμŠ€ν„΄μŠ€λŠ” μ½”λ“œ μƒμ—μ„œ 처음 ν˜ΈμΆœλ˜κ±°λ‚˜ μ°Έμ‘° 될 λ•Œ μƒμ„±ν•œλ‹€.
  • enum은 μ•”μ‹œμ μœΌλ‘œ java.lang.Enum 클래슀λ₯Ό 상속받기 λ•Œλ¬Έμ— enum에 μ •μ˜λœ μƒμˆ˜λŠ” Enum 클래슀의 λͺ¨λ“  멀버λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. λ˜ν•œ μžλ°”λŠ” 닀쀑 상속을 μ§€μ›ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ enum은 λ‹€λ₯Έ 클래슀λ₯Ό 상속 받을 수 μ—†λ‹€.
  • enum에 λŒ€ν•œ EnumMap, EnumSet μ»¬λ ‰μ…˜ ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜λ―€λ‘œ λ”μš± λ‹€μ–‘ν•˜κ²Œ ν™œμš© κ°€λŠ₯.

 

 

package ch08.unit08;

public class Ex01 {

	public static void main(String[] args) {
		System.out.println(Color.RED); // RED

		// μ—΄κ±°ν˜• μƒμˆ˜μ˜ 기수 좜λ ₯
		for (Color c : Color.values()) {
			System.out.println(c + "->" + c.ordinal()); // ordinal μœ„μΉ˜κ°€ μ–΄λ””μžˆλŠ”μ§€ μ•Œλ €μ€Œ
			// RED : 0

		}

		System.out.println(Color.RED.ordinal() == 0);
		System.out.println();

		Test1 t = new Test1();
		System.out.println(t.getColor());

		Color color = t.getColor();
		// case κ΅¬λ¬Έμ—μ„œ Color. μƒλž΅ κ°€λŠ₯
		switch (color) {
		case RED:
			System.out.println("red");
			break;
		case GREEN:
			System.out.println("green");
			break;
		case BLUE:
			System.out.println("blue");
			break;

		}

	}

}

enum Color {
	RED, GREEN, BLUE
}

class Test1 {
	private Color color = Color.RED;

	public void steColor(Color color) {
		this.color = color;
	}

	public Color getColor() {
		return color;
	}
}

 

 

package ch08.unit08;

public class Ex02 {

	public static void main(String[] args) {
		System.out.println(City.SEOUL);
		System.out.println(City.SEOUL.getCount());
		
		for(City c : City.values()) {
			System.out.println(c.getName()+","+c.getCount());
		}

	}

}

//  μ—΄κ±°ν˜• μƒμˆ˜μ— 값을 ν• λ‹Ή - μƒμ„±μžλ₯Ό λ§Œλ“œλŸ¬μ•Ό 함 
enum City {
	SEOUL("μ„œμšΈ", 1000), BUSAN("λΆ€μ‚°", 350), INCHEON("인천", 300);

	private String name;
	private int count;

	// μ—΄κ±°ν˜• μƒμ„±μžλŠ” private만 κ°€λŠ₯, μƒλž΅ν•΄λ„ private
	City(String name, int count) {

		this.name = name;
		this.count = count;
	}

	public String getName() {
		return name;
	}

	public int getCount() {
		return count;
	}

	public String toString() {
		return name + ":" + count;
	}
}

 

 

 

μ–΄λ…Έν…Œμ΄μ…˜(annotantion)

  • μ–΄λ…Έν…Œμ΄μ…˜μ€ ν–₯ν›„ νŠΉμ • μƒν™©μ—μ„œ 데이터λ₯Ό μ‰½κ²Œ ν™œμš©ν•  수 μžˆλ„λ‘ μ†ŒμŠ€ μ½”λ“œμ— 좔가적인 정보λ₯Ό μ œκ³΅ν•΄μ£ΌλŠ” 메타 데이터(metadata)
  • μ–΄λ…Έν…Œμ΄μ…˜μ€ 컴파일 ν•  λ•Œ λ‚˜, λŸ°νƒ€μž„ μ‹œμ— 해석될 수 μžˆλ‹€.
  • μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ½”λ“œ 문법 μ—λŸ¬λ₯Ό μ²΄ν¬ν•˜λ„λ‘ 정보 제곡 
  • μ†Œν”„νŠΈμ›¨μ–΄ 개발 νˆ΄μ΄λ‚˜ λ°œλ“œ, λ°°μΉ˜μ‹œ μ½”λ“œλ₯Ό μžλ™μœΌλ‘œ 생성할 수 μžˆλ„λ‘ 정보 제곡
  • λŸ°νƒ€μž„ μ‹œ νŠΉμ • κΈ°λŠ₯을 μ‹€ν–‰ν•˜λ„λ‘ 정보λ₯Ό 제곡

 

 

β–Ά 빌트 인 μ–΄λ…Έν…Œμ΄μ…˜(Built - in Annotations)

   μžλ°”μ—μ„œ 기본적으둜 μ œκ³΅ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜

 

λͺ…μΉ­ κΈ°λŠ₯
@Override λ©”μ†Œλ“œκ°€ μ˜€λ²„λΌμ΄λ“œ λλŠ”μ§€ 검증. Supter 클래슀 λ˜λŠ” κ΅¬ν˜„ν•΄μ•Ό ν•  μΈν„°νŽ˜μ΄μŠ€μ—μ„œ ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό 찾을 수 μ—†λ‹€λ©΄ 컴파일 였λ₯˜ λ°œμƒ.
@Deprecated λ°ν”„λ¦¬μΌ€μ΄ν‹°λ“œ μ–΄λ…Έν…Œμ΄μ…˜μ€ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ 말도둝 μœ λ„, μ‚¬μš©ν•œλ‹€λ©΄ 컴파일 κ²½κ³ λ₯Ό μΌμœΌν‚¨λ‹€.
@SuppressWarnings μ„œν”„λ ˆμŠ€ μ›Œλ‹ μ–΄λ…Έν…Œμ΄μ…˜μ€ 컴파일 κ²½κ³ λ₯Ό λ¬΄μ‹œν•˜λ„λ‘ ν•œλ‹€.
@SafeVarargs μ œλ„ˆλ¦­ 같은 κ°€λ³€μΈμž λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œ κ²½κ³ λ₯Ό λ¬΄μ‹œ.
@Functionallnterface λžŒλ‹€μ‹μ„ μœ„ν•œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ§€μ •. λ©”μ†Œλ“œκ°€ μ—†κ±°λ‚˜ λ‘κ°œ μ΄μƒλ˜λ©΄ 컴파일 였λ₯˜κ°€ λ°œμƒ.

 

 

package ch08.unit09;

import java.util.Date;

public class Ex01 {
//μ–΄λ…Έν…Œμ΄μ…˜ μ˜ˆμ‹œ 
	public static void main(String[] args) {
		Test1 t = new Test1();
		System.out.println(t);
		t.disp();
	}

}

class Test1 { // 빌트인 μ–΄λ…Έν…Œμ΄μ…˜ : μžλ°”κ°€ μ œκ³΅ν•΄μ€Œ
	// λ©”μ†Œλ“œμ΄λ¦„μ„ toString()둜 λ§Œλ“€λ©΄ μ—λŸ¬ : @Override λ•Œλ¬Έμ—
	// @Override : μž¬μ •μ˜ κ·œμΉ™ 체크
	@Override
	public String toString() {
		return "μ–΄λ…Έν…Œμ΄μ…˜...";
	}

	// @Deprecated : 더 λ‚˜μ€, κ°œμ„ λœ λ©”μ†Œλ“œκ°€ μžˆμŒμ„ λ‚˜νƒ€λ‚΄κ³ μž ν• λ•Œ
	@Deprecated
	public void sub() {
		System.out.println("sub...");
	}

	@SuppressWarnings("deprecation") // 경고문을 좜λ ₯ν•˜μ§€ μ•Šκ²Œ
	public void disp() {

		Date date = new Date();
		int y = date.getYear() + 1900;
		System.out.println(y);
	}
}

 

 

 

메타 μ–΄λ…Έν…Œμ΄μ…˜

Meta Annotations λ‹€λ₯Έ μ–΄λ…Έν…Œμ΄μ…˜μ— μ μš©λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜.

 

λͺ…μΉ­ κΈ°λŠ₯
@Retention μ–΄λ…Έν…Œμ΄μ…˜ 정보가 λ³΄κ΄€λ˜λŠ” 기간을 μ§€μ •. μ–΄λ–€ μ‹œμ κΉŒμ§€ μ–΄λ…Έν…Œμ΄μ…˜μ΄ 영ν–₯을 λ―ΈμΉ˜λŠ”μ§€ κ²°μ •
@Documented ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ„ javadoc에 ν¬ν•¨ν•œλ‹€.
@Target μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ μš©ν•  μœ„μΉ˜λ₯Ό κ²°μ •
@Inherited ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ„ μ„ μ–Έν•˜λ©΄ ν•˜μœ„ ν΄λž˜μŠ€κ°€ μ–΄λ…Έν…Œμ΄μ…˜μ„ 상속 받을 수 μžˆλ‹€.
@Repeatable 반볡적으둜 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ„ μ–Έν•  수 있게 ν•œλ‹€. 

 

 

μ»€μŠ€ν…€ μ–΄λ…Έν…Œμ΄μ…˜

 

custom annontation ν΄λž˜μŠ€μ™€ 같이 μ–΄λ…Έν…Œμ΄μ…˜μ„ μž„μ˜λ‘œ μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€. μ–΄λ…Έν…Œμ΄μ…˜μ˜ μ •μ˜λŠ” 일반적인 μΈν„°νŽ˜μ΄μŠ€μ˜ μ •μ˜μ™€ 맀우 μœ μ‚¬. μ»΄νŒŒμΌλŸ¬λŠ” λ‹€λ₯Έ μžλ°” μΈν„°νŽ˜μ΄μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μ–΄λ…Έν…Œμ΄μ…˜μ„ 클래슀둜 μ»΄νŒŒμΌν•œλ‹€.

 

package ch08.unit09;
//μ–΄λ…Έν…Œμ΄μ…˜ 생성 예제 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

public class Ex02 {

	public static void main(String[] args) {
		Test2 t = new Test2();
		t.exeute();

	}

}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME) // μ–΄λ…Έν…Œμ΄μ…˜ μœ μ§€ μ‹œμ 
@interface MYAnno{
	
}

class Test2{
	@MYAnno
	public void exeute() {
		System.out.println("μ—λ…Έν…Œμ΄μ…˜ 생성 예제...");
	}
}

 

 

package ch08.unit09;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

public class Ex03 {

	public static void main(String[] args) {
		Test3 t = new Test3();
		t.sub();
		System.out.println();
		
		// Test3 클래슀의 λ©”μ†Œλ“œ 정보
		Method[] mm = Test3.class.getDeclaredMethods();
		for(Method m:mm) {
			//λ©”μ†Œλ“œκ°€ PrintAnno μ—λ…Έν…Œμ΄μ…˜μ΄ μ μš©λ˜μ—ˆλŠ”μ§€ 확인
			
			if(m.isAnnotationPresent(PrintAnno.class)) {
				// @PrintAnno
				PrintAnno pa = m.getAnnotation(PrintAnno.class);
				
				//λ©”μ†Œλ“œμ˜ 이름 좜λ ₯
				System.out.println("["+m.getName()+"]");
			
				for(int i=0; i<pa.number();i++) {
					System.out.print(pa.value());
				}
				System.out.println();
				
				//λ©”μ†Œλ“œ 호좜
				try {
					m.invoke(t);
				} catch (Exception e) {
					                  
				}
				System.out.println();
				
			}
		}
	}
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface PrintAnno {
	// μ—λ…Έν…Œμ΄μ…˜ 속성 μ„€μ •
	public String value() default "-";
	public int number() default 15;
}

class Test3 {
	@PrintAnno
	public void sub() {
		System.out.println("μ‹€ν–‰-1");
	}

	@PrintAnno("*")
	public void sub2() {
		System.out.println("μ‹€ν–‰-2");
	}
	@PrintAnno(value ="#",number = 20)
	public void sub3() {
		System.out.println("μ‹€ν–‰-3");
	}
}

 

 

 


 

 

record 

  • λΆˆλ³€(immutable) 데이터 객체λ₯Ό μ‰½κ²Œ 생성할 수 μžˆλ„λ‘ ν•˜λŠ” μƒˆλ‘œμš΄ μœ ν˜•μ˜ 클래슀.
  • final 클래슀둜 ν•˜μœ„ 클래슀λ₯Ό κ°€μ§ˆ 수 μ—†μœΌλ©°, abstract 선언이 λΆˆκ°€λŠ₯ν•˜λ‹€.
  • λ‹€λ₯Έ 클래슀λ₯Ό 상속 받을 수 μ—†μ§€λ§Œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„(implement)ν•  수 μžˆλ‹€.
  • 각 ν•„λ“œλŠ” private final ν•„λ“œλ‘œ μ •μ˜λœλ‹€.
  • 각 ν•„λ“œμ˜ getterλŠ” getXXX()κ°€ μ•„λ‹Œ, ν•„λ“œλͺ…을 λ”΄ getterκ°€ μƒμ„±λœλ‹€.
  • recordλŠ” static λ³€μˆ˜λ₯Ό κ°€μ§ˆ 수 있고, static κ³Ό public methodλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

 

package ch08.unit10;
//λΆˆλ³€ 객체 μ˜ˆμ‹œ 
public class Ex01 {

	public static void main(String[] args) {
		Test1 t = new Test1(10,5);
		System.out.println(t.getX()+","+t.getY());

	}

}
//μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΆˆλ³€ 객체 
final class Test1{
	private final int x;
	private final int y;
	
	public Test1(int x, int y) {
		this.x = x;
		this.y = y;
	}
	public int getX() {
		return x;
	}
	public int getY() {
		return y;
	}
	
}

 

 

package ch08.unit10;
//λΆˆλ³€ 객체 record둜 λ§Œλ“€κΈ° 
public class Ex02 {

	public static void main(String[] args) {
		Point p = new Point (10,5);
		System.out.println(p.x()+","+p.y());
	}

}

record Point(int x, int y) {}

 

 

 

 

β–Ά 컴팩트 μƒμ„±μž(Compact Constructor)

  • μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μž 
  • λͺ…μ‹œμ μœΌλ‘œ μΈμŠ€ν„΄μŠ€ ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•˜μ§€ μ•Šμ•„λ„ 컴팩트 μƒμ„±μžμœΌ γ…£λ§ˆμ§€λ§‰μ— μ΄ˆκΈ°ν™” ꡬ문이 μžλ™μœΌλ‘œ μ‚½μž…
  • ν‘œμ€€ μƒμ„±μžμ™€λŠ” 달리 컴팩트 μƒμ„±μž λ‚΄λΆ€μ—μ„œλŠ” this ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€ ν•„λ“œμ— 접근을 ν•  수 μ—†λ‹€.
  • ν‘œμ€€ μƒμ„±μžμ™€ 컴팩트 μƒμ„±μžλ₯Ό ν˜Όμš©ν•΄μ„œ μ“Έ 수 μžˆλ‹€.
  • 컴팩트 μƒμ„±μž(Compact Constructor)λ₯Ό μ΄μš©ν•˜μ—¬ μƒμ„±μž λ§€κ°œλ³€μˆ˜μ˜ validation 둜직 등을 μ²˜λ¦¬ν•  수 μžˆλ‹€. 

 

package ch08.unit10;

public class Ex03 {

	public static void main(String[] args) {
		//Person p = new Person("μ΄μžλ°”", -5);
		Person p = new Person("μ΄μžλ°”", 5);
		System.out.println(p.name()+","+p.age());
	}

}
record Person(String name,int age) {
	//컴팩트 μƒμ„±μž
	public Person { 
		if(age<0) {
			throw new IllegalArgumentException("λ‚˜μ΄λŠ” 0μ΄μƒλ§Œ...");
				
	}
		// name = "홍길동"; κ°€λŠ₯
		//this.name = "홍길동"; μ—λŸ¬
	}
}