Graphics2D 클래스

Graphics2D 클래스

Graphics2D 클래스는 Graphics 클래스를 확장해서 기하, 좌표 변환, 색상 관리, 텍스트 레이아웃에 대한 더 정교한 제어를 제공해요. Java 플랫폼에서 2차원 도형·텍스트·이미지를 렌더링하는 기본 클래스예요.

출처: Java API Reference

본문

좌표 공간

Graphics2D 객체에 전달되는 모든 좌표는 어플리케이션이 사용하는 장치 독립적인 좌표계인 사용자 공간(User Space)으로 지정돼요. Graphics2D 객체는 렌더링 상태의 일부로 AffineTransform 객체를 포함하는데, 이는 좌표를 사용자 공간에서 장치 공간(Device Space)의 장치 의존 좌표로 변환하는 방법을 정의해요.

public abstract class Graphics2D
extends Graphics

모든 Graphics2D 객체는 렌더링이 일어나는 대상을 정의하는 대상(target)과 연결돼요. GraphicsConfiguration 객체는 픽셀 형식·해상도 같은 렌더링 대상의 특성을 정의해요. Graphics2D 생성 시 GraphicsConfiguration이 대상의 기본 변환을 지정해요.

기본 변환은 원점이 장치 대상 영역의 왼쪽 위 모서리에 오도록 사용자 좌표계를 화면·프린터 장치 좌표로 매핑해요. X 좌표는 오른쪽으로, Y 좌표는 아래쪽으로 증가해요. 화면 장치처럼 약 72dpi에 가까운 장치는 기본 변환의 스케일이 항등(identity)으로 설정되고, 프린터 같은 고해상도 장치는 1제곱인치당 약 72 사용자 좌표로 설정돼요. 이미지 버퍼의 기본 변환은 항등 변환이에요.

렌더링 과정

렌더링 과정은 Graphics2D 렌더링 속성으로 제어되는 네 단계로 나눌 수 있어요.

  1. 무엇을 렌더링할지 결정 — 도형·텍스트·이미지 연산.
  2. 현재 Clip으로 렌더링 연산 제한 — 사용자 클립을 현재 변환으로 장치 공간에 변환하고 장치 클립과 결합해 합성 클립을 결정.
  3. 무슨 색상을 렌더링할지 결정 — 현재 Paint 속성 조회.
  4. 대상 그리기 표면에 색상 적용 — 현재 Composite 속성 사용.

렌더 과정의 세 종류 연산을 살펴보면:

  • 도형 연산draw(Shape)면 현재 Stroke 속성의 createStrokedShape로 지정 도형 윤곽선을 포함한 새 Shape를 만들고, 사용자→장치 공간 변환 후 PathIterator로 윤곽선을 추출해 그려요.
  • 텍스트 연산String이면 현재 Font가 문자를 글리프 집합으로 변환하고, AttributedCharacterIteratorTextLayout로 변환하며, GlyphVector면 이미 글리프 코드와 좌표를 갖고 있어 글리프 윤곽선을 채워요.
  • 이미지 연산 — 소스 이미지의 경계 상자를 이미지 공간→사용자 공간→장치 공간으로 변환해 그려요.

기본 렌더링 속성

  • PaintComponent의 색상
  • FontComponent의 글꼴
  • Stroke — 선폭 1의 사각 펜, 대시 없음, miter 조인, 사각 끝 캡
  • TransformComponentGraphicsConfiguration의 기본 변환
  • CompositeAlphaComposite.SRC_OVER 규칙
  • Clip — 렌더링 클립 없음, 출력은 Component로 클리핑

주요 메서드

  • setPaint(Paint) / setColor(Color) — 페인트·색상을 설정해요.
  • setStroke(Stroke) — 스트로크를 설정해요.
  • setTransform(AffineTransform) / transform(AffineTransform) / translate / rotate / scale — 변환을 설정해요.
  • setComposite(Composite) — 합성 방식을 설정해요.
  • setRenderingHint(...) — 안티앨리어싱 등 렌더링 힌트를 설정해요.
  • draw(Shape) / fill(Shape) — 도형을 그리고 채워요.
  • drawString(String, float, float) — 텍스트를 그려요.
  • getFontRenderContext()FontRenderContext를 얻어요.

JDK 1.1 호환성

Java 2D API는 JDK 1.1 렌더링 동작과 호환성을 유지해요. 기본 속성 설정 하에서 레거시 메서드(fillRect, drawRect, drawString 등)는 기존과 동일하게 동작하며, fill(Shape)·draw(Shape)로도 같은 결과를 낼 수 있어요. 좌표는 픽셀 사이에 정의돼서 안티앨리어싱 유무와 무관하게 예측 가능한 렌더링을 보장해요.

Graphics.setColor(c)는 이제 setPaint(c)와 동일한 편의 메서드예요. setPaintMode()는 기본 Composite를 설정하는 편의 메서드(setComposite(new AlphaComposite.SrcOver)과 동일)이고, setXORMode(xorcolor)는 소스 색상의 Alpha 성분을 무시하고 dstpixel = (PixelOf(srccolor) ^ PixelOf(xorcolor) ^ dstpixel)로 대상 색상을 설정하는 특수 Composite를 설정하는 편의 메서드예요.

더 알아보기