티스토리 뷰


 : inner 클래스
 - 안드로이드 에서 주로 쓰임

  

< 종류 >


  1. instance 이너 클래스
  2. local  이너
  3. static 이너 
  4. (anonymous) 익명 이너 클래스

  (1번과4번을 위주로 공부)

  

#기본 구조



 class Person{
  Eye eye;
 }
 class Eye{}
 ------------------
 class Person{
  class Eye{ // 내부 클래스

  }
 }

  


1. instance 이너 클래스


(1) instance 사용


package instanceex;

class Outer{


//타입  변수
 int   num;    // 인스턴스 변수
 
 //인스턴스 내부 클래스 (instanceInner class)-->타입의 역할 수행
 class Value{
  int val1;
  int val2;
  int val3;


  //class임으로 메서드 생성가능
  void m(){
  }
  void n(){
  }
  
 }
}


public class InstanceInner {

 public static void main(String[] args) {
 
  Outer.Value myValue = new Value();
  // error나는 이유 --> Outer 가 생성되지 않았는기때문에 Value가 나올수 없음
  //Outer에 의해 좌지우지 됨
  

  Outer.Value myValue =null;
  myValue= new Outer().new Value();


  
  myValue.val1=10;
  myValue.val1=20;
  myValue.val1=30;


 }

}


(2) instance inner 사용 이유


ex1)



package instanceex;
class Data{
 int commonValue=0x123456;  //--> 공통값이므로 이 값이 바뀌면 나머지도 같이 바뀌었으면 좋겠다 
 
 class Num3{
  int num3 = commonValue;
  // 외부에 있는 commonValue 를 생성자 없이 언제든 공유할 수 있다
  //num1,num2 처럼 인스턴스를 생성하지않고 바로 사용 가능
 }
 
}
class Num1{
 int num1;
 Num1(){
  Data d = new Data();
  num1= d.commonValue;
 }
}
class Num2{
 int num2= new Data().commonValue;
 
}
public class InstanceInner2 {

 public static void main(String[] args) {
  
 }


(3) 인스턴스이너 호출


package instanceex;

import java.util.Date;


class MyCalendar{
 Date date = new Date();
 

 //instanceInner 클래스
 class Diary{
  void record(){
   System.out.println(date+"다이어리 구매");
  }
 }
 class Household_ledger{
  void buy(){

   System.out.println(date+"에 시장을 감");
  }
 }
}
public class InstanceInner3 {

 public static void main(String[] args) {
  
  //#1. 메서드 호출할 때마다 인스턴스를 만들자
  


  new MyCalendar().new Diary().record();
  new MyCalendar().new Household_ledger().buy();
  
  //#2. 외부 객체를 하나 만든 후 , 내부 인스턴스를 호출하자
  
  MyCalendar cal= new MyCalendar();
  
  cal.new Diary().record();
  cal.new Household_ledger().buy();
  
  //#3. 인스턴스 객체를 만든후에 내부 호출
  
  MyCalendar.Diary myD= new MyCalendar().new Diary();
  myD.record();
  
  MyCalendar.Household_ledger myH= new MyCalendar().new Household_ledger();
  myH.buy();
  
  //#4. 만든 인스턴스 객체에 외부객체를 사용하여 호출
  
  myD=cal.new Diary();
  myH=cal.new Household_ledger();
  
    
 }

}


#실습


package instanceex;

import java.util.Date;
class HumanFace{
 String faceColor="노란색";
 class Eye{
  String eyeColor=faceColor; //인스턴스이너이므로 바로 사용가능
  int eH,eW;
 }
}
class Nose{
 String noseColor;
 int nH,nW;


 //instanceInner이 아니기 때문에 직접 만들어 주어야한다
 Nose(){
  noseColor= new HumanFace().faceColor;
  
 }
}
public class InstanceInner4 {

