내부클래스(inner class) / 로컬 내부 클래스 / static 내부 클래스 / 익명의 내부클래스 / url
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());
}
}
}