내부클래스

    -클래스 안의 클래스를 의미한다.,

    -코드를 간단하게 표현하기위하여 사용한다.

     

    선언위치에 따라

    1) Member inner class

    -Non-static class

    -Static class

    2) Local inner calss

    -Named local class

    -Anonymous class


     

    Outer 클래스, Inner 클래스 예제

    package kr.co.kihd.event2;
    
    public class InnerClassTest {
    
    	public static void main(String[] args) {
    		Outer outer = new Outer();
    		System.out.println("Outer의 aa값 : " + outer.aa);
    		System.out.println("Outer의 bb값 : " + Outer.bb);
    		outer.method();
    		
    		System.out.println("----Inner 클래스 접근하기----");
    		Outer outer2 = new Outer();
    		Outer.Inner inner = outer2.new Inner();
    		System.out.println("Inner의 cc값 = " + inner.cc);
    		inner.subFunc();
    		
    		Outer.StaticInner staticInner = new Outer.StaticInner();
    		System.out.println("StaticInner dd값 = " + staticInner.dd);
    		staticInner.subFunc1();
    		//staticInner.subFunc2();
    		Outer.StaticInner.subFunc2(); //올바른 호출 방법
    	}
    
    }
    
    //Outer 클래스
    class Outer {
    	int aa = 100;	 	 	//인스턴스 변수, non-static 변수
    	static int bb = 200;	//클래스 변수, static 변수
    	
    	public void method() {
    		System.out.println("-------일반 메서드-------");
    	}
    	
    	//Member Inner 클래스(non-static 내부클래스)
    	class Inner {					
    		int cc = 10;
    	
    		public void subFunc() {
    			System.out.println("------Inner Class(non-static)");
    			//Outer클래스 맴버 호출
    			System.out.println("외부클래스의 변수 aa = " + aa);
    			System.out.println("외부클래스의 변수(static) bb = " + bb);
    			method();
    		}
    		
    	}
    	//Member Inner 클래스(static 내부클래스)
    	static class StaticInner{
    		int dd = 20;
    		static int ee = 30;
    		
    		public void subFunc1() {
    			System.out.println("------Inner Class(non-static)");
    		}
    		
    		public static void subFunc2() {
    			System.out.println("------Inner Class(non-static2)");
    		}
    		
    	}
    	
    }

    Outer의 aa값 : 100
    Outer의 bb값 : 200
    -------일반 메서드-------
    ----Inner 클래스 접근하기----
    Inner의 cc값 = 10
    ------Inner Class(non-static)
    외부클래스의 변수 aa = 100
    외부클래스의 변수(static) bb = 200
    -------일반 메서드-------
    StaticInner dd값 = 20
    ------Inner Class(non-static)
    ------Inner Class(non-static2)


    Outer 클래스, Inner 클래스 예제2

    package kr.co.kihd.event2;
    
    public class InnerClassTest2 {
    
    	public static void main(String[] args) {
    		Outer1 ot1 = new Outer1();
    		Outer1.Innner oi = ot1.new Innner();
    		oi.innerFunc();
    
    	}
    
    }
    
    class Outer1{
    	int value = 100;
    	
    	class Innner{
    		int value = 200;
    		
    		void innerFunc() {
    			int value = 300;
    			System.out.println("InnerFunc의 value = " + value);
    			System.out.println("Inner클래스의 value = " + this.value);
    			System.out.println("Outer1클래스의 value = " + Outer1.this.value);
    		}
    	} //Inner class
    }//Outer class

    InnerFunc의 value = 300
    Inner클래스의 value = 200
    Outer1클래스의 value = 100


    로컬이너클래스 예제

     

    package kr.co.kihd.event2;
    
    public class LocalInnerClassTest {
    
    		
    		String str = "멤버 변수 str";
    		
    		public void method() {
    			final int aa = 100;
    			System.out.println(str);
    			System.out.println(aa);
    			
    			class LocalInner {
    				String str1 = "로컬이너 클래스의 변수";
    				public void show() {
    					System.out.println("LocalInnerClassTest의 변수 str : " + str);
    					System.out.println("LocalInner의 변수 str1 : " + str1);
    					System.out.println("method()의 지역변수 : " + aa);
    				}
    			}
    			LocalInner li = new LocalInner(); //내부에서만 객체생성가능함.
    			li.show();
    		}
    		
    		public static void main(String[] args) {
    			LocalInnerClassTest local = new LocalInnerClassTest();
    			local.method();
    			
    			
    		}
    		
    }
    

    멤버 변수 str
    100
    LocalInnerClassTest의 변수 str : 멤버 변수 str
    LocalInner의 변수 str1 : 로컬이너 클래스의 변수
    method()의 지역변수 : 100


    내부클래스 사용시 별로의 바이너리 파일이 생성된다.


    익명클래스(Anonymous Class)

    -이름이 없는 로컬이너클래스(Local Inner class)

    -클래스의 선언과 객체의 생성을 동시에 한다.

    -이름이 없기 떄문에 생성자도 가질수 없다.

    -단, 하나의 클래스를 상속받을수 있다.

    -단, 하나의 인터페이스를 구현할 수 있다.

     

    Frame 상속 GUI를 가지는 멤버


    Anonymous형태로 이벤트 처리 예제

    package kr.co.kihd.event2;
    
    import java.awt.Button;
    import java.awt.Frame;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class AnonymousTest extends Frame {
    	
    	Button btn;
    	
    	public AnonymousTest() {
    		setBounds(200, 200, 300, 300);
    		btn = new Button("Exit");
    		add(btn, "South");
    		
    		btn.addActionListener(new ActionListener() {//버튼만 객체이름없이 구현
    
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				System.exit(0);
    				
    			}
    			
    		}); 
    	}
    	public static void main(String[] args) {
    		AnonymousTest am = new AnonymousTest();
    		am.setVisible(true);
    	}	
    }
    
    //class EventHandler implements ActionListener{
    //
    //	@Override
    //	public void actionPerformed(ActionEvent e) {
    //		System.exit(0);
    //		
    //	}
    //	
    //}
    

    TextComponent Test

    package kr.co.kihd.event2;
    
    import java.awt.Frame;
    import java.awt.TextArea;
    import java.awt.TextField;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class TextComponentTest extends Frame {
    	
    	TextField textField;
    	TextArea textArea;
    	
    	public TextComponentTest(String title) {
    		super(title);
    	}
    	
    	public void textComponentShow() {
    		this.textArea = new TextArea();
    		this.textField = new TextField();
    		
    		//Frame은 원래 BorderLayout이므로 아래와 같이 추가하면 된다.
    		this.add(textField, "South"); //연결 하면서 위치를 파라미터값으로 설정
    		this.add(textArea, "Center");
    		
    		/*
    		 *  ActionEvent가 발생하는 4가지가 있다.
    		 *  	1)Butten이 클릭되었을 때
    		 *  	2)Menu를 클릭했을때
    		 *  	3)TextField에서 Enter키를 눌렀을 때
    		 *  	4)List의 Item하나를 선택해서 더블클릭했을 때
    		 */
    		
    		this.textField.addActionListener(new ActionListener() {
    			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				// textField에서 Enter를 치면, txtArea에 입력된 text를
    				// textArea에 추가한다.
    				textArea.append(textField.getText() + "\n");
    				//textField의 내용을 지운다.
    				textField.setText("");
    				textField.requestFocus();
    			}
    		});
    		//textArea의 글자를 편집하지 못하게 설정
    		//필드를 통해서 추가되도록 제한을 함.
    		this.textArea.setEditable(false);
    		
    		this.setSize(300, 200);
    		this.setLocation(500,300);
    		this.setVisible(true);
    		//focus가 실행됨과 동시에 textField에 위치하도록 설정
    		this.textField.requestFocus();
    		
    	}
    }
    
    package kr.co.kihd.event2;
    
    public class TextComponentEventTest {
    
    
    	public static void main(String[] args) {
    		TextComponentTest tEvent = 
    				new TextComponentTest("Text컴포넌트");
    		tEvent.textComponentShow();
    
    	}
    
    }
    


    어뎁터 클래스

    이벤트 리스너 구현에 따른 부담 해소를 위해

    리스너의 모든 메소드가 단순 리턴하도록 구현해 놓은 클래스

     

    종료기능 추가

    package kr.co.kihd.event2;
    
    import java.awt.Frame;
    import java.awt.TextArea;
    import java.awt.TextField;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    
    public class TextComponentTest2 extends Frame {
    	
    	TextField textField;
    	TextArea textArea;
    	
    	public TextComponentTest2(String title) {
    		super(title);
    	}
    	
    	public void textComponentShow() {
    		this.textArea = new TextArea();
    		this.textField = new TextField();
    		
    		//Frame은 원래 BorderLayout이므로 아래와 같이 추가하면 된다.
    		this.add(textField, "South"); //연결 하면서 위치를 파라미터값으로 설정
    		this.add(textArea, "Center");
    		
    		/*
    		 *  ActionEvent가 발생하는 4가지가 있다.
    		 *  	1)Butten이 클릭되었을 때
    		 *  	2)Menu를 클릭했을때
    		 *  	3)TextField에서 Enter키를 눌렀을 때
    		 *  	4)List의 Item하나를 선택해서 더블클릭했을 때
    		 */
    		
    		this.textField.addActionListener(new ActionListener() {
    			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				// textField에서 Enter를 치면, txtArea에 입력된 text를
    				// textArea에 추가한다.
    				textArea.append(textField.getText() + "\n");
    				//textField의 내용을 지운다.
    				textField.setText("");
    				textField.requestFocus();
    			}
    		});
    		//textArea의 글자를 편집하지 못하게 설정
    		//필드를 통해서 추가되도록 제한을 함.
    		this.textArea.setEditable(false);
    		
    		this.setSize(300, 200);
    		this.setLocation(500,300);
    		this.setVisible(true);
    		//focus가 실행됨과 동시에 textField에 위치하도록 설정
    		this.textField.requestFocus();
    		
    		//윈도우 이벤트 익명자식객체로 만들어 구현.
    		WindowAdapter waAdapter = new WindowAdapter() {
    			@Override
    			public void windowClosing(WindowEvent e) {
    				System.exit(0);
    			}
    		};
    		this.addWindowListener(waAdapter);
    	}
    	
    }
    
    package kr.co.kihd.event2;
    
    public class TextComponentEventTest {
    
    
    	public static void main(String[] args) {
    		TextComponentTest2 tEvent = 
    				new TextComponentTest2("Text컴포넌트");
    		tEvent.textComponentShow();
    
    	}
    
    }
    

    swing test

    package kr.or.kihd.swingtest;
    
    import javax.swing.JFrame;
    
    public class SwingTest1 {
    
    	public static void main(String[] args) {
    		
    		JFrame jFrame = new JFrame();
    		jFrame.setTitle("프레임연습");
    		jFrame.setSize(300, 300);
    		jFrame.setVisible(true);
    		
    	}
    
    }
    
    package kr.or.kihd.swingtest;
    
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.FlowLayout;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    public class SwingTest2 extends JFrame{
    
    	public SwingTest2() {
    		super("컴포넌트 추가하기");
    		//프레임이 닫힐때 프로그램이 같이 종료된다.
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		
    		Container contentPane = getContentPane();
    		contentPane.setLayout(new FlowLayout());
    		contentPane.setBackground(Color.yellow);
    		
    		setSize(500, 500);
    		setVisible(true);
    		
    		contentPane.add(new JButton("확인"));
    		contentPane.add(new JButton("취소"));
    
    	}
    	
    	public static void main(String[] args) {
    		new SwingTest2();
    		
    	}
    
    }
    
    package kr.or.kihd.swingtest;
    
    import java.awt.Container;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    public class SwingTest3 extends JFrame{
    
    	Container container;
    	JButton btn1, btn2, btn3, btn4;
    	
    	public SwingTest3() {
    		super("버튼 제작 테스트");
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		
    		container = getContentPane();
    		container.setLayout(new FlowLayout());
    		
    		btn1 = new JButton("일반 버튼");
    		btn1.addActionListener(new EventHandler());
    		container.add(btn1);
    		
    		setSize(300, 300);
    		setVisible(true);
    	}
    	
    	public class EventHandler implements ActionListener{
    		@Override
    		public void actionPerformed(ActionEvent e) {
    			
    			Object obj = e.getSource();
    			
    			if(obj == btn1) {
    				System.out.println("위치 : " + btn1.getX() +
    						", " + btn1.getY() + 
    						" 크기: " + btn1.getSize());
    			}
    			
    		}
    	}
    	
    	
    	public static void main(String[] args) {
    		new SwingTest3();
    
    	}
    
    }
    
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기
    loading