본문 바로가기

3월 ~ 5월) 자바/java

18Day - StudentMapApp / (아이디,비밀번호,이메일 -입력)RegualarExpressionApp / (화면에 창뜨게함) FrameOneApp & FrameTwoApp / ComponentAddApp / NonLayoutManagerApp / BorderLayoutApp / FlowLayoutApp / PanelApp / MenuBarApp / EventHandle..

StudentMapApp / (아이디,비밀번호,이메일 -입력)RegualarExpressionApp / (화면에 창뜨게함) FrameOneApp & FrameTwoApp / ComponentAddApp / NonLayoutManagerApp / BorderLayoutApp / FlowLayoutApp / PanelApp / MenuBarApp / EventHandleApp


 

StudentMapApp

package xyz.itwill.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class StudentMapApp {
    public static void main(String[] args) {
        List<Student> studentListOne = new ArrayList<Student>();
        studentListOne.add(new Student(1000,"강백호"));
        studentListOne.add(new Student(2000,"서태웅"));
        studentListOne.add(new Student(3000,"정대만"));
        studentListOne.add(new Student(4000,"채치수"));
        studentListOne.add(new Student(5000,"송태섭"));

        List<Student> studentListTwo = new ArrayList<>();
        studentListTwo.add(new Student(6000,"유재석"));
        studentListTwo.add(new Student(7000,"강호동"));
        studentListTwo.add(new Student(8000,"신동엽"));
        studentListTwo.add(new Student(9000,"김용만"));

        Map<Integer, List<Student>> studentListMap = new HashMap<>();
        studentListMap.put(1,studentListOne);
        studentListMap.put(2,studentListTwo);

        for (Integer ban : studentListMap.keySet()) {
            System.out.println(ban + " 반의 학생정보 >> ");

            List<Student> studentList = studentListMap.get(ban);
            for (Student student : studentList) {
                System.out.println(student);
            }
            System.out.println();
        }
    }
}

1 반의 학생정보 >> 
학번 = 1000, 이름 = 강백호
학번 = 2000, 이름 = 서태웅
학번 = 3000, 이름 = 정대만
학번 = 4000, 이름 = 채치수
학번 = 5000, 이름 = 송태섭

2 반의 학생정보 >> 
학번 = 6000, 이름 = 유재석
학번 = 7000, 이름 = 강호동
학번 = 8000, 이름 = 신동엽
학번 = 9000, 이름 = 김용만

RegualarExpressionApp 

package xyz.itwill.util;
// 정규표현식(RegualarExpression) : 메타문자 (Meta Character), 회피문자 (Escape Character) 등을
// 사용하여 일정한 규칙의 문자열을 표현하는 방법 - 사용자 입력값에 대한 검증

^문자 - 문자()로 시작됨
문자& - 문자()로 종료됨
. - 임의의 문자 하나를 의미 (\문자는 표현 불가능)
[문자1문자2문자3] - 나열된 문자 중 하나
[^문자1문자2문자3] - 나열된 문자를 제외한 문자 중 하나
[문자1 - 문자2] - [문자1]에서 [문자2] 범위
문자열1|문자열2|문자열3 - 나열된 문자열 중 하나
문자열+ - 문자열이 1번이상 반복됨
문자열* - 문자열이 0번이상 반복됨
문자열? - 무낮열이 0번 또는 1번 존재
문자열{숫자} - 문자열이 [숫자]만큼 반복됨
문자열{숫자1, 숫자2} - 문자열이 [숫자 1]부터 [숫자2]범위만큼 반복됨
(?!)문자열 - 문자열에서 대소문자를 구분하지 않음
(? = 문자열) - 문자열이 반드시 포함됨
(! = 문자열) - 문자열이 반드시 초함되지 않음

\s - 공백이 있는 문자열
\S - 공백이 없는 문자열
\w - 영문자, 숫자, 특수문자(_)의 문자로만 구성된 문자열
\W - 영문자, 숫자, 특수문자(_)의 문자를 제외한 나머지 구성된 문자열
\d - 숫자 형태의 문자로만 구성된 문자열
\D - 숫자 형태의 문자를 제외한 문자로 구성된 문자열
\메타문자 - 메타문자를 일반문자로 표현됨 ex) \. = .

