JAVA

내부클래스(inner class) / 로컬 내부 클래스 / static 내부 클래스 / 익명의 내부클래스 / url

choi121xx 2014. 9. 13. 07:54

 

1.  내부클래스(inner class) 



- 클래스 또는 메소드 안에 또 다른 클래스를 만드는것(멤버로 클래스를 정의)


- 내부클래스는 외부클래스의 모든 멤버를 자신의 멤버처럼 사용가능 (private멤버접근 가능)


- static내부 클래스를 제외한 내부 클래스는 항상 외부 클래스 객체를 통해서 생성할 수 있다.

 


ex> Test01_inner.java

package test01;

import test01.OuterClass.InnerClass;

//외부클래스

class OuterClass{

    private int a=10;

    public void printa(){

        System.out.println("a:" +a);

    }

    public void printab(){

        InnerClass ic=new InnerClass();

        ic.print();

    }


    //내부클래스

    class InnerClass{

        private int b=20;

        public void print(){

            //내부클래스는 외부클래스의 private멤버까지도 맘대로 접근할 수 있다.

            System.out.println("a:" + a);

            System.out.println("b:"+b);

        }

    }

}

public class Test01_inner {

    public static void main(String[] args) {

        OuterClass oc=new OuterClass();

        oc.printab();


        //내부클래스 객체를 생성할때는 외부클래스 객체를 통해서 생성해야 한다.

        OuterClass.InnerClass aa=oc.new InnerClass();

        aa.print();

    }

}

 

 




2.  로컬내부 클래스 


- 메소드안에서 정의된 클래스(메소드안에서만 사용할 수 있다.)


- 외부클래스의 모든 멤버에 접근 가능(private멤버도 접근 가능)


- 지역변수는 접근 할 수 없지만 final로 선언된 상수는 접근 가능하다.


Ex> Test02_localInner.java

package test01;


class OuterClass1{


    private int a=10;


    public void test(){

        int b=20;

        final int d=40;


        class LocalInner{

            private int c=30;


            //내부클래스에서 static멤버는 선언할 수 없다.

            //private static int f=100;


            public void print(){

                System.out.println("a:" + a);


                //로컬내부클래스는 지역변수는 접근할 수 없다.

                //System.out.println("b:" + b);

                System.out.println("c:" + c);


                //final로 선언된 지역변수(상수)는 접근할 수 있다.

                System.out.println("d:" + d);

            }

        }

        LocalInner inner=new LocalInner();

        inner.print();

    }    

}

public class Test02_localInner {

    public static void main(String[] args) {

        

    }

}






3.  static 내부 클래스 


- 멤버변수에 static이 있으면 내부클래스로 static으로 만들어야 한다.


- static 내부클래스를 외부에서 생성하려면 Outer클래스객체의 생성없이 바로 생성할 수 있다.



ex> Test03_staticInner.java

package test01;


class OuterClass02{

    private int a=10;

    private static int b=20;


    static class InnerClass{

        private static int c=30;


        public void print(){

            //일반멤버변수(인스턴스변수)는 접근할 수 없음!

            //System.out.println("a:" + a);

            System.out.println("b:" + b);

            System.out.println("c:"+c);

        }

    }

    public void printAll(){

        //내부클래스 객체 생성

        InnerClass ic=new InnerClass();

        ic.print();

    }

}

public class Test03_staticInner {

    public static void main(String[] args) {

        //OuterClass02 oc=new OuterClass02();

        //oc.printAll();

        //static내부클래스 생성하기

        OuterClass02.InnerClass oi=new OuterClass02.InnerClass();

        oi.print();

    }

}

 


 


4. 익명의 내부 클래스(**) 


- 추상클래스나 인터페이스를 상속받아 딱 한번만 사용하고 버려질 클래스인경우 익명의 내부 클래스를 만들어 사용한다.


- 만드는 방법

   인터페이스(추상클래스) 객체명=new 인터페이스(){

       추상메소드오버라이딩(){..}

      ...

   };

 


ex> Test04_Anonymous.java

package test01;


interface Shape{

    void draw();

    void paint();

}

interface Message{

    void send(String msg);

}

public class Test04_Anonymous {

    public static void main(String[] args) {

        //Message를 익명의 내부클래스를 만들어 사용해 보세요.

        Message mm=new Message(){

            public void send(String msg){

                System.out.println(msg +" 를 이멜로 전송했습니다.");

            }

        };

        mm.send("test...");

        

        new Message(){

            public void send(String msg){

                System.out.println(msg+" 를 문자메시지로 보냈어요!");

            }

        }.send("ddd");

        

        //익명의 내부 클래스 만들기

        Shape sh=new Shape(){

            //추상메소드 오버라이딩

            public void draw(){

                System.out.println("사각형그리기");

            }

            public void paint(){

                System.out.println("사각형칠하기");

            }

        };

        sh.draw();

        sh.paint();

        

//        class Box implements Shape{

//            public void draw(){System.out.println("사각형그리기");}

//            public void paint(){System.out.println("사각형칠하기");}

//        }

//        Box bo=new Box();

//        bo.draw();

//        bo.paint();

//        

//        Box bo1=new Box();

    }

}




5.     

www.naver.com  url을 갖는 객체 생성 후 접속정보를 가져와 출력한다.


package test01.net;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.MalformedURLException;

import java.net.URL;

import java.net.URLConnection;


public class Test01_Url {

    public static void main(String[] args) {

        try{

            //URL에 대한 정보를 갖는 클래스

            URL url=new URL("http://www.naver.com");

            System.out.println("호스트명:" + url.getHost());

            System.out.println("포트:" + url.getPort());


            //URL에 접속한 정보를 갖는 클래스

            URLConnection uc=url.openConnection();

            System.out.println("mime타입:" + uc.getContentType());

            System.out.println("인코딩:" + uc.getContentEncoding());

            System.out.println("헤더정보:" + uc.getHeaderFields());


            //url접속을 통해 데이터를 읽어오기 위한 스트림 얻어오기

            InputStream is=uc.getInputStream();

            BufferedReader br=

                new BufferedReader(new InputStreamReader(is,"utf-8"));


            String str="";


            while((str=br.readLine())!=null){

                str=br.readLine();

                System.out.println(str);

            }

            br.close();

            

        }catch(MalformedURLException me){

            System.out.println(me.getMessage());

        }catch(IOException ie){

            System.out.println(ie.getMessage());

        }

    }

}