JAVA/JAVA Basic

[JAVA ] GUI(Graphic User Interface)

IT록흐 2021. 6. 20. 09:03
반응형

 

 

JAVA코드를 짜고

이클립스를 실행하면

콘솔창이 뜬다.

 

 

 

 

하지만 우리는

프로그램을 '콘솔'로

사용하지 않는다.

 

 

 

 

아이콘을 '클릭'하면

'윈도우 창'이 열린다.

 

 

이와 같이

입출력 환경이

그래픽으로 구성된 환경을 두고

GUI 환경이라 부른다.

 

그럼 GUI란 어떤 일을 할까?

 

GUI (Graphic user Interface)

 

 

 

 

 

CPU는 연산이 목적이지

그림그리기가 목적이 아니다.

 

만약 CPU가 그림까지 그려버리면, 실제로 주목적인 연산을 처리하지 못하고 그림에만 매달리게 된다. 그래서 이 작업을 다른 장치에 맡겨두는데 그것이 그래픽카드(혹은 내장그래픽)다.

 

OS는 사용자에게 그래픽을 제공한다. 사용자는 그래픽 안에서 각종 이벤트를 발생시킨다(키보드 입력, 마우스 클릭) . 그 이벤트를 OS는 2진코드로 바꾸어 CPU에게 보내 연산을 처리시켜 결과값을 그래픽카드로 보낸다. 그래픽카드는 결과값을 그래픽으로 만든 후, 사용자에게 제공한다.

 

이와 같이 OS에 제어 아래, 사용자의 이벤트(명령)에 따라 그래픽을 제공하는 환경을 두고 우리는 GUI라 부른다.

 

JAVA GUI 도구(swing, awt)

 

그림을 그리려면 도구가 필요하다. 그 도구가 JAVA에서는 awt와 swing 이다. awt와 swing은 '그림을 그리는 패키지'이다. GUI에서 말했듯, 연산과 그림 그리기는 '분리'되어 있다. Main 클래스의 스레드가 열심히 연산할 때, awt와 swing의 스레드는 열심히 그림을 그려야 한다.

 

그래서 awt와 swing은 독자적인 스레드를 가진다. GUI환경의 프로그램이 실행되면 자동으로 실행되는 보조 스레드로 우리는 이를 '데몬 스레드'라 부른다. awt와 swing이 그림을 그리려면 '피사체'가 필요하다.

 

 

 

 

이를 '컨테이너'(Container)라 부른다. 컨테이너 안에는 각종 '위젯'들이 포함되어 있다. 로고, 아이디 칸, 비밀번호칸, 로그인 버튼, 계정찾기버튼, 비밀번호 재설정 버튼, 메뉴바 등등 이러한 위젯들을 '컴포넌트'라 부른다.

 

그러므로 awt와 swing이 그림을 그리는 대상은 크게 두 가지다.

 

1. 특정 한 가지 기능을 하는 '컴포넌트'(ex. 버튼, checkBox..)

2. 그 컴포넌트들을 담는 그릇인 '컨테이너' (ex. 프레임, 패널..)

 

 

main스레드가 awt와 swing 스레드에게 외주를 맡기려면 먼저 '어떻게' 그려야 하는지 설명 해주어야 한다.

 

대표사진 삭제

사진 설명을 입력하세요.

 

 

메인 스레드는 '컨테이너'와 '컴포넌트'의 정보를 설정한다. 버튼이 몇 개가 선언되었으며, 어떤 이름을 갖고 있고 어떤 색을 갖고 있으며, 어떤 컨테이너 안에 어떤 컴포넌트가 포함되어야 하는지 등등 각종 설정값들을 메인스레드에서 설정한다.

 

컨테이너는 대표적으로 두 개가 있다. 프레임(Prame)과 패널(Panel).

 

 

 

네이버 창이 한 프레임이라 보면, 프레임은 용도 별로 여러 개의 패널로 나뉘어진다. 프레임을 특정한 레이아웃(Layout)으로 나눌 때, 패널을 사용하면 컴포넌트 관리가 용이해진다.

 

프레임 안에 컴포넌트를 바로 배치하면, 프레임은 컴포넌트를 1대1로 관리해야한다. 컴포넌트의 수가 적으면 상관이 없겠지만 네이버 페이지 같이 엄청나게 많은 컴포넌트가 있는 경우, 하나씩 관리해주는 것은 쉽지 않다.

 