아이디

// 키보드로 사용자에게 값을 입력받아 형식에 맞는 값인지를 비교하여 출력하는 프로그램
// > 형식에 맞지 않는 값이 입력될 경우 에러 메세지 출력 후 프로그램 종료
public class RegualarExpressionApp {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 사용자에게 아이디를 입력받아 형식에 맞는 값인지를 비교
        // 아이디 패턴(패턴) : 영문자로 시작되며 영문자, 숫자, 특수문자(_)의 조합으로 6~20번위의 문자로 구성
        // 6 ~ 20 범위의 문자들로 구성된 문자열

        System.out.print("아이디 입력 >> ");
        String id = scanner.nextLine();

        if (id == null || id.equals("")) { // 사용자 입력값이 없는 경우
            System.out.println("[에러]아이디를 반드시 입력해 주세요.");
            System.exit(0);
        }

        // 아이디 패턴을 정규표현식으로 표현하여 저장
        // String idReg = "^[a-zA-Z] [a-zA-Z0-9_] {5,19}$";
        String idReg = "^[a-zA-Z]\\w{5,19}$"; // (띄어쓰기하면 실행안됨)△ 또는

        // Pattern 클래스 - 정규표현식을 사용하기 위한 기능의 메소드를 제공하는 클래스
        // Pattern.matches(String regEx, CharSequence input) - 정규표현식과 입력값을 비교하여
        // 정규표현식의 패턴과 입력값이 다르면 [false]를 반환하고 같으면 [true]를 반환하는 메소드
        if (!Pattern.matches(idReg,id)) { // idReg 와 id가 !같지않다면,
            System.out.println("[에러]아이디를 형식에 맞게 입력해 주세요.");
            System.exit(0);
        }

        System.out.println("[메세지]형식에 맞는 아이디를 입력 하였습니다.");

        scanner.close();
        
        
아이디 입력 >> chellog0421
[메세지]형식에 맞는 아이디를 입력 하였습니다.

 

비밀번호

public class RegualarExpressionApp {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

// 사용자에게 비밀번호를 입력받아 형식에 맞는 값인지를 비교
        // 비밀번호 패턴(패턴) : 영문자, 숫자, 특수문자가 반드시 1번이상 포함되며
        // 8 ~ 30 범위의 문자들로 구성된 문자열
         
        System.out.print("비밀번호 입력 >> ");
        String password = scanner.nextLine();

        if (password == null || password.equals("")) {
            System.out.println("[에러]비밀번호를 반드시 입력해 주세요.");
            System.exit(0);
        }

        String passwordReg = "^(?=.*[a-zA-Z]) (?=.*[0-9]) (?=.*[~!@#$%^&*_-]) {8,30}$";
        // △(?=.*[~!@#$%^&*_-]) 중 - 는 사이에 넣으면 범위가 되어버리기때문에, 굳이 넣고싶다면 끝에 넣기
        System.out.println("[메세지]형식에 맞는 비밀번호를 입력 하였습니다.");

        scanner.close();
        
비밀번호 입력 >> 23456chch!
[메세지]형식에 맞는 비밀번호를 입력 하였습니다.

 

이메일

public class RegualarExpressionApp {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 사용자에게 이메일를 입력받아 형식에 맞는 값인지를 비교
        // 이메일 형식(패턴) : [아이디@도매인] 형식의 문자열

        System.out.print("이메일 입력 >> ");
        String email = scanner.nextLine();

