import javax.swing.*;// swing패키지 전체를 불러온다.
import java.awt.*;// awt패키지 전체를 불러온다.

public class practice6 extends JFrame {
    public static final int JLABEL_NUMBER = 20; // 정수형 상수를 필드에 선언을 하며 20이라는 데이터를 넣었다.
    public practice6(){ //practice6이라는 클래스의 생성자이다.
        setTitle("Random Labels");// 제목을 Random Labels이라고 지었다.
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container container = getContentPane();
        container.setLayout(null);// 배치관리자 없도록했다.
        // 그동안 컴포넌트를 주면 주어진 배치관리자가 위치와 크기를 상대적으로 조율하면서 배치를 했다. 근데 이게 반복문을 이용해서 놓는 것이 좋다 생각
        JLabel [] jLabels = new JLabel[JLABEL_NUMBER];// JLabel클래스배열을 정의하고 선언했다.
        int x, y;// 지역변수 정수형을 선언했다.

        for (int i = 0; i < JLABEL_NUMBER; i++)// 반복문 for문이다. JLABEL_NUMBER = 20이므로 20번 반복!
        {
            jLabels[i] = new JLabel(Integer.toString(i));//JLabel배열 원소 순서대로 접근
            x = (int)(Math.random()*200) + 50;// 반복할때마다 새로 난수 데이터를 저장
            y = (int)(Math.random()*200) + 50;// 반복할때마다 새로 난수 데이터를 저장
            jLabels[i].setLocation(x,y);// 난수에 설정된 정수로 위치좌표를 설정한다.
            jLabels[i].setSize(10,10);// 크기를 10x10으로 설정
            jLabels[i].setBackground(Color.BLUE);// 색을 파란색으로 설정
            jLabels[i].setOpaque(true);
            container.add(jLabels[i]);// 컨테이너 즉 여기서는 콘텐츠팬에 부착
        }

        setSize(300,300);// 콘텐츠 팬은 300x300사이즈로 설정
        setVisible(true);// 화면에 보이도록 설정!
    }
    public static void main(String[] args) {
        new practice6();
    }

파일을 다루는 기본적인 요소들을 정리해보았다.

1. 파일 작업 단계

f = open("test.txt", "r")             //파일 열기

s = f.read()                                   //읽기 또는 쓰기

f.close()                                       //파일 닫기

 

 

2. 텍스트 파일 읽고 쓰기

 

open()함수

 

"r" : 읽기

"w" : 쓰기

"a" : 추가

"r+" : 읽기로 열어 쓰기까지 가능

"w+" : 쓰기로 열어 읽기까지 가능

 

'b' : 바이너리 모드

't' : 텍스트 모드(파일 내용을 str로 반환)

'+' : 업데이트 용으로 열기

 

open() 후 파일 읽고 쓰기 메소드

 

읽기

read() : 파일 내용을 모두 읽어서 문자열로 반환

read(n) : 파일에서 n 바이트 읽어서 문자열로 반환

 

readline() : 한 줄씩 읽어서 문자열로 반환

 

readlines() : 파일 전체를 리스트로 반환

 

쓰기

write() : 문자열을 파일에 저장

writelines() : 문자열 리스트를 파일에 저장

 

3. 줄바꿈 기호 삭제하기

str.strip() : 양쪽 공백과 개행문자 제거

str.lstrip() : 왼쪽 공백과 개행문자 제거

str.rstrip() : 오른쪽 공백과 개행문자 제거

 

예시

>>> s = '       Hello       '
>>> s.strip()
'Hello'
>>> s.lstrip()
'Hello       '
>>> s.lstrip()
'       Hello'

 

 

4. 파일에서 단어 읽기

str.split() : 공백 문자를 이용하여 문자열에서 단어를 분리

 

5. with 문을 이용한 파일 열고 닫기(파일을 닫는 가장 좋은 방법)

with 문 내부의 블록이 종료될 때 파일 닫힘 -> close()를 명시적으로 호출할 필요 없음

 

다음에는 python에서 복사에 대해 정리해보겠다

 

'프로그래밍 언어 > python' 카테고리의 다른 글

[프로그래머스] 카펫  (0) 2021.01.20
파이썬을 배워야 하는 이유  (0) 2021.01.10
import javax.swing.*;                                           // javax.swing내에서 모든 클래스 import
import java.awt.*;                                              // java.awt내에서 모든 클래스 import
import java.awt.event.MouseAdapter;                             // java.awtjava.awt.event.MouseAdapter 클래스 import
import java.awt.event.MouseEvent;                               // java.awt.event.MouseEvent 클래스 import

public class JavaProject1_3 extends JFrame {                    // JFrame클래스 내에 있는 메소드,필드를 사용하기 위해서 JavaProject1_3 클래스에 상속을 받았다.
    private JLabel jLabel = new JLabel("2");               // JLabel "2"라는 텍스트를 가진 라벨 객체 생성