그래서 컴포넌트를 프레임 컨테이너가 아닌 패널 컨테이너 안에 넣어준다. 패널은 컴포넌트들을 그룹화시켜 유지보수를 용이하게 만든다.

 

import java.awt.Color;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JFrame {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
        //컨테이너와 컴포넌트 생성
		JFrame fr = new JFrame(); // 프레임
		JPanel pn1 = new JPanel(); // 패널1
        JPanel pn2 = new JPanel(); // 패널2
		JButton bt1 = new JButton("버튼1"); //컴포넌트1
		JButton bt2 = new JButton("버튼2"); //컴포넌트2
        JButton bt3 = new JButton("버튼3"); //컴포넌트3
		JButton bt4 = new JButton("버튼4"); //컴포넌트4

        //레이아웃 설정
		FlowLayout fl = new FlowLayout(); //레이아웃 설정
		fl.setAlignment(FlowLayout.LEFT); //레이아웃 방식 설정
		
		//패널 1 설정
		pn1.setBackground(Color.orange); // 패널1 배경색 설정
		pn1.add(bt1); // 컨테이너(패널) 안 컴포넌트(버튼1) 넣기 
		pn1.add(bt2); // 컨테이너(패널) 안 컴포넌트(버튼2) 넣기 
		
        //패널 2 설정
        pn2.setBackground(Color.BLUE); // 패널2 배경색 설정
		pn2.add(bt3); // 컨테이너(패널) 안 컴포넌트(버튼3) 넣기 
		pn2.add(bt4); // 컨테이너(패널) 안 컴포넌트(버튼4) 넣기 

        //프레임 설정
		fr.setLayout(fl); // 프레임 레이아웃 설정
		fr.add(pn1); // 큰 컨테이너(프레임) 안 작은 컨테이너(패널1) 넣기
		fr.add(pn2); // 큰 컨테이너(프레임) 안 작은 컨테이너(패널2) 넣기
        fr.setDefaultCloseOperation(EXIT_ON_CLOSE); //창을 종료하면 데몬스레드도 같이 종료
		fr.setSize(300,300); // 프레임 크기 설정
		fr.setVisible(true);// 프레임이 보이도록 설정		
	}
}

 

 

 

이와 같이, main은 '설정'만 해놓으면 된다. 가장 큰 컨테이너인 프레임 객체에 최종적으로 add() 시키고 setVisible(true);를 하여 프레임 창이 눈에 보이도록 설정시켜 놓으면 awt와 swing의 데몬스레드가 알아서 실행되어 프레임 객체를 토대로 그림을 그려 아래와 같은 창을 만들어 낸다.

 

 

 

JAVA GUI 도구인 awt와 swing을 사용하기 전에, 이와같은 개념이 가장 중요하다고 생각한다. OS가 연산하는 환경과 그래픽을 담당하는 환경(GUI)이 서로 구분되어 있듯이, JAVA에서도 연산하는 스레드와 그림 그리는 스레드가 분리되어 있다.

 

fr.setDefaultCloseOperation(EXIT_ON_CLOSE);

 

이 코드를 넣어주는 이유도 그렇다. 창이 종료되면 Main스레드는 종료된다. 하지만 그림을 그리고 이벤트를 받는 데몬스레드는 종료가 되지 않는다. 창이 종료되었을시, awt와 swing의 데몬스레드도 같이 종료시키려면 저 코드를 사용해야한다.

 

그래서 Main에서 우리가 awt와 swing 패키지의 클래스를 사용할 때, 가장 주안점을 두어야 하는 부분은 어떻게하면 내가 원하는 방식대로 출력이 되도록 '설정'을 할까? 이다. 다양한 메소드가 다양한 기능을 제공하므로 레이아웃을 비롯하여 많은 내용을 공부하면 공부할수록 원하는 창을 만들어 낼 수 있다. 하지만 실무에서는 자바 GUI 환경을 잘 사용하지 않는다고 하니, 깊게 공부할 필요가 있을까 싶다.

 

 


정리

 

 

1. GUI는 사용자와 그래픽으로 소통하기 위한 환경이다.

2. JAVA의 GUI 프로그래밍도 연산과 그래픽의 스레드가 분리되어 이루어진다.

 

 

 

 

반응형