        if (email == null || email.equals("")) {
            System.out.println("[에러]이메일을 반드시 입력해 주세요.");
            System.exit(0);
        }
        String emailReg="^([a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+)*$";
        // \\.[a-zA-Z0-9_-]+)+)*$"; // 닷컴
        if (!Pattern.matches(emailReg,email)) {
            System.out.println("[에러]이메일을 형식에 맞게 입력해 주세요.");
            System.exit(0);
        }
        System.out.println("[메세지] 형식에 맞는 이메일을 입력 하였습니다.");
        scanner.close();
    }
}

이메일 입력 >> chch0421@nnnnn.com
[메세지] 형식에 맞는 이메일을 입력 하였습니다.

 


 

// CUI(Character User Interface) 프로그램 : 문자 중심의 실행 환경에서 동작되는 프로그램
// GUI 프로그램 (Graphic User Interface) 프로그램 : 그래픽 중심의 실행 환경에서 동작되는 프로그램
// > 컴퍼넌트를 이용하여 작성된 프로그램

// java.awt 패키지 : GUI 프로그램을 작성하기 위한 클래스가 선언된 패키지
// > 운영체제(OS)에 종속된 컴퍼넌트 제공
// javax.swing 패키지 : GUI 프로그램을 작성하기 위한 클래스가 선언된 패키지
// > java.awt 패키지의 확장 패키지 - Java 컴퍼넌트 제공

// 컴퍼넌트(Component) : GUI 프로그램에서 사용자 환경 (UI - User Interface) 를 구현하기 위한 클래스
// > Button, List, Label, Canvas, Checkbox, Choice, Scrollbar, TextField, TextArea
// 컨테이너(Container) : 컴퍼넌트를 배치할 수 있는 컴퍼넌트
// > 독립적 컨테이너 : Frame, Window, Dialog - 독립적으로 사용 가능
// > 종속적 컨테이너 : Panel, ScrollPane - 다른 컨테이너에 배치하여 사용 가능

 

FrameOneApp 

package xyz.itwill.awt;
import java.awt.*;

public class FrameOneApp {
    public static void main(String[] args) {
        // Frame : 메뉴가 존재하는 컨테이너를 생성하기 위한 클래스
        // Frame frame = new frame
        Frame frame = new Frame();

        // Component.setSize(int width, int height) : 컴퍼넌트의 크기를 변경하는 메소드
        // > GUI 프로그램에서 크기 또는 위치를 표현하는 단위는 픽셀(Pixel) 단위로 표현하여 설정
        frame.setSize(400,300); // 픽셀 400*300 사이즈 창 만들거임

        // Component.setSize(int x, int y) : 컴퍼넌트의 출력 위치를 변경하는 메소드
        frame.setLocation(600,100);

        // Component.setVisible(boolean b) : 컴퍼넌트를 보이지 않게 처리하거나 보이도록 처리하는 메소드
        // true 보여지도록 처리 / false 보이지않도록 처리
        frame.setVisible(true);
    }
}


 

FrameTwoApp

package xyz.itwill.awt;
import java.awt.*;

// GUI 프로그램을 UI 구성 및 이벤트 처리를 위해 Frame 클래스를 상속받아 작성하는 것을 권장
public class FrameTwoApp extends Frame {
    private static final long serialVersionUID = 1l;

    // 생성자에서 프레임을 구성하는 디자인 설정 - UI 구형
    public FrameTwoApp(String title) {
        super(title); // Frame(String title) 생성자를 이용하여 Frame 객체 생성

        // Frame.setTitle(String title) 프레임의 제목을 변경하는 메소드
        // setTitle(title);

        // Component.setBounds(int x, int y, int width, int height) : 컴퍼넌트의 출력 위피와 크기를 변경하는 메소드
        setBounds(600, 100, 400, 300);

        // Frame.setResizable(boolean resize) : 프레임의 크기 변경 여부를 설정하기 위한 메소드
        // > false : 프레임 크기 변경 불가능, true : 프레임 크기 변경 가능 - 기본
        // setResizable(false);

        setVisible(true);

    }

    public static void main(String[] args) {
        //Frame 클래스를 상속받은 자식클래스로 객체 생성
        // > Frame 객체 생성 - 프레임 생성

        new FrameTwoApp("프레임 연습");
    }
}


module-info.java *(인텔리제이는 없어야 실행됨 : 읽을수없다고 코드뜸)

module Java_3{
    requires java.se;
        }

 


 

 

  ComponentAddApp

package xyz.itwill.awt;

 

import java.awt.Button;
import java.awt.Frame;

public class ComponentAddApp extends Frame {
    private static final long serialVersionUID = 1L;

