네스티드 클래스
- 클래스나 인터페이스 안에 클레스를 선언하거나 인터페이스를 선언하는 문법 (p607 참조)
- 클래스 안에 선언된 클래스를 네스티드 클래스, 그 클래스를 에워싼 클래스를 인클로징 클래스라 함.

네스티드 클래스의 종류

정적 네스티드 클래스 (static nested class)
- 클래스 안에 정의되는 static inner class

Line.Point point = new Line.Point(100,200);
직접 접근하여 생성 가능. (인클로징 클래스명.정적 네스티드 클래스명 = new...)


이너 클래스 (inner calss)
- 클래스 안에 정의되는 inner class
Cart cart = new Cart(); ...
Cart.Item item = cart.new Item("", 1,5000);
바깥에 있는 cart를 먼저 생성한 다음에 안에 있는 것을 생성할 수 있음.
(인클로징 클래스명.정적 네스티드 클래스명 = 생성자.new...)


로컬 이너 클래스 (local inner class)
- 메소드 안에 정의되는 inner class
메소드 본체 안에 선언된 네스티드 클래스. 메소드 안에서만 사용 가능.


이름 없는 이너 클래스
abstact나 interface를 새로운 클래스 이름 없이 생성


1. 이너 클래스 예제

1) 장바구니 클래스와 상품항목 클래스(이너클래스)

public class Cart { // 장바구니 클래스

ArrayList<Item> list = new ArrayList<Item>(); // 리스트형 자료구조 ArrayList

void addItem (String name, int num, int unitPrice) {

list.add(new Item(name,num, unitPrice)); // 이너 클래스의 생성자 호출

}

void removeItem(int index) {

list.remove(index);

}

Item getItem(int index) {

return list.get(index);

}

int getItemNum() {

       return list.size();

 }

int getTotalPrice() {

int total = 0;

for(Item item : list)

total += item.getPrice(); // 이너 클래스의 메소드 호출

return total;

}

void changeItemNumber (int index, int num) {

Item item = list.get(index);

item.num = num; // 이너 클래스의 필드 사용

}

class Item// 상품항목 클래스 (이너클래스)

String name;

int num;

int unitPrice;

Item (String name, int num, int unitPrice) {

this.name = name;

this.num = num;

this.unitPrice = unitPrice;

}

int getPrice() {

return num*unitPrice;

}

}

}

--------------------------

2) 실행 클래스 

public class NestedClassExample1 {


public static void main(String[] args) {

Cart cart = new Cart();

cart.addItem("쵸콜렛", 3, 1000);

cart.addItem("케이크", 1, 25000);

   cart.addItem("샴페인", 1, 7000);

    Cart.Item item = cart.new Item("꽃다발", 1. 50000); // 인크로징 클래스 외부에서 이너클래스의 객체 생성

    cart.list.add(item); // 상품 항목 객체를 생성해서 장바구니에 추가

   printCart(cart);

}

static void printCart(Cart cart) {

  int num = cart.getItemNum();

       System.out.println("      상품명   수량   단가    금액");        

       System.out.println("----------------------------------");        

       for (int cnt = 0; cnt < num; cnt++) {

           Cart.Item item = cart.getItem(cnt);

           System.out.printf("%3d %5s %5d %7d %7d %n", cnt+1, 

              item.name, item.num, item.unitPrice, item.getPrice());

       }

       System.out.println("----------------------------------");        

       System.out.printf("      총계              %10d %n", 

                         cart.getTotalPrice());

   }

}







2. 정적 네스티드 클래스 예제

1) 직선 클래스와 점 클래스(정적 네스티드 클래스)

---------------------------------------------------------------------------

public class Line { // 직선 클래스

Point point1, point2;

Line(int x1, int y1, int x2, int y2) {

 point1 = new Point(x1, y1); // 정적 네스티드 클래스의 생성자 호출

 point2 = new Point(x2, y2);

}  

 void move(int offsetX, int offsetY) {

 point1.x += offsetX;   // 정적 네스티드 클래스의 필드 사용

 point1.y += offsetY;

 point2.x += offsetX;

     point2.y += offsetY;

 } 

 

static class Point {   // 점 클래스

       int x, y;

       Point(int x, int y) {

           this.x = x;

           this.y = y;

      }

}

}

-----------------------------------------------------------------------

public class NestedClassExample2 {


public static void main(String[] args) {

Line line = new Line(0, 0, 100, 100);

line.move(10, 20);

printPoint(line.point1);

printPoint(line.point2);

}

static void printPoint(Line.Point point) {  

// 인클로징 클래스 외부에서 정적 네스티드 클래스 사용할 때에는 [인클로징 클래스 이름.]을 클래스명 앞에 붙여줌.

        System.out.printf("(%d, %d) %n", point.x, point.y);

    }

}






Posted by netyhobby
,