 public static void main(String[] args) {
  
  String fColor="";
  String eColor="";
  String nColor="";
  
  HumanFace hf= new HumanFace();
  fColor=hf.faceColor;
  
  HumanFace.Eye ec= new HumanFace().new Eye();
  eColor=ec.eyeColor;
  
  Nose nc=new Nose();
  nColor = nc.noseColor;
  
  System.out.println("얼굴색 :" +fColor);
  System.out.println("눈 색 :" +eColor);
  System.out.println("코 색 :" +nColor);
  
  System.out.println("--------------------");
  
  hf.faceColor="빨강색";
  fColor=hf.faceColor;
  eColor=hf.faceColor;
  
  System.out.println("얼굴색 :" +fColor);
  System.out.println("눈 색 :" +eColor);
  System.out.println("코 색 :" +nColor);
  
  System.out.println("--------------------");
  
  //파란색
  hf.faceColor="파란색";
  ec.eyeColor=hf.faceColor;
  
  System.out.println("얼굴색 :" +hf.faceColor);
  System.out.println("눈 색 :" +hf.new Eye().eyeColor);
  System.out.println("코 색 :" +nColor);
  
 }

}




  2. local  이너


  ※ 내부 클래스의 위치가 로컬화 되어 있다
       ( 지역화 )
       ( 메서드 안에 )
       
 1. 지역화 되어 있다 : 해당 {} 안에서만 쓸 수 있다
 2. 내부 클래스가 지역화 되어 있으면
   객체 생성 --> 객체.메서드() 호출 까지를 해당 메서드 안에서 다 처리해야 한다
   *왜? --> 클래스 단어를 메서드 밖에서는 모른다


#실습


package localex;
class Outer{
 int num;// 인스턴스
 class inner{}//인스턴스
 
 void print(int choice){
  
  class localInner{ // local 이너
   void hpPrinter(){
    System.out.println("hp로 인쇄");
   }
   void epsonPrinter(){
    System.out.println("epson으로 인쇄");
   }
   void samsunPrinter(){
    System.out.println("samsung으로 인쇄");
   }
  }// end local 이너 클래스
  // end local 과 end print 사이의 공간에 로컬인스턴스를 만들어줌
  
  localInner local = new localInner();
  
  if(choice==1){
   local.hpPrinter();
  }else if(choice==2){
   local.epsonPrinter();
  }else if(choice==3){
   local.samsunPrinter();
  }
 }//end print : localInner는 여기 밖에서는 쓸수 없다 --> 클래스 단어 자체가 지역화되어있다는 소리
 
}
public class LocalInner {

 public static void main(String[] args) {

  new Outer().print(1);
  new Outer().print(2);
  new Outer().print(3);
 }

}




  3. static 이너 


 
  * 내부 클래스를 만들떄,
   static 이라는 키워드가 붙어있는 상태
 
  1. static 을 붙일 수 밖에 없는 상황
     : 내부 클래스를 구성하는 맴버중에
     static 변수나 static 메서드가 있다면 내부 클래스는  static 키워드를 붙여야 한다
     


#실습


package staticex;
class Outer{

 int num=111;
 // 인스턴스를 만들어야 사용할 수 있는 변수
 
 static int stNum=777;
 // 인스턴스를 만들지 않아도 사용 할수 있는 변수
}
public class StaticInner {

 public static void main(String[] args) {

  System.out.println(Outer.stNum);
  // 인스턴스 없어도 사용 가능
  
  Outer in = new Outer();
  System.out.println(in);
  // 인스턴스를 만들어야 사용 가능
 }

}



#실습 2


package staticex;
class Outer2{
 //static 은 top class에서 사용 가능
 
 class inner{
  
  void innerMethod(){ // <=== new Outer3().new inner() 인스턴스만들고 인스턴스 만든다 
   System.out.println("inner 메서드");
  }
 }
 static class stInner{// <== new Outer3.stInner(); 바로 만드는 것 가능
  static void staticMethod(){
   System.out.println("Inner 메서드2");
   
  }
 }
}

public class StaticInner2 {

 public static void main(String[] args) {

  
  Outer2.stInner.staticMethod();
  //이미 stInner는 인스턴스화 되었기 때문에
  //굳이 new Outer3.stInner()생성자가 필요없다
 }

}


'Programing > Java' 카테고리의 다른 글

Java2 - 08. 익명 내부 클래스 (anonymous)  (0) 2017.05.18
Java2 - 03. 패키지 Object - Equals  (0) 2017.05.11
Java2 - 02. 패키지 Object- toString  (0) 2017.05.11
Java2 - 01. 예외처리  (0) 2017.05.10
Java1 - 22. 다형성  (0) 2017.05.10
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함