    public ComponentAddApp(String title) {
        super(title);

        // Button 클래스 : 버튼 컴퍼넌트을 구현하기 위한 클래스
        // > Button 클래스의 Button(String label) 생성자로 버튼의 이름이 설정된 Button 객체 생성
        Button button=new Button("BUTTON");

        // Container.add(Component c) : 컨테이너에 컴퍼넌트를 배치하는 메소드
        // > 컨테이너에 설정된 배치관리자(LayoutManager)에 의해 컴퍼넌트가 출력 위치와
        // 크기가 자동 설정되어 컨테이너에 배치
        add(button);

        setBounds(600, 100, 300, 300);
        setVisible(true);
    }

    public static void main(String[] args) {
        new ComponentAddApp("컴퍼넌트 배치");
    }
}

 


NonLayoutManagerApp

package xyz.itwill.awt;
// 배치관리자 : 컨테이너에 컴퍼넌트를 자동 배치하기 위한 기능을 제공하는 클래스
// > BorderLayout, FlowLayout, GridLayout, CardLayout 등

// 컨테이너는 컴퍼넌트를 자동 배치하기 위한 배치관리자가 초기화 설정 - 기본 배치관리자
// > Frame, Window, Dialog 등 : BorderLayout
// > Panel, Applet 등 : FlowLayout

import java.awt.*;

// 배치관리자를 사용하지 않고 프레임에 컴퍼넌트를 배치하여 사용하는 프로그램
public class NonLayoutManagerApp extends Frame {
    private static final long serialVersionUID = 1l;

    public NonLayoutManagerApp(String title) {
        super(title);

        // Container.set

        // Container.setLayout (LayoutManager mrg): 컨테이너의 배치관리자를 변경하는 메소드
        setLayout(null); // 프레임은 배치관리자를 사용하지 않도록 설정

        Button button1 = new Button("BUTTON-1");
        Button button2 = new Button("BUTTON-2");

        // 배치관리자를 사용하지 않을 경우 반드시 컴퍼넌트의 크기와 출력위치를 변경한 후 배치
        button1.setBounds(80, 100, 150, 80);
        button2.setBounds(190, 300, 100, 120);

        add(button1);
        add(button2);

        setBounds(600, 100, 400, 500);
        setVisible(true);
    }


    public static void main(String[] args) {
        new NonLayoutManagerApp("배치관리자 미사용");

    }
}

 


 BorderLayoutApp

package xyz.itwill.awt;
import java.awt.*;

// BorderLayout : 컴퍼넌트를 중앙, 동, 서, 남, 북 으로 구분하여 배치하는 배치관리자
// > 컴퍼넌트를 배치할 때 반드시 배치위치를 제공
public class BorderLayoutApp extends Frame {
    private static final long serialVersionUID = 1l;

    public BorderLayoutApp(String title) {
        super(title);

        // 프레임의 배치관리자를 으로 변경
        // > Frame의 기본 배치관리자는 이므로 생략 가능
        // setLayout(new BorderLayout());

        Button button1 = new Button("Center");
        Button button2 = new Button("East");
        Button button3 = new Button("West");
        Button button4 = new Button("South");
        Button button5 = new Button("North");

        // Container.add(Component c, Object constraints) :
        // 컴퍼넌트를 컨테이너의 원하는 위치에 배치하는 메소드 - 배치관리자가 [BorderLayout]인 경우에만 사용
        // > 컴퍼넌트가 배치되는 위치는 BorderLayout 클래스의 상수(Constant) 사용
        // > 컨테이너의 중앙에는 반드시 컴퍼넌트를 배치해야 되지만 동서남북은 생략 가능
        add(button1, BorderLayout.CENTER);
        add(button2, BorderLayout.EAST);
        add(button3, BorderLayout.WEST);
        add(button4, BorderLayout.SOUTH);
        add(button5, BorderLayout.NORTH);

        setBounds(600, 100, 400, 400);
        setVisible(true);
    }


    public static void main(String[] args) {
        new BorderLayoutApp("BorderLayout");
    }
}

 


PanelApp 

package xyz.itwill.awt;
import java.awt.*;

public class PanelApp extends Frame {
    private static final long serivalVersionUID = 1L;