    public JavaProject1_3(){                                    // JavaProject1_3 생성자끝
        setTitle("클릭 연습용 응용프로그램");                      // 제목을 클릭 연습용 응용프로그램 라고 한다.
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         // x(닫기창)을 누르면 프로그램이 종료하도록하는 코드이다.
        Container contentPane = getContentPane();               // // contentPane을 불러온다.
        contentPane.setLayout(null);                            // 배치관리자를 삭제했다. 배치관리자는 컴포넌트 부착할때 해당 컴포넌트 크기와 위치를 조율한다. 내가 크기와 위치를 조율해야

        jLabel.setSize(15,15);                     //배치관리자를 삭제했으니 프로그래머가 컴포넌트 크기
        jLabel.setLocation(100,100);                        // 위치를 설정해줘야한다.
        contentPane.add(jLabel);

        jLabel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) { // 익명클래스를 사용했다. 여기서는 마우스 어탭터 클래스로 하나하나 모두 오버라이딩할 필요가 없어졌다.
                int x = (int)(Math.random()*450)+1;                 // 1~450까지 난수 생성
                int y = (int)(Math.random()*450)+1;                 // 1~459까지 난수 생성
                jLabel.setLocation(x,y);                            // 두개의 난수를 위치로 넣는다.
            }
        });

        setSize(500, 500);                              // 창의 크키는 가로 500픽셀, 세로 500픽셀
        setVisible(true);                                             // 창이 보이도록 설정한다.
    }


    public static void main(String[] args) {
        new JavaProject1_3();
    }   // 메인메소드 즉 프로그램 실행부분이다.
}

