Studynote/Computer Science 12

10.14 제 10장 내부클래스 실습

e.sunie 2018. 11. 5. 01:12

10.14 제 10장 내부클래스 실습

 

[10-1]

 

소스코드

package Chapter_10;

 

class Outer { //외부 클래스

class Inner {

int iv = 100; //내부클래스(인스턴스 클래스)

}

}

 

public class Ex_10_1 {

public static void main(String[] args) {

 

Outer ou = new Outer();

Outer.Inner ii = ou.new Inner();

System.out.println(ii.iv);

 

}

 

}

실행결과 

100

 

 

⦁내부클래스의 인스턴스를 생성하기 위해서는 먼저 외부클래스의 인스턴스를 생성해야 한다.

 

[10-2]

 

소스코드

package Chapter_10;

 

class Outer1 { //외부 클래스

static class Inner {

int iv = 200; //내부클래스(인스턴스 클래스)

}

}

 

public class Ex_10_2 {

public static void main(String[] args) {

Outer1.Inner cv = new Outer1.Inner();

System.out.println(cv.iv);

 

}

 

}

 

//1. 다른 하나의 Outer클래스를 이름을 바꾼다. (Outer -> Outer1)

//2. Outer를 클래스 밖에  다른 클래스로 생성 - better

//3. 새로운 패캐지를 생성하여 그곳에 정의한다.

실행결과 

200

 

 

⦁static 맴버를 인스턴스 생성 벗이 사용할 수 있는 것처럼

stataic inner class는 인스턴스 클래스와 달리 외부 클래스의 인스턴스를 생성하지 않고도 사용할 수 있다.

[10-3]

 

소스코드 

package Chapter_10;

 

 

class Outer2 {

int value=10;

 

class Inner {

int value = 20;

void method1() {

int value = 30;

 

System.out.println(value);

System.out.println(this.value);

System.out.println(Outer2.this.value);

 

}

}

}

 

public class Ex_10_3 {

public static void main(String[] args) {

 

Outer2 outer = new Outer2();

Outer2.Inner inner = outer.new Inner();

inner.method1();

}

 

}

 

실행결과 

30

20

10

 

 

[10-4]

 

소스코드

package Chapter_10;

 

//import java.awt.*;

//import java.awt.event.*;

 

import java.awt.Frame;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;   //ctlr+shift+o : 자동 import작성

 

/*

public class Ex_10_4 {

 

public static void main(String[] args) {

Frame f = new Frame();

f.addWindowListener(new EventHandler());

}

}

 

class EventHandler extends WindowAdapter {

public void windowClosing(WindowEvent e) {

e.getWindow().setVisible(false);

e.getWindow().dispose();

System.exit(0);

}

}

*/

public class Ex_10_4 {

 

public static void main(String[] args) {

Frame f = new Frame();

f.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

e.getWindow().setVisible(false);

e.getWindow().dispose();

System.exit(0);

 

}

});

//main

}

실행결과

 

 

 

[10-5]

지역클래스에서 외부클래스의 인스턴스 맴버와 static맴버에 모두 접근할 수 있지만,

지역변수는 final이 붙은 상수만 접근할 수 있는 이유는 무엇인가?

 

왜? 함수가 살아 있는 순간만 지역변수가 존재. 종료와 동시에 소멸.(특징)

클래스에 일반변수의 접근을 허용하면. 함수가 종료되도 변수가 살아 있을 수 있다. 없어진 것을 참조한다. 상수는 어디에나 존재를 하기에 문제가 되지 않는다

 

 

소스코드

/* 

지역클래스에서 외부클래스의 인스턴스 맴버와 static맴버에 모두 접근할 수 있지만,

지역변수는 final이 붙은 상수만 접근할 수 있는 이유는 무엇인가?

 */

 

package Chapter_10;

 

public class Ex_10_5 {

public static void main(String[] args) {

final int VALUE = 10;

Thread t = new Thread(new Runnable() {

public void run() {

for (int i = 0; i < 10; i++) {

try {

Thread.sleep(1 * 10000);

catch (InterruptedException e) {

}

System.out.println(VALUE);

}

}// run()

});

t.start();

System.out.println("main()  -  종료.");

}// main

}

실행결과

main()  -  종료.

10

10

10

.

.

.