    public PanelApp (String title) {
        super(title);

        Button red = new Button("RED");
        Button green = new Button("GREEN");
        Button blue = new Button("BULE");

        // TextField 클래스 : 한 줄의 문자열을 입출력하기 위한 컴퍼넌트
        TextField textField = new TextField();
        // TextArea 클래스 : 여러 줄의 문자열을 입출력하기 위한 컴퍼넌트
        TextArea textArea = new TextArea();

        // Panel 클래스 : 컴퍼넌트를 배치하여 그룹화 하기 위한 종속적인 컨테이너 클래스
        // > 독립적인 사용 불가능한 컨테이너이므로 다른 컨테이너에 배치하여 사용
        Panel panel=new Panel();//[FlowLayout]이 기본 배치관리자

        // 패널 컨테이너에 버튼 컴퍼넌트를 차례대로 배치
        panel.add(red);
        panel.add(green);
        panel.add(blue);

        add(panel, BorderLayout.NORTH);
        add(textArea, BorderLayout.CENTER);
        add(textField, BorderLayout.SOUTH);

        // Component.setFont(Font f) : 컴퍼넌트의 글자 관련 속성을 변경하는 메소드
        // Font 클래스 : 글자 관련 속성을 저장하기 위한 클래스
        // > Font 클래스의 Font(String name, int style, int size) 생성자로 Font 객체 생성
        // > name : 글자의 글꼴, style : 글자 스타일, size : 글자 크기
        // > 글자의 글꼴과 스타일은 Font 클래스에서 제공하는 상수(Constant) 사용
        // 컨테이너에 적용된 글자 관련 속성은 컨테이너에 배치된 컴퍼넌트에 동일하게 적용
        panel.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));
        textArea.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 20));
        textField.setFont(new Font(Font.SANS_SERIF, Font.BOLD+Font.ITALIC, 18));

        // Component.setForeground(Color c) : 컴퍼넌트 글자색을 변경하는 메소드
        // Color 클래스 : 색상 정보를 저장하기 위한 클래스
        // > Color 클래스의 Color(int red, int green, int blue) 생성자로 Color 객체 생성
        // > 빨간색, 초록색, 파란색은  0~255 범위의 정수값으로 표현
        // > Color 클래스는 대표색을 상수(Color 객체)로 제공
        red.setForeground(new Color(255, 0, 0));
        green.setForeground(new Color(0, 255, 0));
        blue.setForeground(new Color(0, 0, 255));

        // Component.setBackground(Color c) : 컴퍼넌트 배경색을 변경하는 메소드
        textArea.setBackground(Color.YELLOW);

        // Component.setEnabled(boolean b) : 컴퍼넌트의 활성화 상태 여부를 변경하는 메소드
        red.setEnabled(false); // 컴퍼넌트 비활성화

        // TextComponent.setFocusable(boolean b) : 텍스트 컴퍼넌트의 입력촛점 위치 여부를 변경하는 메소드
        textArea.setFocusable(false); // 입력촛점 미제공 - 입력 불가능

        setBounds(600, 100, 300, 400);
        setVisible(true);
    }

    public static void main(String[] args) {
        new PanelApp("Panel");
    }
}

 


MenuBarApp

package xyz.itwill.awt
import java.awt.*;
import java.awt.event.KeyEvent;

// MenuItem >> Menu >> MenuBar >> Frame
public class MenuBarApp extends Frame {
    private static final long serialVersionUID = 1L;

