100일 챌린지/빅데이터기반 인공지능 융합 서비스 개발자

Day12 - 내부 클래스, GUI

ksyke 2024. 8. 6. 16:43

목차

    내부 클래스

    • 클래스 내부에 존재하는 클래스를 내부 클래스라 부른다.
    • jdk 1.4 이전에는 상속 대신에 내부 클래스를 많이 썼다.
      • 최근 국내에서는 절차지향적인 코딩이라는 인식이 있어 선호하지 않는 편이다.
    • 내부 클래스를 만들면 외부클래스$내부클래스.class로 컴파일된다.
      • anonymous를 사용할때 잘 활용된다.
      • 안드로이드는 모든것이 내부 클래스로 이루어져 있다.
      • 다만 클래스 소스를 찾기 힘들어 국내 협업에서는 잘 사용하지 않는다.

    내부 클래스의 4가지 형식

    1. Static 클래스 (static inner class)

    class Outter02{
        static int su1 = 1111;
        int su2 = 2222;
    
        // 생성자 
        public Outter02() {
    
        }
    
        static void func01() {
    
            // 내부 static 불러오기
            System.out.println(Inner02.su3);
            Inner02.func03();
    
            // 내부 non-static 불러오기
            Inner02 inner = new Inner02();
            System.out.println(inner.su4);
            inner.func04();
        }
    
        void func02() {
    
            // 내부 static 불러오기
            System.out.println(Inner02.su3);
            Inner02.func03();
    
            // 내부 non-static 불러오기
            Inner02 inner = new Inner02();
            System.out.println(inner.su4);
            inner.func04();
        }
    
    
        // static 내부 클래스 
        static class Inner02{
    
            static int su3 = 3333;
            int su4 = 4444;
    
            // 생성자
            public Inner02() {
    
            }
            static void func03() {
    
                System.out.println(su3);
                System.out.println(Outter02.su1);
                System.out.println(su1); // Outter에 있는 필드 접근 가능
                Outter02.func01(); // 외부 클래스에 있는 메소드 호출 가능
                func01(); // 외부 클래스명은 생략가능하다. 
    
                Outter02 outt = new Outter02();
                System.out.println(outt.su2);
                outt.func02(); // 외부 클래스에 있는 non-static 메소드 접근 가능
            }
            void func04() {
    
                System.out.println(su3);
                System.out.println(Outter02.su1);
                System.out.println(su1); // Outter에 있는 필드 접근 가능
                Outter02.func01(); // 외부 클래스에 있는 메소드 호출 가능
                func01(); // 외부 클래스명은 생략가능하다. 
    
                Outter02 outt = new Outter02();
                System.out.println(outt.su2);
                outt.func02(); // 외부 클래스에 있는 non-static 메소드 접근 가능
            }
        }
    }
    
    public class Ex02 {
    
        public static void main(String[] args) {
    
            // 외부 클래스 불러오기
            System.out.println(Outter02.su1);
            Outter02 outt = new Outter02();
            System.out.println(outt.su2);
    
            // 내부 클래스 불러오기
    
            // 1. static 내부 클래스
            System.out.println(Outter02.Inner02.su3);
    
            // 2. non-static 내부 클래스
            Outter02.Inner02 inn = new Outter02.Inner02();
            System.out.println(inn.su4);
        }
    }
    java.util.Map.Entry entry; // 내부 클래스의 활용 예시

    2. Instance 클래스 (non-static inner class)

    class Outter03{
        static int su1 = 1111;
        int su2 = 2222;
    
        public Outter03() {
        }
    
        static void func01() {
    
            System.out.println(Inner03.su3);
            Outter03 outt = new Outter03();
            Inner03 inn = outt.new Inner03(); // Outter를 생성하기 전까지는 내부 static 클래스를 생성할 수 없다.
            System.out.println(inn.su4);
            inn.func04();
        }
    
        void func02() {
    
            System.out.println(Inner03.su3);
            Inner03 inn = this.new Inner03();
    //        Inner03 inn = new Inner03();
            System.out.println(inn.su4);
            inn.func04();
        }
    
        // non-static 내부 클래스 
        class Inner03{
    //        static int su3 = 3333; // non-static에서는 static 필드를 생성할 수 없다. 
            final static int su3 = 3333; // 상수형 변수는 메모리에 상수영역이 따로 존재하기 때문에 생성될 수 있다. 
            int su4 = 4444;
    
    //        static void func03() {} // 마찬가지로 존재할 수 없다. 
            void func04() {
                System.out.println(su1);
                System.out.println(su2);
                func01();
                Outter03.func01();
                func02();
            }
        }
    }
    
    public class Ex03 {
    
        public static void main(String[] args) {
            System.out.println(Outter03.Inner03.su3);
            System.out.println(com.Day12.Outter03.Inner03.su3);
    
            Outter03 outt = new Outter03();
            Outter03.Inner03 inn = outt.new Inner03();
            System.out.println(inn.su4);
            inn.func04();
        }
    }

    3. Local 클래스 (지역 클래스)

    public class Ex04 {
        static int su3 = 3333;
        int su4 = 4444;
    
        public static void func01() {
            Ex04 me = new Ex04();
            int su5 = 5555; // 상수형 변수라는 전재하에 사용된다. 
            // jdk 1.7 이하에서는 final 표기 생략 불가
            // jdk 1.8 이상에서는 final 표기 생략 가능
    
    //        static class Local01{} // local 클래스는 static이 존재할 수 없음
    
            class Local01{
                final static int su1 = 1111; // 상수형 변수만 static이 존재할 수 있다.
                int su2 = 2222;
    
                public Local01() {
                }
    
                void func01() {
                    System.out.println(su1);
                    System.out.println(su3);
                    System.out.println(me.su4);
                    System.out.println(su5);
                }
                void func02() {
                    System.out.println(su2);
                }
            }
    //        su5++; // 문법상으로 맞지 않아서 사용할 수 없다. su5를 final이라고 생각하면 된다.
            Local01 local = new Local01();
            System.out.println(Local01.su1);
            System.out.println(local.su2);
            local.func01();
            local.func02();
        }
    
        public void func02() {
            class Local01{
                final static int su1 = 1111; // 상수형 변수만 static이 존재할 수 있다.
                int su2 = 2222;
    
                public Local01() {
                }
    
                void func01() {
                    System.out.println(su1);
                }
                void func02() {
                    System.out.println(su2);
                }
            }
            Local01 local = new Local01();
            System.out.println(Local01.su1);
            System.out.println(local.su2);
            local.func01();
            local.func02();
        }
    
        public static void main(String[] args) {
            func01();
            System.out.println("----");
            Ex04 me = new Ex04();
            me.func02();
        }
    }

    4. Anonymous 클래스 (익명 클래스)

    • 한번만 호출하면 되는 클래스를 위해
    class Anony{
        void func(){
    
        }
    }
    
    public class Ex05 {
    
        public static void func01() {
    
            Anony obj = new Anony(){
                void func() {
                    System.out.println("실행");
                }
            };
    
            obj.func();
        }
    
        public static void main(String[] args) {
            func01();
    
        }
    }
    interface Inter{
        void func();
    }
    
    public class Ex05 {
        int su1 = 1111;
    
        public static Inter func01() {
    
            return new Inter(){ // class Local implements Inter의 클래스명을 지운 익명클래스이다.
                int su2 = 2222;
    
                public void func() {
                    System.out.println("실행");
                    System.out.println(this.su2);
                }
            };
        }
    
        public static void main(String[] args) {
            Inter local = func01();
            local.func();
        }
    }
    interface Inter{
        void func();
    }
    
    public class Ex05 {
        int su = 1111;
        static Inter local = new Inter(){ 
            public void func() {
                System.out.println("실행");
            }
        };
    
        public static void main(String[] args) {
            local.func();
        }
    }
    interface Inter{
        void func();
    }
    
    public class Ex05 {
    
    
        public static void main(String[] args) {
            Inter local = new Inter(){ 
                public void func() {
                    System.out.println("실행");
                }
            };
            local.func();
        }
    }
    람다식을 이용한 Anonymous class
    interface Inter{
        void func();
    }
    
    public class Ex05 {
    
        public static void main(String[] args) {
            // Lambda
            Inter local2 = () -> System.out.println("람다식");
            local2.func();
        }
    }

    Anonymous를 이용한 list sorting

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(2222);
        list.add(4444);
        list.add(1111);
        list.add(5555);
        list.add(3333);
    
        list.sort(new Comparator<Integer>() {
    
            @Override
            public int compare(Integer o1, Integer o2) {
                // TODO Auto-generated method stub
                return o2.intValue() - o1.intValue();
            }
        });
        System.out.println(list);
    }
    Comparator desc = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o2.intValue() - o1.intValue();
        }
    };
    Comparator asc = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o1.intValue() - o2.intValue();
        }
    };
    List<Integer> list = new ArrayList<Integer>();
    list.add(2222);
    list.add(4444);
    list.add(1111);
    list.add(5555);
    list.add(3333);
    
    list.sort(asc); // 오름차순으로 정렬
    System.out.println(list);
    list.sort(desc);
    System.out.println(list); // 내림차순으로 정렬

    GUI

    • awt(jdk 1.0)으로 나뉜다.

      • awt : os에 요청
        • 빠르고, 자원 소모가 적다.
        • 운영체제에 종속된다.
      • swing : java가 직접 drawing 한다.
        • awt가 하지 못하는 기능들을 수행 가능
        • 좀 더 세련된 인터페이스 (롱혼 테마)
    • )와 swing(jdk 1.2

    • 또 웹에서 사용하는 css가 있다.

    한글이 나오지 않을 때

    배치 레이아웃

    • 상대속성과 절대속성(absolute)이 존재한다.
      • 상대속성은 배치관리자가 알아서 관리하고 바꿀 수 없다.

    Flow Layout

    • 가운데 정렬
    • 컴포넌트의 배치와 크기를 조절할 수 없다.
    • 컨텐츠의 특성(글자의 길이와 크기 등)에 맞춰 사이즈가 조절된다.
    public class EX07 extends java.awt.Frame{
    
        public EX07() {
            Font f = new Font("궁서체", 1, 20);
    
            // 배치 관리자
            LayoutManager l1 = new FlowLayout();
            LayoutManager l2 = new GridLayout(3,3);
            LayoutManager l3 = new CardLayout();
            this.setLayout(l1);
    
            // 버튼 만들기
            java.awt.Button btn = new Button();
    //        btn.setFont(f);
            btn.setLabel("first");
            this.add(btn);
            java.awt.Button btn2 = new Button();
            btn2.setLabel("second");
            this.add(btn2);
            java.awt.Button btn3 = new Button();
            btn3.setLabel("third");
            this.add(btn3);
            java.awt.Button btn4 = new Button();
            btn4.setLabel("forth");
            this.add(btn4);
            java.awt.Button btn5 = new Button();
            btn5.setLabel("fifth");
            this.add(btn5);
    
            // 초기 창 위치 지정하기
            this.setLocation(2560/2-250, 1600/2-200);
    
            // 초기 창 크기 정하기 
            this.setSize(500, 400);
            this.setVisible(true);
        }
    
        public static void main(String[] args) {
            EX07 me = new EX07();
        }
    }

    Grid Layout

    LayoutManager l2 = new GridLayout(3, 2);
    • row가 column보다 우선순위를 받는다.

    Border Layout

    public class Ex08 {
    
        public static void main(String[] args) {
            Frame f = new Frame();
    
            LayoutManager lm;
            lm = new BorderLayout();
            f.setLayout(lm);
    
            Button btn1 = new Button();
            btn1.setLabel("top");
            f.add(btn1, BorderLayout.NORTH);
    
            Panel center = new Panel();
            Button btn2 = new Button();
            btn2.setLabel("center");
            center.add(btn2);
            f.add(center, "Center");
    
            Button btn3 = new Button();
            btn3.setLabel("Left");
            f.add(btn3, "West");
    
            Button btn4 = new Button();
            btn4.setLabel("Right");
            f.add(btn4, "East");
    
            Button btn5 = new Button();
            btn5.setLabel("Bottom");
            f.add(btn5, "South");
    
    
            f.setLocation(2560/2-250, 1600/2-200);
            f.setSize(500,400);
            f.setVisible(true);
        }
    }

    Card Layout

    public class Ex09 extends Frame{
        CardLayout lm = new CardLayout();
    
        public Ex09() {
            this.setLayout(lm);
            Panel p1 = new Panel();
            Panel p2 = new Panel();
            Panel p3 = new Panel();
            Panel p4 = new Panel();
    
            Color c1 = new Color(255, 0, 0);
            p1.setBackground(c1);
            Color c2 = new Color(0, 255, 0);
            p2.setBackground(c2);
            Color c3 = new Color(0, 0, 255);
            p3.setBackground(c3);
            Color c4 = new Color(200, 0, 200);
            p4.setBackground(c4);
    
            add(p1);
            add(p2);
            add(p3);
            add(p4);
    
            setSize(300, 600);
            setLocation(2560/2-250, 1600/2-200);
            setVisible(true);        
    
        }
        public static void main(String[] args) {
            Ex09 me = new Ex09();
            java.util.Scanner sc = new java.util.Scanner(System.in);
    
            while(true) {
                int su = sc.nextInt();
                if(su == 0) break;
                me.lm.next(me);
            }
        }
    }

    GridBag Layout

    public class Ex10 extends Frame {
    
        public Ex10() {
            LayoutManager lm = new GridBagLayout();
            setLayout(lm);
    
            Button btn1 = new Button();
            Button btn2 = new Button();
            Button btn3 = new Button();
            Button btn4 = new Button();
            Button btn5 = new Button();
            Button btn6 = new Button();
    
            btn1.setLabel("btn1");
            btn2.setLabel("btn2");
            btn3.setLabel("btn3");
            btn4.setLabel("btn4");
            btn5.setLabel("btn5");
            btn6.setLabel("btn6");
    
            GridBagConstraints bag;
            bag = new GridBagConstraints();
    
            bag.fill = 0;
            bag.gridwidth = 1;
            bag.gridheight = 1;
            bag.weightx = 1.0;
            bag.weighty = 1.0;
    
            bag.gridx = 0;
            bag.gridy = 0;
            add(btn1, bag);
            bag.gridx = 1;
            add(btn2, bag);
            bag.gridx = 2;
            add(btn3, bag);
            bag.gridx = 0;
            bag.gridy = 1;
            add(btn4, bag);
            bag.gridx = 1;
            add(btn5, bag);
            bag.gridx = 2;
            add(btn6, bag);
    
            setSize(500, 400);
            setLocation(2560/2-250, 1600/2-200);
            setVisible(true);        
        }
    
        public static void main(String[] args) {
            new Ex10();
        }
    }

    bag.fill = GridBagConstraints.CENTER;

    bag.fill = GridBagConstraints.BOTH;

    bag.fill = GridBagConstraints.HORIZONTAL;

    bag.fill = GridBagConstraints.VERTICAL;

    Absolute Layout

    public class Ex11 extends Frame{
    
        public Ex11() {
            setLayout(null); // 절대 관리자
    
            Button btn = new Button();
            btn.setLabel("button");
            btn.setLocation(200, 200);
            btn.setSize(100, 30);
            add(btn);
    
            setSize(500, 400);
            setResizable(false);
            setLocation(2560/2-250, 1600/2-200);
            setVisible(true);    
        }
    
        public static void main(String[] args) {
            new Ex11();
        }
    }

    Components

        public static void main(String[] args) {
            Frame f = new Frame();
    
            Panel p = new Panel();
    //        p.setLayout(new FlowLayout); // default layout
    //        p.setBackground(new Color(255, 0, 0));
            p.setBackground(Color.PINK);
    
            Button btn = new Button("press");
            Font font = Font.getFont(Font.SANS_SERIF);
    
            btn.setFont(font);
            btn.setBackground(Color.BLUE);
            btn.setForeground(Color.WHITE);
            p.add(btn);
    
            JButton btn2 = new JButton("스윙버튼");
            btn2.setFont(Font.getFont("궁서체"));
            Icon defaultIcon = new ImageIcon("logo.jpg");
            btn2.setIcon(defaultIcon);
            p.add(btn2);
    
            f.add(p);
            f.setTitle("제목없음");
            f.setSize(500, 400);
            f.setLocation(2560/2-250, 1600/2-200);
            f.setVisible(true);    
    
            // swing으로 띄우기
    //        JFrame f = new JFrame();
    //        f.setSize(300, 300);
    //        f.setLocation(1500, 1000);
    //        f.setVisible(true);
        }
    }

    TextField

    public class Ex13 extends Frame{
        static TextField tf;
    
        public Ex13() {
            setLayout(new FlowLayout());
    
    //        TextField tf = new TextField("글자", 15);
            tf = new TextField("글자", 15);
            Font f = new Font("궁서체", 1, 20);
            tf.setFont(f);
    //        tf.setText("입력해주세요");
            add(tf);
    
    
            setSize(500, 400);
            setLocation(2560/2-250, 1600/2-200);
            setVisible(true);    
        }
    
        public static void main(String[] args) {
            new Ex13();
            String msg = tf.getText();
            System.out.println(msg);
        }
    }

    TextArea

    public class Ex14 {
    
        public static void main(String[] args) {
            Frame f = new Frame();
            f.setLayout(new FlowLayout());
    
    //        TextArea ta = new TextArea("초기값", 5, 15, 3); 
            TextArea ta = new TextArea("초기값", 5, 15, TextArea.SCROLLBARS_VERTICAL_ONLY); 
    //        ta.setText("abc \nABC");
    
            ta.setFont(new Font("", Font.ITALIC, 30));
            ta.setBackground(Color.GRAY);
            ta.setForeground(Color.CYAN);
    
            f.add(ta);
    
            f.setSize(500, 400);
            f.setLocation(2560/2-250, 1600/2-200);
            f.setVisible(true);    
        }
    }

    Checkbox, Radio box

    public class Ex15 {
    
        public static void main(String[] args) {
            Frame f = new Frame();
            f.setLayout(new FlowLayout());
    
            f.setSize(500, 400);
            f.setLocation(2560/2-250, 1600/2-200);
            f.setVisible(true);    
    
            CheckboxGroup group = new CheckboxGroup();
            Checkbox box1 = new Checkbox("check1", true, group);
            box1.setFont(new Font("", 0, 30));
            Checkbox box2 = new Checkbox("check2", false, group);
            box2.setFont(new Font("", 0, 30));
            Checkbox box3 = new Checkbox("check3", false, group);
            box3.setFont(new Font("", 0, 30));
    
            f.add(box1);
            f.add(box2);
            f.add(box3);
        }
    }

    Choice, List, 그리고 Label

    public class Ex16 {
    
        public static void main(String[] args) {
            Frame f = new Frame();
            f.setLayout(new FlowLayout());
    
            f.setSize(500, 400);
            f.setLocation(2560/2-250, 1600/2-200);
            f.setVisible(true);    
    
            Choice cho1 = new Choice();
            cho1.addItem("item1");
            cho1.addItem("item2");
            cho1.addItem("item3");
            cho1.addItem("item4");
            cho1.select(1);
    
            cho1.setFont(new Font("", 0, 15));
            f.add(cho1);
    
            java.awt.List list = new List(5); 
    //        java.awt.List list = new List(5, true); // 다중선택
            list.add("item1");
            list.add("item2");
            list.add("item3");
            list.add("item4");
            list.add("item5");
    
            f.add(list);
    
            Label la = new Label();
            la.setText("Label");
            f.add(la);
    
            JLabel jla = new JLabel();
            jla.setIcon(new ImageIcon("logo.jpg"));
            f.add(jla);
        }
    }