μ€μ²© ν΄λμ€(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 = new μΈλΆ_ν΄λμ€λͺ
();
μΈλΆν΄λμ€λͺ .λ©€λ²ν΄λμ€λͺ κ°μ²΄2 = κ°μ²΄1.new λ©€λ²ν΄λμ€λͺ (); - μΈλΆν΄λμ€λͺ .λ©€λ²ν΄λμ€λͺ κ°μ²΄ = 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 = "νκΈΈλ"; μλ¬
}
}
'π» > JAVA' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| [Java] 15μΌμ°¨ : μμΈ(Exception)μ²λ¦¬ 2 (2) | 2024.03.06 |
|---|---|
| [Java] 14μΌμ°¨ : μμΈ(Exception)μ²λ¦¬ (3) | 2024.03.05 |
| [Java] 14μΌμ°¨ : μΈν°νμ΄μ€(interface) (0) | 2024.03.05 |
| [Java] 13μΌμ°¨ : μμ 2 (0) | 2024.03.04 |
| [Java] 13μΌμ°¨ : μμ (0) | 2024.03.04 |