    public MenuBarApp(String title) {
        super(title);

        MenuBar menuBar=new MenuBar();

        Menu file = new Menu("File");
        Menu help = new Menu("Help");

        menuBar.add(file); // 메뉴바에 메뉴 배치
        menuBar.add(help);

        // MenuShortcut 클래스 : 메뉴아이템에 단축키를 제공하기 위한 클래스
        // KeyEvent 클래스 : 가상의 키보드 정보를 제공하기 위한 클래스
        MenuItem open = new MenuItem("Open", new MenuShortcut(KeyEvent.VK_O));
        MenuItem save = new MenuItem("Save", new MenuShortcut(KeyEvent.VK_S));
        MenuItem exit = new MenuItem("Exit");

        MenuItem view = new MenuItem("HelpView");
        MenuItem info = new MenuItem("Infomation");

        file.add(open); // 메뉴에 메뉴아이템 배치
        file.add(save);
        file.addSeparator(); // 메뉴에 메뉴아이템을 구분하는 구분선 배치
        file.add(exit);

        help.add(view);
        help.addSeparator();
        help.add(info);

        //Frame.setMenuBar(MemuBar bar) : 프레임의 메뉴바를 변경하는 메소드
        setMenuBar(menuBar);

        TextArea textArea = new TextArea();
        textArea.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 20));
        add(textArea, BorderLayout.CENTER);

        setBounds(500, 100, 1000, 800);
        setVisible(true);
    }

    public static void main(String[] args) {
        new MenuBarApp("MenuBar");

    }
}

 

 


EventHandleApp

package xyz.itwill.awt;
// 이벤트 처리 프로그램 작성 방법
// 1. 컴퍼넌트와 컨테이너 관련 클래스를 사용하여 디자인 클래스 작성 - UI 구현
// > Frame 클래스를 상속받아 디자인 클래스 작성
// > 컴퍼넌트 또는 컨테이너에서 다양한 이벤트 발생 - 이벤트 소스(Event Source)
// > 이벤트와 관련된 XXXEvent 클래스(이벤트 정보를 저장하기 위한 클래스)로 객체가 자동 생성
// ex) Button 컴퍼넌트를 누른 경우 ActionEvent 클래스로 객체 생성 - ActionEvent 발생
// [EXIT] 버튼을 누른 경우 프로그램을 종료하는 기능의 프로그램 작성

// 2.이벤트 소스에서 발생된 이벤트를 처리하기 위한 클래스 작성
// > 이벤트를 처리하기 위한 XXXListener 인터페이스를 상속받아 이벤트 처리 클래스 작성
// ex) ActionEvent >> ActionListener 인터페이스를 상속받아 이벤트 처리 클래스 작성
// > Listener 인터페이스에서 컴퍼넌트에서 발생된 이벤트를 처리하기 위해 추상메소드 제공
// > Listener 인터페이스를 상속받은 자식클래스에서 추상메소드를 오버라이드 선언하여
// 오버라이드 선언된 메소드에 이벤트 처리 명령 작성

// 3.이벤트 소스에서 이벤트가 발생되면 이벤트 처리 클래스의 객체를 제공받아 이벤트 처리 명령이
// 실행되도록 설정 - Component.addXXXListener(Listener l) 메소드 호출
// > Component.addXXXListener(Listener l) : 컴퍼넌트의 이벤트를 처리하기 위한 이벤트 처리
// 객체를 등록하기 위한 메소드
// > 이벤트 처리 객체를 제공받아 자동으로 이벤트 처리 메소드를 호출하여 이벤트 처리
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

// [EXIT] 버튼을 누르면 프로그램을 종료하는 GUI 프로그램 작성
public class EventHandleApp extends Frame {
    private static final long serialVersionUID = 1L;

    public EventHandleApp(String title) {
        super(title);

        setLayout(new FlowLayout());
        Button exit=new Button("EXIT");//이벤트 소스
        exit.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 30));
        add(exit);

        // 컴퍼넌트에 이벤트 처리 객체 등록
        // > Button 컴퍼넌트에서 ActionEvent가 발생될 경우 EventHandle 클래스의 객체를
        //제공받아 이벤트 처리 메소드를 자동 호출하여 이벤트 처리
        exit.addActionListener(new EventHandle());

        setBounds(800, 200, 300, 300);
        setVisible(true);
    }
    public static void main(String[] args) {
        new EventHandleApp("이벤트처리");
    }
}


// 이벤트 처리 기능을 제공하기 위한 클래스 - Listener 인터페이스를 상속받아 작성
// > Button 컴퍼넌트에서 발생된 ActionEvent를 처리하기 위한 클래스
class EventHandle implements ActionListener {
    // 이벤트 처리 명령을 작성하기 위한 메소드

    public void actionPerformed(ActionEvent e) {
        System.exit(0);
    }
}