국비학원/수업기록

국비 지원 개발자 과정_Day9

루팽 2022. 12. 8. 21:18

<시험1-프로그래밍 언어 활용 문제 해결 시나리오>

while의 조건문이 false이므로 변경할 방법이 없어서 무한루프를 돌게 된다.

문자열 비교는 .equals()을 써서 해야 한다.

exit할 때 Scanner도 Close()로 닫아줘야 한다.

package dev_java.ch03;

import java.util.Scanner;

public class Q1 {
  public void Count() {
    Scanner s = new Scanner(System.in);
    boolean isOk = true; // boolean 변수 추가

    while (isOk) { // 조건문에 isOk 변수를 추가
      System.out.println("문자열을 입력해주세요: ");
      String str = s.nextLine();
      if (str.equals("exit")) { // .equals()로 변경
        isOk = false; // exit할 경우 isOk가 false로 바뀌도록 추가
        s.close(); // scanner close() 추가
        break;
      } else {
        System.out.println(str.length() + "글자 입니다.");
      }
    }
    System.out.println("프로그램을 종료합니다.");
  }

  public static void main(String[] args) {
    Q1 q = new Q1();
    q.Count();
  }
}

 

 

1~20까지의 수 중에서 5의 배수인 숫자들은 “5의 배수입니다.”라고 출력하고,

그 외의 숫자들은 “5의 배수가 아닙니다.”라고 출력한다.

package dev_java.ch03;

public class Q2 {
  int i = 1;

  void methodA() {
    while (i <= 20) {
      if (i % 5 == 0) {
        System.out.println(i + ": 5의 배수입니다.");
      } else {
        System.out.println(i + ": 5의 배수가 아닙니다.");
      }
      i++;
    }
  }

  void methodB() { // for, switch문으로 변경
    for (i = 0; i <= 20; i++) {
      switch (i) {
        case 5:
        case 10:
        case 15:
        case 20:
          System.out.println(i + ": 5의 배수입니다.");
          break;
        default:
          System.out.println(i + ": 5의 배수가 아닙니다.");
      }
    }
  }
  public static void main(String[] args) {
    Q2 q = new Q2();
    q.methodA();
    System.out.println("========");
    q.methodB();
  }
}

 

 

for문의 조건식에서 i <= arr.length;라고 썼기에 0부터 4까지의 수를 arr[]의 index에 대입하게 되는데,

arr[]의 인덱스 범위는 배열길이(4)-1이기에 arr[0]~arr[3]까지이고,

해당 배열의 index를 벗어나는 값 불러왔기에 에러가 발생했다.

package dev_java.ch03;

import java.util.Arrays;

public class Q3 {
  int[] arr = new int[4]; // 길이가 4인 배열의 선언과 생성(디폴트값0)

  void methodA() {
    for (int i = 0; i < arr.length; i++) { // <=를 <로 변경(i는 0~3)
      arr[i] += (10 + i);
    }
  }

  public static void main(String[] args) {
    Q3 q = new Q3();
    q.methodA();
    System.out.println(Arrays.toString(q.arr));
    // [10, 11, 12, 13]이 출력됨
  }
}

 

 

<시험2-프로그래밍 언어 활용 서술형(신)>

기본자료형 메모리 할당 크기

정수형: byte(1byte), short(2byte), int(4byte), long(8byte)

실수형: float(4byte), double(8byte)

문자형: char(2byte)

논리형: boolean(1byte)

 

상수

변하지 않고 고정된 수로 final 예약어를 사용하여 선언하고, 초기화 이후 그 안의 값을 바꿀 수 없다.

상수의 변수명은 대문자를 사용하고 여러 단어를 연결하는 경우 _ 를 사용한다.

 

자동형 변환

작은 크기의 자료형이 큰 크기의 자료형에 저장될 때 자동으로 형 변환(타입 변환)이 일어나는 것.

 

강제형 변환

큰 크기의 자료형을 작은 크기의 자료형에 저장하면 오류가 발생하기에, 명시적으로 바꾸고자 하는 자료형을 입력하여 형 변환을 해주는 것.

강제 형 변환은 값의 손실이 일어날 수도 있다.

 

연산자 우선순위

최우선 연산자 → 산술 연산자 → 논리 연산자 → 삼항 연산자 →대입 연산자

 

조건문 종류

if문, if-else문, if-else if-else문, switch문

 

if 조건문

괄호 안에 true와 false를 판단하는 조건문이 들어간다.

해당 조건문을 테스트해서 true면 if문에 속한 문장들을 수행하고, false면 수행하지 않는다.

 

switch 입력 변수

괄호 안에 변수가 들어간다.

변수의 값과 일치하는 case 값이 있다면 해당 case문에 속한 문장들이 실행된다.

 


 

이벤트

마우스로 클릭하거나 키보드로 누르는 일련의 모든 작동

 

이벤트 소스

이벤트가 발생할 수 있는 대상(버튼, 체크박스, 리스트, 프레임, 마우스 등과 같은 컴포넌트들)

 

이벤트 리스너

이벤트 소스에서 이벤트가 발생하면 이벤트를 처리할 수 있도록 만든 인터페이스

 

