본문 바로가기
공부기록

4월 20일 Java - 내부클래스, 익명클래스, GUI

by project100 2023. 4. 20.

내부 클래스와 익명클래스 with GUI - 파워포인트 자료 살펴보기!

 

GUI - 그래픽이용, 사용자가 이해하기 쉬운 모양으로 정보 제공, 사용자는 마우스나 키보드를 이용하여 쉽게 입력

AWT - GUI 라이브러리

Swing - AWT 기술을 기반으로 순수 자바 언어로 만들어진 라이브러리

 

스윙 패키지에 들어있는 GUI 기본 샘플

JFrame - 기본 화면 구성

JTree - 탐색기 구성

JLabel - 이미지 출력

컨테이너 - 담아주는 역할, 다른 GUI 컴포넌트를 포함할 수 있는 컴포넌트

최상위 컨테이너 - 다른 컨테이너에 속하지않고 독립적으로 출력 가능한 컨테이너 예)JFrame

컴포넌트 - 컨테이너에 포함되어야 화면에 출력될 수 있는 순수 컴포넌트


내부 클래스(Inner Class)

한 클래스 내부에 작성하는 클래스

class OuterClass {
       private 바깥 필드;
       이런저런멤버들;
       public(private) class InnerClass
              클래스문장들;
              바깥필드 = 데이터;
       }
}

내부클래스에서 외부클래스의 모든 멤버의 접근이 용이하여 마음껏 활용할 수 있는 클래스를 작성할 수 있다.

(일종의 전용 부품 클래스를 내부에 작성하는 것)

 

 

익명 클래스(이름 없는 클래스)

모든 인스턴스는 클래스가 있어야 생성할 수 있다!

인터페이스로 새로운 클래스를 파생시킬 때 클래스의 이름 없이 바로 작성하여 인스턴스를 생성하는 방식

인스턴스 생성 문장에 직접 파생 클래스를 작성하는 것

GUI, 안드로이드 프로그래밍 등에서 이벤트 처리에 많이 사용됨.

추상클래스, 인터페이스를 사용하여 인스턴스를 생성할 때 사용하는 방식.

 

import javax.swing.*; //화면관련
import java.awt.*;
import java.awt.event.*;
//import java.awt.event.ActionEvent; 클릭
//import java.awt.event.ActionListener; 이벤트처리

// import문에 *은 패키지 내의 모든 클래스를 포함시킨다는 의미

public class GuiButtonEx extends JFrame {
    // 기본적인 화면 구성 생성자로 처리
    public GuiButtonEx() {
        // 제목 표시줄에 타이틀 출력
        setTitle("GUI 버튼 예제");

        // 종료버튼 클릭 시 프로그램 종료
        // 상수 public static final int EXIT_ON_CLOSE = 3;
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 화면에 보여질 요소를 담는 컨테이너 생성
        // 자동으로 최상위 컨테이너가 생성된 것을 패널로 쓰겠다고 가지고 오는 것
        Container c = getContentPane();

        //요소를 배치하는 레이아웃 설정 FlowLayout
        c.setLayout(new FlowLayout()); // 익명 인스턴스

        // 요소 화면에 추가 - 버튼
        JButton btn1 = new JButton("Action"); //생성
        c.add(btn1); //추가

        // 이벤트 처리 인스턴스 생성
        MyActionListener mal = new MyActionListener();
        //버튼 이벤트 처리 인스턴스 넣기 - 연결하기
        btn1.addActionListener(mal);

        JButton btn2 = new JButton("Action2");
        c.add(btn2);

        // 이벤트 처리 인스턴스 생성 - 내부클래스 사용
        // 제목변경 - 연걸하기
        InnerActionListener ial = new InnerActionListener();
        btn2.addActionListener(ial);

        JButton btn3 = new JButton("Action3");
        c.add(btn3);

        // 익명 클래스로 이벤트 인스턴스 생성
        btn3.addActionListener(new ActionListener() {
            // btn3 전용의 객체(인스턴스)를 생성하는 익명 클래스
            @Override
            public void actionPerformed(ActionEvent e) {
                JButton b = (JButton) e.getSource();
                if(b.getText().equals("Action3")){
                    b.setText("액션3");
                } else {
                    b.setText("Action3");
                }
                // 버튼 글자 바꾸기
                // 생성자 안에서는 바로 사용 가능
                setTitle(b.getText());
            }
        });

        // 프로그램 창의 크기 설정
        setSize(500, 200); //픽셀단위로 설정(너비, 높이)

        // 윗 부분까지 메모리상에만 구현
        // 꼭 필요! 모니터 프로그램 출력. 기본값 false
        setVisible(true);
    }

    public static void main(String[] args) {
        new GuiButtonEx();//Self Creat Instance 자기 자신 인스턴스 생성
    } //main end

    // 내부클래스로 이벤트 처리 객체 생성
    private class InnerActionListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            // 프로그램 제목을 바꿔보자
            // this는 OutClass를 말한다.
            GuiButtonEx.this.setTitle("제목변경");
        }
    }

}//class end


// 버튼 이벤트 처리용 객체(클래스) - 따로 작성하는 것이 기본
class MyActionListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        // 이벤트가 발생했을 때 그 이벤트에 대한 처리 명령을 작성하는 메소드
        // ActionEvent 객체 : 이벤트가 발생된 요소의 정보와 어떤 이벤트인지의 정보를 가진 객체
        JButton b = (JButton) e.getSource();
        // 버튼 클릭시 버튼 이름 변경
        if(b.getText().equals("Action")){
            b.setText("Ready");
        } else {
            b.setText("Action");
        }
    }
}

file - project Structure - Artifacts - + - JAR - From modules with depen~  - ok 

build - build Artifacts - build - 폴더 생성 - 폴더 파일 클릭하면 작성한 화면이 바로 출력

 


 

자바를 활용해 실제로 창을 만들어 띄워볼 수 있어서 재미있었다.