Keyword
-
awt(Abstract Window Toolkit) / swing
-
accessor / mutator
-
ball world를 구성하는 기본 요소
-
2차원 평면에서 ball을 설명할 수 있는 최소 정보
-
위치
-
크기
-
-
생성 후 정보 변경 불가
-
int x
-
2차원 평면에서의 X축 상 위치
-
생성 시 지정
-
-
int y
-
2차원 평면에서의 Y축 상 위치
-
생성 시 지정
-
-
int radius
-
볼의 중심에서 외곽까지의 길이
-
생성 시 지정
-
-
Accessor
-
변수값 반환
-
private 변수에 대한 접근 지원
-
외부에서 직접적인 접근이 필요한 경우에만 정의
-
-
형식
-
get + <field name>
-
getRadius, getColor, …
-
-
is + <field name>
-
isEnabled, isInterrupted, …
-
-
다른 용어
-
Getter
-
-
-
Mutator
-
변수값 변경
-
private 변수에 대한 변경 지원
-
외부에서 직접적인 변경이 필요한 경우에만 지원
-
-
형식
-
set + <field name>
-
setRadius, setColor, …
-
-
Setter
-
-
accessor와 mutator 정의 최소한으로…
-
x, y로 이루어진 중심점 좌표, 반지름을 갖는다.
-
중심점 좌표와 반지름은 생성할 때 설정한다.
-
각 변수의 값을 요청할 수 있다.
-
x, y, radius
-
-
문자열로 출력할 수 있다.
-
코딩 규칙을 따라 작성한다.
-
VSCode 또는 IntelliJ에 SonarLint와 CheckStyle을 설치하여 확인한다.
-
-
class Ball를 참고하라
package com.nhnacademy; public class Ball { ... public Ball(int x, int y, int radius) { ... } public int getX() { ... } public int getY() { ... } public int getRadius() { ... } @Override public String toString() { ... } }
-
Source Code
-
물음
-
Ball class는 요구대로 정의 되었나?
-
볼은 지정된 위치에 주어진 크기로 생성되었나?
-
볼을 위치 (Integer.MAX_VALUE, Integer.MIN_VALUE)에 반지름 1의 크기로 생성하면 어떻게 될까?
-
볼을 위치 (1, -1)에 반지름 Integer.MAX_VALUE 크기로 생성하면 어떻게 될까?
-
-
볼이 차지한 영역 확인이 가능하도록 함수를 추가하라
-
볼이 위치한 최소/최대 x 값을 얻을 수 있다.
-
볼이 위치한 최소/최대 y 값을 얻을 수 있다.
-
-
Source Code
-
물음
-
볼이 차지하는 영역이 올바른가?
-
볼을 위치 (Integer.MAX_VALUE, Integer.MIN_VALUE)에 반지름 1의 크기로 생성하면 영역은 올바른가?
-
볼을 위치 (1, -1)에 반지름 Integer.MAX_VALUE 크기로 생성하면 영역은 올바른가?
-
-
입력 값으로 볼 생성 조건을 만족하지 못할 경우, exception을 발생 시킨다.
-
입력되는 argument들이 유효한지 검사하도록 수정하라.
-
x, y는 int 범위에서 지정할 수 있다.
-
유효하지 않을 경우, OutOfRangeException을 발생시킨다.
-
-
ball의 어떠한 부분도 Java의 int 범위내에 위치해야 한다.
-
반지름은 0보다 큰 정수를 갖는다.
-
유효하지 않을 경우, InvalidSizeException을 발생시킨다.
-
-
표준으로 지원되지 않는 Exception은 정의한다.
-
다음의 값들에 대해 볼이 생성되는지 확인하라.
x
y
Radius
0
0
1
0
0
Integer.MAX_VALUE
100
100
100
100
-100
100
-100
100
100
-100
-100
100
Integer.MIN_VALUE + 1
Integer.MIN_VALUE + 1
1
Integer.MIN_VALUE + 1
Integer.MAX_VALUE - 1
1
Integer.MAX_VALUE - 1
Integer.MIN_VALUE + 1
1
Integer.MAX_VALUE - 1
Integer.MAX_VALUE - 1
1
-
다음의 값들에 대해 InvalidSizeException이 발생하는지 확인하라.
x
y
Radius
0
0
0
0
0
-0
0
0
Integer.MIN_VALUE
-
다음의 값들에 대해 OutOfRangeException이 발생하는지 확인하라.
x
y
Radius
Integer.MAX_VALUE
0
1
0
Integer.MAX_VALUE
1
Integer.MIN_VALUE
0
1
0
Integer.MIN_VALUE
1
Integer.MIN_VALUE
Integer.MIN_VALUE
1
Integer.MAX_VALUE
Integer.MIN_VALUE
1
Integer.MIN_VALUE
Integer.MAX_VALUE
1
Integer.MAX_VALUE
Integer.MAX_VALUE
1
Integer.MAX_VALUE
0
Integer.MAX_VALUE
0
Integer.MAX_VALUE
Integer.MAX_VALUE
Integer.MIN_VALUE
0
Integer.MAX_VALUE
0
Integer.MIN_VALUE
Integer.MAX_VALUE
-
Source Code
-
물음
-
실행시 모든 과정에서 문제 없이 수행되었나?
-
입력 매개변수의 검증에 문제가 없나?
-
조건을 만족하는 값 입력시 정상적으로 생성되는가?
-
조건을 만족하지 않은 값 입력시 해당 exception이 발생하는가?
-
-
-
Exam-3-1-3에서의 확인 과정을 JUnit5를 이용해 테스트 코드로 작성하라.
-
Test를 위해서는 다음의 Annotation 사용이 가능하다.
-
동일한 기능 확인을 임의의 값을 주고, N번 반복해서 확인하라.
-
입력이나 출력 값의 범위가 넓어 모두 확인이 어려울 경우, 램덤 테스트를 통해 일부 검증한다.
-
-
Test를 위해서는 다음의 Annotation 사용이 가능하다.
-
색을 가지며
-
생성시 주어질 수 있다.
-
-
화면에 출력할 수 있다.
-
화면에 그리기는 Java에서 제공하는 라이브러리를 사용하므로, 요구하는 형식에 맞춰 구성
-
Java AWT
-
awt에서는 component를 다시 그려야 하는 시점에 paint 함수를 호출
-
paint함수 호출과 함께 graphic context를 이용해 그리기 가능
-
-
Ball class에는 ball을 화면상에 표시하기 위한 함수 필요
-
void paint(Graphics g)
-
g - ball을 화면에 출력할 수 있도록 지원하는 graphic context의 instance
-
-
-
awt에서 원을 그리기 위해서는 fillOval 사용
-
Ball을 확장한 PaintableBall 정의
-
awt graphics context를 매개변수로 받아 그릴 수 있도록 paint함수 정의
-
void paint(Graphics g);
-
-
도형의 색은 graphics context에서 설정
-
setColor(Color color);
-
-
외부의 자원을 활용할 경우, 자원 활용 후 해당 자원의 변경된 상태 유지가 목적이 아니라면 활용 전 상태로 돌려둘 것
-
코드 중복 최소화
-
함수에 대한 중복 정의는 권장
-
동일한 코드의 반복은 최소화
-
-
Source Code
-
-
JFrame을 이용해 Frame 구성 실행
-
-
-
물음
-
PaintableBall의 constructor에서 super class의 변수들은 어떻게 초기화 하였나?
-
paint 함수에서 x, y, radius, color를 가져올 때, 어떻게 처리하였나?
-
graphic context를 이용해 ball 색을 출력하고, 원래 설정된 색으로 돌려놓았는가?
-
-
Test code를 사용할 경우, 화면 출력 검증이 어려워 해당 기능을 대신할 것이 필요
-
Graphics를 검증 가능한 형태인 DummyGraphics를 정의하여 사용
-
Graphics를 확장해서 만든 DummyGraphics를 이용해 해당 함수가 정상적으로 동작하는지 확인
-
Variable
-
color
-
fillOval 호출 시 주어진 argument
-
-
Method
-
void setColor(Color color)
-
색을 설정하는 함수로, PaintableBall에서 설정한 값을 저장하도록 구성한다.
-
-
Color getColor()
-
현재 설정된 색을 반환한다.
-
-
Color getColorHistory()
-
현재 색 이전에 설정되었던 색들을 저장한다.
-
-
Color[] clearColorHistory()
-
저장되어 있는 색 변경 정보를 삭제한다.
-
-
Map<String, Object> getFillOvalParam();
-
fillOval을 호출하면서 사용된 인수를 저장 후 반환한다.
-
fillOval이 호출되지 않았다면, exception이 발생한다.
-
Map<String, Object>를 반환한다.
-
Map에는 x, y, width, height, color가 저장된다.
-
-
-
Java에서 constant 정의하는 법 확인
-
코드의 중복 최소화
-
Source Code
-
-
Color를 지정하지 않고 생성
-
생성 후 getColor를 이용해 확인
-
-
-
Constructor overloading
-
-
-
world내에서 동작할 ball 관리
-
ball 추가
-
ball 삭제
-
삭제할 ball을 주거나 순번으로 지정
-
-
ball 가져오기
-
순번 지정
-
-
ball 갯수 얻기
-
graphics context가 주어지면, 이를 이용해 그리기
-
-
ball이 존재할 공간이면서 화면에 출력될 영역
-
Swing component JPanel 확장
-
전체 프로그램의 틀이 될 JFrame 생성 후 world 추가하여 실행
-
-
void add(Ball ball)
-
ball을 관리 목록에 추가
-
ball - 추가할 ball
-
-
void remove(Ball ball)
-
ball을 관리 목록에서 제거
-
ball - 제거할 ball
-
-
void remove(int index)
-
특정 번째 ball 제거하기
-
index - 제거할 ball 위치
-
-
int getCount()
-
ball 개수
-
-
Ball get(int index)
-
특정 번째 ball 가져오기
-
index - 가져올 ball 위치
-
-
void paint(Graphics g)
-
화면 출력
-
JPanel의 정의된 void paint(Graphics g) 재정의
-
Panel을 다시 그려야 하는 시점에 ball 출력
-
Ball 종류 확인 필요
-
g - 화면 출력을 위한 graphic context
-
-
JPanel을 확장하여 World class 정의
-
World에서 정의하고 있는 method 구현
-
Source Code
-
-
실행 후 아무런 그림이 없는 window 실행
-
JFrame을 이용한 Window를 생성하여 출력
-
setSize(int, int)
-
Window 크기를 설정한다.
-
-
setDefaultCloseOperation(int)
-
window close 버튼을 클릭하였을때, 프로그램 종료
-
-
add(Component)
-
world는 JPanel을 확장하여 정의하였으므로, awt component
-
frame에서 관리하는 component로 추가
-
-
setEnabled(boolean)
-
Component class에 정의된 함수로서, component 사용 여부 설정
-
기본값 false
-
-
setVisible(boolean)
-
Component의 화면 출력 여부
-
visible 설정 필요
-
기본값 false
-
-
-
-
-
Ball 관리
-
Frame이 다시 그려져야 하는 시점에 paint 함수 호출됨
-
-
-
world
-
크기 가로 400, 세로 300
-
ball이 추가될때 마다 로그 출력
-
-
paintable ball
-
10개 생성하여 추가
-
world 내 임의 위치
-
반지름 최소 10, 최대 50으로 제한
-
다섯 가지 색 중 하나
-
BLUE, RED, WHITE, BLACK, GREEN
-
-
-
주의할 점
-
지금까지 정의한 ball은 두 종류
-
World에는 Ball 등록 가능
-
-
Source Code
-
로그 출력
2024-01-27T20:30:38.137+0900 TRACE ball 추가 : 149, 31, 22, java.awt.Color[r=0,g=255,b=0] 2024-01-27T20:30:38.140+0900 TRACE ball 추가 : 346, 205, 35, java.awt.Color[r=0,g=0,b=0] 2024-01-27T20:30:38.140+0900 TRACE ball 추가 : 118, 136, 47, java.awt.Color[r=255,g=0,b=0] 2024-01-27T20:30:38.141+0900 TRACE ball 추가 : 72, 42, 30, java.awt.Color[r=0,g=0,b=255] 2024-01-27T20:30:38.141+0900 TRACE ball 추가 : 57, 101, 25, java.awt.Color[r=0,g=0,b=255] 2024-01-27T20:30:38.141+0900 TRACE ball 추가 : 223, 95, 35, java.awt.Color[r=255,g=0,b=0] 2024-01-27T20:30:38.142+0900 TRACE ball 추가 : 150, 96, 47, java.awt.Color[r=0,g=0,b=255] 2024-01-27T20:30:38.142+0900 TRACE ball 추가 : 178, 240, 45, java.awt.Color[r=255,g=0,b=0] 2024-01-27T20:30:38.142+0900 TRACE ball 추가 : 185, 135, 41, java.awt.Color[r=255,g=0,b=0] 2024-01-27T20:30:38.143+0900 TRACE ball 추가 : 78, 158, 27, java.awt.Color[r=0,g=255,b=0]
-
출력 형식은 일부 다를 수 있음
-
-
World에서 ball 추가시 ball의 모든 부분이 world의 영역 내에 포함되는지 확인
-
그렇지 않으면, IllegalArgumentException 발생
-
주의
-
World의 크기만 준다고 화면상에 크기가 표시되지 않음.
-
화면상에 표시되는 기본 틀은 Frame에 따른다. 따라서, Frame의 크기를 설정하기 않으면 실행 후 타이틀 바만 보임.
-
+
-
Source Code
-
-
exception의 발생 원인이 외부에서 주어진 데이터 잘못이므로, 외부에서 처리하도록 함.
-
-
-
Ball 추가 시점에 영역이 벗어나는지 확인
-
영역을 벗어난 ball을 등록할 경우, world에서는 exception을 발생시킴
-
-