이벤트 핸들러

이벤트 리스너에 포함되어 있는 메소드로 발생된 이벤트 객체를 받아와서 실제적으로 처리해주는 기능

 

이벤트 객체

발생한 이벤트에 대한 정보를 가진 객체

 

이벤트 클래스의 구조

모든 이벤트 클래스는 java.util.EventObject 클래스로부터 상속을 받고 있으며, 이 클래스에는 이벤트를 발생시킨 객체를 알려주는 getSource() 메서드가 존재

getSource()는 여러 이벤트가 발생할 때 이벤트를 발생시키는 객체를 구별할 목적으로 사용한다.

 

자바에서 이벤트 처리 과정

운영체제가 해당 프로그램에서 이벤트 발생 감지 → JVM에게 이벤트 전달 → JVM은 발생된 이벤트를 처리하기 위해 이벤트 객체를 생성 → 이벤트를 처리하기위해 이벤트 객체를 가지고 핸들러를 호출

 

이벤트 처리 단계

1. 이벤트 소스를 지원하는 이벤트 처리 리스너를 선택한다.

JButton, JTextField(엔터치면) → ActionListener(인터페이스)→추상메소드actionPerformed(@override)

 

인터페이스는 반드시 구현체 클래스가 있어야 하는데(안에 있는 게 추상메소드라서 단독으로 구현x)

그 구현제 클래스를 자바에서 이벤트 핸들러 클래스라고 함

 

class A implements ActionListener{}

클래스 A는 이벤트 핸들러 클래스이다

ActionListener의 구현체 클래스이다

ActionListener에 정의된 추상메소드 actionPerformed를 오버라이딩해야함(강제사항)

 

2. 오버라이딩해야함(재정의)

 

3. 이벤트 소스와 이벤트 핸들러 클래스를 연결(Callback)

package dev_java.view;

import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class RandomGameViewDemo implements ActionListener {
  // 선언부
  // JFrame jf = null; // 게으른 인스턴스화, 선언과 생성을 분리
  JFrame jf = new JFrame(); // 이른 인스턴스화
  JButton jbtn_center = new JButton("중앙"); // 생성자 파라미터는 String
  JButton jbtn_east = new JButton("동쪽");
  JButton jbtn_west = new JButton("서쪽");
  JButton jbtn_south = new JButton("남쪽");
  JButton jbtn_north = new JButton("북쪽");

  // 생성자
  public RandomGameViewDemo() { 
    System.out.println("디폴트 생성자 호출 성공");
    initDisplay();
  }

  // 화면처리부
  public void initDisplay() {
    System.out.println("initDisplay 호출");
    // jf = new JFrame(); // 게으른 인스턴스화, 선언과 생성을 분리
    jbtn_center.addActionListener(this);
    jbtn_east.addActionListener(this);
    jbtn_west.addActionListener(this);
    jbtn_south.addActionListener(this);
    jbtn_north.addActionListener(this);
    jf.add("Center", jbtn_center); // 다른 버튼을 비활성화하면 Center가 그 공간을 차지함
    jf.add("East", jbtn_east);
    jf.add("West", jbtn_west);
    jf.add("South", jbtn_south);
    jf.add("North", jbtn_north);
    jf.setSize(300, 400);
    jf.setVisible(true);
  }

  // UI API를 활용하여 공부를 하면
  // 1. 초기화를 활용할 수 있게됨
  // 2. 생성자 역할에 대해 알게됨
  // 3. 사용자 정의 메소드를 많이 만들어볼 수 있음
  // 4. 파라미터와 리턴타입에 대해 확실해짐
  // 5. 전역변수와 지역변수를 구분하여 코딩을 전개하게됨
  // 6. 클래스를 나누는 조건을 갖게됨
  // 7. 이벤트 처리를 사전학습할 수 있음
  // 8. 익명클래스를 활용할 수 있음(익명함수, arrow function등 신 문법을 공부하는데 도움)

  // 메인메소드
  public static void main(String[] args) {
    new RandomGameView();
    // 선언부 없이 생성자만 호출할 수 있다.(인스턴스변수를 재사용할 일이 없다면 괜찮음)
    // new RandomGameView(); // 복제본이 생성됨. 그러나 서로 다른 객체
    // new RandomGameView(); //마찬가지로 복제본이 생성됨. 타입은 동일하지만 다른 객체
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    // 눌린 버튼의 문자열을 읽어온다
    System.out.println(e.getActionCommand());
    // 눌린 버튼의 주소번지를 가져온다
    System.out.println(e.getSource());
    String label = e.getActionCommand(); // 북쪽, 남쪽, 동쪽, 서쪽, 중앙
    if ("중앙".equals(label)) {
      System.out.println("중앙버튼 클릭");
    } else if ("동쪽".equals(label)) {
      System.out.println("동쪽버튼 클릭");
    } else if ("서쪽".equals(label)) {
      System.out.println("서쪽버튼 클릭");
    } else if ("남쪽".equals(label)) {
      System.out.println("남쪽버튼 클릭");
    } else if ("북쪽".equals(label)) {
      System.out.println("북쪽버튼 클릭");
    }
  }
}