*기본 계산기앱은 블로그는 (3)이 끝입니다.

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class AppCal extends JFrame {
    // AppCal클래스의 필드
    private JTextArea printInputtedCalculation = new JTextArea();// 수식을 화면에 보여주는 JTextField 컴포넌트
    private JButton [] calculationNumberButton = new JButton[10]; // 숫자에 해당하는 버튼들
    private JButton [] calculationButton = {
            new JButton("<-(All)"), new JButton("계산"),
            new JButton("+"), new JButton("-"), new JButton("×"), new JButton("÷")
    };// 연산기호에 해당하는 버튼들
    private JTextField printResultCalculation = new JTextField();// 계산 결과를 출력하는 컴포넌트

    // AppCal클래스의 생성자
    public AppCal(){
        setTitle("계산기 프로그램");// 제목을 계산기 프로그램이라는 이름 설정하기
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 창닫기버튼 클릭시 프로그램 종료
        Container contentpane = getContentPane();// 콘텐트팬을 가져오기 => 여기서 gui프로그램을 만든다.
        contentpane.setLayout(new BorderLayout());// 레이아웃을 BorderLayout으로 설정한다.

        contentpane.add(new InputtedCalculation(), BorderLayout.NORTH);//북쪽에 계산식을 보여주는 패널을 부착한다.
        contentpane.add(new ResultOfCalculation(), BorderLayout.SOUTH);// 계산결과를 알려주는 패널을 부착한다.
        contentpane.add(new CalculationButton(), BorderLayout.CENTER);// 중앙에 계산기에 필요한 숫자들과 사칙연산기호등... 버튼들이 있는 패널을 부착한다.
        setSize(380,260);//프로그램 실행시 창을 가로360픽셀, 세로 260픽셀크기로 한다.
        setVisible(true);// 창을 화면에 보이도록 설정한다.
    }
    // AppCal클래스의 내부 클래스로 JPanel을 상속받아 InputtedCalculation 패널클래스구현(계산식(계산수식)을 보여준다.)
    private class InputtedCalculation extends JPanel{
        public InputtedCalculation(){
            setLayout(new GridLayout(1,2)); // 1행과 2렬로 구성된 grid배치관리자로 설정했다.
            setBackground(Color.LIGHT_GRAY);// 배경색을 LIGHT_GRAY로 설정했다.(밝은 회색)
            add(new JLabel("계산식"));// 라벨의 텍스트를 게산식으로 설정해서 부착했다.
            printInputtedCalculation.setEditable(false);// 사용자가 JTextField를 수정하지못하도록 설정했다.
            add((printInputtedCalculation)); // JTextArea를 부착했다.
        }
    }
    // AppCal클래스의 내부 클래스로 JPanel을 상속받아 CalculationButton 패널클래스구현(계산기의 버튼들을 만든다.)
    private class CalculationButton extends JPanel{

        public CalculationButton(){
            int i;
            setLayout(new GridLayout(4,4,3,3));// 4행과 4렬로 구성된 grid배치관리자로 설정했다.추가로 상하좌우 간격을 각각 3픽셀씩 간격을 두도록 했다.

            for (i = 0; i < calculationNumberButton.length; i++)// 0~9까지의 텍스트를 가지는 각각 버튼을 부착하는 반복문이다.(+나중에는 이벤트리스너를 구현해서 처리를 할 것 이다.)
            {
                calculationNumberButton[i] = new JButton(Integer.toString(i)); // 숫자는 반복되는데 텍스트를 넣어야하기에 숫자를 문자열로 바꿔 JButton의 인수에 넣었다.
                add(calculationNumberButton[i]);// 숫자에 해당하는 버튼 부착
                calculationNumberButton[i].addActionListener(new calculatorButtonActionListener(false));// 아직 미완
            }
            for (i = 0; i < calculationButton.length; i++)// 연산기호에 해당하는 텍스트를 가지는 각각 버튼을 부착하는 반복문이다.(+나중에는 이벤트리스너를 구현해서 처리를 할 것 이다.)
            {
                add(calculationButton[i]);// 연산기호에 해당하는 버튼 부착
                if (i>=2)
                    calculationButton[i].addActionListener(new calculatorButtonActionListener(true));// 사칙연산기호에 해당 이벤트 리스너를 적용했다.
            }
            calculationButton[0].addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionEvent) {
                    JButton button = (JButton)actionEvent.getSource();
                    printInputtedCalculation.setText("");
                }
            });
            calculationButton[1].addActionListener(new calculatorActionListener());

        }
        private class calculatorButtonActionListener implements ActionListener{
            private boolean operationalSymbols;
            public calculatorButtonActionListener(boolean operationalSymbols){
                this.operationalSymbols = operationalSymbols;
            }
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                // 이벤트가 발생하면 해당버튼 숫자를 불러와 printInputtedCalculation에 출력한다.
                // 우선 해당버튼 객체를 불러온다. 그 객체 문자를 가져와 printInputtedCalculation에 출력
                JButton button = (JButton)actionEvent.getSource();
                if (operationalSymbols)
                    printInputtedCalculation.append(" " + button.getText() + " ");
                else
                    printInputtedCalculation.append(button.getText());
            }
        }
        private class calculatorActionListener implements ActionListener{
            private String [] calculationElements = printInputtedCalculation.getText().split(" ");
            private ArrayList<String> calculationElements1 = new ArrayList<String>();
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                // 계산버튼
                // 먼저 문자열 전체부분을 가져온다. 그래서 공백기준으로 쪼개서 넣는다.
                // 반복문 for 안에서 ~~
                // 홀수부분이 연산자, 짝수부분이 피연산자 개수를 파악할 수 있다. size()로 개수도 파악가능하고 인덱스도 파악가능하다. => 이걸 반복문에서 자체로 걸려서 인덱스로 대입을 할지 contain을 해서 안에서 할지
                //
            }
        }
    }
    // AppCal클래스의 내부 클래스로 JPanel을 상속받아 ResultOfCalculation 패널클래스구현()
    private class ResultOfCalculation extends JPanel{
        public ResultOfCalculation(){
            setLayout(new GridLayout(1,2));// 1행과 2렬로 구성된 grid배치관리자로 설정했다.
            setBackground(Color.ORANGE);// 배경색을 ORANGE로 설정했다.(오렌지)
            add(new JLabel("계산결과"));// 라벨의 텍스트를 게산결과로 설정해서 부착했다.
            printResultCalculation.setEditable(false);// 사용자가 JTextField를 수정하지못하도록 설정했다.
            add(printResultCalculation);
        }
    }
    public static void main(String[] args) {
        new AppCal();
    }// 메인메소드에서 AppCal클래스 생성자를 실행시켰다.
}

이벤트처리부분과 사칙연산을 고려해서 넣는게 쉽진않네요..

+ Recent posts