<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://dislab.hufs.ac.kr/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Swpark</id>
	<title>DISLab - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://dislab.hufs.ac.kr/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Swpark"/>
	<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/wiki/Special:Contributions/Swpark"/>
	<updated>2026-05-25T10:20:11Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=Sangwon_Park&amp;diff=445</id>
		<title>Sangwon Park</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=Sangwon_Park&amp;diff=445"/>
		<updated>2025-03-09T14:04:24Z</updated>

		<summary type="html">&lt;p&gt;Swpark: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Sangwon_Park.jpg|right|110px]]&lt;br /&gt;
&amp;lt;h2&amp;gt;공학박사 '''박상원'''&amp;lt;/h2&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
한국외국어대학교 정보통신공학과 교수&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:Sangwon_Park-emailaddr.png]]&lt;br /&gt;
&lt;br /&gt;
2002.2 - 2003.2 : 세종사이버대학교 디지털콘텐츠학과 학과장 전임강사&lt;br /&gt;
&lt;br /&gt;
2003.3 - 현재 : 한국외국어대학교 정보통신공학과 교수&lt;br /&gt;
&lt;br /&gt;
2012.2 - 2014.1 : 한국외국어대학교 정보지원처장&lt;br /&gt;
&lt;br /&gt;
2016.2 - 2017.1 : 한국외국어대학교 융복합소프트웨어전공 주임교수&lt;br /&gt;
&lt;br /&gt;
2019.8 - 2022.1 : 한국외국어대학교 미네르바교양대학장(서울) 겸 미네르바교양대학장(글로벌) 학장&lt;br /&gt;
&lt;br /&gt;
2022.2 - 2023.2 : 한국외국어대학교 Software&amp;amp;AI 주임교수&lt;br /&gt;
&lt;br /&gt;
2024.2 - 현재 : 한국외국어대학교 글로벌캠퍼스 교무처장&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
서울대학교 학사, 석사, 박사&lt;br /&gt;
&lt;br /&gt;
__NOTITLE__&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=Sangwon_Park&amp;diff=444</id>
		<title>Sangwon Park</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=Sangwon_Park&amp;diff=444"/>
		<updated>2025-03-09T14:02:00Z</updated>

		<summary type="html">&lt;p&gt;Swpark: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Sangwon_Park.jpg|right|110px]]&lt;br /&gt;
&amp;lt;h2&amp;gt;공학박사 '''박상원'''&amp;lt;/h2&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
한국외국어대학교 정보통신공학과 교수&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:Sangwon_Park-emailaddr.png]]&lt;br /&gt;
&lt;br /&gt;
2002.2 - 2003.2 : 세종사이버대학교 디지털콘텐츠학과 학과장 전임강사&lt;br /&gt;
&lt;br /&gt;
2003.3 - 현재 : 한국외국어대학교 정보통신공학과 교수&lt;br /&gt;
&lt;br /&gt;
2012.2 - 2014.1 : 한국외국어대학교 정보지원처장&lt;br /&gt;
&lt;br /&gt;
2016.2 - 2017.1 : 한국외국어대학교 융복합소프트웨어전공 주임교수&lt;br /&gt;
&lt;br /&gt;
2019.8 - 2022.1 : 한국외국어대학교 미네르바교양대학(서울,글로벌) 학장&lt;br /&gt;
&lt;br /&gt;
2022.2 - 2023.2 : 한국외국어대학교 Software&amp;amp;AI 주임교수&lt;br /&gt;
&lt;br /&gt;
2024.2 - 현재 : 한국외국어대학교 글로벌캠퍼스 교무처장&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
서울대학교 학사, 석사, 박사&lt;br /&gt;
&lt;br /&gt;
__NOTITLE__&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=Java_%EC%84%A4%EC%B9%98&amp;diff=443</id>
		<title>Java 설치</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=Java_%EC%84%A4%EC%B9%98&amp;diff=443"/>
		<updated>2022-12-22T04:01:37Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* 환경 변수 설정 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Java 다운로드 ===&lt;br /&gt;
* [https://www.oracle.com/java Oracle Java 홈페이지]&lt;br /&gt;
* [https://www.oracle.com/java/technologies/downloads 여러 버전의 Java 다운로드]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=Java_%EC%84%A4%EC%B9%98&amp;diff=442</id>
		<title>Java 설치</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=Java_%EC%84%A4%EC%B9%98&amp;diff=442"/>
		<updated>2022-12-22T04:01:30Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* 두 가지 버전 설치 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Java 다운로드 ===&lt;br /&gt;
* [https://www.oracle.com/java Oracle Java 홈페이지]&lt;br /&gt;
* [https://www.oracle.com/java/technologies/downloads 여러 버전의 Java 다운로드]&lt;br /&gt;
&lt;br /&gt;
=== 환경 변수 설정 ===&lt;br /&gt;
* JAVA_HOME 환경 변수 설정 (예: JAVA_HOME, C:\Program Files\Java\jdk-11.0.8)&lt;br /&gt;
** Windows 10의 경우 다음 메뉴를 선택하여 환경 변수 설정함 : 설정 / 정보 / 고급 시스템 설정 / 환경 변수&lt;br /&gt;
&lt;br /&gt;
[[File:환경변수설정1.jpg|500px|top]]&lt;br /&gt;
[[File:환경변수설정2.jpg|300px|top]]&lt;br /&gt;
[[File:환경변수설정3.jpg|300px|top]]&lt;br /&gt;
[[File:환경변수설정JAVA_PATH.jpg|500px|top]]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=Visual_Studio_Code%EC%97%90%EC%84%9C_Java_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D&amp;diff=441</id>
		<title>Visual Studio Code에서 Java 프로그래밍</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=Visual_Studio_Code%EC%97%90%EC%84%9C_Java_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D&amp;diff=441"/>
		<updated>2022-12-22T02:48:47Z</updated>

		<summary type="html">&lt;p&gt;Swpark: Created page with &amp;quot;== Java == === Java 언어의 특징 === * High-level, class-based, object-oriented programming language * Write once, run anywhere (WORA) * Java Virtaul Machine (JVM) ** bytecode (compile 된 기계어 코드) * C, C++와 비슷한 문법 * Dynamic capabilitites ** Reflection ** Runtime code modification  === 개발 === * Sun Microsystems에 근무하고 있던 James Gosling에 의해 개발됨 * Sun이 [https://www.oracle.com Oracle]에 인수됨  === 역사 === * 1991...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Java ==&lt;br /&gt;
=== Java 언어의 특징 ===&lt;br /&gt;
* High-level, class-based, object-oriented programming language&lt;br /&gt;
* Write once, run anywhere (WORA)&lt;br /&gt;
* Java Virtaul Machine (JVM)&lt;br /&gt;
** bytecode (compile 된 기계어 코드)&lt;br /&gt;
* C, C++와 비슷한 문법&lt;br /&gt;
* Dynamic capabilitites&lt;br /&gt;
** Reflection&lt;br /&gt;
** Runtime code modification&lt;br /&gt;
&lt;br /&gt;
=== 개발 ===&lt;br /&gt;
* Sun Microsystems에 근무하고 있던 James Gosling에 의해 개발됨&lt;br /&gt;
* Sun이 [https://www.oracle.com Oracle]에 인수됨&lt;br /&gt;
&lt;br /&gt;
=== 역사 ===&lt;br /&gt;
* 1991년 James Gosling이 interactive television에 사용할 언어로 개발되기 시작함&lt;br /&gt;
* Oak (Gosling의 마당에 있던 나무) -&amp;gt; Green -&amp;gt; Java (인도네시아의 자바 커피에서 이름을 따옴)&lt;br /&gt;
* 1996년 Java 1.0 발표&lt;br /&gt;
* Write once, run anywhere (compile된 후 어느 기계에서나 실행될 수 있도록)&lt;br /&gt;
* Java SE (standard edition), Java EE (enterprise edition), Java ME (micro edition)&lt;br /&gt;
* 2006년. Sun은 JVM을 GPL 2.0 라이센스로 공개 (free &amp;amp; open-source software)&lt;br /&gt;
* 2009년. Oracle이 Sun을 인수하면서 Java 기술도 인수함&lt;br /&gt;
* 2016년. JDK 9부터 browser plugin 중단 (그러므로 Stanford Karel이 동작 안함)&lt;br /&gt;
&lt;br /&gt;
=== 설계 원칙 ===&lt;br /&gt;
# It must be simple, object-oriented, and familiar.&lt;br /&gt;
# It must be robust and secure.&lt;br /&gt;
# It must be architecture-neutral and portable.&lt;br /&gt;
# It must execute with high performance.&lt;br /&gt;
# It must be interpreted, threaded, and dynamic.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[https://en.wikipedia.org/wiki/Java_(programming_language) Wikipedia에서 참조]&lt;br /&gt;
&lt;br /&gt;
== Java 설치 ==&lt;br /&gt;
{{본문|Java 설치}}&lt;br /&gt;
&lt;br /&gt;
{{:Java 설치}}&lt;br /&gt;
&lt;br /&gt;
== Visual Studio Code 설치 ==&lt;br /&gt;
{{본문|Visual Studio Code 설치}}&lt;br /&gt;
&lt;br /&gt;
{{:Visual Studio Code 설치}}&lt;br /&gt;
&lt;br /&gt;
== 기본 예제 프로그램 및 설명 ==&lt;br /&gt;
{{본문|기본 예제 프로그램 및 설명}}&lt;br /&gt;
&lt;br /&gt;
{{:기본 예제 프로그램 및 설명}}&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=File:SimpleKarelClassDiagram.png&amp;diff=440</id>
		<title>File:SimpleKarelClassDiagram.png</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=File:SimpleKarelClassDiagram.png&amp;diff=440"/>
		<updated>2022-11-10T04:58:51Z</updated>

		<summary type="html">&lt;p&gt;Swpark: Swpark uploaded a new version of File:SimpleKarelClassDiagram.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=File:SimpleKarelClassDiagram.png&amp;diff=439</id>
		<title>File:SimpleKarelClassDiagram.png</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=File:SimpleKarelClassDiagram.png&amp;diff=439"/>
		<updated>2022-11-10T04:54:26Z</updated>

		<summary type="html">&lt;p&gt;Swpark: Swpark uploaded a new version of File:SimpleKarelClassDiagram.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=File:SimpleKarelClassDiagram.png&amp;diff=438</id>
		<title>File:SimpleKarelClassDiagram.png</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=File:SimpleKarelClassDiagram.png&amp;diff=438"/>
		<updated>2022-11-10T04:52:35Z</updated>

		<summary type="html">&lt;p&gt;Swpark: Swpark uploaded a new version of File:SimpleKarelClassDiagram.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=File:SimpleKarelClassDiagram.png&amp;diff=437</id>
		<title>File:SimpleKarelClassDiagram.png</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=File:SimpleKarelClassDiagram.png&amp;diff=437"/>
		<updated>2022-11-10T04:38:14Z</updated>

		<summary type="html">&lt;p&gt;Swpark: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=Object_Oriented_Karel_Programming_Framework_based_on_Stanford_Karel&amp;diff=436</id>
		<title>Object Oriented Karel Programming Framework based on Stanford Karel</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=Object_Oriented_Karel_Programming_Framework_based_on_Stanford_Karel&amp;diff=436"/>
		<updated>2022-11-10T04:37:55Z</updated>

		<summary type="html">&lt;p&gt;Swpark: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Stanford Karel ==&lt;br /&gt;
[https://cs.stanford.edu/people/eroberts/karel-the-robot-learns-java.pdf Karel]은 Stanford 대학교에서 학생들이 Java로 프로그래밍 개념을 익히는데 도움을 주기 위하여 만든 Java 라이브러리이다. 이것은 [https://cs.stanford.edu/people/eroberts/jtf/ ACM Java Task Force]에서 만든 라이브러리를 이용하여 작성되었다. 그런데 이 라이브러리는 Applet을 이용하기 때문에 [https://www.oracle.com/kr/java/technologies/javase-java-archive-javase6-downloads.html JDK 6] 이후의 버전에서는 동작하지 않는다. JDK 7 버전을 이용하면 실행하였을 때 빈 화면만 나온다. 그러므로 Karel 프로그래밍을 하려면 반드시 [https://www.oracle.com/kr/java/technologies/javase-java-archive-javase6-downloads.html JDK 6 버전]을 설치하고 이를 이용하여 컴파일 및 실행을 하여야 한다.&lt;br /&gt;
&lt;br /&gt;
* Karel Java library by Stanford University : [[media:karel.jar | karel.jar]]&lt;br /&gt;
&lt;br /&gt;
Karel 프로그램은 [https://www.eclipse.org/ eclipse] 혹은 [https://code.visualstudio.com/ Visual Studio Code]를 이용하여 작성한다.&lt;br /&gt;
&lt;br /&gt;
== HUFS Karel ==&lt;br /&gt;
Stanford Karel은 함수 중심의 프로그래밍 기법을 익히기에는 좋은 도구이지만, 객체지향 프로그래밍을 익히기에는 적합하지 않다. 그래서 이 Karel 라이브러리를 객체지향 프로그래밍 방법으로 코딩할 수 있도록 라이브러리를 만들었다. HUFS Karel에서 주요한 클래스는 HProgram, HObject, HKarel이다. HProgram은 Karel 프로그램을 준비하고 실행하는 클래스이다. HObject 객체를 만들어 HProgram에서 동작시킬 수 있다. HObject는 추상 클래스로서 이를 계승 받아 프로그래머가 다양한 객체를 만들어 사용할 수 있다. 기본적으로 Stanford Karel의 SuperKarel과 기능이 동일한 HKarel을 제공한다.&lt;br /&gt;
&lt;br /&gt;
이들을 이용한 간단한 프로그램의 예는 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import hufs.karel.HKarel;&lt;br /&gt;
import hufs.karel.HProgram;&lt;br /&gt;
&lt;br /&gt;
public class SimpleProgram extends HProgram {&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onStart() {&lt;br /&gt;
        HKarel karel = (HKarel)get(&amp;quot;John&amp;quot;);&lt;br /&gt;
        karel.move();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        HProgram.main(args, new HKarel(&amp;quot;John&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
프로그램을 실행하기 위하여 HProgram을 계승 받은 SimpleProgram 클래스를 정의하였다. 프로그램을 실행하면 main 함수가 실행된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[image:SimpleKarelClassDiagram.png]]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=Maven_Project_%EC%83%9D%EC%84%B1&amp;diff=435</id>
		<title>Maven Project 생성</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=Maven_Project_%EC%83%9D%EC%84%B1&amp;diff=435"/>
		<updated>2022-11-03T18:21:51Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* pom.xml에 Karel 라이브러리 추가 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Karel을 위한 프로젝트 생성 ===&lt;br /&gt;
아래 그림과 같이 새로운 프로젝트를 생성한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:maven-01.png | 1. 새로운 프로젝트를 생성한다. 탐색기 MAVEN에서 +를 누른 후 maven-archetype-quickstart 선택&lt;br /&gt;
file:maven-02.png | 2. 1.4 선택&lt;br /&gt;
file:maven-03.png | 3. 생성할 예제의 package 명을 입력한다. 그림에서는 &amp;lt;code&amp;gt;hufs.ice.cp&amp;lt;/code&amp;gt;를 입력&lt;br /&gt;
file:maven-04.png | 4. artifact id 입력. 예제에서는 &amp;lt;code&amp;gt;example&amp;lt;/code&amp;gt;을 입력&lt;br /&gt;
file:maven-05.png | 5. 프로젝트 폴더를 선택함. 기존에 연습중이던 프로젝트의 폴더를 선택하거나 새로운 폴더를 선택함&lt;br /&gt;
file:maven-06.png | 6. 터미널 창에서 생성하는 프로젝트의 버전을 지정하는데, &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;을 입력하고 다음 질문에는 &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;를 선택한다.&lt;br /&gt;
file:maven-07.png | 7. 프로젝트를 기존 Workspace에 추가할 지 묻는다. &amp;lt;code&amp;gt;Add to Workspace&amp;lt;/code&amp;gt;를 선택하여 기존 Workspace에 추가한다.&lt;br /&gt;
file:maven-08.png | 8. 추가한 모습. 정상적으로 보이지 않으면 vscode를 다시 실행한다.&lt;br /&gt;
file:maven-09.png | 9. pom.xml 파일에서 Jave 버전은 &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;으로 변경한다. 그렇게 해야 Karel이 동작한다.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== pom.xml에 Karel 라이브러리 추가 ===&lt;br /&gt;
Maven에서 프로젝트에 대한 명세가 pom.xml에 기술되어 있다. 여기에서 필요한 항목을 추가하도록 한다.&lt;br /&gt;
&lt;br /&gt;
* 먼저 Java 1.6으로 컴파일, 실행을 해야 한다. 이것은 아래 명세에서 다음을 변경한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;maven.compiler.source&amp;gt;1.6&amp;lt;/maven.compiler.source&amp;gt;&lt;br /&gt;
&amp;lt;maven.compiler.target&amp;gt;1.6&amp;lt;/maven.compiler.target&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 두 번째로 Karel.jar와 Hufs-karel.jar를 다운로드 받는다. 그리고 방금 만든 프로젝트 폴더에 &amp;lt;code&amp;gt;lib&amp;lt;/code&amp;gt; 폴더를 생성한 후, 이 폴더에 다운로드 받은 두 개의 jar 파일을 이 폴더에 저장한다.&lt;br /&gt;
&lt;br /&gt;
* 세 번째로 Stanford Karel 라이브러리를 프로젝트에서 사용할 수 있도록 추가한다. dependencies 엘리먼트에 다음을 추가한다. 여기서 groupId와 artifactId는 적당한 이름으로 저장하도록 한다. version도 1.0으로 적절하게 지정한다. systemPath에서 project.basedir은 프로젝트가 있는 최상위 폴더를 뜻한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
      &amp;lt;groupId&amp;gt;karel&amp;lt;/groupId&amp;gt;&lt;br /&gt;
      &amp;lt;artifactId&amp;gt;stanford&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt;&lt;br /&gt;
      &amp;lt;systemPath&amp;gt;${basedir}/lib/Karel.jar&amp;lt;/systemPath&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 마지막으로 Hufs Karel 라이브러리를 다음과 같이 추가한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
      &amp;lt;groupId&amp;gt;karel&amp;lt;/groupId&amp;gt;&lt;br /&gt;
      &amp;lt;artifactId&amp;gt;hufs&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt;&lt;br /&gt;
      &amp;lt;systemPath&amp;gt;${basedir}/lib/Hufs-karel.jar&amp;lt;/systemPath&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== pom.xml에서 수정하는 부분 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;properties&amp;gt;&lt;br /&gt;
    &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;&lt;br /&gt;
    &amp;lt;maven.compiler.source&amp;gt;1.6&amp;lt;/maven.compiler.source&amp;gt;&lt;br /&gt;
    &amp;lt;maven.compiler.target&amp;gt;1.6&amp;lt;/maven.compiler.target&amp;gt;&lt;br /&gt;
  &amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;
      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;4.11&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
      &amp;lt;groupId&amp;gt;karel&amp;lt;/groupId&amp;gt;&lt;br /&gt;
      &amp;lt;artifactId&amp;gt;stanford&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt;&lt;br /&gt;
      &amp;lt;systemPath&amp;gt;${basedir}/lib/Karel.jar&amp;lt;/systemPath&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
      &amp;lt;groupId&amp;gt;karel&amp;lt;/groupId&amp;gt;&lt;br /&gt;
      &amp;lt;artifactId&amp;gt;hufs&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt;&lt;br /&gt;
      &amp;lt;systemPath&amp;gt;${basedir}/lib/Hufs-karel.jar&amp;lt;/systemPath&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
  &amp;lt;/dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=Maven_Project_%EC%83%9D%EC%84%B1&amp;diff=434</id>
		<title>Maven Project 생성</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=Maven_Project_%EC%83%9D%EC%84%B1&amp;diff=434"/>
		<updated>2022-11-03T18:20:25Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* pom.xml에서 수정하는 부분 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Karel을 위한 프로젝트 생성 ===&lt;br /&gt;
아래 그림과 같이 새로운 프로젝트를 생성한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:maven-01.png | 1. 새로운 프로젝트를 생성한다. 탐색기 MAVEN에서 +를 누른 후 maven-archetype-quickstart 선택&lt;br /&gt;
file:maven-02.png | 2. 1.4 선택&lt;br /&gt;
file:maven-03.png | 3. 생성할 예제의 package 명을 입력한다. 그림에서는 &amp;lt;code&amp;gt;hufs.ice.cp&amp;lt;/code&amp;gt;를 입력&lt;br /&gt;
file:maven-04.png | 4. artifact id 입력. 예제에서는 &amp;lt;code&amp;gt;example&amp;lt;/code&amp;gt;을 입력&lt;br /&gt;
file:maven-05.png | 5. 프로젝트 폴더를 선택함. 기존에 연습중이던 프로젝트의 폴더를 선택하거나 새로운 폴더를 선택함&lt;br /&gt;
file:maven-06.png | 6. 터미널 창에서 생성하는 프로젝트의 버전을 지정하는데, &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;을 입력하고 다음 질문에는 &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt;를 선택한다.&lt;br /&gt;
file:maven-07.png | 7. 프로젝트를 기존 Workspace에 추가할 지 묻는다. &amp;lt;code&amp;gt;Add to Workspace&amp;lt;/code&amp;gt;를 선택하여 기존 Workspace에 추가한다.&lt;br /&gt;
file:maven-08.png | 8. 추가한 모습. 정상적으로 보이지 않으면 vscode를 다시 실행한다.&lt;br /&gt;
file:maven-09.png | 9. pom.xml 파일에서 Jave 버전은 &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;으로 변경한다. 그렇게 해야 Karel이 동작한다.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== pom.xml에 Karel 라이브러리 추가 ===&lt;br /&gt;
Maven에서 프로젝트에 대한 명세가 pom.xml에 기술되어 있다. 여기에서 필요한 항목을 추가하도록 한다.&lt;br /&gt;
&lt;br /&gt;
* 먼저 Java 1.6으로 컴파일, 실행을 해야 한다. 이것은 아래 명세에서 다음을 변경한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;maven.compiler.source&amp;gt;1.6&amp;lt;/maven.compiler.source&amp;gt;&lt;br /&gt;
&amp;lt;maven.compiler.target&amp;gt;1.6&amp;lt;/maven.compiler.target&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 두 번째로 Karel.jar와 Hufs-karel.jar를 다운로드 받는다. 그리고 방금 만든 프로젝트 폴더에 &amp;lt;code&amp;gt;lib&amp;lt;/code&amp;gt; 폴더를 생성한 후, 이 폴더에 다운로드 받은 두 개의 jar 파일을 이 폴더에 저장한다.&lt;br /&gt;
&lt;br /&gt;
* 세 번째로 Stanford Karel 라이브러리를 프로젝트에서 사용할 수 있도록 추가한다. dependencies 엘리먼트에 다음을 추가한다. 여기서 groupId와 artifactId는 적당한 이름으로 저장하도록 한다. version도 1.0으로 적절하게 지정한다. systemPath에서 project.basedir은 프로젝트가 있는 최상위 폴더를 뜻한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dependency&amp;gt;&lt;br /&gt;
  &amp;lt;groupId&amp;gt;stanfordkarel&amp;lt;/groupId&amp;gt;&lt;br /&gt;
  &amp;lt;artifactId&amp;gt;stanfordkarel&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
  &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt;&lt;br /&gt;
  &amp;lt;systemPath&amp;gt;${project.basedir}/lib/Karel.jar&amp;lt;/systemPath&amp;gt;&lt;br /&gt;
&amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 마지막으로 Hufs Karel 라이브러리를 다음과 같이 추가한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dependency&amp;gt;&lt;br /&gt;
  &amp;lt;groupId&amp;gt;hufskarel&amp;lt;/groupId&amp;gt;&lt;br /&gt;
  &amp;lt;artifactId&amp;gt;hufskarel&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
  &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt;&lt;br /&gt;
  &amp;lt;systemPath&amp;gt;${project.basedir}/lib/Hufs-karel.jar&amp;lt;/systemPath&amp;gt;&lt;br /&gt;
&amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== pom.xml에서 수정하는 부분 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;properties&amp;gt;&lt;br /&gt;
    &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;&lt;br /&gt;
    &amp;lt;maven.compiler.source&amp;gt;1.6&amp;lt;/maven.compiler.source&amp;gt;&lt;br /&gt;
    &amp;lt;maven.compiler.target&amp;gt;1.6&amp;lt;/maven.compiler.target&amp;gt;&lt;br /&gt;
  &amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependencies&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;
      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;4.11&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
      &amp;lt;groupId&amp;gt;karel&amp;lt;/groupId&amp;gt;&lt;br /&gt;
      &amp;lt;artifactId&amp;gt;stanford&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt;&lt;br /&gt;
      &amp;lt;systemPath&amp;gt;${basedir}/lib/Karel.jar&amp;lt;/systemPath&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
    &amp;lt;dependency&amp;gt;&lt;br /&gt;
      &amp;lt;groupId&amp;gt;karel&amp;lt;/groupId&amp;gt;&lt;br /&gt;
      &amp;lt;artifactId&amp;gt;hufs&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt;&lt;br /&gt;
      &amp;lt;systemPath&amp;gt;${basedir}/lib/Hufs-karel.jar&amp;lt;/systemPath&amp;gt;&lt;br /&gt;
    &amp;lt;/dependency&amp;gt;&lt;br /&gt;
  &amp;lt;/dependencies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/0919&amp;diff=433</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/0919</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/0919&amp;diff=433"/>
		<updated>2022-09-26T09:04:22Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* 향상된 for 문 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 데이터 타입 분류 ==&lt;br /&gt;
# 기본 타입(primitive type)&lt;br /&gt;
#* 정수 타입&lt;br /&gt;
#** byte&lt;br /&gt;
#** char&lt;br /&gt;
#** short&lt;br /&gt;
#** int&lt;br /&gt;
#** int&lt;br /&gt;
#** long&lt;br /&gt;
#* 실수 타입&lt;br /&gt;
#** float&lt;br /&gt;
#** double&lt;br /&gt;
#* 논리 타입&lt;br /&gt;
#** boolean&lt;br /&gt;
# 참조 타입(reference type)&lt;br /&gt;
#* 배열 타입(array type)&lt;br /&gt;
#* 열거 타입(enumeration type)&lt;br /&gt;
#* 클래스(class)&lt;br /&gt;
#* 인터페이스(interface)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// 기본 타입 변수&lt;br /&gt;
int age = 25;&lt;br /&gt;
double price = 100.5&lt;br /&gt;
&lt;br /&gt;
// 참조 타입 변수(reference type variable)&lt;br /&gt;
String name = &amp;quot;신용권&amp;quot;; // 객체는 힙(heap) 영역에 존재한다.&lt;br /&gt;
String hobby = &amp;quot;독서&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 참조 변수인 name에는 &amp;quot;신용권&amp;quot; 객체가 저장되어 있는 메모리의 주소가 저장되어 있다.&lt;br /&gt;
* 교재 p.139 그림 참조&lt;br /&gt;
&lt;br /&gt;
== 메모리 사용 영역 ==&lt;br /&gt;
* 교재 p.140 그림 참조&lt;br /&gt;
&lt;br /&gt;
# 메소드(method) 영역&lt;br /&gt;
#* Java 소스 코드(XXX.java)를 컴파일하여 만들어진 실행 코드(bytecode) (XXX.class)가 적재된 메모리 영역&lt;br /&gt;
#* 클래스 로더(class loader)가 class 파일을 읽어 메모리에 올림&lt;br /&gt;
#* 상수풀(runtime constant pool), 필대(field) 데이터, 메소드(method) 데이터, 메소드 코드, 생성자(construct) 코드 등 실행에 필요한 바이트코드 및 상수, 전역 변수(클래스 변수, class field)&lt;br /&gt;
# 힙(heap) 영역&lt;br /&gt;
#* 프로그래머가 생명 주기(life time)을 제어할 수 있는 메모리가 위치하는 영역임&lt;br /&gt;
#* new 연산자를 이용하여 생성하는 객체&lt;br /&gt;
#* 배열, String도 객체이므로 힙에 존재함&lt;br /&gt;
#* new 연사자를 호출하여 객체를 생성하면 만들어지고, garbage가 되면 사라짐&lt;br /&gt;
# 스택(stack) 영역&lt;br /&gt;
#* 스택 영역은 스레드 마다 독립적으로 존재함&lt;br /&gt;
#* 특별히 스레드를 만들지 않았다면 main 메소드가 실행되고 있는 main 스레드만 존재하므로 스택 영역도 하나임&lt;br /&gt;
#* 메소드의 인자, 지역 변수(local variable), 리턴 값, 리턴 주소가 저장됨. 이를 activation record라 부름.&lt;br /&gt;
#* p.142 그림 참조&lt;br /&gt;
&lt;br /&gt;
* 아래 코드에서 (1), (2), (3) 지점에서의 스택 영역의 형태는?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
char v1 = 'A'; // (1)&lt;br /&gt;
&lt;br /&gt;
if (v1 == 'A') { // (2)&lt;br /&gt;
    int v2 = 100;&lt;br /&gt;
    double v3 = 3.14;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
boolean v4 = true; // (3)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 참조 변수의 &amp;lt;nowikI&amp;gt;==&amp;lt;/nowiki&amp;gt;, &amp;lt;nowiki&amp;gt;!=&amp;lt;/nowiki&amp;gt; 연산 ==&lt;br /&gt;
* 교재 p.143 그림 참조&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
refVar1 = 객체_1;&lt;br /&gt;
refVar2 = 객체_2;&lt;br /&gt;
refVar3 = 객체_2;&lt;br /&gt;
&lt;br /&gt;
refVar1 == refVar2  // 결과 : false&lt;br /&gt;
refVar1 != refVar2  // 결과 : true&lt;br /&gt;
&lt;br /&gt;
refVar2 == refVar3  // 결과 : true&lt;br /&gt;
refVar2 != refVar3  // 결과 : false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== null과 NullPointerException ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
refVar1 = 객체_1;&lt;br /&gt;
refVar2 = null;&lt;br /&gt;
&lt;br /&gt;
refVar1 == null // 결과 : false&lt;br /&gt;
refVar1 != null // 결과 : true&lt;br /&gt;
&lt;br /&gt;
refVar2 == null // 결과 : true&lt;br /&gt;
refVar2 != null // 결과 : false&lt;br /&gt;
&lt;br /&gt;
int[] intArray = null;&lt;br /&gt;
intArray[0] = 10;  // NullPointerException 발생&lt;br /&gt;
&lt;br /&gt;
String str = null;&lt;br /&gt;
System.out.println(&amp;quot;총 문자수 : &amp;quot; + str.length()); // NullPointerException 발생&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== String 타입 ==&lt;br /&gt;
* String은 상수 객체이다. 왜냐하면 String에는 자신이 가진 값을 변경하는 메소드가 없기 때문이다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
String 변수 = &amp;quot;문자열&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
String name;&lt;br /&gt;
name = &amp;quot;신용권&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
String hobby = &amp;quot;자바&amp;quot;;&lt;br /&gt;
hobby = null; // garbage가 된다.&lt;br /&gt;
&lt;br /&gt;
String name1 = &amp;quot;신용권&amp;quot;;&lt;br /&gt;
String name2 = &amp;quot;신용권&amp;quot;; // 리터럴이 동일하면 동일한 객체를 가리킴&lt;br /&gt;
&lt;br /&gt;
name1 = &amp;quot;신민철&amp;quot;;&lt;br /&gt;
name2 = &amp;quot;신민철&amp;quot;;&lt;br /&gt;
String name3 = new String(&amp;quot;신민철&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
boolean result = name1 == name2; // true&lt;br /&gt;
result = name1 == name3; // false&lt;br /&gt;
result = name1.equals(name3); // true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 배열 타입 ==&lt;br /&gt;
* 동일한 타입을 여러 개 만들어야 할 때&lt;br /&gt;
&lt;br /&gt;
=== 배열이라? === &lt;br /&gt;
* 다음은 성가시다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int score1 = 83;&lt;br /&gt;
int score2 = 90;&lt;br /&gt;
int score3 = 87;&lt;br /&gt;
int score4 = 99;&lt;br /&gt;
int score5 = 48;&lt;br /&gt;
int score6 = 21;&lt;br /&gt;
int score7 = 38;&lt;br /&gt;
int score8 = 83;&lt;br /&gt;
int score9 = 78;&lt;br /&gt;
int score10 = 92;&lt;br /&gt;
int score11 = 95;&lt;br /&gt;
int score12 = 29;&lt;br /&gt;
int score13 = 55;&lt;br /&gt;
int score14 = 66;&lt;br /&gt;
int score15 = 88;&lt;br /&gt;
int score16 = 77;&lt;br /&gt;
int score17 = 44;&lt;br /&gt;
int score18 = 34;&lt;br /&gt;
int score19 = 84;&lt;br /&gt;
int score20 = 81;&lt;br /&gt;
int score21 = 60;&lt;br /&gt;
int score22 = 85;&lt;br /&gt;
int score23 = 44;&lt;br /&gt;
int score24 = 23;&lt;br /&gt;
int score25 = 84;&lt;br /&gt;
int score26 = 48;&lt;br /&gt;
int score27 = 40;&lt;br /&gt;
int score28 = 58;&lt;br /&gt;
int score29 = 78;&lt;br /&gt;
int score30 = 75;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 평균을 구하고자 한다면 코드를 어떻게 작성해야 하나?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int sum = score1;&lt;br /&gt;
sum += score2;&lt;br /&gt;
sum += score3;&lt;br /&gt;
sum += score4;&lt;br /&gt;
sum += score5;&lt;br /&gt;
sum += score6;&lt;br /&gt;
sum += score7;&lt;br /&gt;
sum += score8;&lt;br /&gt;
sum += score9;&lt;br /&gt;
sum += score10;&lt;br /&gt;
sum += score11;&lt;br /&gt;
sum += score12;&lt;br /&gt;
sum += score13;&lt;br /&gt;
sum += score14;&lt;br /&gt;
sum += score15;&lt;br /&gt;
sum += score16;&lt;br /&gt;
sum += score17;&lt;br /&gt;
sum += score18;&lt;br /&gt;
sum += score19;&lt;br /&gt;
sum += score20;&lt;br /&gt;
sum += score21;&lt;br /&gt;
sum += score22;&lt;br /&gt;
sum += score23;&lt;br /&gt;
sum += score24;&lt;br /&gt;
sum += score25;&lt;br /&gt;
sum += score26;&lt;br /&gt;
sum += score27;&lt;br /&gt;
sum += score28;&lt;br /&gt;
sum += score29;&lt;br /&gt;
sum += score30;&lt;br /&gt;
&lt;br /&gt;
int avg = sum / 30;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 얼마나 번거러운가? 아래와 같이 바꿔보자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// score는 배열이다.&lt;br /&gt;
int[] score = {83, 90, 87, 99, 48, 21, 38, 83, 78, 92, 95, 29, 55, 66, 88, 77, 44, 34, 84, 81, 60, 85, 44, 23, 84, 48, 40, 58, 78, 75};&lt;br /&gt;
&lt;br /&gt;
int sum = 0;&lt;br /&gt;
for(int i = 0; i &amp;lt; score.length; i++)  // 여기서 score.length는 30&lt;br /&gt;
    sum += score[i]; // score[0]는 83, score[1]은 90 ...&lt;br /&gt;
int avg = sum / score.length;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 왜 배열이 필요한지 이해가 되는가?&lt;br /&gt;
&lt;br /&gt;
=== 배열 선언 ===&lt;br /&gt;
&lt;br /&gt;
* 두 표현은 동일하다.&lt;br /&gt;
&amp;lt;table2 class=wikitable sep=bar align=lllllll&amp;gt;&lt;br /&gt;
int[] intArray;          | int intArray[];&lt;br /&gt;
double[] doubleArray;    | double doubleArray[];&lt;br /&gt;
String[] strArray;       | String strArray[]&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 참고할 배열이 없다면 &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;로 지정한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int[] intArray = null;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 값 목록으로 배열 선언 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
String[] names = { &amp;quot;신용권&amp;quot;, &amp;quot;홍길동&amp;quot;, &amp;quot;감자바&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
names[1] = &amp;quot;홍삼원&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//--------------------------------------&lt;br /&gt;
&lt;br /&gt;
String[] names = null;&lt;br /&gt;
names = new String[] { &amp;quot;신용권&amp;quot;, &amp;quot;홍길동&amp;quot;, &amp;quot;감자바&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
//--------------------------------------&lt;br /&gt;
&lt;br /&gt;
// 다음과 같은 add 메소드가 있다면&lt;br /&gt;
int add(int[] scores) {&lt;br /&gt;
    int sum = 0;&lt;br /&gt;
    for(int i = 0; i &amp;lt; scores.length; i++)&lt;br /&gt;
        sum += scores[i];&lt;br /&gt;
    return sum;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 이를 호출하는 방법으로&lt;br /&gt;
int result = add( {95, 85, 90} ); // 컴파일 에러 발생&lt;br /&gt;
&lt;br /&gt;
int result = add( new int[] {95, 85, 90} ); // OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== new 연산자로 배열 생성 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int[] scores = new int[30]; // 앞의 예제에서 빈 배열을 만들고자 한다면. 모두 0으로 초기화된다.&lt;br /&gt;
scores[0] = 83; // 인덱스는 0부터 시작한다.&lt;br /&gt;
scores[1] = 90;&lt;br /&gt;
scores[2] = 75;&lt;br /&gt;
&lt;br /&gt;
String[] names = new String[30]; // 모두 null로 초기화된다.&lt;br /&gt;
names[0] = &amp;quot;신용권&amp;quot;;&lt;br /&gt;
names[1] = &amp;quot;홍길동&amp;quot;;&lt;br /&gt;
names[2] = &amp;quot;감자바&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 배열 길이 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int[] intArray = { 10, 20, 30 };&lt;br /&gt;
System.out.println(intArray.length); // 3이 출력됨&lt;br /&gt;
&lt;br /&gt;
intArray.length = 10; // 에러. length는 상수이다. 즉, 값을 변경할 수 없다.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 커맨드 라인(command line) 입력 ===&lt;br /&gt;
* 명령창에서 다음과 같이 Java 프로그램 실행&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
C:&amp;gt; java MainStringArrayArgument 10 20&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class MainStringArrayArgument {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        if (args.length != 2) { // 입력 데이터가 2개가 아닌 경우&lt;br /&gt;
            System.out.println(&amp;quot;Usage: java MainStringArrayArgument num1 num2&amp;quot;);&lt;br /&gt;
            System.exit(0); // 프로그램 강제 종료&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        String strNum1 = args[0];&lt;br /&gt;
        String strNum2 = args[1];&lt;br /&gt;
&lt;br /&gt;
        int num1 = Integer.parseInt(strNum1); // Integer 클래스의 parseInt 메소드를 이용하여 문자열을 정수로 변환&lt;br /&gt;
        int num2 = Integer.parseInt(strNum2);&lt;br /&gt;
&lt;br /&gt;
        int result = num1 + num2;&lt;br /&gt;
        System.out.println(num1 + &amp;quot;+&amp;quot; + num2 + &amp;quot;=&amp;quot; + result);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
10+20=30&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 다차원 배열 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int[][] scores = new int[2][3];&lt;br /&gt;
&lt;br /&gt;
System.out.println(scores.length);  // 2&lt;br /&gt;
System.out.println(scores[0].length); // 3&lt;br /&gt;
System.out.println(scores[1].length); // 3&lt;br /&gt;
&lt;br /&gt;
//--------------------------------------------&lt;br /&gt;
&lt;br /&gt;
int[][] scores = new int[2][];&lt;br /&gt;
scores[0] = new int[2];&lt;br /&gt;
scores[1] = new int[3];&lt;br /&gt;
&lt;br /&gt;
System.out.println(scores.length);  // 2&lt;br /&gt;
System.out.println(scores[0].length); // 2&lt;br /&gt;
System.out.println(scores[1].length); // 3&lt;br /&gt;
&lt;br /&gt;
//--------------------------------------------&lt;br /&gt;
// 다차원 배열 초기화&lt;br /&gt;
&lt;br /&gt;
int[][] scores = { {95, 80}, {92, 96} };&lt;br /&gt;
&lt;br /&gt;
System.out.println( scores[0][0] ); // 95&lt;br /&gt;
System.out.println( scores[1][1] ); // 96&lt;br /&gt;
&lt;br /&gt;
int[][] javaScores = { {95, 80}, {92, 96, 80} };&lt;br /&gt;
&lt;br /&gt;
for(int i = 0; i &amp;lt; javaScores.length; i++) {&lt;br /&gt;
    for(int k = 0; k &amp;lt; javaScores[i].length; k++) {&lt;br /&gt;
        System.out.println( javaScores[i][k] );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 배열 복사 ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ArrayCopyExample {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        // for 문 이용&lt;br /&gt;
&lt;br /&gt;
        int[] oldIntArray = { 1, 2, 3 };&lt;br /&gt;
        int[] newIntArray = new int[5];&lt;br /&gt;
&lt;br /&gt;
        for(int i = 0; i &amp;lt; oldIntArray.length; i++)&lt;br /&gt;
            newIntArray[i] = oldIntArray[i];&lt;br /&gt;
&lt;br /&gt;
        for(int i = 0; i &amp;lt; newIntArray.length; i++)&lt;br /&gt;
            System.out.print(newIntArray[i] + &amp;quot;,&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
&lt;br /&gt;
        // arraycopy 이용&lt;br /&gt;
        String[] oldStrArray = { &amp;quot;java&amp;quot;, &amp;quot;array&amp;quot;, &amp;quot;copy&amp;quot; };&lt;br /&gt;
        String[] newStrArray = new String[5];&lt;br /&gt;
&lt;br /&gt;
        System.arraycopy(oldStrArray, 0, newStrArray, 0, oldIntArray.length); // p.169 그림 참조&lt;br /&gt;
&lt;br /&gt;
        for(int i = 0; i &amp;lt; newStrArray.length; i++)&lt;br /&gt;
            System.out.print(newStrArray[i] + &amp;quot;, &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
1,2,3,0,0,&lt;br /&gt;
java, array, copy, null, null,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 향상된 for 문 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ArrayCopyExample {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        // for 문 이용&lt;br /&gt;
&lt;br /&gt;
        int[] oldIntArray = { 1, 2, 3 };&lt;br /&gt;
        int[] newIntArray = new int[5];&lt;br /&gt;
&lt;br /&gt;
        for(int i = 0; i &amp;lt; oldIntArray.length; i++)&lt;br /&gt;
            newIntArray[i] = oldIntArray[i];&lt;br /&gt;
&lt;br /&gt;
        for(int value : newIntArray) // ← 배열 전체를 스캔하는데 인덱스가 필요없음&lt;br /&gt;
            System.out.print(value + &amp;quot;,&amp;quot; );&lt;br /&gt;
        System.out.println();&lt;br /&gt;
&lt;br /&gt;
        // arraycopy 이용&lt;br /&gt;
        String[] oldStrArray = { &amp;quot;java&amp;quot;, &amp;quot;array&amp;quot;, &amp;quot;copy&amp;quot; };&lt;br /&gt;
        String[] newStrArray = new String[5];&lt;br /&gt;
&lt;br /&gt;
        System.arraycopy(oldStrArray, 0, newStrArray, 0, oldIntArray.length);&lt;br /&gt;
&lt;br /&gt;
        for(String str : newStrArray) // ← 배열 전체를 스캔하는데 인덱스가 필요없음&lt;br /&gt;
            System.out.print(str + &amp;quot;, &amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 열거 타입(Enumeration Type) ==&lt;br /&gt;
* Java에서 이름 짓는 법&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
종류                       | 예                  | 설명&lt;br /&gt;
변수                       | name                | 소문자를 이용하여 짓는다. 영어가 아닌 한국어로 변수 이름을 지어도 되지만 관례적으로 로마자를 사용한다.&lt;br /&gt;
                           | myName, myFirstName | 두 개의 단어가 연이어 나오면 새로운 단어의 시작은 대문자로 한다.&lt;br /&gt;
메소드                     | move()              | 소문자로 짓는다. 이름 뒤에 연이어 괄호가 나오기 때문에 이름으로 변수와 메소드를 구분할 수 있다.&lt;br /&gt;
                           | moveLeft()          | 두 개의 단어가 연이어 나오면 새로운 단어의 시작은 대문자로 한다.&lt;br /&gt;
클래스, 인터페이스, 열거형 | Car                 | 시작 문자를 대문자로 한다.&lt;br /&gt;
                           | BlueCar             | 두 개의 단어가 연이어 나오면 새로운 단어의 시작은 대문자로 한다.&lt;br /&gt;
상수(static final)         | COLOR               | 모든 문자를 대문자로 한다.&lt;br /&gt;
                           | BLUE_COLOR          | 두 개의 단어가 연이어 나오면 단어 사이에 _를 붙인다.&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 열거 타입 선언 ===&lt;br /&gt;
&lt;br /&gt;
* 상수를 여러 개 만들고 싶을 때&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public enum Week { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY };&lt;br /&gt;
&lt;br /&gt;
public enum LoginResult { LOGIN_SUCCESS, LOGIN_FAILED };&lt;br /&gt;
&lt;br /&gt;
Week today;&lt;br /&gt;
Week reservationDay;&lt;br /&gt;
Week birthday = null;&lt;br /&gt;
&lt;br /&gt;
today = Week.SUNDAY;&lt;br /&gt;
&lt;br /&gt;
if (today == Week.SUNDAY) { // true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Calendar 객체를 이용한 열거형 연습&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Calendar now = Calendar.getInstance();&lt;br /&gt;
&lt;br /&gt;
int year = now.get(Calendar.YEAR); // 년&lt;br /&gt;
int month = now.get(Calendar.MONTH) + 1; // 월&lt;br /&gt;
int day = now.get(Calendar.DAY_OF_MONTH); // 일&lt;br /&gt;
int week = now.get(Calendar.DAY_OF_WEEK); // 요일 (1~7)&lt;br /&gt;
int hour = now.get(Calendar.HOUR); // 시간 &lt;br /&gt;
int minute = now.get(Calendar.MINUTE); // 분&lt;br /&gt;
int second = now.get(Calendar.SECOND); // 초&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 열거 객체의 메소드 ===&lt;br /&gt;
* 열거 객체는 java.lang.Enum 클래스로부터 상속받음.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
리턴 타입 | 메소드(매개 변수)    | 설명&lt;br /&gt;
String    | name()               | 열거 객체의 문자열을 리턴&lt;br /&gt;
int       | ordinal()            | 열거 객체의 순번(0부터 시작)을 리턴&lt;br /&gt;
int       | compareTo()          | 열거 객체를 비교하여 순번 차이를 리턴&lt;br /&gt;
열거 타입 | valueOf(String name) | 주어진 문자열의 열거 객체를 리턴 &lt;br /&gt;
열거 배열 | values()             | 모든 열거 객체들을 배열로 리턴&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Week today = Week.SUNDAY;&lt;br /&gt;
&lt;br /&gt;
String name = today.name(); // &amp;quot;SUNDAY&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int ordinal = today.ordinal(); // 6. 0부터 시작하여 6번째 데이터라는 뜻임&lt;br /&gt;
&lt;br /&gt;
Week day1 = Week.MONDAY;&lt;br /&gt;
Week day2 = Week.WEDNESDAY;&lt;br /&gt;
&lt;br /&gt;
int result1 = day1.compareTo(day2); // -2 (0 - 2)&lt;br /&gt;
int result2 = day2.compareTo(day1); // 2 (2 - 0)&lt;br /&gt;
&lt;br /&gt;
Week weekDay = Week.valueOf(&amp;quot;SATURDAY&amp;quot;); // Week.SATURDAY&lt;br /&gt;
&lt;br /&gt;
Week[] days = Week.values();&lt;br /&gt;
for(Week day : days)&lt;br /&gt;
    System.out.println(day);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category:컴퓨터프로그래밍및실습]]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EA%B8%B0%EB%B3%B8_Karel_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8_%EC%98%88%EC%A0%9C&amp;diff=432</id>
		<title>기본 Karel 프로그램 예제</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EA%B8%B0%EB%B3%B8_Karel_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8_%EC%98%88%EC%A0%9C&amp;diff=432"/>
		<updated>2022-09-22T04:22:37Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* 두 번째 HUFS Karel 프로그램 수정 버전 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Karel 라이브러리 ===&lt;br /&gt;
* [[media:karel.jar | Stanford Karel Library (karel.jar)]]&lt;br /&gt;
* &amp;lt;del&amp;gt;[[media:hufs-karel.jar | HUFS Karel Library (hufs-karel.jar)]]&amp;lt;/del&amp;gt;&lt;br /&gt;
* [[media:hufs-karel-220915.jar | HUFS Karel Library 2022.09.15 Version (hufs-karel-220915.jar)]]&lt;br /&gt;
&lt;br /&gt;
이 라이브러리는 Java 6 이하의 버전에서만 실행된다. 그 이유는 Java Applet을 이용하기 때문인데, Java 7부터 Applet이 제거되어 Applet은 이후 버전에서는 더 이상 동작하지 않는다. Java 7 이후 버전으로 Karel을 실행하면 빈 화면만 등장한다.&lt;br /&gt;
&lt;br /&gt;
=== 첫 번째 HUFS Karel 프로그램 ===&lt;br /&gt;
&lt;br /&gt;
[[File:HKarel 초기 화면.png|thumb|첫 번째 HUFS Karel 실행 화면]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import hufs.karel.HKarel;&lt;br /&gt;
import hufs.karel.HufsProgram;&lt;br /&gt;
&lt;br /&gt;
public class FirstHKarelProgram extends HufsProgram {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onStart() {&lt;br /&gt;
        HKarel karel = (HKarel)getHObject(&amp;quot;철수&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        karel.move();&lt;br /&gt;
        karel.move();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        HufsProgram.main(args, new HKarel(&amp;quot;철수&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Start 버튼을 누르면 &amp;lt;code&amp;gt;onStart&amp;lt;/code&amp;gt;가 실행된다.&lt;br /&gt;
* &amp;lt;code&amp;gt;HufsProgram.main&amp;lt;/code&amp;gt;에서 인자로 전달한 &amp;lt;code&amp;gt;HKarel(&amp;quot;철수&amp;quot;)&amp;lt;/code&amp;gt;는 &amp;lt;code&amp;gt;getHObject(&amp;quot;철수&amp;quot;)&amp;lt;/code&amp;gt;를 통하여 구할 수 있다.&lt;br /&gt;
&lt;br /&gt;
=== 두 번째 HUFS Karel 프로그램 ===&lt;br /&gt;
&lt;br /&gt;
[[File:SecondHKarelProgram 실행 화면.png|thumb|SecondHKarelProgram 실행 화면]]&lt;br /&gt;
[[File:SecondHKarelProgram 에러 화면.png|thumb|SecondHKarelProgram 실행할 경우 발생하는 오류]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import hufs.karel.HKarel;&lt;br /&gt;
import hufs.karel.HufsProgram;&lt;br /&gt;
&lt;br /&gt;
public class SecondHKarelProgram extends HufsProgram {&lt;br /&gt;
&lt;br /&gt;
    HKarel karel;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onInit() {&lt;br /&gt;
        karel = new HKarel(&amp;quot;철수&amp;quot;, 5, 5);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onStart() {&lt;br /&gt;
        while (true) {&lt;br /&gt;
            if (karel.frontIsBlocked())&lt;br /&gt;
                karel.turnLeft();&lt;br /&gt;
            karel.move();&lt;br /&gt;
        }        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        HufsProgram.main(args, null);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;HufsProgram.main&amp;lt;/code&amp;gt; 메소드에서 두 번째 인자로 &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;을 두었다. 이것은 Karel 객체를 전달하지 않는다는 뜻이다.&lt;br /&gt;
* Start 버튼을 누르기 전에 &amp;lt;code&amp;gt;onInit()&amp;lt;/code&amp;gt;가 실행된다. 그러므로 Start 버튼을 누르기 전에 초기화 해야 할 코드는 이곳에 작성한다. 여기에서 &amp;lt;code&amp;gt;HKarel&amp;lt;/code&amp;gt; 객체를 생성하였다. 하지만 이 객체를 월드에 추가하지는 않았다.&lt;br /&gt;
* Start 버튼을 누르면 &amp;lt;code&amp;gt;onStart()&amp;lt;/code&amp;gt;가 실행된다.&lt;br /&gt;
* &amp;lt;code&amp;gt;add()&amp;lt;/code&amp;gt; 메소드를 이용하여 생성한 Karel을 월드에 추가하지 않았기 때문에 오류가 난다.&lt;br /&gt;
&lt;br /&gt;
=== 세 번째 HUFS Karel 프로그램 수정 버전 ===&lt;br /&gt;
&lt;br /&gt;
생성한 객체를 월드에 추가해야 나타남&lt;br /&gt;
&lt;br /&gt;
[[File:SecondHKarelProgram 실행 화면 2.png|thumb|수정한 SecondHKarelProgram 실행 화면]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import hufs.karel.HKarel;&lt;br /&gt;
import hufs.karel.HufsProgram;&lt;br /&gt;
&lt;br /&gt;
public class SecondHKarelProgram extends HufsProgram {&lt;br /&gt;
&lt;br /&gt;
    HKarel karel;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onInit() {&lt;br /&gt;
        karel = new HKarel(&amp;quot;철수&amp;quot;, 5, 5);&lt;br /&gt;
        karel.setColor(BLUE);&lt;br /&gt;
        karel.setColorOfBody(YELLOW);&lt;br /&gt;
        karel.setColorOfFoot(GREEN);&lt;br /&gt;
        karel.setColorOfMouth(RED);&lt;br /&gt;
        add(karel);     // 생성한 HKarel을 월드에 추가&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onStart() {&lt;br /&gt;
        while (true) {&lt;br /&gt;
            if (karel.frontIsBlocked())&lt;br /&gt;
                karel.turnLeft();&lt;br /&gt;
            karel.move();&lt;br /&gt;
        }        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        HufsProgram.main(args, null);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 위 예제와 동일한 코드이나, &amp;lt;code&amp;gt;add(karel)&amp;lt;/code&amp;gt;을 실행하여 생성한 객체를 월드에 추가하도록 하였다. 그러므로 이 객체가 월드에 있어야만 사용할 수 있는 &amp;lt;code&amp;gt;move()&amp;lt;/code&amp;gt; 메소드를 사용할 수 있게 되었다.&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=File:Hufs-karel-220915.jar&amp;diff=431</id>
		<title>File:Hufs-karel-220915.jar</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=File:Hufs-karel-220915.jar&amp;diff=431"/>
		<updated>2022-09-15T04:43:33Z</updated>

		<summary type="html">&lt;p&gt;Swpark: category:Karel&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
[[category:Karel]]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EA%B8%B0%EB%B3%B8_Karel_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8_%EC%98%88%EC%A0%9C&amp;diff=430</id>
		<title>기본 Karel 프로그램 예제</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EA%B8%B0%EB%B3%B8_Karel_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8_%EC%98%88%EC%A0%9C&amp;diff=430"/>
		<updated>2022-09-15T04:42:54Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* Karel 라이브러리 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Karel 라이브러리 ===&lt;br /&gt;
* [[media:karel.jar | Stanford Karel Library (karel.jar)]]&lt;br /&gt;
* &amp;lt;del&amp;gt;[[media:hufs-karel.jar | HUFS Karel Library (hufs-karel.jar)]]&amp;lt;/del&amp;gt;&lt;br /&gt;
* [[media:hufs-karel-220915.jar | HUFS Karel Library 2022.09.15 Version (hufs-karel-220915.jar)]]&lt;br /&gt;
&lt;br /&gt;
이 라이브러리는 Java 6 이하의 버전에서만 실행된다. 그 이유는 Java Applet을 이용하기 때문인데, Java 7부터 Applet이 제거되어 Applet은 이후 버전에서는 더 이상 동작하지 않는다. Java 7 이후 버전으로 Karel을 실행하면 빈 화면만 등장한다.&lt;br /&gt;
&lt;br /&gt;
=== 첫 번째 HUFS Karel 프로그램 ===&lt;br /&gt;
&lt;br /&gt;
[[File:HKarel 초기 화면.png|thumb|첫 번째 HUFS Karel 실행 화면]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import hufs.karel.HKarel;&lt;br /&gt;
import hufs.karel.HufsProgram;&lt;br /&gt;
&lt;br /&gt;
public class FirstHKarelProgram extends HufsProgram {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onStart() {&lt;br /&gt;
        HKarel karel = (HKarel)getHObject(&amp;quot;철수&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        karel.move();&lt;br /&gt;
        karel.move();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        HufsProgram.main(args, new HKarel(&amp;quot;철수&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Start 버튼을 누르면 &amp;lt;code&amp;gt;onStart&amp;lt;/code&amp;gt;가 실행된다.&lt;br /&gt;
* &amp;lt;code&amp;gt;HufsProgram.main&amp;lt;/code&amp;gt;에서 인자로 전달한 &amp;lt;code&amp;gt;HKarel(&amp;quot;철수&amp;quot;)&amp;lt;/code&amp;gt;는 &amp;lt;code&amp;gt;getHObject(&amp;quot;철수&amp;quot;)&amp;lt;/code&amp;gt;를 통하여 구할 수 있다.&lt;br /&gt;
&lt;br /&gt;
=== 두 번째 HUFS Karel 프로그램 ===&lt;br /&gt;
&lt;br /&gt;
[[File:SecondHKarelProgram 실행 화면.png|thumb|SecondHKarelProgram 실행 화면]]&lt;br /&gt;
[[File:SecondHKarelProgram 에러 화면.png|thumb|SecondHKarelProgram 실행할 경우 발생하는 오류]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import hufs.karel.HKarel;&lt;br /&gt;
import hufs.karel.HufsProgram;&lt;br /&gt;
&lt;br /&gt;
public class SecondHKarelProgram extends HufsProgram {&lt;br /&gt;
&lt;br /&gt;
    HKarel karel;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onInit() {&lt;br /&gt;
        karel = new HKarel(&amp;quot;철수&amp;quot;, 5, 5);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onStart() {&lt;br /&gt;
        while (true) {&lt;br /&gt;
            if (karel.frontIsBlocked())&lt;br /&gt;
                karel.turnLeft();&lt;br /&gt;
            karel.move();&lt;br /&gt;
        }        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        HufsProgram.main(args, null);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;HufsProgram.main&amp;lt;/code&amp;gt; 메소드에서 두 번째 인자로 &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;을 두었다. 이것은 Karel 객체를 전달하지 않는다는 뜻이다.&lt;br /&gt;
* Start 버튼을 누르기 전에 &amp;lt;code&amp;gt;onInit()&amp;lt;/code&amp;gt;가 실행된다. 그러므로 Start 버튼을 누르기 전에 초기화 해야 할 코드는 이곳에 작성한다. 여기에서 &amp;lt;code&amp;gt;HKarel&amp;lt;/code&amp;gt; 객체를 생성하였다. 하지만 이 객체를 월드에 추가하지는 않았다.&lt;br /&gt;
* Start 버튼을 누르면 &amp;lt;code&amp;gt;onStart()&amp;lt;/code&amp;gt;가 실행된다.&lt;br /&gt;
* &amp;lt;code&amp;gt;add()&amp;lt;/code&amp;gt; 메소드를 이용하여 생성한 Karel을 월드에 추가하지 않았기 때문에 오류가 난다.&lt;br /&gt;
&lt;br /&gt;
=== 두 번째 HUFS Karel 프로그램 수정 버전 ===&lt;br /&gt;
&lt;br /&gt;
생성한 객체를 월드에 추가해야 나타남&lt;br /&gt;
&lt;br /&gt;
[[File:SecondHKarelProgram 실행 화면 2.png|thumb|수정한 SecondHKarelProgram 실행 화면]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import hufs.karel.HKarel;&lt;br /&gt;
import hufs.karel.HufsProgram;&lt;br /&gt;
&lt;br /&gt;
public class SecondHKarelProgram extends HufsProgram {&lt;br /&gt;
&lt;br /&gt;
    HKarel karel;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onInit() {&lt;br /&gt;
        karel = new HKarel(&amp;quot;철수&amp;quot;, 5, 5);&lt;br /&gt;
        karel.setColor(BLUE);&lt;br /&gt;
        karel.setColorOfBody(YELLOW);&lt;br /&gt;
        karel.setColorOfFoot(GREEN);&lt;br /&gt;
        karel.setColorOfMouth(RED);&lt;br /&gt;
        add(karel);     // 생성한 HKarel을 월드에 추가&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onStart() {&lt;br /&gt;
        while (true) {&lt;br /&gt;
            if (karel.frontIsBlocked())&lt;br /&gt;
                karel.turnLeft();&lt;br /&gt;
            karel.move();&lt;br /&gt;
        }        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        HufsProgram.main(args, null);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 위 예제와 동일한 코드이나, &amp;lt;code&amp;gt;add(karel)&amp;lt;/code&amp;gt;을 실행하여 생성한 객체를 월드에 추가하도록 하였다. 그러므로 이 객체가 월드에 있어야만 사용할 수 있는 &amp;lt;code&amp;gt;move()&amp;lt;/code&amp;gt; 메소드를 사용할 수 있게 되었다.&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/0908&amp;diff=429</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/0908</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/0908&amp;diff=429"/>
		<updated>2022-09-04T17:22:50Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* 이항 연산잔 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 연산자와 연산식 ==&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=semicolon align=clccl&amp;gt;&lt;br /&gt;
연산자 종류 ; 연산자           ; 피연산자 수          ; 산출값      ; 기능 설명                             ; 예&lt;br /&gt;
산술        ; +, -, *, /, %    ; 이항                 ; 숫자        ; 사칙연산 및 나머지 연산               ; 2 + 3&lt;br /&gt;
부호        ; +, -             ; 단항                 ; 숫자        ; 음수와 양수의 부호                    ; -2&lt;br /&gt;
문자열      ; +                ; 이항                 ; 문자열      ; 두 문자열을 연결                      ; &amp;quot;abc&amp;quot; + &amp;quot;def&amp;quot;&lt;br /&gt;
대입        ; =, +=, -=, *=, /=, %=, &amp;amp;= &amp;lt;br/&amp;gt;^=, !=, &amp;lt;&amp;lt;=, &amp;gt;&amp;gt;=, &amp;gt;&amp;gt;&amp;gt;= ; 이항 ; 다양 ; 우변의 값을 좌변의 변수에 대입 ; i += 3&lt;br /&gt;
증감        ; ++, --           ; 단항                 ; 숫자        ; 1만큼 증가/감소                       ; i++&lt;br /&gt;
비교        ; ==, !=, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=&amp;lt;br/&amp;gt;instanceof  ; 이항 ; boolean ; 값의 비교                             ; i &amp;gt; j&lt;br /&gt;
논리        ; !, &amp;amp;, |, &amp;amp;&amp;amp;, &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; ; 단항&amp;lt;br/&amp;gt;이항        ; boolean     ; 논리적 NOT, AND, OR 연산              ; !(a &amp;lt; 3), (a &amp;lt; 3) &amp;amp;&amp;amp; (a &amp;gt; 1) &lt;br /&gt;
조건        ; (조건식) ? A : B ; 삼항                 ; 다양        ; 조건식에 따라 A 또는 B 중 하나를 선택 ; a = (x &amp;gt; y) ? x : y&lt;br /&gt;
비트        ; ~, &amp;amp;, |, ^       ; 단항&amp;lt;br/&amp;gt;이항        ; 숫자&amp;lt;br/&amp;gt;boolean ; 비트 NOT, AND, OR, XOR 연산      ; ~a, a &amp;amp; b&lt;br /&gt;
쉬프트      ; &amp;gt;&amp;gt;, &amp;lt;&amp;lt;, &amp;gt;&amp;gt;&amp;gt;      ; 이항                 ; 숫자        ; 비트를 좌측/우측으로 밀어서 이동      ; a &amp;gt;&amp;gt; 3&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 연산의 방향과 우선순위 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
x &amp;gt; 0 &amp;amp;&amp;amp; y &amp;lt; 0 // 어떤 순으로 연산될 것인가?&lt;br /&gt;
&lt;br /&gt;
v1 = 100 * 2 / 3 % 5; // v1 = (((100 * 2) / 3) % 5)&lt;br /&gt;
&lt;br /&gt;
a = b = c = 5; // (a = (b = (c = 5)));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 연산자 우선순위&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=semicolon align=&amp;quot;lcc&amp;quot;&amp;gt;&lt;br /&gt;
연산자                   ; 연산 방향 ; 우선 순위&lt;br /&gt;
++, --, +, -, ~, !       ; ←        ; 높음&lt;br /&gt;
*, /, %                  ; →        ; &lt;br /&gt;
+, -                     ; →        ;&lt;br /&gt;
&amp;lt;&amp;lt;, &amp;gt;&amp;gt;, &amp;gt;&amp;gt;&amp;gt;              ; →        ;&lt;br /&gt;
&amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;=, instanceof ; →        ;&lt;br /&gt;
==, !=                   ; →        ;&lt;br /&gt;
&amp;amp;                        ; →        ;&lt;br /&gt;
^                        ; →        ;&lt;br /&gt;
|                        ; →        ;&lt;br /&gt;
&amp;amp;&amp;amp;                       ; →        ;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;      ; →        ;&lt;br /&gt;
? :                      ; →        ;&lt;br /&gt;
=, +=, -=, *=, /=, %=, &amp;amp;=, ^=, |=, &amp;lt;&amp;lt;=, &amp;gt;&amp;gt;=, &amp;gt;&amp;gt;&amp;gt;= ; ← ; 낮음&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int var1 = 1;&lt;br /&gt;
int var2 = 3;&lt;br /&gt;
int var3 = 2;&lt;br /&gt;
int result = var1 + var2 * var3;&lt;br /&gt;
&lt;br /&gt;
int result = (var1 + var2) * var3;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 단항 연산자 ==&lt;br /&gt;
&lt;br /&gt;
=== 부호 연산자 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int i1 = +100;  // 부호 + (양수)&lt;br /&gt;
int i2 = -100;  // 부호 - (음수)&lt;br /&gt;
double d1 = +3.14;&lt;br /&gt;
&lt;br /&gt;
int x = -100;&lt;br /&gt;
int result1 = -x; // OK&lt;br /&gt;
&lt;br /&gt;
short s1 = 100;&lt;br /&gt;
short s2 = -s1; // 오류. 정수 연산은 int로 바뀌기 때문&lt;br /&gt;
int i3 = -s1; // OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 증감 연산자(++, --) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
++i;&lt;br /&gt;
i++;&lt;br /&gt;
&lt;br /&gt;
--i;&lt;br /&gt;
i--;&lt;br /&gt;
&lt;br /&gt;
//------------------&lt;br /&gt;
int x = 10;&lt;br /&gt;
int z;&lt;br /&gt;
&lt;br /&gt;
z = ++x;&lt;br /&gt;
&lt;br /&gt;
// 위 코드는 아래와 동일&lt;br /&gt;
x = x + 1;&lt;br /&gt;
z = x;&lt;br /&gt;
&lt;br /&gt;
//-------------------&lt;br /&gt;
int x = 10;&lt;br /&gt;
int z;&lt;br /&gt;
&lt;br /&gt;
z = x++;&lt;br /&gt;
&lt;br /&gt;
// 위 코드는 아래와 동일&lt;br /&gt;
z = x;&lt;br /&gt;
x = x + 1;&lt;br /&gt;
&lt;br /&gt;
//------------------&lt;br /&gt;
int x = 10;&lt;br /&gt;
int z;&lt;br /&gt;
&lt;br /&gt;
z = --x;&lt;br /&gt;
&lt;br /&gt;
// 위 코드는 아래와 동일&lt;br /&gt;
x = x - 1;&lt;br /&gt;
z = x;&lt;br /&gt;
&lt;br /&gt;
//-------------------&lt;br /&gt;
int x = 10;&lt;br /&gt;
int z;&lt;br /&gt;
&lt;br /&gt;
z = x--;&lt;br /&gt;
&lt;br /&gt;
// 위 코드는 아래와 동일&lt;br /&gt;
z = x;&lt;br /&gt;
x = x - 1;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 논리 부정 연산자 ! ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
boolean play = true;&lt;br /&gt;
&lt;br /&gt;
play = !play;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 비트 반전 연산자 ~ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
byte v1 = 10; // 00001010&lt;br /&gt;
byte v2 = ~v1; // 오류. 정수 종류의 연산은 자동으로 int로 변환됨&lt;br /&gt;
&lt;br /&gt;
int i2 = ~v1; // OK. 11111111 11111111 11111111 11110101&lt;br /&gt;
&lt;br /&gt;
int i3 = ~v1 + 1; // -10 (2의 보수)&lt;br /&gt;
&lt;br /&gt;
System.out.println( Integer.toBinaryString(i3) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 이항 연산자 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 산술 연산자 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
byte byte1 = 1;&lt;br /&gt;
byte byte2 = 1;&lt;br /&gt;
byte byte3 = byte1 + byte2; // 오류. 정수 타입의 산술 연산은 32비트인 int로 형변환됨&lt;br /&gt;
&lt;br /&gt;
int result1 = byte1 + byte2; // OK&lt;br /&gt;
&lt;br /&gt;
int int1 = 10;&lt;br /&gt;
int int2 = 4;&lt;br /&gt;
int result2 = int1 / int2;  // 2&lt;br /&gt;
double result3 = int1 / int2; // 2.0&lt;br /&gt;
&lt;br /&gt;
double result4 = (double) int1 / int2; // 2.5&lt;br /&gt;
&lt;br /&gt;
char c1 = 'A' + 1; // OK 'B'&lt;br /&gt;
char c2 = 'A';&lt;br /&gt;
char c3 = c2 + 1; // 컴파일 에러. c2가 int로 형변환됨&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 오버플로우 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int x = 1000000;&lt;br /&gt;
int y = 1000000;&lt;br /&gt;
&lt;br /&gt;
int z = x * y; // z에는 오버플로우되어 -727379968와 같이 알 수 없는 값이 저장됨&lt;br /&gt;
&lt;br /&gt;
//-------------&lt;br /&gt;
&lt;br /&gt;
long x = 1000000;&lt;br /&gt;
long y = 1000000;&lt;br /&gt;
&lt;br /&gt;
long z = x * y; // OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 정확한 계산은 정수 사용 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int apple = 1;&lt;br /&gt;
double priceUnit = 0.1;&lt;br /&gt;
int number = 7;&lt;br /&gt;
&lt;br /&gt;
double result = apple - number * priceUnit; // 0.3이 되어야 할 것 같지만 아님. 왜?&lt;br /&gt;
&lt;br /&gt;
System.out.println(result); // 0.29999999999999993&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NaN과 Infinity 연산 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
5 / 0 → ArithmeticException 예외 발생&lt;br /&gt;
5 % 0 → ArithmeticException 예외 발생&lt;br /&gt;
&lt;br /&gt;
5 / 0.0 → Infinity&lt;br /&gt;
5 % 0.0 → NaN&lt;br /&gt;
&lt;br /&gt;
double val = Double.valueOf(&amp;quot;NaN&amp;quot;); // NaN 입력&lt;br /&gt;
&lt;br /&gt;
if (Double.isNaN(val)) { // NaN인지 검사&lt;br /&gt;
    System.out.println(&amp;quot;OOPS&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 문자열 연결 연산자 (+) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
String str1 = &amp;quot;JDK&amp;quot; + 6.0; // &amp;quot;JDK6.0&amp;quot;&lt;br /&gt;
String str2 = str1 + &amp;quot; 특징&amp;quot;; // &amp;quot;JDK6.0 특징&amp;quot;&lt;br /&gt;
&lt;br /&gt;
String str3 = &amp;quot;JDK&amp;quot; + 3 + 3.0; // (&amp;quot;JDK&amp;quot; + 3) + 3.0 → (&amp;quot;JDK&amp;quot; + &amp;quot;3&amp;quot;) + 3.0 → &amp;quot;JDK3&amp;quot; + &amp;quot;3.0&amp;quot; → &amp;quot;JDK33.0&amp;quot;&lt;br /&gt;
String str4 = 3 + 3.0 + &amp;quot;JDK&amp;quot;; // (3 + 3.0) + &amp;quot;JDK&amp;quot; → (3.0 + 3.0) + &amp;quot;JDK&amp;quot; → &amp;quot;6.0&amp;quot; + &amp;quot;JDK&amp;quot; → &amp;quot;6.0JDK&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 비교 연산자 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int num1 = 10;&lt;br /&gt;
int num2 = 10;&lt;br /&gt;
&lt;br /&gt;
boolean result1 = num1 == num2;&lt;br /&gt;
boolean result2 = (num1 != num2);&lt;br /&gt;
boolean result3 = (num1 &amp;lt;= num2);&lt;br /&gt;
&lt;br /&gt;
char char1 = 'A';&lt;br /&gt;
char char2 = 'B';&lt;br /&gt;
&lt;br /&gt;
boolean result4 = (char1 &amp;lt; char2);&lt;br /&gt;
&lt;br /&gt;
//------------------&lt;br /&gt;
&lt;br /&gt;
'A' == 65 → true&lt;br /&gt;
3 == 3.0 → true&lt;br /&gt;
0.1 == 0.1f → false // 2진수로 변환하기 때문에 정확한 0.1 표현이 안됨. &lt;br /&gt;
                     // 0.1을 2진수로 바꾸었다가 10진수로 변환하면 0.10000000149011612와 같이 표현됨&lt;br /&gt;
&lt;br /&gt;
//------------------&lt;br /&gt;
&lt;br /&gt;
String strVar1 = &amp;quot;신용권&amp;quot;;&lt;br /&gt;
String strVal2 = &amp;quot;신용권&amp;quot;;&lt;br /&gt;
String strVal3 = new String(&amp;quot;신용권&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
strVal1 == strVal2 → true&lt;br /&gt;
strVar2 == strVal3 → false&lt;br /&gt;
&lt;br /&gt;
strVal1.equals(strVal2) → true&lt;br /&gt;
strVal2.equals(strVal3) → true // 내용으로 비교하기 때문&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 논리 연산자 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=semicolon align=cccc&amp;gt;&lt;br /&gt;
구분 ; 연산식              ; 설명&lt;br /&gt;
AND  ; &amp;amp;&amp;amp;                  ; 모두 참일 때만 참&lt;br /&gt;
OR   ; &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; ; 모두 거짓일 때만 거짓&lt;br /&gt;
XOR  ; ^                   ; 배타적 논리합. 하나는 true, 다른 하나는 false 일 때만 true&lt;br /&gt;
NOT  ; !                   ; 피연산자의 논리값을 바꿈&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int charCode = 'A';&lt;br /&gt;
&lt;br /&gt;
if (charCode &amp;gt;= 'A' &amp;amp;&amp;amp; charCode &amp;lt;= 'Z') {&lt;br /&gt;
    System.out.println(&amp;quot;대문자입니다&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 비트 연산자 ===&lt;br /&gt;
&lt;br /&gt;
==== 비트 논리 연산자 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
byte num1 = 45;&lt;br /&gt;
byte num2 = 25;&lt;br /&gt;
&lt;br /&gt;
byte result1 = num1 &amp;amp; num2;&lt;br /&gt;
byte result2 = num1 | num2;&lt;br /&gt;
byte result3 = num1 ^ num2;&lt;br /&gt;
byte result4 = ~num1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=semicolon align=llcl&amp;gt;&lt;br /&gt;
변수    ; 값       ; 십진수 ; 연산&lt;br /&gt;
num1    ; 00101101 ; 45     ;&lt;br /&gt;
num2    ; 00011001 ; 25     ;  &lt;br /&gt;
result1 ; 00001001 ; 9      ; num1 &amp;amp; num2&lt;br /&gt;
result2 ; 00111101 ; 61     ; num1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; num2&lt;br /&gt;
result3 ; 00110100 ; 52     ; num1 ^ num2&lt;br /&gt;
result4 ; 11010010 ; -46    ; ~num1&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 비트 이동 연산자 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int result1 = 1 &amp;lt;&amp;lt; 3;&lt;br /&gt;
int result2 = -8 &amp;gt;&amp;gt; 3;&lt;br /&gt;
int result3 = -8 &amp;gt;&amp;gt;&amp;gt; 3;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lllll&amp;gt;&lt;br /&gt;
변수    | 값        | 연산     | 이진값                             | 비고&lt;br /&gt;
        | 1         |          | 00000000 00000000 0000000 00000001 | &lt;br /&gt;
result1 | 8         | 1 &amp;lt;&amp;lt; 3   | 00000000 00000000 0000000 00001000 | 2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
        | -8        |          | 11111111 11111111 1111111 11111000 |&lt;br /&gt;
resutl2 | -1        | -8 &amp;gt;&amp;gt; 3  | 11111111 11111111 1111111 11111111 |&lt;br /&gt;
result3 | 536870911 | -8 &amp;gt;&amp;gt;&amp;gt; 3 | 00011111 11111111 1111111 11111111 |&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 대입 연산자 ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class AssignmentOperatorExample {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        int result = 0;&lt;br /&gt;
&lt;br /&gt;
        result += 10; // result = result + 10;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
&lt;br /&gt;
        result -= 5; // result = result - 10;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
&lt;br /&gt;
        result *= 3; // result = result * 3;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
&lt;br /&gt;
        result /= 5; // result = result / 5;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
&lt;br /&gt;
        result %= 3;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
10&lt;br /&gt;
5&lt;br /&gt;
15&lt;br /&gt;
3&lt;br /&gt;
0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 유용한 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int result *= x + y * z; // result = result * (x + y * z);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 삼항 연산자 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int score = 95;&lt;br /&gt;
&lt;br /&gt;
char grade = (score &amp;gt; 90) ? 'A' : 'B';&lt;br /&gt;
&lt;br /&gt;
// 아래와 동일한 의미의 코드이다.&lt;br /&gt;
&lt;br /&gt;
int score = 95&lt;br /&gt;
&lt;br /&gt;
char grade;&lt;br /&gt;
if (score &amp;gt; 90)&lt;br /&gt;
    grade = 'A';&lt;br /&gt;
else&lt;br /&gt;
    grade = 'B';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category:컴퓨터프로그래밍및실습]]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/0908&amp;diff=428</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/0908</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/0908&amp;diff=428"/>
		<updated>2022-09-04T16:56:43Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* 대입 연산자 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 연산자와 연산식 ==&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=semicolon align=clccl&amp;gt;&lt;br /&gt;
연산자 종류 ; 연산자           ; 피연산자 수          ; 산출값      ; 기능 설명                             ; 예&lt;br /&gt;
산술        ; +, -, *, /, %    ; 이항                 ; 숫자        ; 사칙연산 및 나머지 연산               ; 2 + 3&lt;br /&gt;
부호        ; +, -             ; 단항                 ; 숫자        ; 음수와 양수의 부호                    ; -2&lt;br /&gt;
문자열      ; +                ; 이항                 ; 문자열      ; 두 문자열을 연결                      ; &amp;quot;abc&amp;quot; + &amp;quot;def&amp;quot;&lt;br /&gt;
대입        ; =, +=, -=, *=, /=, %=, &amp;amp;= &amp;lt;br/&amp;gt;^=, !=, &amp;lt;&amp;lt;=, &amp;gt;&amp;gt;=, &amp;gt;&amp;gt;&amp;gt;= ; 이항 ; 다양 ; 우변의 값을 좌변의 변수에 대입 ; i += 3&lt;br /&gt;
증감        ; ++, --           ; 단항                 ; 숫자        ; 1만큼 증가/감소                       ; i++&lt;br /&gt;
비교        ; ==, !=, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=&amp;lt;br/&amp;gt;instanceof  ; 이항 ; boolean ; 값의 비교                             ; i &amp;gt; j&lt;br /&gt;
논리        ; !, &amp;amp;, |, &amp;amp;&amp;amp;, &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; ; 단항&amp;lt;br/&amp;gt;이항        ; boolean     ; 논리적 NOT, AND, OR 연산              ; !(a &amp;lt; 3), (a &amp;lt; 3) &amp;amp;&amp;amp; (a &amp;gt; 1) &lt;br /&gt;
조건        ; (조건식) ? A : B ; 삼항                 ; 다양        ; 조건식에 따라 A 또는 B 중 하나를 선택 ; a = (x &amp;gt; y) ? x : y&lt;br /&gt;
비트        ; ~, &amp;amp;, |, ^       ; 단항&amp;lt;br/&amp;gt;이항        ; 숫자&amp;lt;br/&amp;gt;boolean ; 비트 NOT, AND, OR, XOR 연산      ; ~a, a &amp;amp; b&lt;br /&gt;
쉬프트      ; &amp;gt;&amp;gt;, &amp;lt;&amp;lt;, &amp;gt;&amp;gt;&amp;gt;      ; 이항                 ; 숫자        ; 비트를 좌측/우측으로 밀어서 이동      ; a &amp;gt;&amp;gt; 3&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 연산의 방향과 우선순위 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
x &amp;gt; 0 &amp;amp;&amp;amp; y &amp;lt; 0 // 어떤 순으로 연산될 것인가?&lt;br /&gt;
&lt;br /&gt;
v1 = 100 * 2 / 3 % 5; // v1 = (((100 * 2) / 3) % 5)&lt;br /&gt;
&lt;br /&gt;
a = b = c = 5; // (a = (b = (c = 5)));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 연산자 우선순위&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=semicolon align=&amp;quot;lcc&amp;quot;&amp;gt;&lt;br /&gt;
연산자                   ; 연산 방향 ; 우선 순위&lt;br /&gt;
++, --, +, -, ~, !       ; ←        ; 높음&lt;br /&gt;
*, /, %                  ; →        ; &lt;br /&gt;
+, -                     ; →        ;&lt;br /&gt;
&amp;lt;&amp;lt;, &amp;gt;&amp;gt;, &amp;gt;&amp;gt;&amp;gt;              ; →        ;&lt;br /&gt;
&amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;=, instanceof ; →        ;&lt;br /&gt;
==, !=                   ; →        ;&lt;br /&gt;
&amp;amp;                        ; →        ;&lt;br /&gt;
^                        ; →        ;&lt;br /&gt;
|                        ; →        ;&lt;br /&gt;
&amp;amp;&amp;amp;                       ; →        ;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;      ; →        ;&lt;br /&gt;
? :                      ; →        ;&lt;br /&gt;
=, +=, -=, *=, /=, %=, &amp;amp;=, ^=, |=, &amp;lt;&amp;lt;=, &amp;gt;&amp;gt;=, &amp;gt;&amp;gt;&amp;gt;= ; ← ; 낮음&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int var1 = 1;&lt;br /&gt;
int var2 = 3;&lt;br /&gt;
int var3 = 2;&lt;br /&gt;
int result = var1 + var2 * var3;&lt;br /&gt;
&lt;br /&gt;
int result = (var1 + var2) * var3;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 단항 연산자 ==&lt;br /&gt;
&lt;br /&gt;
=== 부호 연산자 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int i1 = +100;  // 부호 + (양수)&lt;br /&gt;
int i2 = -100;  // 부호 - (음수)&lt;br /&gt;
double d1 = +3.14;&lt;br /&gt;
&lt;br /&gt;
int x = -100;&lt;br /&gt;
int result1 = -x; // OK&lt;br /&gt;
&lt;br /&gt;
short s1 = 100;&lt;br /&gt;
short s2 = -s1; // 오류. 정수 연산은 int로 바뀌기 때문&lt;br /&gt;
int i3 = -s1; // OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 증감 연산자(++, --) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
++i;&lt;br /&gt;
i++;&lt;br /&gt;
&lt;br /&gt;
--i;&lt;br /&gt;
i--;&lt;br /&gt;
&lt;br /&gt;
//------------------&lt;br /&gt;
int x = 10;&lt;br /&gt;
int z;&lt;br /&gt;
&lt;br /&gt;
z = ++x;&lt;br /&gt;
&lt;br /&gt;
// 위 코드는 아래와 동일&lt;br /&gt;
x = x + 1;&lt;br /&gt;
z = x;&lt;br /&gt;
&lt;br /&gt;
//-------------------&lt;br /&gt;
int x = 10;&lt;br /&gt;
int z;&lt;br /&gt;
&lt;br /&gt;
z = x++;&lt;br /&gt;
&lt;br /&gt;
// 위 코드는 아래와 동일&lt;br /&gt;
z = x;&lt;br /&gt;
x = x + 1;&lt;br /&gt;
&lt;br /&gt;
//------------------&lt;br /&gt;
int x = 10;&lt;br /&gt;
int z;&lt;br /&gt;
&lt;br /&gt;
z = --x;&lt;br /&gt;
&lt;br /&gt;
// 위 코드는 아래와 동일&lt;br /&gt;
x = x - 1;&lt;br /&gt;
z = x;&lt;br /&gt;
&lt;br /&gt;
//-------------------&lt;br /&gt;
int x = 10;&lt;br /&gt;
int z;&lt;br /&gt;
&lt;br /&gt;
z = x--;&lt;br /&gt;
&lt;br /&gt;
// 위 코드는 아래와 동일&lt;br /&gt;
z = x;&lt;br /&gt;
x = x - 1;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 논리 부정 연산자 ! ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
boolean play = true;&lt;br /&gt;
&lt;br /&gt;
play = !play;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 비트 반전 연산자 ~ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
byte v1 = 10; // 00001010&lt;br /&gt;
byte v2 = ~v1; // 오류. 정수 종류의 연산은 자동으로 int로 변환됨&lt;br /&gt;
&lt;br /&gt;
int i2 = ~v1; // OK. 11111111 11111111 11111111 11110101&lt;br /&gt;
&lt;br /&gt;
int i3 = ~v1 + 1; // -10 (2의 보수)&lt;br /&gt;
&lt;br /&gt;
System.out.println( Integer.toBinaryString(i3) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 이항 연산잔 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 산술 연산자 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
byte byte1 = 1;&lt;br /&gt;
byte byte2 = 1;&lt;br /&gt;
byte byte3 = byte1 + byte2; // 오류. 정수 타입의 산술 연산은 32비트인 int로 형변환됨&lt;br /&gt;
&lt;br /&gt;
int result1 = byte1 + byte2; // OK&lt;br /&gt;
&lt;br /&gt;
int int1 = 10;&lt;br /&gt;
int int2 = 4;&lt;br /&gt;
int result2 = int1 / int2;  // 2&lt;br /&gt;
double result3 = int1 / int2; // 2.0&lt;br /&gt;
&lt;br /&gt;
double result4 = (double) int1 / int2; // 2.5&lt;br /&gt;
&lt;br /&gt;
char c1 = 'A' + 1; // OK 'B'&lt;br /&gt;
char c2 = 'A';&lt;br /&gt;
char c3 = c2 + 1; // 컴파일 에러. c2가 int로 형변환됨&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 오버플로우 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int x = 1000000;&lt;br /&gt;
int y = 1000000;&lt;br /&gt;
&lt;br /&gt;
int z = x * y; // z에는 오버플로우되어 -727379968와 같이 알 수 없는 값이 저장됨&lt;br /&gt;
&lt;br /&gt;
//-------------&lt;br /&gt;
&lt;br /&gt;
long x = 1000000;&lt;br /&gt;
long y = 1000000;&lt;br /&gt;
&lt;br /&gt;
long z = x * y; // OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 정확한 계산은 정수 사용 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int apple = 1;&lt;br /&gt;
double priceUnit = 0.1;&lt;br /&gt;
int number = 7;&lt;br /&gt;
&lt;br /&gt;
double result = apple - number * priceUnit; // 0.3이 되어야 할 것 같지만 아님. 왜?&lt;br /&gt;
&lt;br /&gt;
System.out.println(result); // 0.29999999999999993&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NaN과 Infinity 연산 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
5 / 0 → ArithmeticException 예외 발생&lt;br /&gt;
5 % 0 → ArithmeticException 예외 발생&lt;br /&gt;
&lt;br /&gt;
5 / 0.0 → Infinity&lt;br /&gt;
5 % 0.0 → NaN&lt;br /&gt;
&lt;br /&gt;
double val = Double.valueOf(&amp;quot;NaN&amp;quot;); // NaN 입력&lt;br /&gt;
&lt;br /&gt;
if (Double.isNaN(val)) { // NaN인지 검사&lt;br /&gt;
    System.out.println(&amp;quot;OOPS&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 문자열 연결 연산자 (+) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
String str1 = &amp;quot;JDK&amp;quot; + 6.0; // &amp;quot;JDK6.0&amp;quot;&lt;br /&gt;
String str2 = str1 + &amp;quot; 특징&amp;quot;; // &amp;quot;JDK6.0 특징&amp;quot;&lt;br /&gt;
&lt;br /&gt;
String str3 = &amp;quot;JDK&amp;quot; + 3 + 3.0; // (&amp;quot;JDK&amp;quot; + 3) + 3.0 → (&amp;quot;JDK&amp;quot; + &amp;quot;3&amp;quot;) + 3.0 → &amp;quot;JDK3&amp;quot; + &amp;quot;3.0&amp;quot; → &amp;quot;JDK33.0&amp;quot;&lt;br /&gt;
String str4 = 3 + 3.0 + &amp;quot;JDK&amp;quot;; // (3 + 3.0) + &amp;quot;JDK&amp;quot; → (3.0 + 3.0) + &amp;quot;JDK&amp;quot; → &amp;quot;6.0&amp;quot; + &amp;quot;JDK&amp;quot; → &amp;quot;6.0JDK&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 비교 연산자 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int num1 = 10;&lt;br /&gt;
int num2 = 10;&lt;br /&gt;
&lt;br /&gt;
boolean result1 = num1 == num2;&lt;br /&gt;
boolean result2 = (num1 != num2);&lt;br /&gt;
boolean result3 = (num1 &amp;lt;= num2);&lt;br /&gt;
&lt;br /&gt;
char char1 = 'A';&lt;br /&gt;
char char2 = 'B';&lt;br /&gt;
&lt;br /&gt;
boolean result4 = (char1 &amp;lt; char2);&lt;br /&gt;
&lt;br /&gt;
//------------------&lt;br /&gt;
&lt;br /&gt;
'A' == 65 → true&lt;br /&gt;
3 == 3.0 → true&lt;br /&gt;
0.1 == 0.1f → false // 2진수로 변환하기 때문에 정확한 0.1 표현이 안됨. &lt;br /&gt;
                     // 0.1을 2진수로 바꾸었다가 10진수로 변환하면 0.10000000149011612와 같이 표현됨&lt;br /&gt;
&lt;br /&gt;
//------------------&lt;br /&gt;
&lt;br /&gt;
String strVar1 = &amp;quot;신용권&amp;quot;;&lt;br /&gt;
String strVal2 = &amp;quot;신용권&amp;quot;;&lt;br /&gt;
String strVal3 = new String(&amp;quot;신용권&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
strVal1 == strVal2 → true&lt;br /&gt;
strVar2 == strVal3 → false&lt;br /&gt;
&lt;br /&gt;
strVal1.equals(strVal2) → true&lt;br /&gt;
strVal2.equals(strVal3) → true // 내용으로 비교하기 때문&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 논리 연산자 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=semicolon align=cccc&amp;gt;&lt;br /&gt;
구분 ; 연산식              ; 설명&lt;br /&gt;
AND  ; &amp;amp;&amp;amp;                  ; 모두 참일 때만 참&lt;br /&gt;
OR   ; &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; ; 모두 거짓일 때만 거짓&lt;br /&gt;
XOR  ; ^                   ; 배타적 논리합. 하나는 true, 다른 하나는 false 일 때만 true&lt;br /&gt;
NOT  ; !                   ; 피연산자의 논리값을 바꿈&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int charCode = 'A';&lt;br /&gt;
&lt;br /&gt;
if (charCode &amp;gt;= 'A' &amp;amp;&amp;amp; charCode &amp;lt;= 'Z') {&lt;br /&gt;
    System.out.println(&amp;quot;대문자입니다&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 비트 연산자 ===&lt;br /&gt;
&lt;br /&gt;
==== 비트 논리 연산자 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
byte num1 = 45;&lt;br /&gt;
byte num2 = 25;&lt;br /&gt;
&lt;br /&gt;
byte result1 = num1 &amp;amp; num2;&lt;br /&gt;
byte result2 = num1 | num2;&lt;br /&gt;
byte result3 = num1 ^ num2;&lt;br /&gt;
byte result4 = ~num1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=semicolon align=llcl&amp;gt;&lt;br /&gt;
변수    ; 값       ; 십진수 ; 연산&lt;br /&gt;
num1    ; 00101101 ; 45     ;&lt;br /&gt;
num2    ; 00011001 ; 25     ;  &lt;br /&gt;
result1 ; 00001001 ; 9      ; num1 &amp;amp; num2&lt;br /&gt;
result2 ; 00111101 ; 61     ; num1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; num2&lt;br /&gt;
result3 ; 00110100 ; 52     ; num1 ^ num2&lt;br /&gt;
result4 ; 11010010 ; -46    ; ~num1&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 비트 이동 연산자 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int result1 = 1 &amp;lt;&amp;lt; 3;&lt;br /&gt;
int result2 = -8 &amp;gt;&amp;gt; 3;&lt;br /&gt;
int result3 = -8 &amp;gt;&amp;gt;&amp;gt; 3;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lllll&amp;gt;&lt;br /&gt;
변수    | 값        | 연산     | 이진값                             | 비고&lt;br /&gt;
        | 1         |          | 00000000 00000000 0000000 00000001 | &lt;br /&gt;
result1 | 8         | 1 &amp;lt;&amp;lt; 3   | 00000000 00000000 0000000 00001000 | 2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
        | -8        |          | 11111111 11111111 1111111 11111000 |&lt;br /&gt;
resutl2 | -1        | -8 &amp;gt;&amp;gt; 3  | 11111111 11111111 1111111 11111111 |&lt;br /&gt;
result3 | 536870911 | -8 &amp;gt;&amp;gt;&amp;gt; 3 | 00011111 11111111 1111111 11111111 |&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 대입 연산자 ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class AssignmentOperatorExample {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        int result = 0;&lt;br /&gt;
&lt;br /&gt;
        result += 10; // result = result + 10;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
&lt;br /&gt;
        result -= 5; // result = result - 10;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
&lt;br /&gt;
        result *= 3; // result = result * 3;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
&lt;br /&gt;
        result /= 5; // result = result / 5;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
&lt;br /&gt;
        result %= 3;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
10&lt;br /&gt;
5&lt;br /&gt;
15&lt;br /&gt;
3&lt;br /&gt;
0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 유용한 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int result *= x + y * z; // result = result * (x + y * z);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 삼항 연산자 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int score = 95;&lt;br /&gt;
&lt;br /&gt;
char grade = (score &amp;gt; 90) ? 'A' : 'B';&lt;br /&gt;
&lt;br /&gt;
// 아래와 동일한 의미의 코드이다.&lt;br /&gt;
&lt;br /&gt;
int score = 95&lt;br /&gt;
&lt;br /&gt;
char grade;&lt;br /&gt;
if (score &amp;gt; 90)&lt;br /&gt;
    grade = 'A';&lt;br /&gt;
else&lt;br /&gt;
    grade = 'B';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category:컴퓨터프로그래밍및실습]]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=Visual_Studio_Code_%EC%84%A4%EC%B9%98&amp;diff=427</id>
		<title>Visual Studio Code 설치</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=Visual_Studio_Code_%EC%84%A4%EC%B9%98&amp;diff=427"/>
		<updated>2022-08-18T17:08:52Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* Windows Subsystems for Linux (WSL) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Visual Studio Code 다운로드 및 설명서 ===&lt;br /&gt;
* 다운로드 사이트 : https://code.visualstudio.com&lt;br /&gt;
* [https://www.youtube.com/watch?v=K8qVH8V0VvY&amp;amp;t=865s (Youtube) Visual Studio Code 기본 사용법]&lt;br /&gt;
&lt;br /&gt;
=== 한국어 지원 ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / korean 입력&lt;br /&gt;
** Korean Language Pack for Visual Studio Code&lt;br /&gt;
&lt;br /&gt;
=== Java ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / java 입력&lt;br /&gt;
** Extension Pack for Java&lt;br /&gt;
** Debugger for Java&lt;br /&gt;
** Language Support for Java(TM) by RedHat&lt;br /&gt;
** Project Manager for Java&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=JBXdaAXtRjk (Youtube) 2022년 자바(Java) 학습 개발 환경 구축 with Visual Studio Code]&lt;br /&gt;
&lt;br /&gt;
=== 프로젝트 관리 ===&lt;br /&gt;
Java를 이용하여 앱을 개발할 때 Project를 지원한다.&lt;br /&gt;
&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / maven 입력&lt;br /&gt;
** IntelliCode&lt;br /&gt;
** Maven for Java&lt;br /&gt;
** Maven dependency explorer&lt;br /&gt;
&lt;br /&gt;
=== UML(Unified Modeling Language) ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / plantuml 입력&lt;br /&gt;
** PlantUML&lt;br /&gt;
** PlantUML Previewer&lt;br /&gt;
** PlantUML Grammar&lt;br /&gt;
&lt;br /&gt;
* [https://plantuml.com/ko PlantUML 설명서]&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-X) / python 입력&lt;br /&gt;
** Python&lt;br /&gt;
&lt;br /&gt;
=== C/C++ ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-X) / c++ 입력&lt;br /&gt;
** C/C++&lt;br /&gt;
** C/C++ Extension Pack&lt;br /&gt;
** Better C++ Syntax&lt;br /&gt;
** C/C++ Themes&lt;br /&gt;
&lt;br /&gt;
* [https://code.visualstudio.com/docs/cpp/config-mingw MinGW-w64 설치]&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ pacman -Syu   // 설치 후 실행&lt;br /&gt;
$ pacman -Syu   // Run &amp;quot;MSYS2 MSYS&amp;quot; from Start menu.&lt;br /&gt;
$ pacman -S --needed base-devel mingw-w64-x86_64-toolchain&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Path에 C:\msys64\mingw64\bin 등록함&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=MUi4U4oV_p0 (Youtube) VS Code를 이용하여 C++ 개발 환경 설정하기]&lt;br /&gt;
&lt;br /&gt;
=== Windows Subsystems for Linux (WSL) ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-X) / wsl 입력&lt;br /&gt;
** Remote - WSL&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=Visual_Studio_Code_%EC%84%A4%EC%B9%98&amp;diff=426</id>
		<title>Visual Studio Code 설치</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=Visual_Studio_Code_%EC%84%A4%EC%B9%98&amp;diff=426"/>
		<updated>2022-08-18T17:06:25Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* C/C++ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Visual Studio Code 다운로드 및 설명서 ===&lt;br /&gt;
* 다운로드 사이트 : https://code.visualstudio.com&lt;br /&gt;
* [https://www.youtube.com/watch?v=K8qVH8V0VvY&amp;amp;t=865s (Youtube) Visual Studio Code 기본 사용법]&lt;br /&gt;
&lt;br /&gt;
=== 한국어 지원 ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / korean 입력&lt;br /&gt;
** Korean Language Pack for Visual Studio Code&lt;br /&gt;
&lt;br /&gt;
=== Java ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / java 입력&lt;br /&gt;
** Extension Pack for Java&lt;br /&gt;
** Debugger for Java&lt;br /&gt;
** Language Support for Java(TM) by RedHat&lt;br /&gt;
** Project Manager for Java&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=JBXdaAXtRjk (Youtube) 2022년 자바(Java) 학습 개발 환경 구축 with Visual Studio Code]&lt;br /&gt;
&lt;br /&gt;
=== 프로젝트 관리 ===&lt;br /&gt;
Java를 이용하여 앱을 개발할 때 Project를 지원한다.&lt;br /&gt;
&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / maven 입력&lt;br /&gt;
** IntelliCode&lt;br /&gt;
** Maven for Java&lt;br /&gt;
** Maven dependency explorer&lt;br /&gt;
&lt;br /&gt;
=== UML(Unified Modeling Language) ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / plantuml 입력&lt;br /&gt;
** PlantUML&lt;br /&gt;
** PlantUML Previewer&lt;br /&gt;
** PlantUML Grammar&lt;br /&gt;
&lt;br /&gt;
* [https://plantuml.com/ko PlantUML 설명서]&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-X) / python 입력&lt;br /&gt;
** Python&lt;br /&gt;
&lt;br /&gt;
=== C/C++ ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-X) / c++ 입력&lt;br /&gt;
** C/C++&lt;br /&gt;
** C/C++ Extension Pack&lt;br /&gt;
** Better C++ Syntax&lt;br /&gt;
** C/C++ Themes&lt;br /&gt;
&lt;br /&gt;
* [https://code.visualstudio.com/docs/cpp/config-mingw MinGW-w64 설치]&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ pacman -Syu   // 설치 후 실행&lt;br /&gt;
$ pacman -Syu   // Run &amp;quot;MSYS2 MSYS&amp;quot; from Start menu.&lt;br /&gt;
$ pacman -S --needed base-devel mingw-w64-x86_64-toolchain&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Path에 C:\msys64\mingw64\bin 등록함&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=MUi4U4oV_p0 (Youtube) VS Code를 이용하여 C++ 개발 환경 설정하기]&lt;br /&gt;
&lt;br /&gt;
=== Windows Subsystems for Linux (WSL) ===&lt;br /&gt;
* WSL 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-X) / wsl 입력&lt;br /&gt;
** Remote - WSL&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=Visual_Studio_Code_%EC%84%A4%EC%B9%98&amp;diff=425</id>
		<title>Visual Studio Code 설치</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=Visual_Studio_Code_%EC%84%A4%EC%B9%98&amp;diff=425"/>
		<updated>2022-08-18T17:06:18Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Visual Studio Code 다운로드 및 설명서 ===&lt;br /&gt;
* 다운로드 사이트 : https://code.visualstudio.com&lt;br /&gt;
* [https://www.youtube.com/watch?v=K8qVH8V0VvY&amp;amp;t=865s (Youtube) Visual Studio Code 기본 사용법]&lt;br /&gt;
&lt;br /&gt;
=== 한국어 지원 ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / korean 입력&lt;br /&gt;
** Korean Language Pack for Visual Studio Code&lt;br /&gt;
&lt;br /&gt;
=== Java ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / java 입력&lt;br /&gt;
** Extension Pack for Java&lt;br /&gt;
** Debugger for Java&lt;br /&gt;
** Language Support for Java(TM) by RedHat&lt;br /&gt;
** Project Manager for Java&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=JBXdaAXtRjk (Youtube) 2022년 자바(Java) 학습 개발 환경 구축 with Visual Studio Code]&lt;br /&gt;
&lt;br /&gt;
=== 프로젝트 관리 ===&lt;br /&gt;
Java를 이용하여 앱을 개발할 때 Project를 지원한다.&lt;br /&gt;
&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / maven 입력&lt;br /&gt;
** IntelliCode&lt;br /&gt;
** Maven for Java&lt;br /&gt;
** Maven dependency explorer&lt;br /&gt;
&lt;br /&gt;
=== UML(Unified Modeling Language) ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / plantuml 입력&lt;br /&gt;
** PlantUML&lt;br /&gt;
** PlantUML Previewer&lt;br /&gt;
** PlantUML Grammar&lt;br /&gt;
&lt;br /&gt;
* [https://plantuml.com/ko PlantUML 설명서]&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-X) / python 입력&lt;br /&gt;
** Python&lt;br /&gt;
&lt;br /&gt;
=== C/C++ ===&lt;br /&gt;
* C/C++ 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-X) / c++ 입력&lt;br /&gt;
** C/C++&lt;br /&gt;
** C/C++ Extension Pack&lt;br /&gt;
** Better C++ Syntax&lt;br /&gt;
** C/C++ Themes&lt;br /&gt;
&lt;br /&gt;
* [https://code.visualstudio.com/docs/cpp/config-mingw MinGW-w64 설치]&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ pacman -Syu   // 설치 후 실행&lt;br /&gt;
$ pacman -Syu   // Run &amp;quot;MSYS2 MSYS&amp;quot; from Start menu.&lt;br /&gt;
$ pacman -S --needed base-devel mingw-w64-x86_64-toolchain&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Path에 C:\msys64\mingw64\bin 등록함&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=MUi4U4oV_p0 (Youtube) VS Code를 이용하여 C++ 개발 환경 설정하기]&lt;br /&gt;
&lt;br /&gt;
=== Windows Subsystems for Linux (WSL) ===&lt;br /&gt;
* WSL 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-X) / wsl 입력&lt;br /&gt;
** Remote - WSL&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=Visual_Studio_Code_%EC%84%A4%EC%B9%98&amp;diff=424</id>
		<title>Visual Studio Code 설치</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=Visual_Studio_Code_%EC%84%A4%EC%B9%98&amp;diff=424"/>
		<updated>2022-08-18T16:55:43Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* C/C++ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Visual Studio Code 다운로드 및 설명서 ===&lt;br /&gt;
* 다운로드 사이트 : https://code.visualstudio.com&lt;br /&gt;
* [https://www.youtube.com/watch?v=K8qVH8V0VvY&amp;amp;t=865s (Youtube) Visual Studio Code 기본 사용법]&lt;br /&gt;
&lt;br /&gt;
=== 한국어 지원 ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / korean 입력&lt;br /&gt;
** Korean Language Pack for Visual Studio Code&lt;br /&gt;
&lt;br /&gt;
=== Java ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / java 입력&lt;br /&gt;
** Extension Pack for Java&lt;br /&gt;
** Debugger for Java&lt;br /&gt;
** Language Support for Java(TM) by RedHat&lt;br /&gt;
** Project Manager for Java&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=JBXdaAXtRjk (Youtube) 2022년 자바(Java) 학습 개발 환경 구축 with Visual Studio Code]&lt;br /&gt;
&lt;br /&gt;
=== 프로젝트 관리 ===&lt;br /&gt;
Java를 이용하여 앱을 개발할 때 Project를 지원한다.&lt;br /&gt;
&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / maven 입력&lt;br /&gt;
** IntelliCode&lt;br /&gt;
** Maven for Java&lt;br /&gt;
** Maven dependency explorer&lt;br /&gt;
&lt;br /&gt;
=== UML(Unified Modeling Language) ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / plantuml 입력&lt;br /&gt;
** PlantUML&lt;br /&gt;
** PlantUML Previewer&lt;br /&gt;
** PlantUML Grammar&lt;br /&gt;
&lt;br /&gt;
* [https://plantuml.com/ko PlantUML 설명서]&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
* Python 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-X) / python 입력&lt;br /&gt;
** Python&lt;br /&gt;
&lt;br /&gt;
=== C/C++ ===&lt;br /&gt;
* C/C++ 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-X) / c++ 입력&lt;br /&gt;
** C/C++&lt;br /&gt;
** C/C++ Extension Pack&lt;br /&gt;
** Better C++ Syntax&lt;br /&gt;
** C/C++ Themes&lt;br /&gt;
&lt;br /&gt;
* [https://code.visualstudio.com/docs/cpp/config-mingw MinGW-w64 설치]&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ pacman -Syu   // 설치 후 실행&lt;br /&gt;
$ pacman -Syu   // Run &amp;quot;MSYS2 MSYS&amp;quot; from Start menu.&lt;br /&gt;
$ pacman -S --needed base-devel mingw-w64-x86_64-toolchain&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Path에 C:\msys64\mingw64\bin 등록함&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=MUi4U4oV_p0 (Youtube) VS Code를 이용하여 C++ 개발 환경 설정하기]&lt;br /&gt;
&lt;br /&gt;
=== Windows Subsystems for Linux (WSL) ===&lt;br /&gt;
* WSL 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-X) / wsl 입력&lt;br /&gt;
** Remote - WSL&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=Visual_Studio_Code_%EC%84%A4%EC%B9%98&amp;diff=423</id>
		<title>Visual Studio Code 설치</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=Visual_Studio_Code_%EC%84%A4%EC%B9%98&amp;diff=423"/>
		<updated>2022-08-18T16:55:30Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Visual Studio Code 다운로드 및 설명서 ===&lt;br /&gt;
* 다운로드 사이트 : https://code.visualstudio.com&lt;br /&gt;
* [https://www.youtube.com/watch?v=K8qVH8V0VvY&amp;amp;t=865s (Youtube) Visual Studio Code 기본 사용법]&lt;br /&gt;
&lt;br /&gt;
=== 한국어 지원 ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / korean 입력&lt;br /&gt;
** Korean Language Pack for Visual Studio Code&lt;br /&gt;
&lt;br /&gt;
=== Java ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / java 입력&lt;br /&gt;
** Extension Pack for Java&lt;br /&gt;
** Debugger for Java&lt;br /&gt;
** Language Support for Java(TM) by RedHat&lt;br /&gt;
** Project Manager for Java&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=JBXdaAXtRjk (Youtube) 2022년 자바(Java) 학습 개발 환경 구축 with Visual Studio Code]&lt;br /&gt;
&lt;br /&gt;
=== 프로젝트 관리 ===&lt;br /&gt;
Java를 이용하여 앱을 개발할 때 Project를 지원한다.&lt;br /&gt;
&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / maven 입력&lt;br /&gt;
** IntelliCode&lt;br /&gt;
** Maven for Java&lt;br /&gt;
** Maven dependency explorer&lt;br /&gt;
&lt;br /&gt;
=== UML(Unified Modeling Language) ===&lt;br /&gt;
* Vscode extension 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-x) / plantuml 입력&lt;br /&gt;
** PlantUML&lt;br /&gt;
** PlantUML Previewer&lt;br /&gt;
** PlantUML Grammar&lt;br /&gt;
&lt;br /&gt;
* [https://plantuml.com/ko PlantUML 설명서]&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
* Python 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-X) / python 입력&lt;br /&gt;
** Python&lt;br /&gt;
&lt;br /&gt;
=== C/C++ ===&lt;br /&gt;
* PlantUML 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-X) / c++ 입력&lt;br /&gt;
** C/C++&lt;br /&gt;
** C/C++ Extension Pack&lt;br /&gt;
** Better C++ Syntax&lt;br /&gt;
** C/C++ Themes&lt;br /&gt;
&lt;br /&gt;
* [https://code.visualstudio.com/docs/cpp/config-mingw MinGW-w64 설치]&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ pacman -Syu   // 설치 후 실행&lt;br /&gt;
$ pacman -Syu   // Run &amp;quot;MSYS2 MSYS&amp;quot; from Start menu.&lt;br /&gt;
$ pacman -S --needed base-devel mingw-w64-x86_64-toolchain&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Path에 C:\msys64\mingw64\bin 등록함&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=MUi4U4oV_p0 (Youtube) VS Code를 이용하여 C++ 개발 환경 설정하기]&lt;br /&gt;
&lt;br /&gt;
=== Windows Subsystems for Linux (WSL) ===&lt;br /&gt;
* WSL 설치 - 확장(Ctrl-&amp;lt;shift&amp;gt;-X) / wsl 입력&lt;br /&gt;
** Remote - WSL&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1128&amp;diff=422</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/1128</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1128&amp;diff=422"/>
		<updated>2022-07-22T06:57:17Z</updated>

		<summary type="html">&lt;p&gt;Swpark: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JavaFX 컨트롤 ==&lt;br /&gt;
&lt;br /&gt;
=== 버튼 컨트롤 ===&lt;br /&gt;
* ButtonBase를 상속하는 하위 컨트롤&lt;br /&gt;
* Button, CheckBox, RadioButton, ToggleButton, Hyperlink 등&lt;br /&gt;
* p.896 그림 참조&lt;br /&gt;
&lt;br /&gt;
* Button&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button text=&amp;quot;아이콘버튼&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;graphic&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
         &amp;lt;Image url=&amp;quot;@iamges/history_view.gif&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/graphic&amp;gt;&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* selected 속성 - CheckBox, RadioButton, ToggleButton : 선택, 미선택 (selected가 true 혹은 false)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;CheckBox text=&amp;quot;라벨1&amp;quot; userData=&amp;quot;값1&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;CheckBox text=&amp;quot;라벨2&amp;quot; userData=&amp;quot;값2&amp;quot; selected=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* toggleGroup 속성 - RadioButton, ToggleButton : 하나의 그룹으로 묶이고, 그룹 내에서는 하나만 선택&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fx:deine&amp;gt;&lt;br /&gt;
   &amp;lt;ToggleGroup fx:=id=&amp;quot;groupName&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/fx:define&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;RadioButton text=&amp;quot;라벨1&amp;quot; userData=&amp;quot;값1&amp;quot; toggleGroup=&amp;quot;$groupName&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;RadioButton text=&amp;quot;라벨2&amp;quot; userData=&amp;quot;값2&amp;quot; toggleGroup=&amp;quot;$groupName&amp;quot; selected=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ActionEvent 발생 - CheckBox, RadioButton, ToggleButton : 컨트롤을 사용하가 클릭할 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;CheckBox ... onAction=&amp;quot;#handleChkAction&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* RadioButton, ToggleButton 그룹 내에서 선택 변경을 감시하고 싶다면&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
groupName.selectedToggleProperty().addListener(new ChangeListener&amp;lt;Toggle&amp;gt; {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void changed(ObservableValue&amp;lt;? extends Toggle&amp;gt; observable, Toggle oldValue, Toggle newValue) {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.RadioButton?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.CheckBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Separator?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.ToggleGroup?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;ch17.p897.RootController&amp;quot; prefHeight=&amp;quot;150.0&amp;quot; prefWidth=&amp;quot;420.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;HBox alignment=&amp;quot;CENTER&amp;quot; prefHeight=&amp;quot;100.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot; spacing=&amp;quot;10&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;VBox prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;100.0&amp;quot; spacing=&amp;quot;20.0&amp;quot; alignment=&amp;quot;CENTER_LEFT&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;children&amp;gt;&lt;br /&gt;
                  &amp;lt;CheckBox fx:id=&amp;quot;chk1&amp;quot; text=&amp;quot;안경&amp;quot; onAction=&amp;quot;#handleChkAction&amp;quot; /&amp;gt;&lt;br /&gt;
                  &amp;lt;CheckBox fx:id=&amp;quot;chk2&amp;quot; text=&amp;quot;모자&amp;quot; onAction=&amp;quot;#handleChkAction&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/children&amp;gt;&lt;br /&gt;
            &amp;lt;/VBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;ImageView fx:id=&amp;quot;checkImageView&amp;quot; fitWidth=&amp;quot;200.0&amp;quot; preserveRatio=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/geek.gif&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
            &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;Separator orientation=&amp;quot;VERTICAL&amp;quot; prefHeight=&amp;quot;200.0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;VBox prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;100.0&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;fx:define&amp;gt;&lt;br /&gt;
                  &amp;lt;ToggleGroup fx:id=&amp;quot;group&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/fx:define&amp;gt;&lt;br /&gt;
&lt;br /&gt;
               &amp;lt;children&amp;gt;&lt;br /&gt;
                  &amp;lt;RadioButton fx:id=&amp;quot;rad1&amp;quot; text=&amp;quot;BubbleChart&amp;quot; userData=&amp;quot;BubbleChart&amp;quot; toggleGroup=&amp;quot;$group&amp;quot;/&amp;gt;&lt;br /&gt;
                  &amp;lt;RadioButton fx:id=&amp;quot;rad2&amp;quot; text=&amp;quot;BarChart&amp;quot; userData=&amp;quot;BarChart&amp;quot; toggleGroup=&amp;quot;$group&amp;quot; selected=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
                  &amp;lt;RadioButton fx:id=&amp;quot;rad3&amp;quot; text=&amp;quot;AreaChart&amp;quot; userData=&amp;quot;AreaChart&amp;quot; toggleGroup=&amp;quot;$group&amp;quot;/&amp;gt;&lt;br /&gt;
               &amp;lt;/children&amp;gt;&lt;br /&gt;
            &amp;lt;/VBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;ImageView fx:id=&amp;quot;radioImageView&amp;quot; fitHeight=&amp;quot;100.0&amp;quot; preserveRatio=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
               &amp;lt;image&amp;gt;&lt;br /&gt;
                  &amp;lt;Image url=&amp;quot;@images/BarChart.png&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/image&amp;gt;&lt;br /&gt;
            &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btnExit&amp;quot; BorderPane.alignment=&amp;quot;CENTER&amp;quot; onAction=&amp;quot;#handleBtnExitAction&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;graphic&amp;gt;&lt;br /&gt;
            &amp;lt;ImageView&amp;gt;&lt;br /&gt;
               &amp;lt;Image url=&amp;quot;@images/exit.png&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
         &amp;lt;/graphic&amp;gt;&lt;br /&gt;
         &amp;lt;BorderPane.margin&amp;gt;&lt;br /&gt;
            &amp;lt;Insets top=&amp;quot;20.0&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/BorderPane.margin&amp;gt;&lt;br /&gt;
      &amp;lt;/Button&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p897;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Platform;&lt;br /&gt;
import javafx.beans.value.ChangeListener;&lt;br /&gt;
import javafx.beans.value.ObservableValue;&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.CheckBox;&lt;br /&gt;
import javafx.scene.control.Toggle;&lt;br /&gt;
import javafx.scene.control.ToggleGroup;&lt;br /&gt;
import javafx.scene.image.Image;&lt;br /&gt;
import javafx.scene.image.ImageView;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private CheckBox chk1;&lt;br /&gt;
    @FXML private CheckBox chk2;&lt;br /&gt;
    @FXML private ImageView checkImageView;&lt;br /&gt;
    @FXML private ToggleGroup group;&lt;br /&gt;
    @FXML private ImageView radioImageView;&lt;br /&gt;
    @FXML private Button btnExit;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        group.selectedToggleProperty().addListener(new ChangeListener&amp;lt;Toggle&amp;gt;() {&lt;br /&gt;
&lt;br /&gt;
            @Override&lt;br /&gt;
            public void changed(ObservableValue&amp;lt;? extends Toggle&amp;gt; observable, Toggle oldValue, Toggle newValue) {&lt;br /&gt;
                Image image = new Image(getClass().getResource(&amp;quot;images/&amp;quot; +&lt;br /&gt;
                                        newValue.getUserData().toString() + &amp;quot;.png&amp;quot;).toString());&lt;br /&gt;
                radioImageView.setImage(image);                &lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // CheckBox 이벤트 처리&lt;br /&gt;
    public void handleChkAction(ActionEvent e) {&lt;br /&gt;
        if (chk1.isSelected() &amp;amp;&amp;amp; chk2.isSelected()) {&lt;br /&gt;
            checkImageView.setImage(new Image(getClass().getResource(&amp;quot;images/geek-glasses-hair.gif&amp;quot;).toString()));&lt;br /&gt;
        } else if (chk1.isSelected()) {&lt;br /&gt;
            checkImageView.setImage(new Image(getClass().getResource(&amp;quot;images/geek-glasses.gif&amp;quot;).toString()));&lt;br /&gt;
        } else if (chk2.isSelected()) {&lt;br /&gt;
            checkImageView.setImage(new Image(getClass().getResource(&amp;quot;images/geek-hair.gif&amp;quot;).toString()));&lt;br /&gt;
        } else {&lt;br /&gt;
            checkImageView.setImage(new Image(getClass().getResource(&amp;quot;images/geek.gif&amp;quot;).toString()));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Button 이벤트 처리&lt;br /&gt;
    public void handleBtnExitAction(ActionEvent e) {&lt;br /&gt;
        Platform.exit();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 입력 컨트롤 ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 뷰 컨트롤 ===&lt;br /&gt;
&lt;br /&gt;
==== ImageView 컨트롤 ====&lt;br /&gt;
&lt;br /&gt;
==== ListView 컨트롤 ====&lt;br /&gt;
&lt;br /&gt;
==== TableView 컨트롤 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 미디어 컨트롤 ===&lt;br /&gt;
&lt;br /&gt;
==== Slider 컨트롤 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ProgressBar와 ProgressIndicator 컨트롤 ====&lt;br /&gt;
&lt;br /&gt;
=== 차트 컨트롤 ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== JavaFX 메뉴바(MenuBar)와 툴바(Toolbar) ==&lt;br /&gt;
&lt;br /&gt;
=== MenuBar 컨트롤 ===&lt;br /&gt;
&lt;br /&gt;
=== ToolBar 컨트롤 ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== JavaFX 다이얼로그(Dialog) ==&lt;br /&gt;
&lt;br /&gt;
=== FileChooser, DirectoryChooser ===&lt;br /&gt;
&lt;br /&gt;
=== Popup ===&lt;br /&gt;
&lt;br /&gt;
=== Custom Dialog ===&lt;br /&gt;
&lt;br /&gt;
=== 컨트롤러에서 primaryStage 사용 ===&lt;br /&gt;
&lt;br /&gt;
==== 메인 클래스에 전달하는 방법 ====&lt;br /&gt;
&lt;br /&gt;
==== 컨테이너 또는 컨트롤로부터 얻는 방법 ====&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=421</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/1124</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=421"/>
		<updated>2022-07-22T06:01:54Z</updated>

		<summary type="html">&lt;p&gt;Swpark: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JavaFX 개요 ==&lt;br /&gt;
# AWT&lt;br /&gt;
#* Native UI 컴포넌트 사용&lt;br /&gt;
#* 운영체제 마다 UI 모양이 다름&lt;br /&gt;
# Swing&lt;br /&gt;
#* 운영체제가 제공하는 native UI 사용 안 함&lt;br /&gt;
#* 운영체제가 새롭게 제공하는 UI 지원의 어려움&lt;br /&gt;
# JavaFX&lt;br /&gt;
#* Abode의 flash, Microsoft의 silverlight의 대항마&lt;br /&gt;
#* JDK 7부터 지원. JDK 8 권장.&lt;br /&gt;
#* JDK 11부터는 별도로 설치해야 함.&lt;br /&gt;
#* 화면 레이아웃과 스타일, 애플리케이션 로직 분리&lt;br /&gt;
#* Java 코드와 분리해서 스타일 시트(CSS)로 외관 작성 → 개발자와 디자이너의 동시 개발 가능&lt;br /&gt;
#* Java 코드에서도 레이아웃과 애플리케이션 로직을 분리하고 싶다면 레이아웃은 FXML로 작성, 로직은 Java로 작성&lt;br /&gt;
#* JavaFX 애플리케이션 구성 요소&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;50&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[레이아웃]'''&amp;lt;br/&amp;gt;자바 코드 파일&amp;lt;/br&amp;gt;또는 FXML 파일&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[외관 및 스타일]'''&amp;lt;br/&amp;gt;CSS 파일&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[리소스]'''&amp;lt;br/&amp;gt;그림 파일&amp;lt;br/&amp;gt;동영상 파일&amp;lt;br/&amp;gt;... &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[비즈니스 로직]'''&amp;lt;br/&amp;gt;자바 코드 파일&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JavaFX 애플리케이션 개발 시작 ==&lt;br /&gt;
=== 메인 클래스 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX 라이프사이클(life cycle) ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
    public AppMain() {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: AppMain() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: init() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: start() 호출&amp;quot;);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public void stop() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: stop() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: main() 호출&amp;quot;);&lt;br /&gt;
        launch(args);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
main: main() 호출&lt;br /&gt;
JavaFX Application Thread: AppMain() 호출&lt;br /&gt;
JavaFX-Launcher: init() 호출&lt;br /&gt;
JavaFX Application Thread: start() 호출&lt;br /&gt;
JavaFX Application Thread: stop() 호출 ← 프로그램을 끝내야 실행된다.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 메일 클래스 실행 매개값 얻기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
C:&amp;gt; java AppMain --ip=192.168.0.5 --port=50001&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* main()에서 launch(args)를 넘겨 받음&lt;br /&gt;
* init() 메소드에서 아래와 같이 실행할 수 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parameters params = getParameters();&lt;br /&gt;
List&amp;lt;String&amp;gt; list = params.getRaw();&lt;br /&gt;
Map&amp;lt;String, String&amp;gt; map = params.getNamed();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 무대(Stage)와 장면(Scene) ===&lt;br /&gt;
* 윈도우 : Stage&lt;br /&gt;
* Stage에는 하나의 Scene을 가질 수 있음&lt;br /&gt;
* Scene은 직접 생성해야 함&lt;br /&gt;
&lt;br /&gt;
[[file:CP2022_ch17.2_AppMain.png|thumb|AppMain 실행화면]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.application.Platform;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.layout.VBox;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        VBox root = new VBox();&lt;br /&gt;
        root.setPrefWidth(350);&lt;br /&gt;
        root.setPrefHeight(150);&lt;br /&gt;
        root.setAlignment(Pos.CENTER);&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Label label = new Label();&lt;br /&gt;
        label.setText(&amp;quot;Hello, JavaFX&amp;quot;);&lt;br /&gt;
        label.setFont(new Font(50));&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
        button.setOnAction(event-&amp;gt;Platform.exit());&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().add(label);&lt;br /&gt;
        root.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(root); // VBox를 루트 컨테이너(root container)로 해서 Scene 생성&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain입니다&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene); // 윈도우에 장면 설정&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 레이아웃 ==&lt;br /&gt;
=== 프로그램적 레이아웃 ===&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | 프로그램적 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.collections.ObservableList;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.TextField;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(10));&lt;br /&gt;
        hbox.setSpacing(10);&lt;br /&gt;
&lt;br /&gt;
        TextField textField = new TextField();&lt;br /&gt;
        textField.setPrefWidth(200);&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ObservableList list = hbox.getChildren();&lt;br /&gt;
        list.add(textField);&lt;br /&gt;
        list.add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 레이아웃 ===&lt;br /&gt;
* FXML 파일 (root.fxml)&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | FXML 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;padding&amp;gt;&lt;br /&gt;
        &amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/padding&amp;gt;&lt;br /&gt;
    &amp;lt;spacing&amp;gt;10&amp;lt;/spacing&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;children&amp;gt;&lt;br /&gt;
        &amp;lt;TextField&amp;gt;&lt;br /&gt;
            &amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&lt;br /&gt;
        &amp;lt;/TextField&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
    &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* AppMain 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;)); // ← FXML 로드&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 레이아웃(layout) 여백: 패딩(padding)과 마진(margin) ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cll&amp;gt;&lt;br /&gt;
구분      | HBox의 패딩                                                        | Button의 마진&lt;br /&gt;
개념      | [[file:CP-17.3.3-padding.png]]                                     | [[file:CP-17.3.3-margin.png]]&lt;br /&gt;
자바 코드 | HBox hbox = new HBox();&amp;lt;br/&amp;gt;'''hbox.setPadding(new Insets(50))'''; | Button button = new Button();&amp;lt;br/&amp;gt;'''HBox.setMargin(button, new Insets(50));'''&lt;br /&gt;
FXML 태그 | &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt; | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;HBox.margin&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Hbox.margin&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Margin, Padding 설정 방법&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// top, right, bottom, left를 모두 동일한 값으로 설정할 때&lt;br /&gt;
// Insets(double topRightBottomLeft)&lt;br /&gt;
new Insets(50);&lt;br /&gt;
&lt;br /&gt;
// top, right, bottom, left를 다를 값으로 설정할 때&lt;br /&gt;
// Insets(double top, double right, double bottom, double left)&lt;br /&gt;
new Insets(10, 20, 30, 40);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 패딩과 마진 적용 예&lt;br /&gt;
[[file:CP-17.3.3-AppMain.png|thumb|패딩과 마진 적용 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        // 패딩 설정&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(50, 10, 10, 50));&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setPrefSize(100, 100);&lt;br /&gt;
        &lt;br /&gt;
        // 마진 설정&lt;br /&gt;
        // HBox hbox = new HBox();&lt;br /&gt;
        // Button button = new Button();&lt;br /&gt;
        // button.setPrefSize(100, 100);&lt;br /&gt;
        // HBox.setMargin(button, new Insets(10, 10, 50, 50));&lt;br /&gt;
&lt;br /&gt;
        hbox.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 작성 규칙 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
TextField textField = new TextField();&amp;lt;br/&amp;gt;textField.setPrefWidth(200);&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/TextField&amp;gt;&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}   |  &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
ObsetvableList list = hbox.getChildren();&amp;lt;br/&amp;gt;list.add(textField);&amp;lt;br/&amp;gt;list.add(button);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;children&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Button&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 패키지(package) 선언 ====&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                          |   FXML 태그&lt;br /&gt;
import javafx.scene.layout.HBox;   |   &amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
import javafx.scene.control.*;     |   &amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;?import?&amp;gt;가 들어가는 위치는 &amp;lt;?xml ...&amp;gt;와 루트 컨테이너 태그 사이이다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;루트 컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/루트 컨테이너&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* import를 제대로 하지 않으면 not a valid type 메시지와 함께 javafx.fxml.LoadException 발생&lt;br /&gt;
&lt;br /&gt;
==== 태그(tag) 선언 ====&lt;br /&gt;
* 시작 태그와 끝 태그가 매칭되어야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 속성(attribute) 선언 ====&lt;br /&gt;
* 속성은 &amp;quot;나 '로 감싸야 한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;태그이름 속성명=&amp;quot;값&amp;quot; 속성명='값'&amp;gt; ... &amp;lt;/태그이름&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 속성명은 Setter 메소드 명이 옴&lt;br /&gt;
* 모든 Setter가 사용될 수 있는 것은 아님. 기본 타입(boolean, byte, short, char, int, long, float, double)의 값을 세팅하거나, String을 세팅하는 Setter만 올 수 있음&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML (Setter 태그)                                    | FXML (Setter 속성)&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;   | &amp;lt;Button text=&amp;quot;확인&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 객체 선언 ====&lt;br /&gt;
===== 클래스 속성 =====&lt;br /&gt;
* 생성자에 매개 변수가 있고, 매개 변수에 @NamedArg(javafx.beans.NamedArg) 어노테이션이 적용되어 있으면 속성명이나 자식 태그로 작성할 수 있음&lt;br /&gt;
&amp;lt;table2 class=wikitable sep=bar align=ll&amp;gt;&lt;br /&gt;
&amp;lt;클래스 매개변수=&amp;quot;값&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}     | &amp;lt;클래스&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;매개변수&amp;gt;값&amp;lt;/매개변수&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/클래스&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
** HBox를 패딩할 때 setPadding(Insets value) 메소드를 사용하는데&lt;br /&gt;
** Insets는 기본 생성자가 없고,&lt;br /&gt;
** Insets(double topRightBottomLeft) 또는 Insets(double top, double right, double bottom, double left)만 있음&lt;br /&gt;
** 이 경우 아래와 같이 선언 가능함&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:value =====&lt;br /&gt;
* 클래스가 valueOf(String) 메소드를 제공하는 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:value=&amp;quot;값&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
String.valueOf(&amp;quot;Hello, World!&amp;quot;);&amp;lt;br/&amp;gt;Integer.valueOf(&amp;quot;1&amp;quot;);&amp;lt;br/&amp;gt;Double.valueOf(&amp;quot;1.0&amp;quot;);&amp;lt;br/&amp;gt;Boolean.valueOf(&amp;quot;false&amp;quot;);  |  &amp;lt;String fx:value=&amp;quot;Hello, World!&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Integer fx:value=&amp;quot;1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Double fx:value=&amp;quot;1.0&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Boolean fx:value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:constant =====&lt;br /&gt;
*클래스에 정의된 상수값을 얻고 싶을 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:constant=&amp;quot;상수&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setMaxWidth( Double.MAX_VALUE );&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;maxWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/maxWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:factory =====&lt;br /&gt;
* 어떤 클래스는 new 연산자로 객체를 생성할 수 없고,&lt;br /&gt;
* 정적 메소드(이를 factory 메소드라 부른다)로 객체를 얻어야 하는 경우가 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:factory=&amp;quot;정적메소드&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예: &amp;lt;code&amp;gt;ObservableList&amp;lt;/code&amp;gt;의 구현 객체는 &amp;lt;code&amp;gt;javafx.collections.FXCollections&amp;lt;/code&amp;gt;의 정적 메소드인 &amp;lt;code&amp;gt;observableArrayList(E... items)&amp;lt;/code&amp;gt; 메소드로 얻을 수 있다.&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
ComboBox combo = new ComboBox();&amp;lt;br/&amp;gt;combo.setItems(FXCollections.observableArrayList(&amp;quot;공개&amp;quot;, &amp;quot;비공개&amp;quot;));&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;ComboBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Items&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;FXCollections fx:factory=&amp;quot;observableArrayList&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;비공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;/FXCollections&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/items&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/ComboBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 로딩과 Scene 생성 ===&lt;br /&gt;
* FXML 파일을 작성한 후 이를 이용하여 객체를 만들어야 한다. 이를 '''FXML loading'''이라고 한다.&lt;br /&gt;
* javafx.fxml.FXMLLoader를 이용&lt;br /&gt;
** 두 개의 load() 메소드 : 정적 메소드, 인스턴스 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* getClass() - 현재 클래스 리턴&lt;br /&gt;
* getResource() - 클래스가 위치하는 곳에서 상대 경로로 리소스의 URL을 리턴&lt;br /&gt;
* load() - FXML 파일을 로딩&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
FXMLLoader loader = new FXMLLoader(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
Parent root = (Parent)loader.load();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* load() - Parent 타입을 리턴함. 이것은 FXML 파일에서의 루트 태그로 선언된 컨테이너임&lt;br /&gt;
* 만을 루트 태그가 &amp;lt;HBox&amp;gt; 라면 다음과 같이 작성해도 됨&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
HBox hbox = (HBox) FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX Scene Builder ===&lt;br /&gt;
[[file:CP-SceneBuilder-1.png | thumb | Scene Builder로 root.fxml 띄움]]&lt;br /&gt;
* Scene Builder 다운로드 - https://gluonhq.com/products/scene-builder/&lt;br /&gt;
* [https://marketplace.visualstudio.com/items?itemName=bilalekrem.scenebuilderextension SceneBuilder extension for Visual Studio Code]&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 눌러 &amp;quot;Configure Scene Builder path&amp;quot;를 실행한다.&lt;br /&gt;
*** 경로를 다음과 같이 지정한다 : C:\Users\profs\AppData\Local\SceneBuilder 폴더의 SceneBuilder.exe 지정&lt;br /&gt;
&lt;br /&gt;
* Scene Builder 띄우는 방법&lt;br /&gt;
** fxml 파일을 선택한다.&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 누른다.&lt;br /&gt;
&lt;br /&gt;
== JavaFX 컨테이너 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
컨테이너   | 설명&lt;br /&gt;
AnchorPane | 컨트롤을 좌표로 배치하는 레이아웃&lt;br /&gt;
BorderPane | 위, 아래, 오른쪽, 왼쪽, 중앙에 컨트롤을 배치하는 레이아웃&lt;br /&gt;
FlowPane   | 행으로 배치하되 공간이 부족하면 새로운 행에 배치하는 레이아웃&lt;br /&gt;
GridPane   | 그리드로 배치하되 셀의 크기가 고정적이지 않은 레이아웃&lt;br /&gt;
StackPane  | 컨트롤을 겹쳐서 배치하는 레이아웃&lt;br /&gt;
TilePane   | 그리드로 배치하되 고정된 셀의 크기를 갖는 레이아웃&lt;br /&gt;
HBox       | 수평으로 배치하는 레이아웃&lt;br /&gt;
VBox       | 수직으로 배치하는 레이아웃&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AnchorPane 컨테이너 ===&lt;br /&gt;
[[file:CP-17.4.1-1.png]]&lt;br /&gt;
&lt;br /&gt;
* AnchorPane에서 사용할 수 있는 주요 설정&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명            | 적용&lt;br /&gt;
PrefWidth    | 폭을 설정       | AnchorPane&lt;br /&gt;
PrefHeight   | 높이를 설정     | AnchorPane&lt;br /&gt;
layoutX      | 컨트롤의 X 좌표 | 컨트롤&lt;br /&gt;
layoutY      | 컨트롤의 Y 좌표 | 컨트롤&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함   | AnchorPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.1-2.png | thumb | AnchorPane (Scene Builder)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.PasswordField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;150.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;28.0&amp;quot; text=&amp;quot;아이디&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;66.0&amp;quot; text=&amp;quot;패스워드&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;24.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;PasswordField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;62.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;97.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;164.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBox와 VBox 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                         | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                    | HBox, VBox&lt;br /&gt;
prefHeight   | 높이를 설정                  | HBox, VBox &lt;br /&gt;
alignment    | 컨트롤의 정렬을 설정         | HBox, VBox &lt;br /&gt;
spacing      | 컨트롤의 간격을 설정         | HBox, VBox&lt;br /&gt;
fillWidth    | 컨트롤의 폭 확장 여부 설정   | VBox&lt;br /&gt;
fillHeight   | 컨트롤의 높이 확장 여부 설정 | HBox&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함                | HBox, VBox&lt;br /&gt;
&amp;lt;HBox.hgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; | HBox의 남은 폭을 채움   | 컨트롤&lt;br /&gt;
&amp;lt;VBox.vgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/VBox.vgrow&amp;gt; | VBox의 남을 높이를 채움 | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root2.fxml&lt;br /&gt;
** 이 패키지의 하위 폴더로 &amp;lt;code&amp;gt;images&amp;lt;/code&amp;gt;를 만들고 여기에 javafx.png 파일을 복사해 넣어둔다. [[file:javafx.png | thumb | javafx.png]]&lt;br /&gt;
[[file:CP-17.4.3-project.png | thumb | images 폴더]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import java.lang.Double?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.Priority?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitWidth=&amp;quot;200.0&amp;quot; preserveRatio=&amp;quot;true&amp;quot;&amp;gt; &amp;lt;!-- 그림의 비율에 맞게 높이를 설정 --&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&lt;br /&gt;
          &amp;lt;Image url=&amp;quot;@images/javafx.png&amp;quot; /&amp;gt; &amp;lt;!-- 현재 경로 기준으로 상대경로로 파일 지정 --&amp;gt;&lt;br /&gt;
        &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;HBox alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;이전&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;다음&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;HBox.hgrow&amp;gt;&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; &amp;lt;!-- 오른쪽 남은 공간을 버튼이 모두 채우도록 설정 --&amp;gt;&lt;br /&gt;
              &amp;lt;maxWidth&amp;gt;&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;/maxWidth&amp;gt; &amp;lt;!-- 버튼의 폭을 자동으로 확장하기 위해 설정--&amp;gt;&lt;br /&gt;
            &amp;lt;/Button&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
         &amp;lt;VBox.margin&amp;gt;&lt;br /&gt;
           &amp;lt;Insets top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/VBox.margin&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.4.3-p874.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root2.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BorderPane 컨테이너 ===&lt;br /&gt;
* top, bottom, left, right, center 셀에 컨트롤을 배치하는 컨테이너&lt;br /&gt;
* 다른 컨테이너를 배치할 수도 있음&lt;br /&gt;
* 각 셀에는 '''하나'''의 컨트롤 또는 컨테이너만 배치할 수 있음&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-1.png | 250px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                           | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                      | BorderPane&lt;br /&gt;
prefHeight   | 높이를 설정                    | BorderPane&lt;br /&gt;
&amp;lt;top&amp;gt;        | top에 배치될 컨트롤을 포함     | BorderPane&lt;br /&gt;
&amp;lt;bottom&amp;gt;     | bottom에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;right&amp;gt;      | right에 배치될 컨트롤을 포함   | BorderPane&lt;br /&gt;
&amp;lt;left&amp;gt;       | left에 배치될 컨트롤을 포함    | BorderPane&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;center&amp;gt;&amp;lt;/nowiki&amp;gt;     | center에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.ToolBar?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;top&amp;gt;&lt;br /&gt;
      &amp;lt;ToolBar prefHeight=&amp;quot;40.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot; BorderPane.alignment=&amp;quot;CENTER&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;items&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/items&amp;gt;&lt;br /&gt;
      &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
   &amp;lt;/top&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea /&amp;gt; &amp;lt;!-- left와 right까지 확장--&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;BorderPane&amp;gt;&lt;br /&gt;
         &amp;lt;center&amp;gt;&lt;br /&gt;
           &amp;lt;TextField /&amp;gt; &amp;lt;!-- top, bottom, left까지 확장--&amp;gt;&lt;br /&gt;
         &amp;lt;/center&amp;gt;&lt;br /&gt;
         &amp;lt;right&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/right&amp;gt;&lt;br /&gt;
      &amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FlowPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                      | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                 | FlowPane&lt;br /&gt;
prefHeight   | 높이를 설정               | FlowPane&lt;br /&gt;
hgap         | 컨트롤의 수평 간격을 설정 | FlowPane&lt;br /&gt;
vgap         | 컨트롤의 수직 간격을 설정 | FlowPane&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함             |  FlowPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.5-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.FlowPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;FlowPane prefHeight=&amp;quot;70.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/FlowPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TilePane 컨테이너 ===&lt;br /&gt;
* 그리드로 컨트롤을 배치하되 고정된 셀(타일) 크기를 갖는 컨테이너&lt;br /&gt;
* 오른쪽에 배치할 공간이 부족하면 새로운 행에 컨트롤을 배치함&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-TilePane.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성   | 설명               | 적용&lt;br /&gt;
prefWidth      | 폭을 설정          | TilePane&lt;br /&gt;
prefHeight     | 높이를 설정        | TilePane&lt;br /&gt;
prefTileWidth  | 타일의 폭을 설정   | TilePane&lt;br /&gt;
prefTileHeight | 타일의 높이를 설정 | TilePane&lt;br /&gt;
&amp;lt;children&amp;gt;     | 컨트롤을 포함      | TilePane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:fruit1.jpg | fruit1.jpg&lt;br /&gt;
file:fruit2.jpg | fruit2.jpg&lt;br /&gt;
file:fruit3.jpg | fruit3.jpg&lt;br /&gt;
file:fruit4.jpg | fruit4.jpg&lt;br /&gt;
file:fruit5.jpg | fruit5.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.TilePane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TilePane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;100.0&amp;quot; prefWidth=&amp;quot;100.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit1.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit2.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit3.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit4.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit5.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/TilePane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GridPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성         | 설명                                 | 적용&lt;br /&gt;
prefWidth            | 폭을 설정                            | GridPane&lt;br /&gt;
prefHeight           | 놎이를 설정                          | GridPane&lt;br /&gt;
hgap                 | 수평 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
vgap                 | 수직 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
&amp;lt;children&amp;gt;           | 컨트롤을 포함                        | GridPane&lt;br /&gt;
GridPane.rowIndex    | 컨트롤이 위치하는 행 인덱스를 설정   | 컨트롤&lt;br /&gt;
GridPane.columnIndex | 컨트롤이 위치하는 컬럼 인덱스를 설정 | 컨트롤&lt;br /&gt;
GridPane.rowSpan     | 행 병합 수를 설정                    | 컨트롤&lt;br /&gt;
GridPane.columnSpan  | 컬럼 병합 수를 설정                  | 컨트롤&lt;br /&gt;
GridPane.hgrow       | 수평 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.vgrow       | 수직 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.halignment  | 컨트롤의 수평 정렬을 설정            | 컨트롤&lt;br /&gt;
GridPane.valignment  | 컨트롤의 수직 정렬을 설정            | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.7-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.ColumnConstraints?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.GridPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.RowConstraints?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GridPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; hgap=&amp;quot;10.0&amp;quot; vgap=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets topRightBottomLeft=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;아이디&amp;quot; GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;패스워드&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.columnIndex=&amp;quot;1&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
      &amp;lt;HBox GridPane.rowIndex=&amp;quot;2&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot;&lt;br /&gt;
                 GridPane.columnSpan=&amp;quot;2&amp;quot; GridPane.hgrow=&amp;quot;ALWAYS&amp;quot;&lt;br /&gt;
                 alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot; &amp;gt;  &amp;lt;!-- 컬럼 2개 병합 --&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/GridPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== StackPane 컨테이너 ===&lt;br /&gt;
* 컨트롤을 겹쳐 배치하는 컨테이너&lt;br /&gt;
* 카드 레이아웃(Card Layout)이라고도 함&lt;br /&gt;
* 만약 위에 있는 컨트롤이 투명하다면 밑에 있는 컨트롤이 겹쳐 보임&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:duke.jpg | duke.jpg&lt;br /&gt;
file:snow.jpg | snow.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.8-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.StackPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;StackPane  xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;300.0&amp;quot; prefWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitHeight=&amp;quot;300.0&amp;quot; fitWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/snow.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView preserveRatio=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/duke.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/StackPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 이벤트 처리 ==&lt;br /&gt;
&lt;br /&gt;
=== 이벤트 핸들러(EventHandler) ===&lt;br /&gt;
* JavaFX는 이벤트 발생 콘트롤과 이벤트 핸들러(EventHandler)를 분리하는 위임형(Delegation&amp;lt;ref&amp;gt;Design Pattern 중 Delegation Pattern&amp;lt;/ref&amp;gt;) 방식을 사용함&lt;br /&gt;
* 이를 위해 먼저 컨트롤에 EventHandler를 등록해야 함 (setOnXXX() 메소드. 예: setOnAction())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cccc&amp;gt;&lt;br /&gt;
컨트롤(control) | 사건        | 이벤트(event) 발생 | 이벤트 처리 담당 객체 | 이벤트 처리 메소드 실행 | 이벤트 처리 효과&lt;br /&gt;
Button          | 버튼을 누름 | ActionEvent        | EventHandler          | public void handle(...) {&amp;lt;br/&amp;gt;{{sp2}}이벤트 처리&amp;lt;/br/&amp;gt;} | 1. 윈도우 닫기&amp;lt;br/&amp;gt;2. 컨트롤 내용 변경&amp;lt;br/&amp;gt;3. 다이얼로그 띄우기&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Button 클릭 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Button button = new Button();&lt;br /&gt;
button.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(ActionEvent event) { ... }&lt;br /&gt;
}):&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* TableView에서 행을 마우스로 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TableView tableView = new TableView();&lt;br /&gt;
tableView.setOnMouseClicked(new EventHandler&amp;lt;MouseEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(MouseEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 윈도우 우측 상단(x) 버튼 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
stage.setOnCloseRequest(new EventHandler&amp;lt;WindowEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(WindowEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* EventHandler는 하나의 메소드를 가진 함수적 인터페이스이므로 람다식을 이용하여 이벤트 등록 가능&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
button.setOnAction( event-&amp;gt;{ ... } );&lt;br /&gt;
tableView.setOnMouseClicked( event-&amp;gt;{ ... } );&lt;br /&gt;
stage.setOnCloseRequest( event-&amp;gt;{ ... } );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.1-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox root = new HBox();&lt;br /&gt;
        root.setPrefSize(200, 50);&lt;br /&gt;
        root.setAlignment(Pos.CENTER); // 수평 중앙 정렬&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Button btn1 = new Button(&amp;quot;버튼1&amp;quot;);&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        Button btn2 = new Button(&amp;quot;버튼2&amp;quot;);&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;System.out.println(&amp;quot;버튼2 클릭&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().addAll(btn1, btn2); // HBox에 btn1과 btn2를 추가&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.setOnCloseRequest(event-&amp;gt;System.out.println(&amp;quot;종료 클릭&amp;quot;));&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FXML 컨트롤러(Controller) ===&lt;br /&gt;
&lt;br /&gt;
==== fx:controller 속성과 컨트롤러 클래스 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;루트컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;packageName.ControllerName&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/루트컨트롤러&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fx:id 속성과 @FXML 컨트롤 주입 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
      fx:controller=&amp;quot;sec05.exam02_fxml_controller.RootController&amp;quot;&lt;br /&gt;
      prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
      alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @FXML private Button btn1;&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML&lt;br /&gt;
    private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EventHandler 등록 ====&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.2-실행결과.png| thumb | 실행 결과]]&lt;br /&gt;
* AppMain.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* RootController.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private Button btn1; // import javafx.fxml.FXML 필요&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() { // 직접 EventHandler 생성 후 등록&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                handleBtn1Action(event);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;handleBtn2Action(event)); // 람다식 이용&lt;br /&gt;
        // btn3.setOnAction(event-&amp;gt;handleBtn3Action(event));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void handleBtn1Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void handleBtn2Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼2 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void handleBtn3Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼3 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root.xml&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
    fx:controller=&amp;quot;ch17.p889.RootController&amp;quot;&lt;br /&gt;
    prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
    alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; onAction=&amp;quot;#handleBtn3Action&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 이벤트 처리 메소드 매핑 ====&lt;br /&gt;
* FXML 파일&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button fx:id=&amp;quot;btn&amp;quot; text=&amp;quot;버튼&amp;quot; onAction=&amp;quot;#handleBtnAction&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Controller 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void handleBtnAction(ActionEvent event) { ... }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 속성 감시와 바인딩 ==&lt;br /&gt;
&lt;br /&gt;
=== 속성 감시 ===&lt;br /&gt;
* JavaFX 컨트롤 속성은 세 가지 메소드로 구성&lt;br /&gt;
*# Getter&lt;br /&gt;
*# Setter&lt;br /&gt;
*# Property 객체를 리턴하는 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private StringProperty text = new SimpleStringProperty(); // 값이 저장될 필드&lt;br /&gt;
&lt;br /&gt;
// Setter&lt;br /&gt;
public void setText(String newValue) {&lt;br /&gt;
    text.set(newValue);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Getter&lt;br /&gt;
public String getText() {&lt;br /&gt;
    return text.get();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Property 메소드&lt;br /&gt;
public StringProperty textProperty() {&lt;br /&gt;
    return text;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* text 속성을 감시하는 리스너 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textProperty().addListener(new ChangeListener&amp;lt;String&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void changed(ObservableValue&amp;lt;? extends String&amp;gt; observable, String oldValue, String newValue) {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Slider의 value 속성에 리스너 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Slider slider = new Slider();&lt;br /&gt;
slider.valueProperty().addListener( new ChangeListener&amp;lt;Number&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void changed(ObservableValue&amp;lt;? extends Number&amp;gt; observable, Number oldValue, Number newValue) {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.6.1-실행결과.png | thumb | 예제]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Slider?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.text.Font?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&lt;br /&gt;
      fx:controller=&amp;quot;ch17.p891.RootController&amp;quot;&lt;br /&gt;
      prefHeight=&amp;quot;250.0&amp;quot; prefWidth=&amp;quot;350.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;Label fx:id=&amp;quot;label&amp;quot; text=&amp;quot;JavaFX&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;font&amp;gt;&lt;br /&gt;
            &amp;lt;Font size=&amp;quot;0&amp;quot; /&amp;gt; &amp;lt;!-- Label의 기본 폰트 크기는 0 --&amp;gt;&lt;br /&gt;
         &amp;lt;/font&amp;gt;&lt;br /&gt;
      &amp;lt;/Label&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;Slider fx:id=&amp;quot;slider&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p891;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.value.ChangeListener;&lt;br /&gt;
import javafx.beans.value.ObservableValue;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.control.Slider;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private Slider slider;&lt;br /&gt;
    @FXML private Label label;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        slider.valueProperty().addListener(new ChangeListener&amp;lt;Number&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void changed(ObservableValue&amp;lt;? extends Number&amp;gt; observable, Number oldValue, Number newValue) {&lt;br /&gt;
                label.setFont(new Font(newValue.doubleValue()));&lt;br /&gt;
            }&lt;br /&gt;
        });             &lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p891;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 속성 바인딩 ===&lt;br /&gt;
* JavaFX 속성은 다른 속성과 바인딩될 수 있음&lt;br /&gt;
* 바인딩된 속성들은 하나가 변경되면 자동적으로 다른 하나도 변경&lt;br /&gt;
&lt;br /&gt;
* 예: textArea1에서 입력된 내용이 textArea2에 자동으로 입력 (단방향)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TextArea textArea1 = new TextArea();&lt;br /&gt;
TextArea textArea2 = new TextArea();&lt;br /&gt;
textArea2.textProperty().bind(textArea1.textProperty());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 양방향 바인딩&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textArea2.textProperty().bindBidirectional(textArea1.textProperty());&lt;br /&gt;
Bindings.bindBidirectional(textArea1.textProperty(), textArea2.textProperty());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Unbind&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textArea2.textProperty().unbin(); // 단방향 해제&lt;br /&gt;
textArea2.textProperty().unbindBidirectional(textArea1.textProperty()); // 양방향 해제&lt;br /&gt;
Bindings.unbindBidirectional(textArea1.textProperty(), textArea2.textProperty()); // 양방향 해제&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.6.2-실행결과.png | thumb | 속성 바인딩]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;ch17.p893.RootController&amp;quot; prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; spacing=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;textArea1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea fx:id=&amp;quot;textArea1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;textArea2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea fx:id=&amp;quot;textArea2&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p893;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.binding.Bindings;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.TextArea;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private TextArea textArea1;&lt;br /&gt;
    @FXML private TextArea textArea2;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        Bindings.bindBidirectional(textArea1.textProperty(), textArea2.textProperty());           &lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bindings 클래스 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
메소드                              | 설명&lt;br /&gt;
add, substract, multiply, divide    | 속성값에 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 수행하고 바인딩함&lt;br /&gt;
max, min                            | 속성값과 어떤 수를 비교해서 최대, 최소값을 얻고 바인딩함&lt;br /&gt;
greaterThan, greaterThanOrEqual     | 속성값이 어떤 값보다 큰지, 같거나 큰지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
lessThan, lessThanOrEqual           | 속성값이 어떤 값보다 작거나, 같거나 작은지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
equal, notEquals                    | 속성값이 어떤 값과 같은지, 다른지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
equalIgnoreCase, notEqualIgnoreCase | 대소문자와 상관없이 속성값이 어떤 문자열과 같은지, 다른지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
isEmpty, isNotEmpty                 | 속성값이 비어있는지, 아닌지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
isNull, isNotNull                   | 속성값이 null 또는 not null인지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
length                              | 속성값이 문자열일 경우 문자 수를 얻어 바인딩함&lt;br /&gt;
size                                | 속성 타입이 배열, List, Map, Set일 경우 요소 수를 얻어 바인딩함&lt;br /&gt;
and, or                             | 속성값이 boolean일 경우, 논리곱, 논리합을 얻어 바인딩함&lt;br /&gt;
not                                 | 속성값이 boolean일 경우, 반대값으로 바인딩함&lt;br /&gt;
convert                             | 속성값을 문자열로 변환해서 바인딩함&lt;br /&gt;
valueAt                             | 속성이 List, Map일 경우 해당 인덱스 또는 키의 값을 얻어 바인딩함&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.6.3-실행결과1.png | thumb | 초기 화면]]&lt;br /&gt;
[[file:CP-17.6.3-실행결과2.png | thumb | 화면 크기 변환 후]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.shape.Circle?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:id=&amp;quot;root&amp;quot; fx:controller=&amp;quot;ch17.p895.RootController&amp;quot; prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Circle fx:id=&amp;quot;circle&amp;quot; fill=&amp;quot;DODGERBLUE&amp;quot; radius=&amp;quot;50.0&amp;quot; stroke=&amp;quot;BLACK&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p895;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.binding.Bindings;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.layout.AnchorPane;&lt;br /&gt;
import javafx.scene.shape.Circle;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private AnchorPane root;&lt;br /&gt;
    @FXML private Circle circle;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        circle.centerXProperty().bind(Bindings.divide(root.widthProperty(), 2));&lt;br /&gt;
        circle.centerYProperty().bind(Bindings.divide(root.heightProperty(), 2));&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category:컴퓨터프로그래밍및실습]]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=420</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/1124</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=420"/>
		<updated>2022-07-22T06:01:09Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* Bindings 클래스 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JavaFX 개요 ==&lt;br /&gt;
# AWT&lt;br /&gt;
#* Native UI 컴포넌트 사용&lt;br /&gt;
#* 운영체제 마다 UI 모양이 다름&lt;br /&gt;
# Swing&lt;br /&gt;
#* 운영체제가 제공하는 native UI 사용 안 함&lt;br /&gt;
#* 운영체제가 새롭게 제공하는 UI 지원의 어려움&lt;br /&gt;
# JavaFX&lt;br /&gt;
#* Abode의 flash, Microsoft의 silverlight의 대항마&lt;br /&gt;
#* JDK 7부터 지원. JDK 8 권장.&lt;br /&gt;
#* JDK 11부터는 별도로 설치해야 함.&lt;br /&gt;
#* 화면 레이아웃과 스타일, 애플리케이션 로직 분리&lt;br /&gt;
#* Java 코드와 분리해서 스타일 시트(CSS)로 외관 작성 → 개발자와 디자이너의 동시 개발 가능&lt;br /&gt;
#* Java 코드에서도 레이아웃과 애플리케이션 로직을 분리하고 싶다면 레이아웃은 FXML로 작성, 로직은 Java로 작성&lt;br /&gt;
#* JavaFX 애플리케이션 구성 요소&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;50&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[레이아웃]'''&amp;lt;br/&amp;gt;자바 코드 파일&amp;lt;/br&amp;gt;또는 FXML 파일&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[외관 및 스타일]'''&amp;lt;br/&amp;gt;CSS 파일&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[리소스]'''&amp;lt;br/&amp;gt;그림 파일&amp;lt;br/&amp;gt;동영상 파일&amp;lt;br/&amp;gt;... &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[비즈니스 로직]'''&amp;lt;br/&amp;gt;자바 코드 파일&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JavaFX 애플리케이션 개발 시작 ==&lt;br /&gt;
=== 메인 클래스 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX 라이프사이클(life cycle) ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
    public AppMain() {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: AppMain() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: init() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: start() 호출&amp;quot;);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public void stop() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: stop() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: main() 호출&amp;quot;);&lt;br /&gt;
        launch(args);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
main: main() 호출&lt;br /&gt;
JavaFX Application Thread: AppMain() 호출&lt;br /&gt;
JavaFX-Launcher: init() 호출&lt;br /&gt;
JavaFX Application Thread: start() 호출&lt;br /&gt;
JavaFX Application Thread: stop() 호출 ← 프로그램을 끝내야 실행된다.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 메일 클래스 실행 매개값 얻기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
C:&amp;gt; java AppMain --ip=192.168.0.5 --port=50001&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* main()에서 launch(args)를 넘겨 받음&lt;br /&gt;
* init() 메소드에서 아래와 같이 실행할 수 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parameters params = getParameters();&lt;br /&gt;
List&amp;lt;String&amp;gt; list = params.getRaw();&lt;br /&gt;
Map&amp;lt;String, String&amp;gt; map = params.getNamed();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 무대(Stage)와 장면(Scene) ===&lt;br /&gt;
* 윈도우 : Stage&lt;br /&gt;
* Stage에는 하나의 Scene을 가질 수 있음&lt;br /&gt;
* Scene은 직접 생성해야 함&lt;br /&gt;
&lt;br /&gt;
[[file:CP2022_ch17.2_AppMain.png|thumb|AppMain 실행화면]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.application.Platform;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.layout.VBox;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        VBox root = new VBox();&lt;br /&gt;
        root.setPrefWidth(350);&lt;br /&gt;
        root.setPrefHeight(150);&lt;br /&gt;
        root.setAlignment(Pos.CENTER);&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Label label = new Label();&lt;br /&gt;
        label.setText(&amp;quot;Hello, JavaFX&amp;quot;);&lt;br /&gt;
        label.setFont(new Font(50));&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
        button.setOnAction(event-&amp;gt;Platform.exit());&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().add(label);&lt;br /&gt;
        root.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(root); // VBox를 루트 컨테이너(root container)로 해서 Scene 생성&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain입니다&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene); // 윈도우에 장면 설정&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 레이아웃 ==&lt;br /&gt;
=== 프로그램적 레이아웃 ===&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | 프로그램적 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.collections.ObservableList;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.TextField;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(10));&lt;br /&gt;
        hbox.setSpacing(10);&lt;br /&gt;
&lt;br /&gt;
        TextField textField = new TextField();&lt;br /&gt;
        textField.setPrefWidth(200);&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ObservableList list = hbox.getChildren();&lt;br /&gt;
        list.add(textField);&lt;br /&gt;
        list.add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 레이아웃 ===&lt;br /&gt;
* FXML 파일 (root.fxml)&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | FXML 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;padding&amp;gt;&lt;br /&gt;
        &amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/padding&amp;gt;&lt;br /&gt;
    &amp;lt;spacing&amp;gt;10&amp;lt;/spacing&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;children&amp;gt;&lt;br /&gt;
        &amp;lt;TextField&amp;gt;&lt;br /&gt;
            &amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&lt;br /&gt;
        &amp;lt;/TextField&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
    &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* AppMain 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;)); // ← FXML 로드&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 레이아웃(layout) 여백: 패딩(padding)과 마진(margin) ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cll&amp;gt;&lt;br /&gt;
구분      | HBox의 패딩                                                        | Button의 마진&lt;br /&gt;
개념      | [[file:CP-17.3.3-padding.png]]                                     | [[file:CP-17.3.3-margin.png]]&lt;br /&gt;
자바 코드 | HBox hbox = new HBox();&amp;lt;br/&amp;gt;'''hbox.setPadding(new Insets(50))'''; | Button button = new Button();&amp;lt;br/&amp;gt;'''HBox.setMargin(button, new Insets(50));'''&lt;br /&gt;
FXML 태그 | &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt; | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;HBox.margin&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Hbox.margin&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Margin, Padding 설정 방법&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// top, right, bottom, left를 모두 동일한 값으로 설정할 때&lt;br /&gt;
// Insets(double topRightBottomLeft)&lt;br /&gt;
new Insets(50);&lt;br /&gt;
&lt;br /&gt;
// top, right, bottom, left를 다를 값으로 설정할 때&lt;br /&gt;
// Insets(double top, double right, double bottom, double left)&lt;br /&gt;
new Insets(10, 20, 30, 40);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 패딩과 마진 적용 예&lt;br /&gt;
[[file:CP-17.3.3-AppMain.png|thumb|패딩과 마진 적용 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        // 패딩 설정&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(50, 10, 10, 50));&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setPrefSize(100, 100);&lt;br /&gt;
        &lt;br /&gt;
        // 마진 설정&lt;br /&gt;
        // HBox hbox = new HBox();&lt;br /&gt;
        // Button button = new Button();&lt;br /&gt;
        // button.setPrefSize(100, 100);&lt;br /&gt;
        // HBox.setMargin(button, new Insets(10, 10, 50, 50));&lt;br /&gt;
&lt;br /&gt;
        hbox.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 작성 규칙 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
TextField textField = new TextField();&amp;lt;br/&amp;gt;textField.setPrefWidth(200);&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/TextField&amp;gt;&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}   |  &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
ObsetvableList list = hbox.getChildren();&amp;lt;br/&amp;gt;list.add(textField);&amp;lt;br/&amp;gt;list.add(button);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;children&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Button&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 패키지(package) 선언 ====&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                          |   FXML 태그&lt;br /&gt;
import javafx.scene.layout.HBox;   |   &amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
import javafx.scene.control.*;     |   &amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;?import?&amp;gt;가 들어가는 위치는 &amp;lt;?xml ...&amp;gt;와 루트 컨테이너 태그 사이이다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;루트 컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/루트 컨테이너&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* import를 제대로 하지 않으면 not a valid type 메시지와 함께 javafx.fxml.LoadException 발생&lt;br /&gt;
&lt;br /&gt;
==== 태그(tag) 선언 ====&lt;br /&gt;
* 시작 태그와 끝 태그가 매칭되어야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 속성(attribute) 선언 ====&lt;br /&gt;
* 속성은 &amp;quot;나 '로 감싸야 한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;태그이름 속성명=&amp;quot;값&amp;quot; 속성명='값'&amp;gt; ... &amp;lt;/태그이름&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 속성명은 Setter 메소드 명이 옴&lt;br /&gt;
* 모든 Setter가 사용될 수 있는 것은 아님. 기본 타입(boolean, byte, short, char, int, long, float, double)의 값을 세팅하거나, String을 세팅하는 Setter만 올 수 있음&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML (Setter 태그)                                    | FXML (Setter 속성)&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;   | &amp;lt;Button text=&amp;quot;확인&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 객체 선언 ====&lt;br /&gt;
===== 클래스 속성 =====&lt;br /&gt;
* 생성자에 매개 변수가 있고, 매개 변수에 @NamedArg(javafx.beans.NamedArg) 어노테이션이 적용되어 있으면 속성명이나 자식 태그로 작성할 수 있음&lt;br /&gt;
&amp;lt;table2 class=wikitable sep=bar align=ll&amp;gt;&lt;br /&gt;
&amp;lt;클래스 매개변수=&amp;quot;값&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}     | &amp;lt;클래스&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;매개변수&amp;gt;값&amp;lt;/매개변수&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/클래스&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
** HBox를 패딩할 때 setPadding(Insets value) 메소드를 사용하는데&lt;br /&gt;
** Insets는 기본 생성자가 없고,&lt;br /&gt;
** Insets(double topRightBottomLeft) 또는 Insets(double top, double right, double bottom, double left)만 있음&lt;br /&gt;
** 이 경우 아래와 같이 선언 가능함&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:value =====&lt;br /&gt;
* 클래스가 valueOf(String) 메소드를 제공하는 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:value=&amp;quot;값&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
String.valueOf(&amp;quot;Hello, World!&amp;quot;);&amp;lt;br/&amp;gt;Integer.valueOf(&amp;quot;1&amp;quot;);&amp;lt;br/&amp;gt;Double.valueOf(&amp;quot;1.0&amp;quot;);&amp;lt;br/&amp;gt;Boolean.valueOf(&amp;quot;false&amp;quot;);  |  &amp;lt;String fx:value=&amp;quot;Hello, World!&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Integer fx:value=&amp;quot;1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Double fx:value=&amp;quot;1.0&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Boolean fx:value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:constant =====&lt;br /&gt;
*클래스에 정의된 상수값을 얻고 싶을 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:constant=&amp;quot;상수&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setMaxWidth( Double.MAX_VALUE );&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;maxWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/maxWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:factory =====&lt;br /&gt;
* 어떤 클래스는 new 연산자로 객체를 생성할 수 없고,&lt;br /&gt;
* 정적 메소드(이를 factory 메소드라 부른다)로 객체를 얻어야 하는 경우가 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:factory=&amp;quot;정적메소드&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예: &amp;lt;code&amp;gt;ObservableList&amp;lt;/code&amp;gt;의 구현 객체는 &amp;lt;code&amp;gt;javafx.collections.FXCollections&amp;lt;/code&amp;gt;의 정적 메소드인 &amp;lt;code&amp;gt;observableArrayList(E... items)&amp;lt;/code&amp;gt; 메소드로 얻을 수 있다.&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
ComboBox combo = new ComboBox();&amp;lt;br/&amp;gt;combo.setItems(FXCollections.observableArrayList(&amp;quot;공개&amp;quot;, &amp;quot;비공개&amp;quot;));&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;ComboBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Items&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;FXCollections fx:factory=&amp;quot;observableArrayList&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;비공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;/FXCollections&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/items&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/ComboBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 로딩과 Scene 생성 ===&lt;br /&gt;
* FXML 파일을 작성한 후 이를 이용하여 객체를 만들어야 한다. 이를 '''FXML loading'''이라고 한다.&lt;br /&gt;
* javafx.fxml.FXMLLoader를 이용&lt;br /&gt;
** 두 개의 load() 메소드 : 정적 메소드, 인스턴스 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* getClass() - 현재 클래스 리턴&lt;br /&gt;
* getResource() - 클래스가 위치하는 곳에서 상대 경로로 리소스의 URL을 리턴&lt;br /&gt;
* load() - FXML 파일을 로딩&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
FXMLLoader loader = new FXMLLoader(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
Parent root = (Parent)loader.load();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* load() - Parent 타입을 리턴함. 이것은 FXML 파일에서의 루트 태그로 선언된 컨테이너임&lt;br /&gt;
* 만을 루트 태그가 &amp;lt;HBox&amp;gt; 라면 다음과 같이 작성해도 됨&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
HBox hbox = (HBox) FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX Scene Builder ===&lt;br /&gt;
[[file:CP-SceneBuilder-1.png | thumb | Scene Builder로 root.fxml 띄움]]&lt;br /&gt;
* Scene Builder 다운로드 - https://gluonhq.com/products/scene-builder/&lt;br /&gt;
* [https://marketplace.visualstudio.com/items?itemName=bilalekrem.scenebuilderextension SceneBuilder extension for Visual Studio Code]&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 눌러 &amp;quot;Configure Scene Builder path&amp;quot;를 실행한다.&lt;br /&gt;
*** 경로를 다음과 같이 지정한다 : C:\Users\profs\AppData\Local\SceneBuilder 폴더의 SceneBuilder.exe 지정&lt;br /&gt;
&lt;br /&gt;
* Scene Builder 띄우는 방법&lt;br /&gt;
** fxml 파일을 선택한다.&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 누른다.&lt;br /&gt;
&lt;br /&gt;
== JavaFX 컨테이너 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
컨테이너   | 설명&lt;br /&gt;
AnchorPane | 컨트롤을 좌표로 배치하는 레이아웃&lt;br /&gt;
BorderPane | 위, 아래, 오른쪽, 왼쪽, 중앙에 컨트롤을 배치하는 레이아웃&lt;br /&gt;
FlowPane   | 행으로 배치하되 공간이 부족하면 새로운 행에 배치하는 레이아웃&lt;br /&gt;
GridPane   | 그리드로 배치하되 셀의 크기가 고정적이지 않은 레이아웃&lt;br /&gt;
StackPane  | 컨트롤을 겹쳐서 배치하는 레이아웃&lt;br /&gt;
TilePane   | 그리드로 배치하되 고정된 셀의 크기를 갖는 레이아웃&lt;br /&gt;
HBox       | 수평으로 배치하는 레이아웃&lt;br /&gt;
VBox       | 수직으로 배치하는 레이아웃&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AnchorPane 컨테이너 ===&lt;br /&gt;
[[file:CP-17.4.1-1.png]]&lt;br /&gt;
&lt;br /&gt;
* AnchorPane에서 사용할 수 있는 주요 설정&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명            | 적용&lt;br /&gt;
PrefWidth    | 폭을 설정       | AnchorPane&lt;br /&gt;
PrefHeight   | 높이를 설정     | AnchorPane&lt;br /&gt;
layoutX      | 컨트롤의 X 좌표 | 컨트롤&lt;br /&gt;
layoutY      | 컨트롤의 Y 좌표 | 컨트롤&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함   | AnchorPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.1-2.png | thumb | AnchorPane (Scene Builder)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.PasswordField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;150.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;28.0&amp;quot; text=&amp;quot;아이디&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;66.0&amp;quot; text=&amp;quot;패스워드&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;24.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;PasswordField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;62.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;97.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;164.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBox와 VBox 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                         | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                    | HBox, VBox&lt;br /&gt;
prefHeight   | 높이를 설정                  | HBox, VBox &lt;br /&gt;
alignment    | 컨트롤의 정렬을 설정         | HBox, VBox &lt;br /&gt;
spacing      | 컨트롤의 간격을 설정         | HBox, VBox&lt;br /&gt;
fillWidth    | 컨트롤의 폭 확장 여부 설정   | VBox&lt;br /&gt;
fillHeight   | 컨트롤의 높이 확장 여부 설정 | HBox&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함                | HBox, VBox&lt;br /&gt;
&amp;lt;HBox.hgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; | HBox의 남은 폭을 채움   | 컨트롤&lt;br /&gt;
&amp;lt;VBox.vgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/VBox.vgrow&amp;gt; | VBox의 남을 높이를 채움 | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root2.fxml&lt;br /&gt;
** 이 패키지의 하위 폴더로 &amp;lt;code&amp;gt;images&amp;lt;/code&amp;gt;를 만들고 여기에 javafx.png 파일을 복사해 넣어둔다. [[file:javafx.png | thumb | javafx.png]]&lt;br /&gt;
[[file:CP-17.4.3-project.png | thumb | images 폴더]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import java.lang.Double?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.Priority?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitWidth=&amp;quot;200.0&amp;quot; preserveRatio=&amp;quot;true&amp;quot;&amp;gt; &amp;lt;!-- 그림의 비율에 맞게 높이를 설정 --&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&lt;br /&gt;
          &amp;lt;Image url=&amp;quot;@images/javafx.png&amp;quot; /&amp;gt; &amp;lt;!-- 현재 경로 기준으로 상대경로로 파일 지정 --&amp;gt;&lt;br /&gt;
        &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;HBox alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;이전&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;다음&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;HBox.hgrow&amp;gt;&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; &amp;lt;!-- 오른쪽 남은 공간을 버튼이 모두 채우도록 설정 --&amp;gt;&lt;br /&gt;
              &amp;lt;maxWidth&amp;gt;&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;/maxWidth&amp;gt; &amp;lt;!-- 버튼의 폭을 자동으로 확장하기 위해 설정--&amp;gt;&lt;br /&gt;
            &amp;lt;/Button&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
         &amp;lt;VBox.margin&amp;gt;&lt;br /&gt;
           &amp;lt;Insets top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/VBox.margin&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.4.3-p874.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root2.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BorderPane 컨테이너 ===&lt;br /&gt;
* top, bottom, left, right, center 셀에 컨트롤을 배치하는 컨테이너&lt;br /&gt;
* 다른 컨테이너를 배치할 수도 있음&lt;br /&gt;
* 각 셀에는 '''하나'''의 컨트롤 또는 컨테이너만 배치할 수 있음&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-1.png | 250px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                           | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                      | BorderPane&lt;br /&gt;
prefHeight   | 높이를 설정                    | BorderPane&lt;br /&gt;
&amp;lt;top&amp;gt;        | top에 배치될 컨트롤을 포함     | BorderPane&lt;br /&gt;
&amp;lt;bottom&amp;gt;     | bottom에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;right&amp;gt;      | right에 배치될 컨트롤을 포함   | BorderPane&lt;br /&gt;
&amp;lt;left&amp;gt;       | left에 배치될 컨트롤을 포함    | BorderPane&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;center&amp;gt;&amp;lt;/nowiki&amp;gt;     | center에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.ToolBar?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;top&amp;gt;&lt;br /&gt;
      &amp;lt;ToolBar prefHeight=&amp;quot;40.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot; BorderPane.alignment=&amp;quot;CENTER&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;items&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/items&amp;gt;&lt;br /&gt;
      &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
   &amp;lt;/top&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea /&amp;gt; &amp;lt;!-- left와 right까지 확장--&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;BorderPane&amp;gt;&lt;br /&gt;
         &amp;lt;center&amp;gt;&lt;br /&gt;
           &amp;lt;TextField /&amp;gt; &amp;lt;!-- top, bottom, left까지 확장--&amp;gt;&lt;br /&gt;
         &amp;lt;/center&amp;gt;&lt;br /&gt;
         &amp;lt;right&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/right&amp;gt;&lt;br /&gt;
      &amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FlowPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                      | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                 | FlowPane&lt;br /&gt;
prefHeight   | 높이를 설정               | FlowPane&lt;br /&gt;
hgap         | 컨트롤의 수평 간격을 설정 | FlowPane&lt;br /&gt;
vgap         | 컨트롤의 수직 간격을 설정 | FlowPane&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함             |  FlowPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.5-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.FlowPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;FlowPane prefHeight=&amp;quot;70.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/FlowPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TilePane 컨테이너 ===&lt;br /&gt;
* 그리드로 컨트롤을 배치하되 고정된 셀(타일) 크기를 갖는 컨테이너&lt;br /&gt;
* 오른쪽에 배치할 공간이 부족하면 새로운 행에 컨트롤을 배치함&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-TilePane.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성   | 설명               | 적용&lt;br /&gt;
prefWidth      | 폭을 설정          | TilePane&lt;br /&gt;
prefHeight     | 높이를 설정        | TilePane&lt;br /&gt;
prefTileWidth  | 타일의 폭을 설정   | TilePane&lt;br /&gt;
prefTileHeight | 타일의 높이를 설정 | TilePane&lt;br /&gt;
&amp;lt;children&amp;gt;     | 컨트롤을 포함      | TilePane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:fruit1.jpg | fruit1.jpg&lt;br /&gt;
file:fruit2.jpg | fruit2.jpg&lt;br /&gt;
file:fruit3.jpg | fruit3.jpg&lt;br /&gt;
file:fruit4.jpg | fruit4.jpg&lt;br /&gt;
file:fruit5.jpg | fruit5.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.TilePane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TilePane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;100.0&amp;quot; prefWidth=&amp;quot;100.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit1.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit2.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit3.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit4.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit5.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/TilePane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GridPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성         | 설명                                 | 적용&lt;br /&gt;
prefWidth            | 폭을 설정                            | GridPane&lt;br /&gt;
prefHeight           | 놎이를 설정                          | GridPane&lt;br /&gt;
hgap                 | 수평 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
vgap                 | 수직 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
&amp;lt;children&amp;gt;           | 컨트롤을 포함                        | GridPane&lt;br /&gt;
GridPane.rowIndex    | 컨트롤이 위치하는 행 인덱스를 설정   | 컨트롤&lt;br /&gt;
GridPane.columnIndex | 컨트롤이 위치하는 컬럼 인덱스를 설정 | 컨트롤&lt;br /&gt;
GridPane.rowSpan     | 행 병합 수를 설정                    | 컨트롤&lt;br /&gt;
GridPane.columnSpan  | 컬럼 병합 수를 설정                  | 컨트롤&lt;br /&gt;
GridPane.hgrow       | 수평 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.vgrow       | 수직 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.halignment  | 컨트롤의 수평 정렬을 설정            | 컨트롤&lt;br /&gt;
GridPane.valignment  | 컨트롤의 수직 정렬을 설정            | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.7-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.ColumnConstraints?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.GridPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.RowConstraints?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GridPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; hgap=&amp;quot;10.0&amp;quot; vgap=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets topRightBottomLeft=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;아이디&amp;quot; GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;패스워드&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.columnIndex=&amp;quot;1&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
      &amp;lt;HBox GridPane.rowIndex=&amp;quot;2&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot;&lt;br /&gt;
                 GridPane.columnSpan=&amp;quot;2&amp;quot; GridPane.hgrow=&amp;quot;ALWAYS&amp;quot;&lt;br /&gt;
                 alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot; &amp;gt;  &amp;lt;!-- 컬럼 2개 병합 --&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/GridPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== StackPane 컨테이너 ===&lt;br /&gt;
* 컨트롤을 겹쳐 배치하는 컨테이너&lt;br /&gt;
* 카드 레이아웃(Card Layout)이라고도 함&lt;br /&gt;
* 만약 위에 있는 컨트롤이 투명하다면 밑에 있는 컨트롤이 겹쳐 보임&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:duke.jpg | duke.jpg&lt;br /&gt;
file:snow.jpg | snow.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.8-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.StackPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;StackPane  xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;300.0&amp;quot; prefWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitHeight=&amp;quot;300.0&amp;quot; fitWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/snow.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView preserveRatio=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/duke.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/StackPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 이벤트 처리 ==&lt;br /&gt;
&lt;br /&gt;
=== 이벤트 핸들러(EventHandler) ===&lt;br /&gt;
* JavaFX는 이벤트 발생 콘트롤과 이벤트 핸들러(EventHandler)를 분리하는 위임형(Delegation&amp;lt;ref&amp;gt;Design Pattern 중 Delegation Pattern&amp;lt;/ref&amp;gt;) 방식을 사용함&lt;br /&gt;
* 이를 위해 먼저 컨트롤에 EventHandler를 등록해야 함 (setOnXXX() 메소드. 예: setOnAction())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cccc&amp;gt;&lt;br /&gt;
컨트롤(control) | 사건        | 이벤트(event) 발생 | 이벤트 처리 담당 객체 | 이벤트 처리 메소드 실행 | 이벤트 처리 효과&lt;br /&gt;
Button          | 버튼을 누름 | ActionEvent        | EventHandler          | public void handle(...) {&amp;lt;br/&amp;gt;{{sp2}}이벤트 처리&amp;lt;/br/&amp;gt;} | 1. 윈도우 닫기&amp;lt;br/&amp;gt;2. 컨트롤 내용 변경&amp;lt;br/&amp;gt;3. 다이얼로그 띄우기&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Button 클릭 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Button button = new Button();&lt;br /&gt;
button.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(ActionEvent event) { ... }&lt;br /&gt;
}):&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* TableView에서 행을 마우스로 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TableView tableView = new TableView();&lt;br /&gt;
tableView.setOnMouseClicked(new EventHandler&amp;lt;MouseEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(MouseEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 윈도우 우측 상단(x) 버튼 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
stage.setOnCloseRequest(new EventHandler&amp;lt;WindowEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(WindowEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* EventHandler는 하나의 메소드를 가진 함수적 인터페이스이므로 람다식을 이용하여 이벤트 등록 가능&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
button.setOnAction( event-&amp;gt;{ ... } );&lt;br /&gt;
tableView.setOnMouseClicked( event-&amp;gt;{ ... } );&lt;br /&gt;
stage.setOnCloseRequest( event-&amp;gt;{ ... } );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.1-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox root = new HBox();&lt;br /&gt;
        root.setPrefSize(200, 50);&lt;br /&gt;
        root.setAlignment(Pos.CENTER); // 수평 중앙 정렬&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Button btn1 = new Button(&amp;quot;버튼1&amp;quot;);&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        Button btn2 = new Button(&amp;quot;버튼2&amp;quot;);&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;System.out.println(&amp;quot;버튼2 클릭&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().addAll(btn1, btn2); // HBox에 btn1과 btn2를 추가&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.setOnCloseRequest(event-&amp;gt;System.out.println(&amp;quot;종료 클릭&amp;quot;));&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FXML 컨트롤러(Controller) ===&lt;br /&gt;
&lt;br /&gt;
==== fx:controller 속성과 컨트롤러 클래스 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;루트컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;packageName.ControllerName&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/루트컨트롤러&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fx:id 속성과 @FXML 컨트롤 주입 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
      fx:controller=&amp;quot;sec05.exam02_fxml_controller.RootController&amp;quot;&lt;br /&gt;
      prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
      alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @FXML private Button btn1;&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML&lt;br /&gt;
    private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EventHandler 등록 ====&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.2-실행결과.png| thumb | 실행 결과]]&lt;br /&gt;
* AppMain.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* RootController.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private Button btn1; // import javafx.fxml.FXML 필요&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() { // 직접 EventHandler 생성 후 등록&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                handleBtn1Action(event);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;handleBtn2Action(event)); // 람다식 이용&lt;br /&gt;
        // btn3.setOnAction(event-&amp;gt;handleBtn3Action(event));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void handleBtn1Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void handleBtn2Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼2 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void handleBtn3Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼3 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root.xml&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
    fx:controller=&amp;quot;ch17.p889.RootController&amp;quot;&lt;br /&gt;
    prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
    alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; onAction=&amp;quot;#handleBtn3Action&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 이벤트 처리 메소드 매핑 ====&lt;br /&gt;
* FXML 파일&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button fx:id=&amp;quot;btn&amp;quot; text=&amp;quot;버튼&amp;quot; onAction=&amp;quot;#handleBtnAction&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Controller 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void handleBtnAction(ActionEvent event) { ... }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 속성 감시와 바인딩 ==&lt;br /&gt;
&lt;br /&gt;
=== 속성 감시 ===&lt;br /&gt;
* JavaFX 컨트롤 속성은 세 가지 메소드로 구성&lt;br /&gt;
*# Getter&lt;br /&gt;
*# Setter&lt;br /&gt;
*# Property 객체를 리턴하는 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private StringProperty text = new SimpleStringProperty(); // 값이 저장될 필드&lt;br /&gt;
&lt;br /&gt;
// Setter&lt;br /&gt;
public void setText(String newValue) {&lt;br /&gt;
    text.set(newValue);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Getter&lt;br /&gt;
public String getText() {&lt;br /&gt;
    return text.get();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Property 메소드&lt;br /&gt;
public StringProperty textProperty() {&lt;br /&gt;
    return text;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* text 속성을 감시하는 리스너 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textProperty().addListener(new ChangeListener&amp;lt;String&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void changed(ObservableValue&amp;lt;? extends String&amp;gt; observable, String oldValue, String newValue) {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Slider의 value 속성에 리스너 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Slider slider = new Slider();&lt;br /&gt;
slider.valueProperty().addListener( new ChangeListener&amp;lt;Number&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void changed(ObservableValue&amp;lt;? extends Number&amp;gt; observable, Number oldValue, Number newValue) {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.6.1-실행결과.png | thumb | 예제]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Slider?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.text.Font?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&lt;br /&gt;
      fx:controller=&amp;quot;ch17.p891.RootController&amp;quot;&lt;br /&gt;
      prefHeight=&amp;quot;250.0&amp;quot; prefWidth=&amp;quot;350.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;Label fx:id=&amp;quot;label&amp;quot; text=&amp;quot;JavaFX&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;font&amp;gt;&lt;br /&gt;
            &amp;lt;Font size=&amp;quot;0&amp;quot; /&amp;gt; &amp;lt;!-- Label의 기본 폰트 크기는 0 --&amp;gt;&lt;br /&gt;
         &amp;lt;/font&amp;gt;&lt;br /&gt;
      &amp;lt;/Label&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;Slider fx:id=&amp;quot;slider&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p891;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.value.ChangeListener;&lt;br /&gt;
import javafx.beans.value.ObservableValue;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.control.Slider;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private Slider slider;&lt;br /&gt;
    @FXML private Label label;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        slider.valueProperty().addListener(new ChangeListener&amp;lt;Number&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void changed(ObservableValue&amp;lt;? extends Number&amp;gt; observable, Number oldValue, Number newValue) {&lt;br /&gt;
                label.setFont(new Font(newValue.doubleValue()));&lt;br /&gt;
            }&lt;br /&gt;
        });             &lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p891;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 속성 바인딩 ===&lt;br /&gt;
* JavaFX 속성은 다른 속성과 바인딩될 수 있음&lt;br /&gt;
* 바인딩된 속성들은 하나가 변경되면 자동적으로 다른 하나도 변경&lt;br /&gt;
&lt;br /&gt;
* 예: textArea1에서 입력된 내용이 textArea2에 자동으로 입력 (단방향)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TextArea textArea1 = new TextArea();&lt;br /&gt;
TextArea textArea2 = new TextArea();&lt;br /&gt;
textArea2.textProperty().bind(textArea1.textProperty());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 양방향 바인딩&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textArea2.textProperty().bindBidirectional(textArea1.textProperty());&lt;br /&gt;
Bindings.bindBidirectional(textArea1.textProperty(), textArea2.textProperty());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Unbind&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textArea2.textProperty().unbin(); // 단방향 해제&lt;br /&gt;
textArea2.textProperty().unbindBidirectional(textArea1.textProperty()); // 양방향 해제&lt;br /&gt;
Bindings.unbindBidirectional(textArea1.textProperty(), textArea2.textProperty()); // 양방향 해제&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.6.2-실행결과.png | thumb | 속성 바인딩]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;ch17.p893.RootController&amp;quot; prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; spacing=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;textArea1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea fx:id=&amp;quot;textArea1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;textArea2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea fx:id=&amp;quot;textArea2&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p893;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.binding.Bindings;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.TextArea;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private TextArea textArea1;&lt;br /&gt;
    @FXML private TextArea textArea2;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        Bindings.bindBidirectional(textArea1.textProperty(), textArea2.textProperty());           &lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bindings 클래스 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
메소드                              | 설명&lt;br /&gt;
add, substract, multiply, divide    | 속성값에 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 수행하고 바인딩함&lt;br /&gt;
max, min                            | 속성값과 어떤 수를 비교해서 최대, 최소값을 얻고 바인딩함&lt;br /&gt;
greaterThan, greaterThanOrEqual     | 속성값이 어떤 값보다 큰지, 같거나 큰지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
lessThan, lessThanOrEqual           | 속성값이 어떤 값보다 작거나, 같거나 작은지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
equal, notEquals                    | 속성값이 어떤 값과 같은지, 다른지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
equalIgnoreCase, notEqualIgnoreCase | 대소문자와 상관없이 속성값이 어떤 문자열과 같은지, 다른지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
isEmpty, isNotEmpty                 | 속성값이 비어있는지, 아닌지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
isNull, isNotNull                   | 속성값이 null 또는 not null인지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
length                              | 속성값이 문자열일 경우 문자 수를 얻어 바인딩함&lt;br /&gt;
size                                | 속성 타입이 배열, List, Map, Set일 경우 요소 수를 얻어 바인딩함&lt;br /&gt;
and, or                             | 속성값이 boolean일 경우, 논리곱, 논리합을 얻어 바인딩함&lt;br /&gt;
not                                 | 속성값이 boolean일 경우, 반대값으로 바인딩함&lt;br /&gt;
convert                             | 속성값을 문자열로 변환해서 바인딩함&lt;br /&gt;
valueAt                             | 속성이 List, Map일 경우 해당 인덱스 또는 키의 값을 얻어 바인딩함&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.6.3-실행결과1.png | thumb | 초기 화면]]&lt;br /&gt;
[[file:CP-17.6.3-실행결과2.png | thumb | 화면 크기 변환 후]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.shape.Circle?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:id=&amp;quot;root&amp;quot; fx:controller=&amp;quot;ch17.p895.RootController&amp;quot; prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Circle fx:id=&amp;quot;circle&amp;quot; fill=&amp;quot;DODGERBLUE&amp;quot; radius=&amp;quot;50.0&amp;quot; stroke=&amp;quot;BLACK&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p895;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.binding.Bindings;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.layout.AnchorPane;&lt;br /&gt;
import javafx.scene.shape.Circle;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private AnchorPane root;&lt;br /&gt;
    @FXML private Circle circle;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        circle.centerXProperty().bind(Bindings.divide(root.widthProperty(), 2));&lt;br /&gt;
        circle.centerYProperty().bind(Bindings.divide(root.heightProperty(), 2));&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=419</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/1124</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=419"/>
		<updated>2022-07-22T06:00:41Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* 속성 바인딩 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JavaFX 개요 ==&lt;br /&gt;
# AWT&lt;br /&gt;
#* Native UI 컴포넌트 사용&lt;br /&gt;
#* 운영체제 마다 UI 모양이 다름&lt;br /&gt;
# Swing&lt;br /&gt;
#* 운영체제가 제공하는 native UI 사용 안 함&lt;br /&gt;
#* 운영체제가 새롭게 제공하는 UI 지원의 어려움&lt;br /&gt;
# JavaFX&lt;br /&gt;
#* Abode의 flash, Microsoft의 silverlight의 대항마&lt;br /&gt;
#* JDK 7부터 지원. JDK 8 권장.&lt;br /&gt;
#* JDK 11부터는 별도로 설치해야 함.&lt;br /&gt;
#* 화면 레이아웃과 스타일, 애플리케이션 로직 분리&lt;br /&gt;
#* Java 코드와 분리해서 스타일 시트(CSS)로 외관 작성 → 개발자와 디자이너의 동시 개발 가능&lt;br /&gt;
#* Java 코드에서도 레이아웃과 애플리케이션 로직을 분리하고 싶다면 레이아웃은 FXML로 작성, 로직은 Java로 작성&lt;br /&gt;
#* JavaFX 애플리케이션 구성 요소&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;50&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[레이아웃]'''&amp;lt;br/&amp;gt;자바 코드 파일&amp;lt;/br&amp;gt;또는 FXML 파일&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[외관 및 스타일]'''&amp;lt;br/&amp;gt;CSS 파일&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[리소스]'''&amp;lt;br/&amp;gt;그림 파일&amp;lt;br/&amp;gt;동영상 파일&amp;lt;br/&amp;gt;... &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[비즈니스 로직]'''&amp;lt;br/&amp;gt;자바 코드 파일&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JavaFX 애플리케이션 개발 시작 ==&lt;br /&gt;
=== 메인 클래스 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX 라이프사이클(life cycle) ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
    public AppMain() {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: AppMain() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: init() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: start() 호출&amp;quot;);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public void stop() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: stop() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: main() 호출&amp;quot;);&lt;br /&gt;
        launch(args);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
main: main() 호출&lt;br /&gt;
JavaFX Application Thread: AppMain() 호출&lt;br /&gt;
JavaFX-Launcher: init() 호출&lt;br /&gt;
JavaFX Application Thread: start() 호출&lt;br /&gt;
JavaFX Application Thread: stop() 호출 ← 프로그램을 끝내야 실행된다.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 메일 클래스 실행 매개값 얻기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
C:&amp;gt; java AppMain --ip=192.168.0.5 --port=50001&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* main()에서 launch(args)를 넘겨 받음&lt;br /&gt;
* init() 메소드에서 아래와 같이 실행할 수 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parameters params = getParameters();&lt;br /&gt;
List&amp;lt;String&amp;gt; list = params.getRaw();&lt;br /&gt;
Map&amp;lt;String, String&amp;gt; map = params.getNamed();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 무대(Stage)와 장면(Scene) ===&lt;br /&gt;
* 윈도우 : Stage&lt;br /&gt;
* Stage에는 하나의 Scene을 가질 수 있음&lt;br /&gt;
* Scene은 직접 생성해야 함&lt;br /&gt;
&lt;br /&gt;
[[file:CP2022_ch17.2_AppMain.png|thumb|AppMain 실행화면]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.application.Platform;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.layout.VBox;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        VBox root = new VBox();&lt;br /&gt;
        root.setPrefWidth(350);&lt;br /&gt;
        root.setPrefHeight(150);&lt;br /&gt;
        root.setAlignment(Pos.CENTER);&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Label label = new Label();&lt;br /&gt;
        label.setText(&amp;quot;Hello, JavaFX&amp;quot;);&lt;br /&gt;
        label.setFont(new Font(50));&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
        button.setOnAction(event-&amp;gt;Platform.exit());&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().add(label);&lt;br /&gt;
        root.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(root); // VBox를 루트 컨테이너(root container)로 해서 Scene 생성&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain입니다&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene); // 윈도우에 장면 설정&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 레이아웃 ==&lt;br /&gt;
=== 프로그램적 레이아웃 ===&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | 프로그램적 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.collections.ObservableList;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.TextField;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(10));&lt;br /&gt;
        hbox.setSpacing(10);&lt;br /&gt;
&lt;br /&gt;
        TextField textField = new TextField();&lt;br /&gt;
        textField.setPrefWidth(200);&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ObservableList list = hbox.getChildren();&lt;br /&gt;
        list.add(textField);&lt;br /&gt;
        list.add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 레이아웃 ===&lt;br /&gt;
* FXML 파일 (root.fxml)&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | FXML 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;padding&amp;gt;&lt;br /&gt;
        &amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/padding&amp;gt;&lt;br /&gt;
    &amp;lt;spacing&amp;gt;10&amp;lt;/spacing&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;children&amp;gt;&lt;br /&gt;
        &amp;lt;TextField&amp;gt;&lt;br /&gt;
            &amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&lt;br /&gt;
        &amp;lt;/TextField&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
    &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* AppMain 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;)); // ← FXML 로드&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 레이아웃(layout) 여백: 패딩(padding)과 마진(margin) ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cll&amp;gt;&lt;br /&gt;
구분      | HBox의 패딩                                                        | Button의 마진&lt;br /&gt;
개념      | [[file:CP-17.3.3-padding.png]]                                     | [[file:CP-17.3.3-margin.png]]&lt;br /&gt;
자바 코드 | HBox hbox = new HBox();&amp;lt;br/&amp;gt;'''hbox.setPadding(new Insets(50))'''; | Button button = new Button();&amp;lt;br/&amp;gt;'''HBox.setMargin(button, new Insets(50));'''&lt;br /&gt;
FXML 태그 | &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt; | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;HBox.margin&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Hbox.margin&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Margin, Padding 설정 방법&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// top, right, bottom, left를 모두 동일한 값으로 설정할 때&lt;br /&gt;
// Insets(double topRightBottomLeft)&lt;br /&gt;
new Insets(50);&lt;br /&gt;
&lt;br /&gt;
// top, right, bottom, left를 다를 값으로 설정할 때&lt;br /&gt;
// Insets(double top, double right, double bottom, double left)&lt;br /&gt;
new Insets(10, 20, 30, 40);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 패딩과 마진 적용 예&lt;br /&gt;
[[file:CP-17.3.3-AppMain.png|thumb|패딩과 마진 적용 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        // 패딩 설정&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(50, 10, 10, 50));&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setPrefSize(100, 100);&lt;br /&gt;
        &lt;br /&gt;
        // 마진 설정&lt;br /&gt;
        // HBox hbox = new HBox();&lt;br /&gt;
        // Button button = new Button();&lt;br /&gt;
        // button.setPrefSize(100, 100);&lt;br /&gt;
        // HBox.setMargin(button, new Insets(10, 10, 50, 50));&lt;br /&gt;
&lt;br /&gt;
        hbox.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 작성 규칙 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
TextField textField = new TextField();&amp;lt;br/&amp;gt;textField.setPrefWidth(200);&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/TextField&amp;gt;&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}   |  &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
ObsetvableList list = hbox.getChildren();&amp;lt;br/&amp;gt;list.add(textField);&amp;lt;br/&amp;gt;list.add(button);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;children&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Button&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 패키지(package) 선언 ====&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                          |   FXML 태그&lt;br /&gt;
import javafx.scene.layout.HBox;   |   &amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
import javafx.scene.control.*;     |   &amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;?import?&amp;gt;가 들어가는 위치는 &amp;lt;?xml ...&amp;gt;와 루트 컨테이너 태그 사이이다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;루트 컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/루트 컨테이너&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* import를 제대로 하지 않으면 not a valid type 메시지와 함께 javafx.fxml.LoadException 발생&lt;br /&gt;
&lt;br /&gt;
==== 태그(tag) 선언 ====&lt;br /&gt;
* 시작 태그와 끝 태그가 매칭되어야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 속성(attribute) 선언 ====&lt;br /&gt;
* 속성은 &amp;quot;나 '로 감싸야 한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;태그이름 속성명=&amp;quot;값&amp;quot; 속성명='값'&amp;gt; ... &amp;lt;/태그이름&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 속성명은 Setter 메소드 명이 옴&lt;br /&gt;
* 모든 Setter가 사용될 수 있는 것은 아님. 기본 타입(boolean, byte, short, char, int, long, float, double)의 값을 세팅하거나, String을 세팅하는 Setter만 올 수 있음&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML (Setter 태그)                                    | FXML (Setter 속성)&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;   | &amp;lt;Button text=&amp;quot;확인&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 객체 선언 ====&lt;br /&gt;
===== 클래스 속성 =====&lt;br /&gt;
* 생성자에 매개 변수가 있고, 매개 변수에 @NamedArg(javafx.beans.NamedArg) 어노테이션이 적용되어 있으면 속성명이나 자식 태그로 작성할 수 있음&lt;br /&gt;
&amp;lt;table2 class=wikitable sep=bar align=ll&amp;gt;&lt;br /&gt;
&amp;lt;클래스 매개변수=&amp;quot;값&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}     | &amp;lt;클래스&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;매개변수&amp;gt;값&amp;lt;/매개변수&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/클래스&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
** HBox를 패딩할 때 setPadding(Insets value) 메소드를 사용하는데&lt;br /&gt;
** Insets는 기본 생성자가 없고,&lt;br /&gt;
** Insets(double topRightBottomLeft) 또는 Insets(double top, double right, double bottom, double left)만 있음&lt;br /&gt;
** 이 경우 아래와 같이 선언 가능함&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:value =====&lt;br /&gt;
* 클래스가 valueOf(String) 메소드를 제공하는 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:value=&amp;quot;값&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
String.valueOf(&amp;quot;Hello, World!&amp;quot;);&amp;lt;br/&amp;gt;Integer.valueOf(&amp;quot;1&amp;quot;);&amp;lt;br/&amp;gt;Double.valueOf(&amp;quot;1.0&amp;quot;);&amp;lt;br/&amp;gt;Boolean.valueOf(&amp;quot;false&amp;quot;);  |  &amp;lt;String fx:value=&amp;quot;Hello, World!&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Integer fx:value=&amp;quot;1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Double fx:value=&amp;quot;1.0&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Boolean fx:value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:constant =====&lt;br /&gt;
*클래스에 정의된 상수값을 얻고 싶을 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:constant=&amp;quot;상수&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setMaxWidth( Double.MAX_VALUE );&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;maxWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/maxWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:factory =====&lt;br /&gt;
* 어떤 클래스는 new 연산자로 객체를 생성할 수 없고,&lt;br /&gt;
* 정적 메소드(이를 factory 메소드라 부른다)로 객체를 얻어야 하는 경우가 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:factory=&amp;quot;정적메소드&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예: &amp;lt;code&amp;gt;ObservableList&amp;lt;/code&amp;gt;의 구현 객체는 &amp;lt;code&amp;gt;javafx.collections.FXCollections&amp;lt;/code&amp;gt;의 정적 메소드인 &amp;lt;code&amp;gt;observableArrayList(E... items)&amp;lt;/code&amp;gt; 메소드로 얻을 수 있다.&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
ComboBox combo = new ComboBox();&amp;lt;br/&amp;gt;combo.setItems(FXCollections.observableArrayList(&amp;quot;공개&amp;quot;, &amp;quot;비공개&amp;quot;));&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;ComboBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Items&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;FXCollections fx:factory=&amp;quot;observableArrayList&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;비공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;/FXCollections&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/items&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/ComboBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 로딩과 Scene 생성 ===&lt;br /&gt;
* FXML 파일을 작성한 후 이를 이용하여 객체를 만들어야 한다. 이를 '''FXML loading'''이라고 한다.&lt;br /&gt;
* javafx.fxml.FXMLLoader를 이용&lt;br /&gt;
** 두 개의 load() 메소드 : 정적 메소드, 인스턴스 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* getClass() - 현재 클래스 리턴&lt;br /&gt;
* getResource() - 클래스가 위치하는 곳에서 상대 경로로 리소스의 URL을 리턴&lt;br /&gt;
* load() - FXML 파일을 로딩&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
FXMLLoader loader = new FXMLLoader(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
Parent root = (Parent)loader.load();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* load() - Parent 타입을 리턴함. 이것은 FXML 파일에서의 루트 태그로 선언된 컨테이너임&lt;br /&gt;
* 만을 루트 태그가 &amp;lt;HBox&amp;gt; 라면 다음과 같이 작성해도 됨&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
HBox hbox = (HBox) FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX Scene Builder ===&lt;br /&gt;
[[file:CP-SceneBuilder-1.png | thumb | Scene Builder로 root.fxml 띄움]]&lt;br /&gt;
* Scene Builder 다운로드 - https://gluonhq.com/products/scene-builder/&lt;br /&gt;
* [https://marketplace.visualstudio.com/items?itemName=bilalekrem.scenebuilderextension SceneBuilder extension for Visual Studio Code]&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 눌러 &amp;quot;Configure Scene Builder path&amp;quot;를 실행한다.&lt;br /&gt;
*** 경로를 다음과 같이 지정한다 : C:\Users\profs\AppData\Local\SceneBuilder 폴더의 SceneBuilder.exe 지정&lt;br /&gt;
&lt;br /&gt;
* Scene Builder 띄우는 방법&lt;br /&gt;
** fxml 파일을 선택한다.&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 누른다.&lt;br /&gt;
&lt;br /&gt;
== JavaFX 컨테이너 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
컨테이너   | 설명&lt;br /&gt;
AnchorPane | 컨트롤을 좌표로 배치하는 레이아웃&lt;br /&gt;
BorderPane | 위, 아래, 오른쪽, 왼쪽, 중앙에 컨트롤을 배치하는 레이아웃&lt;br /&gt;
FlowPane   | 행으로 배치하되 공간이 부족하면 새로운 행에 배치하는 레이아웃&lt;br /&gt;
GridPane   | 그리드로 배치하되 셀의 크기가 고정적이지 않은 레이아웃&lt;br /&gt;
StackPane  | 컨트롤을 겹쳐서 배치하는 레이아웃&lt;br /&gt;
TilePane   | 그리드로 배치하되 고정된 셀의 크기를 갖는 레이아웃&lt;br /&gt;
HBox       | 수평으로 배치하는 레이아웃&lt;br /&gt;
VBox       | 수직으로 배치하는 레이아웃&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AnchorPane 컨테이너 ===&lt;br /&gt;
[[file:CP-17.4.1-1.png]]&lt;br /&gt;
&lt;br /&gt;
* AnchorPane에서 사용할 수 있는 주요 설정&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명            | 적용&lt;br /&gt;
PrefWidth    | 폭을 설정       | AnchorPane&lt;br /&gt;
PrefHeight   | 높이를 설정     | AnchorPane&lt;br /&gt;
layoutX      | 컨트롤의 X 좌표 | 컨트롤&lt;br /&gt;
layoutY      | 컨트롤의 Y 좌표 | 컨트롤&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함   | AnchorPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.1-2.png | thumb | AnchorPane (Scene Builder)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.PasswordField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;150.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;28.0&amp;quot; text=&amp;quot;아이디&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;66.0&amp;quot; text=&amp;quot;패스워드&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;24.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;PasswordField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;62.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;97.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;164.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBox와 VBox 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                         | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                    | HBox, VBox&lt;br /&gt;
prefHeight   | 높이를 설정                  | HBox, VBox &lt;br /&gt;
alignment    | 컨트롤의 정렬을 설정         | HBox, VBox &lt;br /&gt;
spacing      | 컨트롤의 간격을 설정         | HBox, VBox&lt;br /&gt;
fillWidth    | 컨트롤의 폭 확장 여부 설정   | VBox&lt;br /&gt;
fillHeight   | 컨트롤의 높이 확장 여부 설정 | HBox&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함                | HBox, VBox&lt;br /&gt;
&amp;lt;HBox.hgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; | HBox의 남은 폭을 채움   | 컨트롤&lt;br /&gt;
&amp;lt;VBox.vgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/VBox.vgrow&amp;gt; | VBox의 남을 높이를 채움 | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root2.fxml&lt;br /&gt;
** 이 패키지의 하위 폴더로 &amp;lt;code&amp;gt;images&amp;lt;/code&amp;gt;를 만들고 여기에 javafx.png 파일을 복사해 넣어둔다. [[file:javafx.png | thumb | javafx.png]]&lt;br /&gt;
[[file:CP-17.4.3-project.png | thumb | images 폴더]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import java.lang.Double?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.Priority?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitWidth=&amp;quot;200.0&amp;quot; preserveRatio=&amp;quot;true&amp;quot;&amp;gt; &amp;lt;!-- 그림의 비율에 맞게 높이를 설정 --&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&lt;br /&gt;
          &amp;lt;Image url=&amp;quot;@images/javafx.png&amp;quot; /&amp;gt; &amp;lt;!-- 현재 경로 기준으로 상대경로로 파일 지정 --&amp;gt;&lt;br /&gt;
        &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;HBox alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;이전&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;다음&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;HBox.hgrow&amp;gt;&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; &amp;lt;!-- 오른쪽 남은 공간을 버튼이 모두 채우도록 설정 --&amp;gt;&lt;br /&gt;
              &amp;lt;maxWidth&amp;gt;&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;/maxWidth&amp;gt; &amp;lt;!-- 버튼의 폭을 자동으로 확장하기 위해 설정--&amp;gt;&lt;br /&gt;
            &amp;lt;/Button&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
         &amp;lt;VBox.margin&amp;gt;&lt;br /&gt;
           &amp;lt;Insets top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/VBox.margin&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.4.3-p874.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root2.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BorderPane 컨테이너 ===&lt;br /&gt;
* top, bottom, left, right, center 셀에 컨트롤을 배치하는 컨테이너&lt;br /&gt;
* 다른 컨테이너를 배치할 수도 있음&lt;br /&gt;
* 각 셀에는 '''하나'''의 컨트롤 또는 컨테이너만 배치할 수 있음&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-1.png | 250px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                           | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                      | BorderPane&lt;br /&gt;
prefHeight   | 높이를 설정                    | BorderPane&lt;br /&gt;
&amp;lt;top&amp;gt;        | top에 배치될 컨트롤을 포함     | BorderPane&lt;br /&gt;
&amp;lt;bottom&amp;gt;     | bottom에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;right&amp;gt;      | right에 배치될 컨트롤을 포함   | BorderPane&lt;br /&gt;
&amp;lt;left&amp;gt;       | left에 배치될 컨트롤을 포함    | BorderPane&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;center&amp;gt;&amp;lt;/nowiki&amp;gt;     | center에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.ToolBar?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;top&amp;gt;&lt;br /&gt;
      &amp;lt;ToolBar prefHeight=&amp;quot;40.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot; BorderPane.alignment=&amp;quot;CENTER&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;items&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/items&amp;gt;&lt;br /&gt;
      &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
   &amp;lt;/top&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea /&amp;gt; &amp;lt;!-- left와 right까지 확장--&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;BorderPane&amp;gt;&lt;br /&gt;
         &amp;lt;center&amp;gt;&lt;br /&gt;
           &amp;lt;TextField /&amp;gt; &amp;lt;!-- top, bottom, left까지 확장--&amp;gt;&lt;br /&gt;
         &amp;lt;/center&amp;gt;&lt;br /&gt;
         &amp;lt;right&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/right&amp;gt;&lt;br /&gt;
      &amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FlowPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                      | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                 | FlowPane&lt;br /&gt;
prefHeight   | 높이를 설정               | FlowPane&lt;br /&gt;
hgap         | 컨트롤의 수평 간격을 설정 | FlowPane&lt;br /&gt;
vgap         | 컨트롤의 수직 간격을 설정 | FlowPane&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함             |  FlowPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.5-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.FlowPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;FlowPane prefHeight=&amp;quot;70.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/FlowPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TilePane 컨테이너 ===&lt;br /&gt;
* 그리드로 컨트롤을 배치하되 고정된 셀(타일) 크기를 갖는 컨테이너&lt;br /&gt;
* 오른쪽에 배치할 공간이 부족하면 새로운 행에 컨트롤을 배치함&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-TilePane.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성   | 설명               | 적용&lt;br /&gt;
prefWidth      | 폭을 설정          | TilePane&lt;br /&gt;
prefHeight     | 높이를 설정        | TilePane&lt;br /&gt;
prefTileWidth  | 타일의 폭을 설정   | TilePane&lt;br /&gt;
prefTileHeight | 타일의 높이를 설정 | TilePane&lt;br /&gt;
&amp;lt;children&amp;gt;     | 컨트롤을 포함      | TilePane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:fruit1.jpg | fruit1.jpg&lt;br /&gt;
file:fruit2.jpg | fruit2.jpg&lt;br /&gt;
file:fruit3.jpg | fruit3.jpg&lt;br /&gt;
file:fruit4.jpg | fruit4.jpg&lt;br /&gt;
file:fruit5.jpg | fruit5.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.TilePane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TilePane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;100.0&amp;quot; prefWidth=&amp;quot;100.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit1.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit2.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit3.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit4.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit5.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/TilePane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GridPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성         | 설명                                 | 적용&lt;br /&gt;
prefWidth            | 폭을 설정                            | GridPane&lt;br /&gt;
prefHeight           | 놎이를 설정                          | GridPane&lt;br /&gt;
hgap                 | 수평 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
vgap                 | 수직 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
&amp;lt;children&amp;gt;           | 컨트롤을 포함                        | GridPane&lt;br /&gt;
GridPane.rowIndex    | 컨트롤이 위치하는 행 인덱스를 설정   | 컨트롤&lt;br /&gt;
GridPane.columnIndex | 컨트롤이 위치하는 컬럼 인덱스를 설정 | 컨트롤&lt;br /&gt;
GridPane.rowSpan     | 행 병합 수를 설정                    | 컨트롤&lt;br /&gt;
GridPane.columnSpan  | 컬럼 병합 수를 설정                  | 컨트롤&lt;br /&gt;
GridPane.hgrow       | 수평 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.vgrow       | 수직 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.halignment  | 컨트롤의 수평 정렬을 설정            | 컨트롤&lt;br /&gt;
GridPane.valignment  | 컨트롤의 수직 정렬을 설정            | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.7-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.ColumnConstraints?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.GridPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.RowConstraints?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GridPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; hgap=&amp;quot;10.0&amp;quot; vgap=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets topRightBottomLeft=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;아이디&amp;quot; GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;패스워드&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.columnIndex=&amp;quot;1&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
      &amp;lt;HBox GridPane.rowIndex=&amp;quot;2&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot;&lt;br /&gt;
                 GridPane.columnSpan=&amp;quot;2&amp;quot; GridPane.hgrow=&amp;quot;ALWAYS&amp;quot;&lt;br /&gt;
                 alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot; &amp;gt;  &amp;lt;!-- 컬럼 2개 병합 --&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/GridPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== StackPane 컨테이너 ===&lt;br /&gt;
* 컨트롤을 겹쳐 배치하는 컨테이너&lt;br /&gt;
* 카드 레이아웃(Card Layout)이라고도 함&lt;br /&gt;
* 만약 위에 있는 컨트롤이 투명하다면 밑에 있는 컨트롤이 겹쳐 보임&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:duke.jpg | duke.jpg&lt;br /&gt;
file:snow.jpg | snow.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.8-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.StackPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;StackPane  xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;300.0&amp;quot; prefWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitHeight=&amp;quot;300.0&amp;quot; fitWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/snow.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView preserveRatio=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/duke.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/StackPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 이벤트 처리 ==&lt;br /&gt;
&lt;br /&gt;
=== 이벤트 핸들러(EventHandler) ===&lt;br /&gt;
* JavaFX는 이벤트 발생 콘트롤과 이벤트 핸들러(EventHandler)를 분리하는 위임형(Delegation&amp;lt;ref&amp;gt;Design Pattern 중 Delegation Pattern&amp;lt;/ref&amp;gt;) 방식을 사용함&lt;br /&gt;
* 이를 위해 먼저 컨트롤에 EventHandler를 등록해야 함 (setOnXXX() 메소드. 예: setOnAction())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cccc&amp;gt;&lt;br /&gt;
컨트롤(control) | 사건        | 이벤트(event) 발생 | 이벤트 처리 담당 객체 | 이벤트 처리 메소드 실행 | 이벤트 처리 효과&lt;br /&gt;
Button          | 버튼을 누름 | ActionEvent        | EventHandler          | public void handle(...) {&amp;lt;br/&amp;gt;{{sp2}}이벤트 처리&amp;lt;/br/&amp;gt;} | 1. 윈도우 닫기&amp;lt;br/&amp;gt;2. 컨트롤 내용 변경&amp;lt;br/&amp;gt;3. 다이얼로그 띄우기&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Button 클릭 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Button button = new Button();&lt;br /&gt;
button.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(ActionEvent event) { ... }&lt;br /&gt;
}):&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* TableView에서 행을 마우스로 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TableView tableView = new TableView();&lt;br /&gt;
tableView.setOnMouseClicked(new EventHandler&amp;lt;MouseEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(MouseEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 윈도우 우측 상단(x) 버튼 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
stage.setOnCloseRequest(new EventHandler&amp;lt;WindowEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(WindowEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* EventHandler는 하나의 메소드를 가진 함수적 인터페이스이므로 람다식을 이용하여 이벤트 등록 가능&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
button.setOnAction( event-&amp;gt;{ ... } );&lt;br /&gt;
tableView.setOnMouseClicked( event-&amp;gt;{ ... } );&lt;br /&gt;
stage.setOnCloseRequest( event-&amp;gt;{ ... } );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.1-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox root = new HBox();&lt;br /&gt;
        root.setPrefSize(200, 50);&lt;br /&gt;
        root.setAlignment(Pos.CENTER); // 수평 중앙 정렬&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Button btn1 = new Button(&amp;quot;버튼1&amp;quot;);&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        Button btn2 = new Button(&amp;quot;버튼2&amp;quot;);&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;System.out.println(&amp;quot;버튼2 클릭&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().addAll(btn1, btn2); // HBox에 btn1과 btn2를 추가&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.setOnCloseRequest(event-&amp;gt;System.out.println(&amp;quot;종료 클릭&amp;quot;));&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FXML 컨트롤러(Controller) ===&lt;br /&gt;
&lt;br /&gt;
==== fx:controller 속성과 컨트롤러 클래스 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;루트컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;packageName.ControllerName&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/루트컨트롤러&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fx:id 속성과 @FXML 컨트롤 주입 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
      fx:controller=&amp;quot;sec05.exam02_fxml_controller.RootController&amp;quot;&lt;br /&gt;
      prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
      alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @FXML private Button btn1;&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML&lt;br /&gt;
    private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EventHandler 등록 ====&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.2-실행결과.png| thumb | 실행 결과]]&lt;br /&gt;
* AppMain.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* RootController.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private Button btn1; // import javafx.fxml.FXML 필요&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() { // 직접 EventHandler 생성 후 등록&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                handleBtn1Action(event);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;handleBtn2Action(event)); // 람다식 이용&lt;br /&gt;
        // btn3.setOnAction(event-&amp;gt;handleBtn3Action(event));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void handleBtn1Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void handleBtn2Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼2 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void handleBtn3Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼3 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root.xml&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
    fx:controller=&amp;quot;ch17.p889.RootController&amp;quot;&lt;br /&gt;
    prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
    alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; onAction=&amp;quot;#handleBtn3Action&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 이벤트 처리 메소드 매핑 ====&lt;br /&gt;
* FXML 파일&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button fx:id=&amp;quot;btn&amp;quot; text=&amp;quot;버튼&amp;quot; onAction=&amp;quot;#handleBtnAction&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Controller 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void handleBtnAction(ActionEvent event) { ... }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 속성 감시와 바인딩 ==&lt;br /&gt;
&lt;br /&gt;
=== 속성 감시 ===&lt;br /&gt;
* JavaFX 컨트롤 속성은 세 가지 메소드로 구성&lt;br /&gt;
*# Getter&lt;br /&gt;
*# Setter&lt;br /&gt;
*# Property 객체를 리턴하는 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private StringProperty text = new SimpleStringProperty(); // 값이 저장될 필드&lt;br /&gt;
&lt;br /&gt;
// Setter&lt;br /&gt;
public void setText(String newValue) {&lt;br /&gt;
    text.set(newValue);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Getter&lt;br /&gt;
public String getText() {&lt;br /&gt;
    return text.get();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Property 메소드&lt;br /&gt;
public StringProperty textProperty() {&lt;br /&gt;
    return text;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* text 속성을 감시하는 리스너 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textProperty().addListener(new ChangeListener&amp;lt;String&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void changed(ObservableValue&amp;lt;? extends String&amp;gt; observable, String oldValue, String newValue) {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Slider의 value 속성에 리스너 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Slider slider = new Slider();&lt;br /&gt;
slider.valueProperty().addListener( new ChangeListener&amp;lt;Number&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void changed(ObservableValue&amp;lt;? extends Number&amp;gt; observable, Number oldValue, Number newValue) {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.6.1-실행결과.png | thumb | 예제]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Slider?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.text.Font?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&lt;br /&gt;
      fx:controller=&amp;quot;ch17.p891.RootController&amp;quot;&lt;br /&gt;
      prefHeight=&amp;quot;250.0&amp;quot; prefWidth=&amp;quot;350.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;Label fx:id=&amp;quot;label&amp;quot; text=&amp;quot;JavaFX&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;font&amp;gt;&lt;br /&gt;
            &amp;lt;Font size=&amp;quot;0&amp;quot; /&amp;gt; &amp;lt;!-- Label의 기본 폰트 크기는 0 --&amp;gt;&lt;br /&gt;
         &amp;lt;/font&amp;gt;&lt;br /&gt;
      &amp;lt;/Label&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;Slider fx:id=&amp;quot;slider&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p891;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.value.ChangeListener;&lt;br /&gt;
import javafx.beans.value.ObservableValue;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.control.Slider;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private Slider slider;&lt;br /&gt;
    @FXML private Label label;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        slider.valueProperty().addListener(new ChangeListener&amp;lt;Number&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void changed(ObservableValue&amp;lt;? extends Number&amp;gt; observable, Number oldValue, Number newValue) {&lt;br /&gt;
                label.setFont(new Font(newValue.doubleValue()));&lt;br /&gt;
            }&lt;br /&gt;
        });             &lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p891;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 속성 바인딩 ===&lt;br /&gt;
* JavaFX 속성은 다른 속성과 바인딩될 수 있음&lt;br /&gt;
* 바인딩된 속성들은 하나가 변경되면 자동적으로 다른 하나도 변경&lt;br /&gt;
&lt;br /&gt;
* 예: textArea1에서 입력된 내용이 textArea2에 자동으로 입력 (단방향)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TextArea textArea1 = new TextArea();&lt;br /&gt;
TextArea textArea2 = new TextArea();&lt;br /&gt;
textArea2.textProperty().bind(textArea1.textProperty());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 양방향 바인딩&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textArea2.textProperty().bindBidirectional(textArea1.textProperty());&lt;br /&gt;
Bindings.bindBidirectional(textArea1.textProperty(), textArea2.textProperty());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Unbind&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textArea2.textProperty().unbin(); // 단방향 해제&lt;br /&gt;
textArea2.textProperty().unbindBidirectional(textArea1.textProperty()); // 양방향 해제&lt;br /&gt;
Bindings.unbindBidirectional(textArea1.textProperty(), textArea2.textProperty()); // 양방향 해제&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.6.2-실행결과.png | thumb | 속성 바인딩]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;ch17.p893.RootController&amp;quot; prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; spacing=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;textArea1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea fx:id=&amp;quot;textArea1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;textArea2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea fx:id=&amp;quot;textArea2&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p893;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.binding.Bindings;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.TextArea;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private TextArea textArea1;&lt;br /&gt;
    @FXML private TextArea textArea2;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        Bindings.bindBidirectional(textArea1.textProperty(), textArea2.textProperty());           &lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bindings 클래스 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
메소드                              | 설명&lt;br /&gt;
add, substract, multiply, divide    | 속성값에 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 수행하고 바인딩함&lt;br /&gt;
max, min                            | 속성값과 어떤 수를 비교해서 최대, 최소값을 얻고 바인딩함&lt;br /&gt;
greaterThan, greaterThanOrEqual     | 속성값이 어떤 값보다 큰지, 같거나 큰지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
lessThan, lessThanOrEqual           | 속성값이 어떤 값보다 작거나, 같거나 작은지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
equal, notEquals                    | 속성값이 어떤 값과 같은지, 다른지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
equalIgnoreCase, notEqualIgnoreCase | 대소문자와 상관없이 속성값이 어떤 문자열과 같은지, 다른지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
isEmpty, isNotEmpty                 | 속성값이 비어있는지, 아닌지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
isNull, isNotNull                   | 속성값이 null 또는 not null인지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
length                              | 속성값이 문자열일 경우 문자 수를 얻어 바인딩함&lt;br /&gt;
size                                | 속성 타입이 배열, List, Map, Set일 경우 요소 수를 얻어 바인딩함&lt;br /&gt;
and, or                             | 속성값이 boolean일 경우, 논리곱, 논리합을 얻어 바인딩함&lt;br /&gt;
not                                 | 속성값이 boolean일 경우, 반대값으로 바인딩함&lt;br /&gt;
convert                             | 속성값을 문자열로 변환해서 바인딩함&lt;br /&gt;
valueAt                             | 속성이 List, Map일 경우 해당 인덱스 또는 키의 값을 얻어 바인딩함&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.6.3-실행결과1.png | thumb | 초기 화면]]&lt;br /&gt;
[[file:CP-17.6.3-실행결과2.png | thumb | 화면 크기 변환 후]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.shape.Circle?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:id=&amp;quot;root&amp;quot; fx:controller=&amp;quot;ch17.p895.RootController&amp;quot; prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Circle fx:id=&amp;quot;circle&amp;quot; fill=&amp;quot;DODGERBLUE&amp;quot; radius=&amp;quot;50.0&amp;quot; stroke=&amp;quot;BLACK&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p895;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.binding.Bindings;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.layout.AnchorPane;&lt;br /&gt;
import javafx.scene.shape.Circle;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private AnchorPane root;&lt;br /&gt;
    @FXML private Circle circle;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        circle.centerXProperty().bind(Bindings.divide(root.widthProperty(), 2));&lt;br /&gt;
        circle.centerYProperty().bind(Bindings.divide(root.heightProperty(), 2));&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=418</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/1124</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=418"/>
		<updated>2022-07-22T05:57:26Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* 속성 감시 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JavaFX 개요 ==&lt;br /&gt;
# AWT&lt;br /&gt;
#* Native UI 컴포넌트 사용&lt;br /&gt;
#* 운영체제 마다 UI 모양이 다름&lt;br /&gt;
# Swing&lt;br /&gt;
#* 운영체제가 제공하는 native UI 사용 안 함&lt;br /&gt;
#* 운영체제가 새롭게 제공하는 UI 지원의 어려움&lt;br /&gt;
# JavaFX&lt;br /&gt;
#* Abode의 flash, Microsoft의 silverlight의 대항마&lt;br /&gt;
#* JDK 7부터 지원. JDK 8 권장.&lt;br /&gt;
#* JDK 11부터는 별도로 설치해야 함.&lt;br /&gt;
#* 화면 레이아웃과 스타일, 애플리케이션 로직 분리&lt;br /&gt;
#* Java 코드와 분리해서 스타일 시트(CSS)로 외관 작성 → 개발자와 디자이너의 동시 개발 가능&lt;br /&gt;
#* Java 코드에서도 레이아웃과 애플리케이션 로직을 분리하고 싶다면 레이아웃은 FXML로 작성, 로직은 Java로 작성&lt;br /&gt;
#* JavaFX 애플리케이션 구성 요소&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;50&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[레이아웃]'''&amp;lt;br/&amp;gt;자바 코드 파일&amp;lt;/br&amp;gt;또는 FXML 파일&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[외관 및 스타일]'''&amp;lt;br/&amp;gt;CSS 파일&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[리소스]'''&amp;lt;br/&amp;gt;그림 파일&amp;lt;br/&amp;gt;동영상 파일&amp;lt;br/&amp;gt;... &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[비즈니스 로직]'''&amp;lt;br/&amp;gt;자바 코드 파일&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JavaFX 애플리케이션 개발 시작 ==&lt;br /&gt;
=== 메인 클래스 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX 라이프사이클(life cycle) ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
    public AppMain() {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: AppMain() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: init() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: start() 호출&amp;quot;);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public void stop() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: stop() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: main() 호출&amp;quot;);&lt;br /&gt;
        launch(args);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
main: main() 호출&lt;br /&gt;
JavaFX Application Thread: AppMain() 호출&lt;br /&gt;
JavaFX-Launcher: init() 호출&lt;br /&gt;
JavaFX Application Thread: start() 호출&lt;br /&gt;
JavaFX Application Thread: stop() 호출 ← 프로그램을 끝내야 실행된다.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 메일 클래스 실행 매개값 얻기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
C:&amp;gt; java AppMain --ip=192.168.0.5 --port=50001&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* main()에서 launch(args)를 넘겨 받음&lt;br /&gt;
* init() 메소드에서 아래와 같이 실행할 수 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parameters params = getParameters();&lt;br /&gt;
List&amp;lt;String&amp;gt; list = params.getRaw();&lt;br /&gt;
Map&amp;lt;String, String&amp;gt; map = params.getNamed();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 무대(Stage)와 장면(Scene) ===&lt;br /&gt;
* 윈도우 : Stage&lt;br /&gt;
* Stage에는 하나의 Scene을 가질 수 있음&lt;br /&gt;
* Scene은 직접 생성해야 함&lt;br /&gt;
&lt;br /&gt;
[[file:CP2022_ch17.2_AppMain.png|thumb|AppMain 실행화면]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.application.Platform;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.layout.VBox;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        VBox root = new VBox();&lt;br /&gt;
        root.setPrefWidth(350);&lt;br /&gt;
        root.setPrefHeight(150);&lt;br /&gt;
        root.setAlignment(Pos.CENTER);&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Label label = new Label();&lt;br /&gt;
        label.setText(&amp;quot;Hello, JavaFX&amp;quot;);&lt;br /&gt;
        label.setFont(new Font(50));&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
        button.setOnAction(event-&amp;gt;Platform.exit());&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().add(label);&lt;br /&gt;
        root.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(root); // VBox를 루트 컨테이너(root container)로 해서 Scene 생성&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain입니다&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene); // 윈도우에 장면 설정&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 레이아웃 ==&lt;br /&gt;
=== 프로그램적 레이아웃 ===&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | 프로그램적 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.collections.ObservableList;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.TextField;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(10));&lt;br /&gt;
        hbox.setSpacing(10);&lt;br /&gt;
&lt;br /&gt;
        TextField textField = new TextField();&lt;br /&gt;
        textField.setPrefWidth(200);&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ObservableList list = hbox.getChildren();&lt;br /&gt;
        list.add(textField);&lt;br /&gt;
        list.add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 레이아웃 ===&lt;br /&gt;
* FXML 파일 (root.fxml)&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | FXML 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;padding&amp;gt;&lt;br /&gt;
        &amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/padding&amp;gt;&lt;br /&gt;
    &amp;lt;spacing&amp;gt;10&amp;lt;/spacing&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;children&amp;gt;&lt;br /&gt;
        &amp;lt;TextField&amp;gt;&lt;br /&gt;
            &amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&lt;br /&gt;
        &amp;lt;/TextField&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
    &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* AppMain 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;)); // ← FXML 로드&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 레이아웃(layout) 여백: 패딩(padding)과 마진(margin) ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cll&amp;gt;&lt;br /&gt;
구분      | HBox의 패딩                                                        | Button의 마진&lt;br /&gt;
개념      | [[file:CP-17.3.3-padding.png]]                                     | [[file:CP-17.3.3-margin.png]]&lt;br /&gt;
자바 코드 | HBox hbox = new HBox();&amp;lt;br/&amp;gt;'''hbox.setPadding(new Insets(50))'''; | Button button = new Button();&amp;lt;br/&amp;gt;'''HBox.setMargin(button, new Insets(50));'''&lt;br /&gt;
FXML 태그 | &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt; | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;HBox.margin&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Hbox.margin&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Margin, Padding 설정 방법&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// top, right, bottom, left를 모두 동일한 값으로 설정할 때&lt;br /&gt;
// Insets(double topRightBottomLeft)&lt;br /&gt;
new Insets(50);&lt;br /&gt;
&lt;br /&gt;
// top, right, bottom, left를 다를 값으로 설정할 때&lt;br /&gt;
// Insets(double top, double right, double bottom, double left)&lt;br /&gt;
new Insets(10, 20, 30, 40);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 패딩과 마진 적용 예&lt;br /&gt;
[[file:CP-17.3.3-AppMain.png|thumb|패딩과 마진 적용 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        // 패딩 설정&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(50, 10, 10, 50));&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setPrefSize(100, 100);&lt;br /&gt;
        &lt;br /&gt;
        // 마진 설정&lt;br /&gt;
        // HBox hbox = new HBox();&lt;br /&gt;
        // Button button = new Button();&lt;br /&gt;
        // button.setPrefSize(100, 100);&lt;br /&gt;
        // HBox.setMargin(button, new Insets(10, 10, 50, 50));&lt;br /&gt;
&lt;br /&gt;
        hbox.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 작성 규칙 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
TextField textField = new TextField();&amp;lt;br/&amp;gt;textField.setPrefWidth(200);&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/TextField&amp;gt;&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}   |  &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
ObsetvableList list = hbox.getChildren();&amp;lt;br/&amp;gt;list.add(textField);&amp;lt;br/&amp;gt;list.add(button);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;children&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Button&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 패키지(package) 선언 ====&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                          |   FXML 태그&lt;br /&gt;
import javafx.scene.layout.HBox;   |   &amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
import javafx.scene.control.*;     |   &amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;?import?&amp;gt;가 들어가는 위치는 &amp;lt;?xml ...&amp;gt;와 루트 컨테이너 태그 사이이다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;루트 컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/루트 컨테이너&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* import를 제대로 하지 않으면 not a valid type 메시지와 함께 javafx.fxml.LoadException 발생&lt;br /&gt;
&lt;br /&gt;
==== 태그(tag) 선언 ====&lt;br /&gt;
* 시작 태그와 끝 태그가 매칭되어야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 속성(attribute) 선언 ====&lt;br /&gt;
* 속성은 &amp;quot;나 '로 감싸야 한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;태그이름 속성명=&amp;quot;값&amp;quot; 속성명='값'&amp;gt; ... &amp;lt;/태그이름&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 속성명은 Setter 메소드 명이 옴&lt;br /&gt;
* 모든 Setter가 사용될 수 있는 것은 아님. 기본 타입(boolean, byte, short, char, int, long, float, double)의 값을 세팅하거나, String을 세팅하는 Setter만 올 수 있음&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML (Setter 태그)                                    | FXML (Setter 속성)&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;   | &amp;lt;Button text=&amp;quot;확인&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 객체 선언 ====&lt;br /&gt;
===== 클래스 속성 =====&lt;br /&gt;
* 생성자에 매개 변수가 있고, 매개 변수에 @NamedArg(javafx.beans.NamedArg) 어노테이션이 적용되어 있으면 속성명이나 자식 태그로 작성할 수 있음&lt;br /&gt;
&amp;lt;table2 class=wikitable sep=bar align=ll&amp;gt;&lt;br /&gt;
&amp;lt;클래스 매개변수=&amp;quot;값&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}     | &amp;lt;클래스&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;매개변수&amp;gt;값&amp;lt;/매개변수&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/클래스&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
** HBox를 패딩할 때 setPadding(Insets value) 메소드를 사용하는데&lt;br /&gt;
** Insets는 기본 생성자가 없고,&lt;br /&gt;
** Insets(double topRightBottomLeft) 또는 Insets(double top, double right, double bottom, double left)만 있음&lt;br /&gt;
** 이 경우 아래와 같이 선언 가능함&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:value =====&lt;br /&gt;
* 클래스가 valueOf(String) 메소드를 제공하는 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:value=&amp;quot;값&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
String.valueOf(&amp;quot;Hello, World!&amp;quot;);&amp;lt;br/&amp;gt;Integer.valueOf(&amp;quot;1&amp;quot;);&amp;lt;br/&amp;gt;Double.valueOf(&amp;quot;1.0&amp;quot;);&amp;lt;br/&amp;gt;Boolean.valueOf(&amp;quot;false&amp;quot;);  |  &amp;lt;String fx:value=&amp;quot;Hello, World!&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Integer fx:value=&amp;quot;1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Double fx:value=&amp;quot;1.0&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Boolean fx:value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:constant =====&lt;br /&gt;
*클래스에 정의된 상수값을 얻고 싶을 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:constant=&amp;quot;상수&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setMaxWidth( Double.MAX_VALUE );&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;maxWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/maxWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:factory =====&lt;br /&gt;
* 어떤 클래스는 new 연산자로 객체를 생성할 수 없고,&lt;br /&gt;
* 정적 메소드(이를 factory 메소드라 부른다)로 객체를 얻어야 하는 경우가 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:factory=&amp;quot;정적메소드&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예: &amp;lt;code&amp;gt;ObservableList&amp;lt;/code&amp;gt;의 구현 객체는 &amp;lt;code&amp;gt;javafx.collections.FXCollections&amp;lt;/code&amp;gt;의 정적 메소드인 &amp;lt;code&amp;gt;observableArrayList(E... items)&amp;lt;/code&amp;gt; 메소드로 얻을 수 있다.&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
ComboBox combo = new ComboBox();&amp;lt;br/&amp;gt;combo.setItems(FXCollections.observableArrayList(&amp;quot;공개&amp;quot;, &amp;quot;비공개&amp;quot;));&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;ComboBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Items&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;FXCollections fx:factory=&amp;quot;observableArrayList&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;비공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;/FXCollections&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/items&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/ComboBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 로딩과 Scene 생성 ===&lt;br /&gt;
* FXML 파일을 작성한 후 이를 이용하여 객체를 만들어야 한다. 이를 '''FXML loading'''이라고 한다.&lt;br /&gt;
* javafx.fxml.FXMLLoader를 이용&lt;br /&gt;
** 두 개의 load() 메소드 : 정적 메소드, 인스턴스 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* getClass() - 현재 클래스 리턴&lt;br /&gt;
* getResource() - 클래스가 위치하는 곳에서 상대 경로로 리소스의 URL을 리턴&lt;br /&gt;
* load() - FXML 파일을 로딩&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
FXMLLoader loader = new FXMLLoader(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
Parent root = (Parent)loader.load();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* load() - Parent 타입을 리턴함. 이것은 FXML 파일에서의 루트 태그로 선언된 컨테이너임&lt;br /&gt;
* 만을 루트 태그가 &amp;lt;HBox&amp;gt; 라면 다음과 같이 작성해도 됨&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
HBox hbox = (HBox) FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX Scene Builder ===&lt;br /&gt;
[[file:CP-SceneBuilder-1.png | thumb | Scene Builder로 root.fxml 띄움]]&lt;br /&gt;
* Scene Builder 다운로드 - https://gluonhq.com/products/scene-builder/&lt;br /&gt;
* [https://marketplace.visualstudio.com/items?itemName=bilalekrem.scenebuilderextension SceneBuilder extension for Visual Studio Code]&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 눌러 &amp;quot;Configure Scene Builder path&amp;quot;를 실행한다.&lt;br /&gt;
*** 경로를 다음과 같이 지정한다 : C:\Users\profs\AppData\Local\SceneBuilder 폴더의 SceneBuilder.exe 지정&lt;br /&gt;
&lt;br /&gt;
* Scene Builder 띄우는 방법&lt;br /&gt;
** fxml 파일을 선택한다.&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 누른다.&lt;br /&gt;
&lt;br /&gt;
== JavaFX 컨테이너 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
컨테이너   | 설명&lt;br /&gt;
AnchorPane | 컨트롤을 좌표로 배치하는 레이아웃&lt;br /&gt;
BorderPane | 위, 아래, 오른쪽, 왼쪽, 중앙에 컨트롤을 배치하는 레이아웃&lt;br /&gt;
FlowPane   | 행으로 배치하되 공간이 부족하면 새로운 행에 배치하는 레이아웃&lt;br /&gt;
GridPane   | 그리드로 배치하되 셀의 크기가 고정적이지 않은 레이아웃&lt;br /&gt;
StackPane  | 컨트롤을 겹쳐서 배치하는 레이아웃&lt;br /&gt;
TilePane   | 그리드로 배치하되 고정된 셀의 크기를 갖는 레이아웃&lt;br /&gt;
HBox       | 수평으로 배치하는 레이아웃&lt;br /&gt;
VBox       | 수직으로 배치하는 레이아웃&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AnchorPane 컨테이너 ===&lt;br /&gt;
[[file:CP-17.4.1-1.png]]&lt;br /&gt;
&lt;br /&gt;
* AnchorPane에서 사용할 수 있는 주요 설정&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명            | 적용&lt;br /&gt;
PrefWidth    | 폭을 설정       | AnchorPane&lt;br /&gt;
PrefHeight   | 높이를 설정     | AnchorPane&lt;br /&gt;
layoutX      | 컨트롤의 X 좌표 | 컨트롤&lt;br /&gt;
layoutY      | 컨트롤의 Y 좌표 | 컨트롤&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함   | AnchorPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.1-2.png | thumb | AnchorPane (Scene Builder)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.PasswordField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;150.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;28.0&amp;quot; text=&amp;quot;아이디&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;66.0&amp;quot; text=&amp;quot;패스워드&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;24.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;PasswordField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;62.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;97.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;164.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBox와 VBox 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                         | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                    | HBox, VBox&lt;br /&gt;
prefHeight   | 높이를 설정                  | HBox, VBox &lt;br /&gt;
alignment    | 컨트롤의 정렬을 설정         | HBox, VBox &lt;br /&gt;
spacing      | 컨트롤의 간격을 설정         | HBox, VBox&lt;br /&gt;
fillWidth    | 컨트롤의 폭 확장 여부 설정   | VBox&lt;br /&gt;
fillHeight   | 컨트롤의 높이 확장 여부 설정 | HBox&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함                | HBox, VBox&lt;br /&gt;
&amp;lt;HBox.hgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; | HBox의 남은 폭을 채움   | 컨트롤&lt;br /&gt;
&amp;lt;VBox.vgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/VBox.vgrow&amp;gt; | VBox의 남을 높이를 채움 | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root2.fxml&lt;br /&gt;
** 이 패키지의 하위 폴더로 &amp;lt;code&amp;gt;images&amp;lt;/code&amp;gt;를 만들고 여기에 javafx.png 파일을 복사해 넣어둔다. [[file:javafx.png | thumb | javafx.png]]&lt;br /&gt;
[[file:CP-17.4.3-project.png | thumb | images 폴더]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import java.lang.Double?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.Priority?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitWidth=&amp;quot;200.0&amp;quot; preserveRatio=&amp;quot;true&amp;quot;&amp;gt; &amp;lt;!-- 그림의 비율에 맞게 높이를 설정 --&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&lt;br /&gt;
          &amp;lt;Image url=&amp;quot;@images/javafx.png&amp;quot; /&amp;gt; &amp;lt;!-- 현재 경로 기준으로 상대경로로 파일 지정 --&amp;gt;&lt;br /&gt;
        &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;HBox alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;이전&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;다음&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;HBox.hgrow&amp;gt;&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; &amp;lt;!-- 오른쪽 남은 공간을 버튼이 모두 채우도록 설정 --&amp;gt;&lt;br /&gt;
              &amp;lt;maxWidth&amp;gt;&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;/maxWidth&amp;gt; &amp;lt;!-- 버튼의 폭을 자동으로 확장하기 위해 설정--&amp;gt;&lt;br /&gt;
            &amp;lt;/Button&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
         &amp;lt;VBox.margin&amp;gt;&lt;br /&gt;
           &amp;lt;Insets top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/VBox.margin&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.4.3-p874.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root2.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BorderPane 컨테이너 ===&lt;br /&gt;
* top, bottom, left, right, center 셀에 컨트롤을 배치하는 컨테이너&lt;br /&gt;
* 다른 컨테이너를 배치할 수도 있음&lt;br /&gt;
* 각 셀에는 '''하나'''의 컨트롤 또는 컨테이너만 배치할 수 있음&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-1.png | 250px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                           | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                      | BorderPane&lt;br /&gt;
prefHeight   | 높이를 설정                    | BorderPane&lt;br /&gt;
&amp;lt;top&amp;gt;        | top에 배치될 컨트롤을 포함     | BorderPane&lt;br /&gt;
&amp;lt;bottom&amp;gt;     | bottom에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;right&amp;gt;      | right에 배치될 컨트롤을 포함   | BorderPane&lt;br /&gt;
&amp;lt;left&amp;gt;       | left에 배치될 컨트롤을 포함    | BorderPane&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;center&amp;gt;&amp;lt;/nowiki&amp;gt;     | center에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.ToolBar?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;top&amp;gt;&lt;br /&gt;
      &amp;lt;ToolBar prefHeight=&amp;quot;40.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot; BorderPane.alignment=&amp;quot;CENTER&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;items&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/items&amp;gt;&lt;br /&gt;
      &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
   &amp;lt;/top&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea /&amp;gt; &amp;lt;!-- left와 right까지 확장--&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;BorderPane&amp;gt;&lt;br /&gt;
         &amp;lt;center&amp;gt;&lt;br /&gt;
           &amp;lt;TextField /&amp;gt; &amp;lt;!-- top, bottom, left까지 확장--&amp;gt;&lt;br /&gt;
         &amp;lt;/center&amp;gt;&lt;br /&gt;
         &amp;lt;right&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/right&amp;gt;&lt;br /&gt;
      &amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FlowPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                      | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                 | FlowPane&lt;br /&gt;
prefHeight   | 높이를 설정               | FlowPane&lt;br /&gt;
hgap         | 컨트롤의 수평 간격을 설정 | FlowPane&lt;br /&gt;
vgap         | 컨트롤의 수직 간격을 설정 | FlowPane&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함             |  FlowPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.5-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.FlowPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;FlowPane prefHeight=&amp;quot;70.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/FlowPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TilePane 컨테이너 ===&lt;br /&gt;
* 그리드로 컨트롤을 배치하되 고정된 셀(타일) 크기를 갖는 컨테이너&lt;br /&gt;
* 오른쪽에 배치할 공간이 부족하면 새로운 행에 컨트롤을 배치함&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-TilePane.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성   | 설명               | 적용&lt;br /&gt;
prefWidth      | 폭을 설정          | TilePane&lt;br /&gt;
prefHeight     | 높이를 설정        | TilePane&lt;br /&gt;
prefTileWidth  | 타일의 폭을 설정   | TilePane&lt;br /&gt;
prefTileHeight | 타일의 높이를 설정 | TilePane&lt;br /&gt;
&amp;lt;children&amp;gt;     | 컨트롤을 포함      | TilePane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:fruit1.jpg | fruit1.jpg&lt;br /&gt;
file:fruit2.jpg | fruit2.jpg&lt;br /&gt;
file:fruit3.jpg | fruit3.jpg&lt;br /&gt;
file:fruit4.jpg | fruit4.jpg&lt;br /&gt;
file:fruit5.jpg | fruit5.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.TilePane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TilePane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;100.0&amp;quot; prefWidth=&amp;quot;100.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit1.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit2.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit3.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit4.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit5.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/TilePane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GridPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성         | 설명                                 | 적용&lt;br /&gt;
prefWidth            | 폭을 설정                            | GridPane&lt;br /&gt;
prefHeight           | 놎이를 설정                          | GridPane&lt;br /&gt;
hgap                 | 수평 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
vgap                 | 수직 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
&amp;lt;children&amp;gt;           | 컨트롤을 포함                        | GridPane&lt;br /&gt;
GridPane.rowIndex    | 컨트롤이 위치하는 행 인덱스를 설정   | 컨트롤&lt;br /&gt;
GridPane.columnIndex | 컨트롤이 위치하는 컬럼 인덱스를 설정 | 컨트롤&lt;br /&gt;
GridPane.rowSpan     | 행 병합 수를 설정                    | 컨트롤&lt;br /&gt;
GridPane.columnSpan  | 컬럼 병합 수를 설정                  | 컨트롤&lt;br /&gt;
GridPane.hgrow       | 수평 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.vgrow       | 수직 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.halignment  | 컨트롤의 수평 정렬을 설정            | 컨트롤&lt;br /&gt;
GridPane.valignment  | 컨트롤의 수직 정렬을 설정            | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.7-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.ColumnConstraints?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.GridPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.RowConstraints?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GridPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; hgap=&amp;quot;10.0&amp;quot; vgap=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets topRightBottomLeft=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;아이디&amp;quot; GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;패스워드&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.columnIndex=&amp;quot;1&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
      &amp;lt;HBox GridPane.rowIndex=&amp;quot;2&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot;&lt;br /&gt;
                 GridPane.columnSpan=&amp;quot;2&amp;quot; GridPane.hgrow=&amp;quot;ALWAYS&amp;quot;&lt;br /&gt;
                 alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot; &amp;gt;  &amp;lt;!-- 컬럼 2개 병합 --&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/GridPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== StackPane 컨테이너 ===&lt;br /&gt;
* 컨트롤을 겹쳐 배치하는 컨테이너&lt;br /&gt;
* 카드 레이아웃(Card Layout)이라고도 함&lt;br /&gt;
* 만약 위에 있는 컨트롤이 투명하다면 밑에 있는 컨트롤이 겹쳐 보임&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:duke.jpg | duke.jpg&lt;br /&gt;
file:snow.jpg | snow.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.8-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.StackPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;StackPane  xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;300.0&amp;quot; prefWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitHeight=&amp;quot;300.0&amp;quot; fitWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/snow.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView preserveRatio=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/duke.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/StackPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 이벤트 처리 ==&lt;br /&gt;
&lt;br /&gt;
=== 이벤트 핸들러(EventHandler) ===&lt;br /&gt;
* JavaFX는 이벤트 발생 콘트롤과 이벤트 핸들러(EventHandler)를 분리하는 위임형(Delegation&amp;lt;ref&amp;gt;Design Pattern 중 Delegation Pattern&amp;lt;/ref&amp;gt;) 방식을 사용함&lt;br /&gt;
* 이를 위해 먼저 컨트롤에 EventHandler를 등록해야 함 (setOnXXX() 메소드. 예: setOnAction())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cccc&amp;gt;&lt;br /&gt;
컨트롤(control) | 사건        | 이벤트(event) 발생 | 이벤트 처리 담당 객체 | 이벤트 처리 메소드 실행 | 이벤트 처리 효과&lt;br /&gt;
Button          | 버튼을 누름 | ActionEvent        | EventHandler          | public void handle(...) {&amp;lt;br/&amp;gt;{{sp2}}이벤트 처리&amp;lt;/br/&amp;gt;} | 1. 윈도우 닫기&amp;lt;br/&amp;gt;2. 컨트롤 내용 변경&amp;lt;br/&amp;gt;3. 다이얼로그 띄우기&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Button 클릭 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Button button = new Button();&lt;br /&gt;
button.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(ActionEvent event) { ... }&lt;br /&gt;
}):&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* TableView에서 행을 마우스로 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TableView tableView = new TableView();&lt;br /&gt;
tableView.setOnMouseClicked(new EventHandler&amp;lt;MouseEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(MouseEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 윈도우 우측 상단(x) 버튼 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
stage.setOnCloseRequest(new EventHandler&amp;lt;WindowEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(WindowEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* EventHandler는 하나의 메소드를 가진 함수적 인터페이스이므로 람다식을 이용하여 이벤트 등록 가능&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
button.setOnAction( event-&amp;gt;{ ... } );&lt;br /&gt;
tableView.setOnMouseClicked( event-&amp;gt;{ ... } );&lt;br /&gt;
stage.setOnCloseRequest( event-&amp;gt;{ ... } );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.1-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox root = new HBox();&lt;br /&gt;
        root.setPrefSize(200, 50);&lt;br /&gt;
        root.setAlignment(Pos.CENTER); // 수평 중앙 정렬&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Button btn1 = new Button(&amp;quot;버튼1&amp;quot;);&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        Button btn2 = new Button(&amp;quot;버튼2&amp;quot;);&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;System.out.println(&amp;quot;버튼2 클릭&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().addAll(btn1, btn2); // HBox에 btn1과 btn2를 추가&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.setOnCloseRequest(event-&amp;gt;System.out.println(&amp;quot;종료 클릭&amp;quot;));&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FXML 컨트롤러(Controller) ===&lt;br /&gt;
&lt;br /&gt;
==== fx:controller 속성과 컨트롤러 클래스 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;루트컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;packageName.ControllerName&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/루트컨트롤러&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fx:id 속성과 @FXML 컨트롤 주입 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
      fx:controller=&amp;quot;sec05.exam02_fxml_controller.RootController&amp;quot;&lt;br /&gt;
      prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
      alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @FXML private Button btn1;&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML&lt;br /&gt;
    private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EventHandler 등록 ====&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.2-실행결과.png| thumb | 실행 결과]]&lt;br /&gt;
* AppMain.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* RootController.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private Button btn1; // import javafx.fxml.FXML 필요&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() { // 직접 EventHandler 생성 후 등록&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                handleBtn1Action(event);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;handleBtn2Action(event)); // 람다식 이용&lt;br /&gt;
        // btn3.setOnAction(event-&amp;gt;handleBtn3Action(event));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void handleBtn1Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void handleBtn2Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼2 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void handleBtn3Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼3 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root.xml&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
    fx:controller=&amp;quot;ch17.p889.RootController&amp;quot;&lt;br /&gt;
    prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
    alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; onAction=&amp;quot;#handleBtn3Action&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 이벤트 처리 메소드 매핑 ====&lt;br /&gt;
* FXML 파일&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button fx:id=&amp;quot;btn&amp;quot; text=&amp;quot;버튼&amp;quot; onAction=&amp;quot;#handleBtnAction&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Controller 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void handleBtnAction(ActionEvent event) { ... }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 속성 감시와 바인딩 ==&lt;br /&gt;
&lt;br /&gt;
=== 속성 감시 ===&lt;br /&gt;
* JavaFX 컨트롤 속성은 세 가지 메소드로 구성&lt;br /&gt;
*# Getter&lt;br /&gt;
*# Setter&lt;br /&gt;
*# Property 객체를 리턴하는 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private StringProperty text = new SimpleStringProperty(); // 값이 저장될 필드&lt;br /&gt;
&lt;br /&gt;
// Setter&lt;br /&gt;
public void setText(String newValue) {&lt;br /&gt;
    text.set(newValue);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Getter&lt;br /&gt;
public String getText() {&lt;br /&gt;
    return text.get();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Property 메소드&lt;br /&gt;
public StringProperty textProperty() {&lt;br /&gt;
    return text;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* text 속성을 감시하는 리스너 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textProperty().addListener(new ChangeListener&amp;lt;String&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void changed(ObservableValue&amp;lt;? extends String&amp;gt; observable, String oldValue, String newValue) {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Slider의 value 속성에 리스너 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Slider slider = new Slider();&lt;br /&gt;
slider.valueProperty().addListener( new ChangeListener&amp;lt;Number&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void changed(ObservableValue&amp;lt;? extends Number&amp;gt; observable, Number oldValue, Number newValue) {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.6.1-실행결과.png | thumb | 예제]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Slider?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.text.Font?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&lt;br /&gt;
      fx:controller=&amp;quot;ch17.p891.RootController&amp;quot;&lt;br /&gt;
      prefHeight=&amp;quot;250.0&amp;quot; prefWidth=&amp;quot;350.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;Label fx:id=&amp;quot;label&amp;quot; text=&amp;quot;JavaFX&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;font&amp;gt;&lt;br /&gt;
            &amp;lt;Font size=&amp;quot;0&amp;quot; /&amp;gt; &amp;lt;!-- Label의 기본 폰트 크기는 0 --&amp;gt;&lt;br /&gt;
         &amp;lt;/font&amp;gt;&lt;br /&gt;
      &amp;lt;/Label&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;Slider fx:id=&amp;quot;slider&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p891;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.value.ChangeListener;&lt;br /&gt;
import javafx.beans.value.ObservableValue;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.control.Slider;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private Slider slider;&lt;br /&gt;
    @FXML private Label label;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        slider.valueProperty().addListener(new ChangeListener&amp;lt;Number&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void changed(ObservableValue&amp;lt;? extends Number&amp;gt; observable, Number oldValue, Number newValue) {&lt;br /&gt;
                label.setFont(new Font(newValue.doubleValue()));&lt;br /&gt;
            }&lt;br /&gt;
        });             &lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p891;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 속성 바인딩 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TextArea textArea1 = new TextArea();&lt;br /&gt;
TextArea textArea2 = new TextArea();&lt;br /&gt;
textArea2.textProperty().bind(textArea1.textProperty());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textArea2.textProperty().bindBidirectional(textArea1.textProperty());&lt;br /&gt;
Bindings.bindBidirectional(textArea1.textProperty(), textArea2.textProperty());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textArea2.textProperty().unbin(); // 단방향 해제&lt;br /&gt;
textArea2.textProperty().unbindBidirectional(textArea1.textProperty()); // 양방향 해제&lt;br /&gt;
Bindings.unbindBidirectional(textArea1.textProperty(), textArea2.textProperty()); // 양방향 해제&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;ch17.p893.RootController&amp;quot; prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; spacing=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;textArea1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea fx:id=&amp;quot;textArea1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;textArea2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea fx:id=&amp;quot;textArea2&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.6.2-실행결과.png | thumb | 속성 바인딩]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p893;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.binding.Bindings;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.TextArea;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private TextArea textArea1;&lt;br /&gt;
    @FXML private TextArea textArea2;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        Bindings.bindBidirectional(textArea1.textProperty(), textArea2.textProperty());           &lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bindings 클래스 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
메소드                              | 설명&lt;br /&gt;
add, substract, multiply, divide    | 속성값에 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 수행하고 바인딩함&lt;br /&gt;
max, min                            | 속성값과 어떤 수를 비교해서 최대, 최소값을 얻고 바인딩함&lt;br /&gt;
greaterThan, greaterThanOrEqual     | 속성값이 어떤 값보다 큰지, 같거나 큰지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
lessThan, lessThanOrEqual           | 속성값이 어떤 값보다 작거나, 같거나 작은지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
equal, notEquals                    | 속성값이 어떤 값과 같은지, 다른지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
equalIgnoreCase, notEqualIgnoreCase | 대소문자와 상관없이 속성값이 어떤 문자열과 같은지, 다른지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
isEmpty, isNotEmpty                 | 속성값이 비어있는지, 아닌지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
isNull, isNotNull                   | 속성값이 null 또는 not null인지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
length                              | 속성값이 문자열일 경우 문자 수를 얻어 바인딩함&lt;br /&gt;
size                                | 속성 타입이 배열, List, Map, Set일 경우 요소 수를 얻어 바인딩함&lt;br /&gt;
and, or                             | 속성값이 boolean일 경우, 논리곱, 논리합을 얻어 바인딩함&lt;br /&gt;
not                                 | 속성값이 boolean일 경우, 반대값으로 바인딩함&lt;br /&gt;
convert                             | 속성값을 문자열로 변환해서 바인딩함&lt;br /&gt;
valueAt                             | 속성이 List, Map일 경우 해당 인덱스 또는 키의 값을 얻어 바인딩함&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.6.3-실행결과1.png | thumb | 초기 화면]]&lt;br /&gt;
[[file:CP-17.6.3-실행결과2.png | thumb | 화면 크기 변환 후]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.shape.Circle?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:id=&amp;quot;root&amp;quot; fx:controller=&amp;quot;ch17.p895.RootController&amp;quot; prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Circle fx:id=&amp;quot;circle&amp;quot; fill=&amp;quot;DODGERBLUE&amp;quot; radius=&amp;quot;50.0&amp;quot; stroke=&amp;quot;BLACK&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p895;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.binding.Bindings;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.layout.AnchorPane;&lt;br /&gt;
import javafx.scene.shape.Circle;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private AnchorPane root;&lt;br /&gt;
    @FXML private Circle circle;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        circle.centerXProperty().bind(Bindings.divide(root.widthProperty(), 2));&lt;br /&gt;
        circle.centerYProperty().bind(Bindings.divide(root.heightProperty(), 2));&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=File:CP-17.6.1-%EC%8B%A4%ED%96%89%EA%B2%B0%EA%B3%BC.png&amp;diff=417</id>
		<title>File:CP-17.6.1-실행결과.png</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=File:CP-17.6.1-%EC%8B%A4%ED%96%89%EA%B2%B0%EA%B3%BC.png&amp;diff=417"/>
		<updated>2022-07-22T05:53:10Z</updated>

		<summary type="html">&lt;p&gt;Swpark: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=File:CP-17.6.2-%EC%8B%A4%ED%96%89%EA%B2%B0%EA%B3%BC.png&amp;diff=416</id>
		<title>File:CP-17.6.2-실행결과.png</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=File:CP-17.6.2-%EC%8B%A4%ED%96%89%EA%B2%B0%EA%B3%BC.png&amp;diff=416"/>
		<updated>2022-07-22T05:51:38Z</updated>

		<summary type="html">&lt;p&gt;Swpark: Swpark moved page File:CP-17.6.1-실행결과.png to File:CP-17.6.2-실행결과.png without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=File:CP-17.6.3-%EC%8B%A4%ED%96%89%EA%B2%B0%EA%B3%BC2.png&amp;diff=415</id>
		<title>File:CP-17.6.3-실행결과2.png</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=File:CP-17.6.3-%EC%8B%A4%ED%96%89%EA%B2%B0%EA%B3%BC2.png&amp;diff=415"/>
		<updated>2022-07-22T05:49:29Z</updated>

		<summary type="html">&lt;p&gt;Swpark: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=File:CP-17.6.3-%EC%8B%A4%ED%96%89%EA%B2%B0%EA%B3%BC1.png&amp;diff=414</id>
		<title>File:CP-17.6.3-실행결과1.png</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=File:CP-17.6.3-%EC%8B%A4%ED%96%89%EA%B2%B0%EA%B3%BC1.png&amp;diff=414"/>
		<updated>2022-07-22T05:49:18Z</updated>

		<summary type="html">&lt;p&gt;Swpark: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=413</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/1124</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=413"/>
		<updated>2022-07-22T05:49:05Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* JavaFX 속성 감시와 바인딩 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JavaFX 개요 ==&lt;br /&gt;
# AWT&lt;br /&gt;
#* Native UI 컴포넌트 사용&lt;br /&gt;
#* 운영체제 마다 UI 모양이 다름&lt;br /&gt;
# Swing&lt;br /&gt;
#* 운영체제가 제공하는 native UI 사용 안 함&lt;br /&gt;
#* 운영체제가 새롭게 제공하는 UI 지원의 어려움&lt;br /&gt;
# JavaFX&lt;br /&gt;
#* Abode의 flash, Microsoft의 silverlight의 대항마&lt;br /&gt;
#* JDK 7부터 지원. JDK 8 권장.&lt;br /&gt;
#* JDK 11부터는 별도로 설치해야 함.&lt;br /&gt;
#* 화면 레이아웃과 스타일, 애플리케이션 로직 분리&lt;br /&gt;
#* Java 코드와 분리해서 스타일 시트(CSS)로 외관 작성 → 개발자와 디자이너의 동시 개발 가능&lt;br /&gt;
#* Java 코드에서도 레이아웃과 애플리케이션 로직을 분리하고 싶다면 레이아웃은 FXML로 작성, 로직은 Java로 작성&lt;br /&gt;
#* JavaFX 애플리케이션 구성 요소&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;50&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[레이아웃]'''&amp;lt;br/&amp;gt;자바 코드 파일&amp;lt;/br&amp;gt;또는 FXML 파일&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[외관 및 스타일]'''&amp;lt;br/&amp;gt;CSS 파일&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[리소스]'''&amp;lt;br/&amp;gt;그림 파일&amp;lt;br/&amp;gt;동영상 파일&amp;lt;br/&amp;gt;... &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[비즈니스 로직]'''&amp;lt;br/&amp;gt;자바 코드 파일&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JavaFX 애플리케이션 개발 시작 ==&lt;br /&gt;
=== 메인 클래스 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX 라이프사이클(life cycle) ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
    public AppMain() {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: AppMain() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: init() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: start() 호출&amp;quot;);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public void stop() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: stop() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: main() 호출&amp;quot;);&lt;br /&gt;
        launch(args);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
main: main() 호출&lt;br /&gt;
JavaFX Application Thread: AppMain() 호출&lt;br /&gt;
JavaFX-Launcher: init() 호출&lt;br /&gt;
JavaFX Application Thread: start() 호출&lt;br /&gt;
JavaFX Application Thread: stop() 호출 ← 프로그램을 끝내야 실행된다.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 메일 클래스 실행 매개값 얻기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
C:&amp;gt; java AppMain --ip=192.168.0.5 --port=50001&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* main()에서 launch(args)를 넘겨 받음&lt;br /&gt;
* init() 메소드에서 아래와 같이 실행할 수 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parameters params = getParameters();&lt;br /&gt;
List&amp;lt;String&amp;gt; list = params.getRaw();&lt;br /&gt;
Map&amp;lt;String, String&amp;gt; map = params.getNamed();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 무대(Stage)와 장면(Scene) ===&lt;br /&gt;
* 윈도우 : Stage&lt;br /&gt;
* Stage에는 하나의 Scene을 가질 수 있음&lt;br /&gt;
* Scene은 직접 생성해야 함&lt;br /&gt;
&lt;br /&gt;
[[file:CP2022_ch17.2_AppMain.png|thumb|AppMain 실행화면]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.application.Platform;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.layout.VBox;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        VBox root = new VBox();&lt;br /&gt;
        root.setPrefWidth(350);&lt;br /&gt;
        root.setPrefHeight(150);&lt;br /&gt;
        root.setAlignment(Pos.CENTER);&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Label label = new Label();&lt;br /&gt;
        label.setText(&amp;quot;Hello, JavaFX&amp;quot;);&lt;br /&gt;
        label.setFont(new Font(50));&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
        button.setOnAction(event-&amp;gt;Platform.exit());&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().add(label);&lt;br /&gt;
        root.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(root); // VBox를 루트 컨테이너(root container)로 해서 Scene 생성&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain입니다&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene); // 윈도우에 장면 설정&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 레이아웃 ==&lt;br /&gt;
=== 프로그램적 레이아웃 ===&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | 프로그램적 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.collections.ObservableList;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.TextField;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(10));&lt;br /&gt;
        hbox.setSpacing(10);&lt;br /&gt;
&lt;br /&gt;
        TextField textField = new TextField();&lt;br /&gt;
        textField.setPrefWidth(200);&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ObservableList list = hbox.getChildren();&lt;br /&gt;
        list.add(textField);&lt;br /&gt;
        list.add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 레이아웃 ===&lt;br /&gt;
* FXML 파일 (root.fxml)&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | FXML 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;padding&amp;gt;&lt;br /&gt;
        &amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/padding&amp;gt;&lt;br /&gt;
    &amp;lt;spacing&amp;gt;10&amp;lt;/spacing&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;children&amp;gt;&lt;br /&gt;
        &amp;lt;TextField&amp;gt;&lt;br /&gt;
            &amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&lt;br /&gt;
        &amp;lt;/TextField&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
    &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* AppMain 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;)); // ← FXML 로드&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 레이아웃(layout) 여백: 패딩(padding)과 마진(margin) ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cll&amp;gt;&lt;br /&gt;
구분      | HBox의 패딩                                                        | Button의 마진&lt;br /&gt;
개념      | [[file:CP-17.3.3-padding.png]]                                     | [[file:CP-17.3.3-margin.png]]&lt;br /&gt;
자바 코드 | HBox hbox = new HBox();&amp;lt;br/&amp;gt;'''hbox.setPadding(new Insets(50))'''; | Button button = new Button();&amp;lt;br/&amp;gt;'''HBox.setMargin(button, new Insets(50));'''&lt;br /&gt;
FXML 태그 | &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt; | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;HBox.margin&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Hbox.margin&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Margin, Padding 설정 방법&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// top, right, bottom, left를 모두 동일한 값으로 설정할 때&lt;br /&gt;
// Insets(double topRightBottomLeft)&lt;br /&gt;
new Insets(50);&lt;br /&gt;
&lt;br /&gt;
// top, right, bottom, left를 다를 값으로 설정할 때&lt;br /&gt;
// Insets(double top, double right, double bottom, double left)&lt;br /&gt;
new Insets(10, 20, 30, 40);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 패딩과 마진 적용 예&lt;br /&gt;
[[file:CP-17.3.3-AppMain.png|thumb|패딩과 마진 적용 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        // 패딩 설정&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(50, 10, 10, 50));&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setPrefSize(100, 100);&lt;br /&gt;
        &lt;br /&gt;
        // 마진 설정&lt;br /&gt;
        // HBox hbox = new HBox();&lt;br /&gt;
        // Button button = new Button();&lt;br /&gt;
        // button.setPrefSize(100, 100);&lt;br /&gt;
        // HBox.setMargin(button, new Insets(10, 10, 50, 50));&lt;br /&gt;
&lt;br /&gt;
        hbox.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 작성 규칙 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
TextField textField = new TextField();&amp;lt;br/&amp;gt;textField.setPrefWidth(200);&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/TextField&amp;gt;&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}   |  &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
ObsetvableList list = hbox.getChildren();&amp;lt;br/&amp;gt;list.add(textField);&amp;lt;br/&amp;gt;list.add(button);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;children&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Button&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 패키지(package) 선언 ====&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                          |   FXML 태그&lt;br /&gt;
import javafx.scene.layout.HBox;   |   &amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
import javafx.scene.control.*;     |   &amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;?import?&amp;gt;가 들어가는 위치는 &amp;lt;?xml ...&amp;gt;와 루트 컨테이너 태그 사이이다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;루트 컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/루트 컨테이너&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* import를 제대로 하지 않으면 not a valid type 메시지와 함께 javafx.fxml.LoadException 발생&lt;br /&gt;
&lt;br /&gt;
==== 태그(tag) 선언 ====&lt;br /&gt;
* 시작 태그와 끝 태그가 매칭되어야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 속성(attribute) 선언 ====&lt;br /&gt;
* 속성은 &amp;quot;나 '로 감싸야 한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;태그이름 속성명=&amp;quot;값&amp;quot; 속성명='값'&amp;gt; ... &amp;lt;/태그이름&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 속성명은 Setter 메소드 명이 옴&lt;br /&gt;
* 모든 Setter가 사용될 수 있는 것은 아님. 기본 타입(boolean, byte, short, char, int, long, float, double)의 값을 세팅하거나, String을 세팅하는 Setter만 올 수 있음&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML (Setter 태그)                                    | FXML (Setter 속성)&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;   | &amp;lt;Button text=&amp;quot;확인&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 객체 선언 ====&lt;br /&gt;
===== 클래스 속성 =====&lt;br /&gt;
* 생성자에 매개 변수가 있고, 매개 변수에 @NamedArg(javafx.beans.NamedArg) 어노테이션이 적용되어 있으면 속성명이나 자식 태그로 작성할 수 있음&lt;br /&gt;
&amp;lt;table2 class=wikitable sep=bar align=ll&amp;gt;&lt;br /&gt;
&amp;lt;클래스 매개변수=&amp;quot;값&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}     | &amp;lt;클래스&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;매개변수&amp;gt;값&amp;lt;/매개변수&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/클래스&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
** HBox를 패딩할 때 setPadding(Insets value) 메소드를 사용하는데&lt;br /&gt;
** Insets는 기본 생성자가 없고,&lt;br /&gt;
** Insets(double topRightBottomLeft) 또는 Insets(double top, double right, double bottom, double left)만 있음&lt;br /&gt;
** 이 경우 아래와 같이 선언 가능함&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:value =====&lt;br /&gt;
* 클래스가 valueOf(String) 메소드를 제공하는 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:value=&amp;quot;값&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
String.valueOf(&amp;quot;Hello, World!&amp;quot;);&amp;lt;br/&amp;gt;Integer.valueOf(&amp;quot;1&amp;quot;);&amp;lt;br/&amp;gt;Double.valueOf(&amp;quot;1.0&amp;quot;);&amp;lt;br/&amp;gt;Boolean.valueOf(&amp;quot;false&amp;quot;);  |  &amp;lt;String fx:value=&amp;quot;Hello, World!&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Integer fx:value=&amp;quot;1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Double fx:value=&amp;quot;1.0&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Boolean fx:value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:constant =====&lt;br /&gt;
*클래스에 정의된 상수값을 얻고 싶을 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:constant=&amp;quot;상수&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setMaxWidth( Double.MAX_VALUE );&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;maxWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/maxWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:factory =====&lt;br /&gt;
* 어떤 클래스는 new 연산자로 객체를 생성할 수 없고,&lt;br /&gt;
* 정적 메소드(이를 factory 메소드라 부른다)로 객체를 얻어야 하는 경우가 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:factory=&amp;quot;정적메소드&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예: &amp;lt;code&amp;gt;ObservableList&amp;lt;/code&amp;gt;의 구현 객체는 &amp;lt;code&amp;gt;javafx.collections.FXCollections&amp;lt;/code&amp;gt;의 정적 메소드인 &amp;lt;code&amp;gt;observableArrayList(E... items)&amp;lt;/code&amp;gt; 메소드로 얻을 수 있다.&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
ComboBox combo = new ComboBox();&amp;lt;br/&amp;gt;combo.setItems(FXCollections.observableArrayList(&amp;quot;공개&amp;quot;, &amp;quot;비공개&amp;quot;));&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;ComboBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Items&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;FXCollections fx:factory=&amp;quot;observableArrayList&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;비공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;/FXCollections&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/items&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/ComboBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 로딩과 Scene 생성 ===&lt;br /&gt;
* FXML 파일을 작성한 후 이를 이용하여 객체를 만들어야 한다. 이를 '''FXML loading'''이라고 한다.&lt;br /&gt;
* javafx.fxml.FXMLLoader를 이용&lt;br /&gt;
** 두 개의 load() 메소드 : 정적 메소드, 인스턴스 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* getClass() - 현재 클래스 리턴&lt;br /&gt;
* getResource() - 클래스가 위치하는 곳에서 상대 경로로 리소스의 URL을 리턴&lt;br /&gt;
* load() - FXML 파일을 로딩&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
FXMLLoader loader = new FXMLLoader(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
Parent root = (Parent)loader.load();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* load() - Parent 타입을 리턴함. 이것은 FXML 파일에서의 루트 태그로 선언된 컨테이너임&lt;br /&gt;
* 만을 루트 태그가 &amp;lt;HBox&amp;gt; 라면 다음과 같이 작성해도 됨&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
HBox hbox = (HBox) FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX Scene Builder ===&lt;br /&gt;
[[file:CP-SceneBuilder-1.png | thumb | Scene Builder로 root.fxml 띄움]]&lt;br /&gt;
* Scene Builder 다운로드 - https://gluonhq.com/products/scene-builder/&lt;br /&gt;
* [https://marketplace.visualstudio.com/items?itemName=bilalekrem.scenebuilderextension SceneBuilder extension for Visual Studio Code]&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 눌러 &amp;quot;Configure Scene Builder path&amp;quot;를 실행한다.&lt;br /&gt;
*** 경로를 다음과 같이 지정한다 : C:\Users\profs\AppData\Local\SceneBuilder 폴더의 SceneBuilder.exe 지정&lt;br /&gt;
&lt;br /&gt;
* Scene Builder 띄우는 방법&lt;br /&gt;
** fxml 파일을 선택한다.&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 누른다.&lt;br /&gt;
&lt;br /&gt;
== JavaFX 컨테이너 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
컨테이너   | 설명&lt;br /&gt;
AnchorPane | 컨트롤을 좌표로 배치하는 레이아웃&lt;br /&gt;
BorderPane | 위, 아래, 오른쪽, 왼쪽, 중앙에 컨트롤을 배치하는 레이아웃&lt;br /&gt;
FlowPane   | 행으로 배치하되 공간이 부족하면 새로운 행에 배치하는 레이아웃&lt;br /&gt;
GridPane   | 그리드로 배치하되 셀의 크기가 고정적이지 않은 레이아웃&lt;br /&gt;
StackPane  | 컨트롤을 겹쳐서 배치하는 레이아웃&lt;br /&gt;
TilePane   | 그리드로 배치하되 고정된 셀의 크기를 갖는 레이아웃&lt;br /&gt;
HBox       | 수평으로 배치하는 레이아웃&lt;br /&gt;
VBox       | 수직으로 배치하는 레이아웃&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AnchorPane 컨테이너 ===&lt;br /&gt;
[[file:CP-17.4.1-1.png]]&lt;br /&gt;
&lt;br /&gt;
* AnchorPane에서 사용할 수 있는 주요 설정&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명            | 적용&lt;br /&gt;
PrefWidth    | 폭을 설정       | AnchorPane&lt;br /&gt;
PrefHeight   | 높이를 설정     | AnchorPane&lt;br /&gt;
layoutX      | 컨트롤의 X 좌표 | 컨트롤&lt;br /&gt;
layoutY      | 컨트롤의 Y 좌표 | 컨트롤&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함   | AnchorPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.1-2.png | thumb | AnchorPane (Scene Builder)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.PasswordField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;150.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;28.0&amp;quot; text=&amp;quot;아이디&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;66.0&amp;quot; text=&amp;quot;패스워드&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;24.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;PasswordField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;62.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;97.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;164.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBox와 VBox 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                         | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                    | HBox, VBox&lt;br /&gt;
prefHeight   | 높이를 설정                  | HBox, VBox &lt;br /&gt;
alignment    | 컨트롤의 정렬을 설정         | HBox, VBox &lt;br /&gt;
spacing      | 컨트롤의 간격을 설정         | HBox, VBox&lt;br /&gt;
fillWidth    | 컨트롤의 폭 확장 여부 설정   | VBox&lt;br /&gt;
fillHeight   | 컨트롤의 높이 확장 여부 설정 | HBox&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함                | HBox, VBox&lt;br /&gt;
&amp;lt;HBox.hgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; | HBox의 남은 폭을 채움   | 컨트롤&lt;br /&gt;
&amp;lt;VBox.vgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/VBox.vgrow&amp;gt; | VBox의 남을 높이를 채움 | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root2.fxml&lt;br /&gt;
** 이 패키지의 하위 폴더로 &amp;lt;code&amp;gt;images&amp;lt;/code&amp;gt;를 만들고 여기에 javafx.png 파일을 복사해 넣어둔다. [[file:javafx.png | thumb | javafx.png]]&lt;br /&gt;
[[file:CP-17.4.3-project.png | thumb | images 폴더]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import java.lang.Double?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.Priority?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitWidth=&amp;quot;200.0&amp;quot; preserveRatio=&amp;quot;true&amp;quot;&amp;gt; &amp;lt;!-- 그림의 비율에 맞게 높이를 설정 --&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&lt;br /&gt;
          &amp;lt;Image url=&amp;quot;@images/javafx.png&amp;quot; /&amp;gt; &amp;lt;!-- 현재 경로 기준으로 상대경로로 파일 지정 --&amp;gt;&lt;br /&gt;
        &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;HBox alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;이전&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;다음&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;HBox.hgrow&amp;gt;&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; &amp;lt;!-- 오른쪽 남은 공간을 버튼이 모두 채우도록 설정 --&amp;gt;&lt;br /&gt;
              &amp;lt;maxWidth&amp;gt;&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;/maxWidth&amp;gt; &amp;lt;!-- 버튼의 폭을 자동으로 확장하기 위해 설정--&amp;gt;&lt;br /&gt;
            &amp;lt;/Button&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
         &amp;lt;VBox.margin&amp;gt;&lt;br /&gt;
           &amp;lt;Insets top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/VBox.margin&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.4.3-p874.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root2.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BorderPane 컨테이너 ===&lt;br /&gt;
* top, bottom, left, right, center 셀에 컨트롤을 배치하는 컨테이너&lt;br /&gt;
* 다른 컨테이너를 배치할 수도 있음&lt;br /&gt;
* 각 셀에는 '''하나'''의 컨트롤 또는 컨테이너만 배치할 수 있음&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-1.png | 250px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                           | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                      | BorderPane&lt;br /&gt;
prefHeight   | 높이를 설정                    | BorderPane&lt;br /&gt;
&amp;lt;top&amp;gt;        | top에 배치될 컨트롤을 포함     | BorderPane&lt;br /&gt;
&amp;lt;bottom&amp;gt;     | bottom에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;right&amp;gt;      | right에 배치될 컨트롤을 포함   | BorderPane&lt;br /&gt;
&amp;lt;left&amp;gt;       | left에 배치될 컨트롤을 포함    | BorderPane&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;center&amp;gt;&amp;lt;/nowiki&amp;gt;     | center에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.ToolBar?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;top&amp;gt;&lt;br /&gt;
      &amp;lt;ToolBar prefHeight=&amp;quot;40.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot; BorderPane.alignment=&amp;quot;CENTER&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;items&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/items&amp;gt;&lt;br /&gt;
      &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
   &amp;lt;/top&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea /&amp;gt; &amp;lt;!-- left와 right까지 확장--&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;BorderPane&amp;gt;&lt;br /&gt;
         &amp;lt;center&amp;gt;&lt;br /&gt;
           &amp;lt;TextField /&amp;gt; &amp;lt;!-- top, bottom, left까지 확장--&amp;gt;&lt;br /&gt;
         &amp;lt;/center&amp;gt;&lt;br /&gt;
         &amp;lt;right&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/right&amp;gt;&lt;br /&gt;
      &amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FlowPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                      | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                 | FlowPane&lt;br /&gt;
prefHeight   | 높이를 설정               | FlowPane&lt;br /&gt;
hgap         | 컨트롤의 수평 간격을 설정 | FlowPane&lt;br /&gt;
vgap         | 컨트롤의 수직 간격을 설정 | FlowPane&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함             |  FlowPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.5-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.FlowPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;FlowPane prefHeight=&amp;quot;70.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/FlowPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TilePane 컨테이너 ===&lt;br /&gt;
* 그리드로 컨트롤을 배치하되 고정된 셀(타일) 크기를 갖는 컨테이너&lt;br /&gt;
* 오른쪽에 배치할 공간이 부족하면 새로운 행에 컨트롤을 배치함&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-TilePane.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성   | 설명               | 적용&lt;br /&gt;
prefWidth      | 폭을 설정          | TilePane&lt;br /&gt;
prefHeight     | 높이를 설정        | TilePane&lt;br /&gt;
prefTileWidth  | 타일의 폭을 설정   | TilePane&lt;br /&gt;
prefTileHeight | 타일의 높이를 설정 | TilePane&lt;br /&gt;
&amp;lt;children&amp;gt;     | 컨트롤을 포함      | TilePane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:fruit1.jpg | fruit1.jpg&lt;br /&gt;
file:fruit2.jpg | fruit2.jpg&lt;br /&gt;
file:fruit3.jpg | fruit3.jpg&lt;br /&gt;
file:fruit4.jpg | fruit4.jpg&lt;br /&gt;
file:fruit5.jpg | fruit5.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.TilePane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TilePane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;100.0&amp;quot; prefWidth=&amp;quot;100.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit1.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit2.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit3.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit4.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit5.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/TilePane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GridPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성         | 설명                                 | 적용&lt;br /&gt;
prefWidth            | 폭을 설정                            | GridPane&lt;br /&gt;
prefHeight           | 놎이를 설정                          | GridPane&lt;br /&gt;
hgap                 | 수평 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
vgap                 | 수직 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
&amp;lt;children&amp;gt;           | 컨트롤을 포함                        | GridPane&lt;br /&gt;
GridPane.rowIndex    | 컨트롤이 위치하는 행 인덱스를 설정   | 컨트롤&lt;br /&gt;
GridPane.columnIndex | 컨트롤이 위치하는 컬럼 인덱스를 설정 | 컨트롤&lt;br /&gt;
GridPane.rowSpan     | 행 병합 수를 설정                    | 컨트롤&lt;br /&gt;
GridPane.columnSpan  | 컬럼 병합 수를 설정                  | 컨트롤&lt;br /&gt;
GridPane.hgrow       | 수평 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.vgrow       | 수직 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.halignment  | 컨트롤의 수평 정렬을 설정            | 컨트롤&lt;br /&gt;
GridPane.valignment  | 컨트롤의 수직 정렬을 설정            | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.7-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.ColumnConstraints?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.GridPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.RowConstraints?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GridPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; hgap=&amp;quot;10.0&amp;quot; vgap=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets topRightBottomLeft=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;아이디&amp;quot; GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;패스워드&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.columnIndex=&amp;quot;1&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
      &amp;lt;HBox GridPane.rowIndex=&amp;quot;2&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot;&lt;br /&gt;
                 GridPane.columnSpan=&amp;quot;2&amp;quot; GridPane.hgrow=&amp;quot;ALWAYS&amp;quot;&lt;br /&gt;
                 alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot; &amp;gt;  &amp;lt;!-- 컬럼 2개 병합 --&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/GridPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== StackPane 컨테이너 ===&lt;br /&gt;
* 컨트롤을 겹쳐 배치하는 컨테이너&lt;br /&gt;
* 카드 레이아웃(Card Layout)이라고도 함&lt;br /&gt;
* 만약 위에 있는 컨트롤이 투명하다면 밑에 있는 컨트롤이 겹쳐 보임&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:duke.jpg | duke.jpg&lt;br /&gt;
file:snow.jpg | snow.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.8-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.StackPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;StackPane  xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;300.0&amp;quot; prefWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitHeight=&amp;quot;300.0&amp;quot; fitWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/snow.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView preserveRatio=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/duke.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/StackPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 이벤트 처리 ==&lt;br /&gt;
&lt;br /&gt;
=== 이벤트 핸들러(EventHandler) ===&lt;br /&gt;
* JavaFX는 이벤트 발생 콘트롤과 이벤트 핸들러(EventHandler)를 분리하는 위임형(Delegation&amp;lt;ref&amp;gt;Design Pattern 중 Delegation Pattern&amp;lt;/ref&amp;gt;) 방식을 사용함&lt;br /&gt;
* 이를 위해 먼저 컨트롤에 EventHandler를 등록해야 함 (setOnXXX() 메소드. 예: setOnAction())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cccc&amp;gt;&lt;br /&gt;
컨트롤(control) | 사건        | 이벤트(event) 발생 | 이벤트 처리 담당 객체 | 이벤트 처리 메소드 실행 | 이벤트 처리 효과&lt;br /&gt;
Button          | 버튼을 누름 | ActionEvent        | EventHandler          | public void handle(...) {&amp;lt;br/&amp;gt;{{sp2}}이벤트 처리&amp;lt;/br/&amp;gt;} | 1. 윈도우 닫기&amp;lt;br/&amp;gt;2. 컨트롤 내용 변경&amp;lt;br/&amp;gt;3. 다이얼로그 띄우기&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Button 클릭 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Button button = new Button();&lt;br /&gt;
button.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(ActionEvent event) { ... }&lt;br /&gt;
}):&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* TableView에서 행을 마우스로 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TableView tableView = new TableView();&lt;br /&gt;
tableView.setOnMouseClicked(new EventHandler&amp;lt;MouseEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(MouseEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 윈도우 우측 상단(x) 버튼 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
stage.setOnCloseRequest(new EventHandler&amp;lt;WindowEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(WindowEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* EventHandler는 하나의 메소드를 가진 함수적 인터페이스이므로 람다식을 이용하여 이벤트 등록 가능&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
button.setOnAction( event-&amp;gt;{ ... } );&lt;br /&gt;
tableView.setOnMouseClicked( event-&amp;gt;{ ... } );&lt;br /&gt;
stage.setOnCloseRequest( event-&amp;gt;{ ... } );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.1-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox root = new HBox();&lt;br /&gt;
        root.setPrefSize(200, 50);&lt;br /&gt;
        root.setAlignment(Pos.CENTER); // 수평 중앙 정렬&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Button btn1 = new Button(&amp;quot;버튼1&amp;quot;);&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        Button btn2 = new Button(&amp;quot;버튼2&amp;quot;);&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;System.out.println(&amp;quot;버튼2 클릭&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().addAll(btn1, btn2); // HBox에 btn1과 btn2를 추가&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.setOnCloseRequest(event-&amp;gt;System.out.println(&amp;quot;종료 클릭&amp;quot;));&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FXML 컨트롤러(Controller) ===&lt;br /&gt;
&lt;br /&gt;
==== fx:controller 속성과 컨트롤러 클래스 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;루트컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;packageName.ControllerName&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/루트컨트롤러&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fx:id 속성과 @FXML 컨트롤 주입 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
      fx:controller=&amp;quot;sec05.exam02_fxml_controller.RootController&amp;quot;&lt;br /&gt;
      prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
      alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @FXML private Button btn1;&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML&lt;br /&gt;
    private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EventHandler 등록 ====&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.2-실행결과.png| thumb | 실행 결과]]&lt;br /&gt;
* AppMain.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* RootController.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private Button btn1; // import javafx.fxml.FXML 필요&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() { // 직접 EventHandler 생성 후 등록&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                handleBtn1Action(event);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;handleBtn2Action(event)); // 람다식 이용&lt;br /&gt;
        // btn3.setOnAction(event-&amp;gt;handleBtn3Action(event));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void handleBtn1Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void handleBtn2Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼2 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void handleBtn3Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼3 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root.xml&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
    fx:controller=&amp;quot;ch17.p889.RootController&amp;quot;&lt;br /&gt;
    prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
    alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; onAction=&amp;quot;#handleBtn3Action&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 이벤트 처리 메소드 매핑 ====&lt;br /&gt;
* FXML 파일&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button fx:id=&amp;quot;btn&amp;quot; text=&amp;quot;버튼&amp;quot; onAction=&amp;quot;#handleBtnAction&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Controller 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void handleBtnAction(ActionEvent event) { ... }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 속성 감시와 바인딩 ==&lt;br /&gt;
&lt;br /&gt;
=== 속성 감시 ===&lt;br /&gt;
* JavaFX 컨트롤 속성은 세 가지 메소드로 구성&lt;br /&gt;
*# Getter&lt;br /&gt;
*# Setter&lt;br /&gt;
*# Property 객체를 리턴하는 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private StringProperty text = new SimpleStringProperty(); // 값이 저장될 필드&lt;br /&gt;
&lt;br /&gt;
// Setter&lt;br /&gt;
public void setText(String newValue) {&lt;br /&gt;
    text.set(newValue);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Getter&lt;br /&gt;
public String getText() {&lt;br /&gt;
    return text.get();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Property 메소드&lt;br /&gt;
public StringProperty textProperty() {&lt;br /&gt;
    return text;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textProperty().addListener(new ChangeListener&amp;lt;String&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void changed(ObservableValue&amp;lt;? extends String&amp;gt; observable, String oldValue, String newValue) {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Slider slider = new Slider();&lt;br /&gt;
slider.valueProperty().addListener( new ChangeListener&amp;lt;Number&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void changed(ObservableValue&amp;lt;? extends Number&amp;gt; observable, Number oldValue, Number newValue) {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.6.1-실행결과.png | thumb | 예제]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Slider?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.text.Font?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&lt;br /&gt;
      fx:controller=&amp;quot;ch17.p891.RootController&amp;quot;&lt;br /&gt;
      prefHeight=&amp;quot;250.0&amp;quot; prefWidth=&amp;quot;350.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;Label fx:id=&amp;quot;label&amp;quot; text=&amp;quot;JavaFX&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;font&amp;gt;&lt;br /&gt;
            &amp;lt;Font size=&amp;quot;0&amp;quot; /&amp;gt; &amp;lt;!-- Label의 기본 폰트 크기는 0 --&amp;gt;&lt;br /&gt;
         &amp;lt;/font&amp;gt;&lt;br /&gt;
      &amp;lt;/Label&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;Slider fx:id=&amp;quot;slider&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p891;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.value.ChangeListener;&lt;br /&gt;
import javafx.beans.value.ObservableValue;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.control.Slider;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private Slider slider;&lt;br /&gt;
    @FXML private Label label;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        slider.valueProperty().addListener(new ChangeListener&amp;lt;Number&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void changed(ObservableValue&amp;lt;? extends Number&amp;gt; observable, Number oldValue, Number newValue) {&lt;br /&gt;
                label.setFont(new Font(newValue.doubleValue()));&lt;br /&gt;
            }&lt;br /&gt;
        });             &lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p891;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 속성 바인딩 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TextArea textArea1 = new TextArea();&lt;br /&gt;
TextArea textArea2 = new TextArea();&lt;br /&gt;
textArea2.textProperty().bind(textArea1.textProperty());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textArea2.textProperty().bindBidirectional(textArea1.textProperty());&lt;br /&gt;
Bindings.bindBidirectional(textArea1.textProperty(), textArea2.textProperty());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textArea2.textProperty().unbin(); // 단방향 해제&lt;br /&gt;
textArea2.textProperty().unbindBidirectional(textArea1.textProperty()); // 양방향 해제&lt;br /&gt;
Bindings.unbindBidirectional(textArea1.textProperty(), textArea2.textProperty()); // 양방향 해제&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;ch17.p893.RootController&amp;quot; prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; spacing=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;textArea1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea fx:id=&amp;quot;textArea1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;textArea2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea fx:id=&amp;quot;textArea2&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.6.2-실행결과.png | thumb | 속성 바인딩]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p893;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.binding.Bindings;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.TextArea;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private TextArea textArea1;&lt;br /&gt;
    @FXML private TextArea textArea2;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        Bindings.bindBidirectional(textArea1.textProperty(), textArea2.textProperty());           &lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bindings 클래스 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
메소드                              | 설명&lt;br /&gt;
add, substract, multiply, divide    | 속성값에 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 수행하고 바인딩함&lt;br /&gt;
max, min                            | 속성값과 어떤 수를 비교해서 최대, 최소값을 얻고 바인딩함&lt;br /&gt;
greaterThan, greaterThanOrEqual     | 속성값이 어떤 값보다 큰지, 같거나 큰지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
lessThan, lessThanOrEqual           | 속성값이 어떤 값보다 작거나, 같거나 작은지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
equal, notEquals                    | 속성값이 어떤 값과 같은지, 다른지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
equalIgnoreCase, notEqualIgnoreCase | 대소문자와 상관없이 속성값이 어떤 문자열과 같은지, 다른지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
isEmpty, isNotEmpty                 | 속성값이 비어있는지, 아닌지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
isNull, isNotNull                   | 속성값이 null 또는 not null인지를 조사해서 true/false로 변환하여 바인딩함&lt;br /&gt;
length                              | 속성값이 문자열일 경우 문자 수를 얻어 바인딩함&lt;br /&gt;
size                                | 속성 타입이 배열, List, Map, Set일 경우 요소 수를 얻어 바인딩함&lt;br /&gt;
and, or                             | 속성값이 boolean일 경우, 논리곱, 논리합을 얻어 바인딩함&lt;br /&gt;
not                                 | 속성값이 boolean일 경우, 반대값으로 바인딩함&lt;br /&gt;
convert                             | 속성값을 문자열로 변환해서 바인딩함&lt;br /&gt;
valueAt                             | 속성이 List, Map일 경우 해당 인덱스 또는 키의 값을 얻어 바인딩함&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.6.3-실행결과1.png | thumb | 초기 화면]]&lt;br /&gt;
[[file:CP-17.6.3-실행결과2.png | thumb | 화면 크기 변환 후]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.shape.Circle?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:id=&amp;quot;root&amp;quot; fx:controller=&amp;quot;ch17.p895.RootController&amp;quot; prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Circle fx:id=&amp;quot;circle&amp;quot; fill=&amp;quot;DODGERBLUE&amp;quot; radius=&amp;quot;50.0&amp;quot; stroke=&amp;quot;BLACK&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p895;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.binding.Bindings;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.layout.AnchorPane;&lt;br /&gt;
import javafx.scene.shape.Circle;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private AnchorPane root;&lt;br /&gt;
    @FXML private Circle circle;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        circle.centerXProperty().bind(Bindings.divide(root.widthProperty(), 2));&lt;br /&gt;
        circle.centerYProperty().bind(Bindings.divide(root.heightProperty(), 2));&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=File:CP-17.6.2-%EC%8B%A4%ED%96%89%EA%B2%B0%EA%B3%BC.png&amp;diff=412</id>
		<title>File:CP-17.6.2-실행결과.png</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=File:CP-17.6.2-%EC%8B%A4%ED%96%89%EA%B2%B0%EA%B3%BC.png&amp;diff=412"/>
		<updated>2022-07-22T05:15:27Z</updated>

		<summary type="html">&lt;p&gt;Swpark: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=411</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/1124</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=411"/>
		<updated>2022-07-22T05:15:18Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* JavaFX 속성 감시와 바인딩 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JavaFX 개요 ==&lt;br /&gt;
# AWT&lt;br /&gt;
#* Native UI 컴포넌트 사용&lt;br /&gt;
#* 운영체제 마다 UI 모양이 다름&lt;br /&gt;
# Swing&lt;br /&gt;
#* 운영체제가 제공하는 native UI 사용 안 함&lt;br /&gt;
#* 운영체제가 새롭게 제공하는 UI 지원의 어려움&lt;br /&gt;
# JavaFX&lt;br /&gt;
#* Abode의 flash, Microsoft의 silverlight의 대항마&lt;br /&gt;
#* JDK 7부터 지원. JDK 8 권장.&lt;br /&gt;
#* JDK 11부터는 별도로 설치해야 함.&lt;br /&gt;
#* 화면 레이아웃과 스타일, 애플리케이션 로직 분리&lt;br /&gt;
#* Java 코드와 분리해서 스타일 시트(CSS)로 외관 작성 → 개발자와 디자이너의 동시 개발 가능&lt;br /&gt;
#* Java 코드에서도 레이아웃과 애플리케이션 로직을 분리하고 싶다면 레이아웃은 FXML로 작성, 로직은 Java로 작성&lt;br /&gt;
#* JavaFX 애플리케이션 구성 요소&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;50&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[레이아웃]'''&amp;lt;br/&amp;gt;자바 코드 파일&amp;lt;/br&amp;gt;또는 FXML 파일&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[외관 및 스타일]'''&amp;lt;br/&amp;gt;CSS 파일&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[리소스]'''&amp;lt;br/&amp;gt;그림 파일&amp;lt;br/&amp;gt;동영상 파일&amp;lt;br/&amp;gt;... &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[비즈니스 로직]'''&amp;lt;br/&amp;gt;자바 코드 파일&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JavaFX 애플리케이션 개발 시작 ==&lt;br /&gt;
=== 메인 클래스 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX 라이프사이클(life cycle) ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
    public AppMain() {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: AppMain() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: init() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: start() 호출&amp;quot;);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public void stop() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: stop() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: main() 호출&amp;quot;);&lt;br /&gt;
        launch(args);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
main: main() 호출&lt;br /&gt;
JavaFX Application Thread: AppMain() 호출&lt;br /&gt;
JavaFX-Launcher: init() 호출&lt;br /&gt;
JavaFX Application Thread: start() 호출&lt;br /&gt;
JavaFX Application Thread: stop() 호출 ← 프로그램을 끝내야 실행된다.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 메일 클래스 실행 매개값 얻기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
C:&amp;gt; java AppMain --ip=192.168.0.5 --port=50001&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* main()에서 launch(args)를 넘겨 받음&lt;br /&gt;
* init() 메소드에서 아래와 같이 실행할 수 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parameters params = getParameters();&lt;br /&gt;
List&amp;lt;String&amp;gt; list = params.getRaw();&lt;br /&gt;
Map&amp;lt;String, String&amp;gt; map = params.getNamed();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 무대(Stage)와 장면(Scene) ===&lt;br /&gt;
* 윈도우 : Stage&lt;br /&gt;
* Stage에는 하나의 Scene을 가질 수 있음&lt;br /&gt;
* Scene은 직접 생성해야 함&lt;br /&gt;
&lt;br /&gt;
[[file:CP2022_ch17.2_AppMain.png|thumb|AppMain 실행화면]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.application.Platform;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.layout.VBox;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        VBox root = new VBox();&lt;br /&gt;
        root.setPrefWidth(350);&lt;br /&gt;
        root.setPrefHeight(150);&lt;br /&gt;
        root.setAlignment(Pos.CENTER);&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Label label = new Label();&lt;br /&gt;
        label.setText(&amp;quot;Hello, JavaFX&amp;quot;);&lt;br /&gt;
        label.setFont(new Font(50));&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
        button.setOnAction(event-&amp;gt;Platform.exit());&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().add(label);&lt;br /&gt;
        root.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(root); // VBox를 루트 컨테이너(root container)로 해서 Scene 생성&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain입니다&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene); // 윈도우에 장면 설정&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 레이아웃 ==&lt;br /&gt;
=== 프로그램적 레이아웃 ===&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | 프로그램적 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.collections.ObservableList;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.TextField;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(10));&lt;br /&gt;
        hbox.setSpacing(10);&lt;br /&gt;
&lt;br /&gt;
        TextField textField = new TextField();&lt;br /&gt;
        textField.setPrefWidth(200);&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ObservableList list = hbox.getChildren();&lt;br /&gt;
        list.add(textField);&lt;br /&gt;
        list.add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 레이아웃 ===&lt;br /&gt;
* FXML 파일 (root.fxml)&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | FXML 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;padding&amp;gt;&lt;br /&gt;
        &amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/padding&amp;gt;&lt;br /&gt;
    &amp;lt;spacing&amp;gt;10&amp;lt;/spacing&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;children&amp;gt;&lt;br /&gt;
        &amp;lt;TextField&amp;gt;&lt;br /&gt;
            &amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&lt;br /&gt;
        &amp;lt;/TextField&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
    &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* AppMain 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;)); // ← FXML 로드&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 레이아웃(layout) 여백: 패딩(padding)과 마진(margin) ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cll&amp;gt;&lt;br /&gt;
구분      | HBox의 패딩                                                        | Button의 마진&lt;br /&gt;
개념      | [[file:CP-17.3.3-padding.png]]                                     | [[file:CP-17.3.3-margin.png]]&lt;br /&gt;
자바 코드 | HBox hbox = new HBox();&amp;lt;br/&amp;gt;'''hbox.setPadding(new Insets(50))'''; | Button button = new Button();&amp;lt;br/&amp;gt;'''HBox.setMargin(button, new Insets(50));'''&lt;br /&gt;
FXML 태그 | &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt; | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;HBox.margin&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Hbox.margin&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Margin, Padding 설정 방법&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// top, right, bottom, left를 모두 동일한 값으로 설정할 때&lt;br /&gt;
// Insets(double topRightBottomLeft)&lt;br /&gt;
new Insets(50);&lt;br /&gt;
&lt;br /&gt;
// top, right, bottom, left를 다를 값으로 설정할 때&lt;br /&gt;
// Insets(double top, double right, double bottom, double left)&lt;br /&gt;
new Insets(10, 20, 30, 40);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 패딩과 마진 적용 예&lt;br /&gt;
[[file:CP-17.3.3-AppMain.png|thumb|패딩과 마진 적용 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        // 패딩 설정&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(50, 10, 10, 50));&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setPrefSize(100, 100);&lt;br /&gt;
        &lt;br /&gt;
        // 마진 설정&lt;br /&gt;
        // HBox hbox = new HBox();&lt;br /&gt;
        // Button button = new Button();&lt;br /&gt;
        // button.setPrefSize(100, 100);&lt;br /&gt;
        // HBox.setMargin(button, new Insets(10, 10, 50, 50));&lt;br /&gt;
&lt;br /&gt;
        hbox.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 작성 규칙 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
TextField textField = new TextField();&amp;lt;br/&amp;gt;textField.setPrefWidth(200);&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/TextField&amp;gt;&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}   |  &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
ObsetvableList list = hbox.getChildren();&amp;lt;br/&amp;gt;list.add(textField);&amp;lt;br/&amp;gt;list.add(button);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;children&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Button&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 패키지(package) 선언 ====&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                          |   FXML 태그&lt;br /&gt;
import javafx.scene.layout.HBox;   |   &amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
import javafx.scene.control.*;     |   &amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;?import?&amp;gt;가 들어가는 위치는 &amp;lt;?xml ...&amp;gt;와 루트 컨테이너 태그 사이이다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;루트 컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/루트 컨테이너&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* import를 제대로 하지 않으면 not a valid type 메시지와 함께 javafx.fxml.LoadException 발생&lt;br /&gt;
&lt;br /&gt;
==== 태그(tag) 선언 ====&lt;br /&gt;
* 시작 태그와 끝 태그가 매칭되어야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 속성(attribute) 선언 ====&lt;br /&gt;
* 속성은 &amp;quot;나 '로 감싸야 한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;태그이름 속성명=&amp;quot;값&amp;quot; 속성명='값'&amp;gt; ... &amp;lt;/태그이름&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 속성명은 Setter 메소드 명이 옴&lt;br /&gt;
* 모든 Setter가 사용될 수 있는 것은 아님. 기본 타입(boolean, byte, short, char, int, long, float, double)의 값을 세팅하거나, String을 세팅하는 Setter만 올 수 있음&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML (Setter 태그)                                    | FXML (Setter 속성)&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;   | &amp;lt;Button text=&amp;quot;확인&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 객체 선언 ====&lt;br /&gt;
===== 클래스 속성 =====&lt;br /&gt;
* 생성자에 매개 변수가 있고, 매개 변수에 @NamedArg(javafx.beans.NamedArg) 어노테이션이 적용되어 있으면 속성명이나 자식 태그로 작성할 수 있음&lt;br /&gt;
&amp;lt;table2 class=wikitable sep=bar align=ll&amp;gt;&lt;br /&gt;
&amp;lt;클래스 매개변수=&amp;quot;값&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}     | &amp;lt;클래스&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;매개변수&amp;gt;값&amp;lt;/매개변수&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/클래스&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
** HBox를 패딩할 때 setPadding(Insets value) 메소드를 사용하는데&lt;br /&gt;
** Insets는 기본 생성자가 없고,&lt;br /&gt;
** Insets(double topRightBottomLeft) 또는 Insets(double top, double right, double bottom, double left)만 있음&lt;br /&gt;
** 이 경우 아래와 같이 선언 가능함&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:value =====&lt;br /&gt;
* 클래스가 valueOf(String) 메소드를 제공하는 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:value=&amp;quot;값&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
String.valueOf(&amp;quot;Hello, World!&amp;quot;);&amp;lt;br/&amp;gt;Integer.valueOf(&amp;quot;1&amp;quot;);&amp;lt;br/&amp;gt;Double.valueOf(&amp;quot;1.0&amp;quot;);&amp;lt;br/&amp;gt;Boolean.valueOf(&amp;quot;false&amp;quot;);  |  &amp;lt;String fx:value=&amp;quot;Hello, World!&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Integer fx:value=&amp;quot;1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Double fx:value=&amp;quot;1.0&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Boolean fx:value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:constant =====&lt;br /&gt;
*클래스에 정의된 상수값을 얻고 싶을 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:constant=&amp;quot;상수&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setMaxWidth( Double.MAX_VALUE );&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;maxWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/maxWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:factory =====&lt;br /&gt;
* 어떤 클래스는 new 연산자로 객체를 생성할 수 없고,&lt;br /&gt;
* 정적 메소드(이를 factory 메소드라 부른다)로 객체를 얻어야 하는 경우가 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:factory=&amp;quot;정적메소드&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예: &amp;lt;code&amp;gt;ObservableList&amp;lt;/code&amp;gt;의 구현 객체는 &amp;lt;code&amp;gt;javafx.collections.FXCollections&amp;lt;/code&amp;gt;의 정적 메소드인 &amp;lt;code&amp;gt;observableArrayList(E... items)&amp;lt;/code&amp;gt; 메소드로 얻을 수 있다.&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
ComboBox combo = new ComboBox();&amp;lt;br/&amp;gt;combo.setItems(FXCollections.observableArrayList(&amp;quot;공개&amp;quot;, &amp;quot;비공개&amp;quot;));&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;ComboBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Items&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;FXCollections fx:factory=&amp;quot;observableArrayList&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;비공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;/FXCollections&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/items&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/ComboBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 로딩과 Scene 생성 ===&lt;br /&gt;
* FXML 파일을 작성한 후 이를 이용하여 객체를 만들어야 한다. 이를 '''FXML loading'''이라고 한다.&lt;br /&gt;
* javafx.fxml.FXMLLoader를 이용&lt;br /&gt;
** 두 개의 load() 메소드 : 정적 메소드, 인스턴스 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* getClass() - 현재 클래스 리턴&lt;br /&gt;
* getResource() - 클래스가 위치하는 곳에서 상대 경로로 리소스의 URL을 리턴&lt;br /&gt;
* load() - FXML 파일을 로딩&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
FXMLLoader loader = new FXMLLoader(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
Parent root = (Parent)loader.load();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* load() - Parent 타입을 리턴함. 이것은 FXML 파일에서의 루트 태그로 선언된 컨테이너임&lt;br /&gt;
* 만을 루트 태그가 &amp;lt;HBox&amp;gt; 라면 다음과 같이 작성해도 됨&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
HBox hbox = (HBox) FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX Scene Builder ===&lt;br /&gt;
[[file:CP-SceneBuilder-1.png | thumb | Scene Builder로 root.fxml 띄움]]&lt;br /&gt;
* Scene Builder 다운로드 - https://gluonhq.com/products/scene-builder/&lt;br /&gt;
* [https://marketplace.visualstudio.com/items?itemName=bilalekrem.scenebuilderextension SceneBuilder extension for Visual Studio Code]&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 눌러 &amp;quot;Configure Scene Builder path&amp;quot;를 실행한다.&lt;br /&gt;
*** 경로를 다음과 같이 지정한다 : C:\Users\profs\AppData\Local\SceneBuilder 폴더의 SceneBuilder.exe 지정&lt;br /&gt;
&lt;br /&gt;
* Scene Builder 띄우는 방법&lt;br /&gt;
** fxml 파일을 선택한다.&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 누른다.&lt;br /&gt;
&lt;br /&gt;
== JavaFX 컨테이너 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
컨테이너   | 설명&lt;br /&gt;
AnchorPane | 컨트롤을 좌표로 배치하는 레이아웃&lt;br /&gt;
BorderPane | 위, 아래, 오른쪽, 왼쪽, 중앙에 컨트롤을 배치하는 레이아웃&lt;br /&gt;
FlowPane   | 행으로 배치하되 공간이 부족하면 새로운 행에 배치하는 레이아웃&lt;br /&gt;
GridPane   | 그리드로 배치하되 셀의 크기가 고정적이지 않은 레이아웃&lt;br /&gt;
StackPane  | 컨트롤을 겹쳐서 배치하는 레이아웃&lt;br /&gt;
TilePane   | 그리드로 배치하되 고정된 셀의 크기를 갖는 레이아웃&lt;br /&gt;
HBox       | 수평으로 배치하는 레이아웃&lt;br /&gt;
VBox       | 수직으로 배치하는 레이아웃&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AnchorPane 컨테이너 ===&lt;br /&gt;
[[file:CP-17.4.1-1.png]]&lt;br /&gt;
&lt;br /&gt;
* AnchorPane에서 사용할 수 있는 주요 설정&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명            | 적용&lt;br /&gt;
PrefWidth    | 폭을 설정       | AnchorPane&lt;br /&gt;
PrefHeight   | 높이를 설정     | AnchorPane&lt;br /&gt;
layoutX      | 컨트롤의 X 좌표 | 컨트롤&lt;br /&gt;
layoutY      | 컨트롤의 Y 좌표 | 컨트롤&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함   | AnchorPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.1-2.png | thumb | AnchorPane (Scene Builder)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.PasswordField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;150.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;28.0&amp;quot; text=&amp;quot;아이디&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;66.0&amp;quot; text=&amp;quot;패스워드&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;24.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;PasswordField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;62.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;97.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;164.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBox와 VBox 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                         | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                    | HBox, VBox&lt;br /&gt;
prefHeight   | 높이를 설정                  | HBox, VBox &lt;br /&gt;
alignment    | 컨트롤의 정렬을 설정         | HBox, VBox &lt;br /&gt;
spacing      | 컨트롤의 간격을 설정         | HBox, VBox&lt;br /&gt;
fillWidth    | 컨트롤의 폭 확장 여부 설정   | VBox&lt;br /&gt;
fillHeight   | 컨트롤의 높이 확장 여부 설정 | HBox&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함                | HBox, VBox&lt;br /&gt;
&amp;lt;HBox.hgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; | HBox의 남은 폭을 채움   | 컨트롤&lt;br /&gt;
&amp;lt;VBox.vgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/VBox.vgrow&amp;gt; | VBox의 남을 높이를 채움 | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root2.fxml&lt;br /&gt;
** 이 패키지의 하위 폴더로 &amp;lt;code&amp;gt;images&amp;lt;/code&amp;gt;를 만들고 여기에 javafx.png 파일을 복사해 넣어둔다. [[file:javafx.png | thumb | javafx.png]]&lt;br /&gt;
[[file:CP-17.4.3-project.png | thumb | images 폴더]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import java.lang.Double?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.Priority?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitWidth=&amp;quot;200.0&amp;quot; preserveRatio=&amp;quot;true&amp;quot;&amp;gt; &amp;lt;!-- 그림의 비율에 맞게 높이를 설정 --&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&lt;br /&gt;
          &amp;lt;Image url=&amp;quot;@images/javafx.png&amp;quot; /&amp;gt; &amp;lt;!-- 현재 경로 기준으로 상대경로로 파일 지정 --&amp;gt;&lt;br /&gt;
        &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;HBox alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;이전&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;다음&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;HBox.hgrow&amp;gt;&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; &amp;lt;!-- 오른쪽 남은 공간을 버튼이 모두 채우도록 설정 --&amp;gt;&lt;br /&gt;
              &amp;lt;maxWidth&amp;gt;&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;/maxWidth&amp;gt; &amp;lt;!-- 버튼의 폭을 자동으로 확장하기 위해 설정--&amp;gt;&lt;br /&gt;
            &amp;lt;/Button&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
         &amp;lt;VBox.margin&amp;gt;&lt;br /&gt;
           &amp;lt;Insets top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/VBox.margin&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.4.3-p874.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root2.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BorderPane 컨테이너 ===&lt;br /&gt;
* top, bottom, left, right, center 셀에 컨트롤을 배치하는 컨테이너&lt;br /&gt;
* 다른 컨테이너를 배치할 수도 있음&lt;br /&gt;
* 각 셀에는 '''하나'''의 컨트롤 또는 컨테이너만 배치할 수 있음&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-1.png | 250px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                           | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                      | BorderPane&lt;br /&gt;
prefHeight   | 높이를 설정                    | BorderPane&lt;br /&gt;
&amp;lt;top&amp;gt;        | top에 배치될 컨트롤을 포함     | BorderPane&lt;br /&gt;
&amp;lt;bottom&amp;gt;     | bottom에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;right&amp;gt;      | right에 배치될 컨트롤을 포함   | BorderPane&lt;br /&gt;
&amp;lt;left&amp;gt;       | left에 배치될 컨트롤을 포함    | BorderPane&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;center&amp;gt;&amp;lt;/nowiki&amp;gt;     | center에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.ToolBar?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;top&amp;gt;&lt;br /&gt;
      &amp;lt;ToolBar prefHeight=&amp;quot;40.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot; BorderPane.alignment=&amp;quot;CENTER&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;items&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/items&amp;gt;&lt;br /&gt;
      &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
   &amp;lt;/top&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea /&amp;gt; &amp;lt;!-- left와 right까지 확장--&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;BorderPane&amp;gt;&lt;br /&gt;
         &amp;lt;center&amp;gt;&lt;br /&gt;
           &amp;lt;TextField /&amp;gt; &amp;lt;!-- top, bottom, left까지 확장--&amp;gt;&lt;br /&gt;
         &amp;lt;/center&amp;gt;&lt;br /&gt;
         &amp;lt;right&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/right&amp;gt;&lt;br /&gt;
      &amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FlowPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                      | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                 | FlowPane&lt;br /&gt;
prefHeight   | 높이를 설정               | FlowPane&lt;br /&gt;
hgap         | 컨트롤의 수평 간격을 설정 | FlowPane&lt;br /&gt;
vgap         | 컨트롤의 수직 간격을 설정 | FlowPane&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함             |  FlowPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.5-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.FlowPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;FlowPane prefHeight=&amp;quot;70.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/FlowPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TilePane 컨테이너 ===&lt;br /&gt;
* 그리드로 컨트롤을 배치하되 고정된 셀(타일) 크기를 갖는 컨테이너&lt;br /&gt;
* 오른쪽에 배치할 공간이 부족하면 새로운 행에 컨트롤을 배치함&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-TilePane.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성   | 설명               | 적용&lt;br /&gt;
prefWidth      | 폭을 설정          | TilePane&lt;br /&gt;
prefHeight     | 높이를 설정        | TilePane&lt;br /&gt;
prefTileWidth  | 타일의 폭을 설정   | TilePane&lt;br /&gt;
prefTileHeight | 타일의 높이를 설정 | TilePane&lt;br /&gt;
&amp;lt;children&amp;gt;     | 컨트롤을 포함      | TilePane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:fruit1.jpg | fruit1.jpg&lt;br /&gt;
file:fruit2.jpg | fruit2.jpg&lt;br /&gt;
file:fruit3.jpg | fruit3.jpg&lt;br /&gt;
file:fruit4.jpg | fruit4.jpg&lt;br /&gt;
file:fruit5.jpg | fruit5.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.TilePane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TilePane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;100.0&amp;quot; prefWidth=&amp;quot;100.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit1.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit2.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit3.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit4.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit5.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/TilePane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GridPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성         | 설명                                 | 적용&lt;br /&gt;
prefWidth            | 폭을 설정                            | GridPane&lt;br /&gt;
prefHeight           | 놎이를 설정                          | GridPane&lt;br /&gt;
hgap                 | 수평 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
vgap                 | 수직 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
&amp;lt;children&amp;gt;           | 컨트롤을 포함                        | GridPane&lt;br /&gt;
GridPane.rowIndex    | 컨트롤이 위치하는 행 인덱스를 설정   | 컨트롤&lt;br /&gt;
GridPane.columnIndex | 컨트롤이 위치하는 컬럼 인덱스를 설정 | 컨트롤&lt;br /&gt;
GridPane.rowSpan     | 행 병합 수를 설정                    | 컨트롤&lt;br /&gt;
GridPane.columnSpan  | 컬럼 병합 수를 설정                  | 컨트롤&lt;br /&gt;
GridPane.hgrow       | 수평 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.vgrow       | 수직 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.halignment  | 컨트롤의 수평 정렬을 설정            | 컨트롤&lt;br /&gt;
GridPane.valignment  | 컨트롤의 수직 정렬을 설정            | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.7-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.ColumnConstraints?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.GridPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.RowConstraints?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GridPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; hgap=&amp;quot;10.0&amp;quot; vgap=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets topRightBottomLeft=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;아이디&amp;quot; GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;패스워드&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.columnIndex=&amp;quot;1&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
      &amp;lt;HBox GridPane.rowIndex=&amp;quot;2&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot;&lt;br /&gt;
                 GridPane.columnSpan=&amp;quot;2&amp;quot; GridPane.hgrow=&amp;quot;ALWAYS&amp;quot;&lt;br /&gt;
                 alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot; &amp;gt;  &amp;lt;!-- 컬럼 2개 병합 --&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/GridPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== StackPane 컨테이너 ===&lt;br /&gt;
* 컨트롤을 겹쳐 배치하는 컨테이너&lt;br /&gt;
* 카드 레이아웃(Card Layout)이라고도 함&lt;br /&gt;
* 만약 위에 있는 컨트롤이 투명하다면 밑에 있는 컨트롤이 겹쳐 보임&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:duke.jpg | duke.jpg&lt;br /&gt;
file:snow.jpg | snow.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.8-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.StackPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;StackPane  xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;300.0&amp;quot; prefWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitHeight=&amp;quot;300.0&amp;quot; fitWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/snow.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView preserveRatio=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/duke.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/StackPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 이벤트 처리 ==&lt;br /&gt;
&lt;br /&gt;
=== 이벤트 핸들러(EventHandler) ===&lt;br /&gt;
* JavaFX는 이벤트 발생 콘트롤과 이벤트 핸들러(EventHandler)를 분리하는 위임형(Delegation&amp;lt;ref&amp;gt;Design Pattern 중 Delegation Pattern&amp;lt;/ref&amp;gt;) 방식을 사용함&lt;br /&gt;
* 이를 위해 먼저 컨트롤에 EventHandler를 등록해야 함 (setOnXXX() 메소드. 예: setOnAction())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cccc&amp;gt;&lt;br /&gt;
컨트롤(control) | 사건        | 이벤트(event) 발생 | 이벤트 처리 담당 객체 | 이벤트 처리 메소드 실행 | 이벤트 처리 효과&lt;br /&gt;
Button          | 버튼을 누름 | ActionEvent        | EventHandler          | public void handle(...) {&amp;lt;br/&amp;gt;{{sp2}}이벤트 처리&amp;lt;/br/&amp;gt;} | 1. 윈도우 닫기&amp;lt;br/&amp;gt;2. 컨트롤 내용 변경&amp;lt;br/&amp;gt;3. 다이얼로그 띄우기&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Button 클릭 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Button button = new Button();&lt;br /&gt;
button.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(ActionEvent event) { ... }&lt;br /&gt;
}):&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* TableView에서 행을 마우스로 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TableView tableView = new TableView();&lt;br /&gt;
tableView.setOnMouseClicked(new EventHandler&amp;lt;MouseEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(MouseEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 윈도우 우측 상단(x) 버튼 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
stage.setOnCloseRequest(new EventHandler&amp;lt;WindowEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(WindowEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* EventHandler는 하나의 메소드를 가진 함수적 인터페이스이므로 람다식을 이용하여 이벤트 등록 가능&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
button.setOnAction( event-&amp;gt;{ ... } );&lt;br /&gt;
tableView.setOnMouseClicked( event-&amp;gt;{ ... } );&lt;br /&gt;
stage.setOnCloseRequest( event-&amp;gt;{ ... } );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.1-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox root = new HBox();&lt;br /&gt;
        root.setPrefSize(200, 50);&lt;br /&gt;
        root.setAlignment(Pos.CENTER); // 수평 중앙 정렬&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Button btn1 = new Button(&amp;quot;버튼1&amp;quot;);&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        Button btn2 = new Button(&amp;quot;버튼2&amp;quot;);&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;System.out.println(&amp;quot;버튼2 클릭&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().addAll(btn1, btn2); // HBox에 btn1과 btn2를 추가&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.setOnCloseRequest(event-&amp;gt;System.out.println(&amp;quot;종료 클릭&amp;quot;));&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FXML 컨트롤러(Controller) ===&lt;br /&gt;
&lt;br /&gt;
==== fx:controller 속성과 컨트롤러 클래스 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;루트컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;packageName.ControllerName&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/루트컨트롤러&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fx:id 속성과 @FXML 컨트롤 주입 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
      fx:controller=&amp;quot;sec05.exam02_fxml_controller.RootController&amp;quot;&lt;br /&gt;
      prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
      alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @FXML private Button btn1;&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML&lt;br /&gt;
    private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EventHandler 등록 ====&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.2-실행결과.png| thumb | 실행 결과]]&lt;br /&gt;
* AppMain.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* RootController.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private Button btn1; // import javafx.fxml.FXML 필요&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() { // 직접 EventHandler 생성 후 등록&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                handleBtn1Action(event);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;handleBtn2Action(event)); // 람다식 이용&lt;br /&gt;
        // btn3.setOnAction(event-&amp;gt;handleBtn3Action(event));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void handleBtn1Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void handleBtn2Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼2 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void handleBtn3Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼3 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root.xml&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
    fx:controller=&amp;quot;ch17.p889.RootController&amp;quot;&lt;br /&gt;
    prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
    alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; onAction=&amp;quot;#handleBtn3Action&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 이벤트 처리 메소드 매핑 ====&lt;br /&gt;
* FXML 파일&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button fx:id=&amp;quot;btn&amp;quot; text=&amp;quot;버튼&amp;quot; onAction=&amp;quot;#handleBtnAction&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Controller 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void handleBtnAction(ActionEvent event) { ... }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 속성 감시와 바인딩 ==&lt;br /&gt;
&lt;br /&gt;
=== 속성 감시 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private StringProperty text = new SimpleStringProperty(); // 값이 저장될 필드&lt;br /&gt;
&lt;br /&gt;
// Setter&lt;br /&gt;
public void setText(String newValue) {&lt;br /&gt;
    text.set(newValue);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Getter&lt;br /&gt;
public String getText() {&lt;br /&gt;
    return text.get();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Property 메소드&lt;br /&gt;
public StringProperty textProperty() {&lt;br /&gt;
    return text;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textProperty().addListener(new ChangeListener&amp;lt;String&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void changed(ObservableValue&amp;lt;? extends String&amp;gt; observable, String oldValue, String newValue) {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Slider slider = new Slider();&lt;br /&gt;
slider.valueProperty().addListener( new ChangeListener&amp;lt;Number&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void changed(ObservableValue&amp;lt;? extends Number&amp;gt; observable, Number oldValue, Number newValue) {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.6.1-실행결과.png | thumb | 예제]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Slider?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.text.Font?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&lt;br /&gt;
      fx:controller=&amp;quot;ch17.p891.RootController&amp;quot;&lt;br /&gt;
      prefHeight=&amp;quot;250.0&amp;quot; prefWidth=&amp;quot;350.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;Label fx:id=&amp;quot;label&amp;quot; text=&amp;quot;JavaFX&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;font&amp;gt;&lt;br /&gt;
            &amp;lt;Font size=&amp;quot;0&amp;quot; /&amp;gt; &amp;lt;!-- Label의 기본 폰트 크기는 0 --&amp;gt;&lt;br /&gt;
         &amp;lt;/font&amp;gt;&lt;br /&gt;
      &amp;lt;/Label&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;Slider fx:id=&amp;quot;slider&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p891;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.value.ChangeListener;&lt;br /&gt;
import javafx.beans.value.ObservableValue;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.control.Slider;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private Slider slider;&lt;br /&gt;
    @FXML private Label label;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        slider.valueProperty().addListener(new ChangeListener&amp;lt;Number&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void changed(ObservableValue&amp;lt;? extends Number&amp;gt; observable, Number oldValue, Number newValue) {&lt;br /&gt;
                label.setFont(new Font(newValue.doubleValue()));&lt;br /&gt;
            }&lt;br /&gt;
        });             &lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p891;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 속성 바인딩 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TextArea textArea1 = new TextArea();&lt;br /&gt;
TextArea textArea2 = new TextArea();&lt;br /&gt;
textArea2.textProperty().bind(textArea1.textProperty());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textArea2.textProperty().bindBidirectional(textArea1.textProperty());&lt;br /&gt;
Bindings.bindBidirectional(textArea1.textProperty(), textArea2.textProperty());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
textArea2.textProperty().unbin(); // 단방향 해제&lt;br /&gt;
textArea2.textProperty().unbindBidirectional(textArea1.textProperty()); // 양방향 해제&lt;br /&gt;
Bindings.unbindBidirectional(textArea1.textProperty(), textArea2.textProperty()); // 양방향 해제&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bindings 클래스 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;ch17.p893.RootController&amp;quot; prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; spacing=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;textArea1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea fx:id=&amp;quot;textArea1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;textArea2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea fx:id=&amp;quot;textArea2&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.6.2-실행결과.png | thumb | 속성 바인딩]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p893;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.beans.binding.Bindings;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.TextArea;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private TextArea textArea1;&lt;br /&gt;
    @FXML private TextArea textArea2;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
        Bindings.bindBidirectional(textArea1.textProperty(), textArea2.textProperty());           &lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=File:CP-17.5.2-%EC%8B%A4%ED%96%89%EA%B2%B0%EA%B3%BC.png&amp;diff=410</id>
		<title>File:CP-17.5.2-실행결과.png</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=File:CP-17.5.2-%EC%8B%A4%ED%96%89%EA%B2%B0%EA%B3%BC.png&amp;diff=410"/>
		<updated>2022-07-22T03:17:25Z</updated>

		<summary type="html">&lt;p&gt;Swpark: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=409</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/1124</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=409"/>
		<updated>2022-07-22T03:17:12Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* EventHandler 등록 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JavaFX 개요 ==&lt;br /&gt;
# AWT&lt;br /&gt;
#* Native UI 컴포넌트 사용&lt;br /&gt;
#* 운영체제 마다 UI 모양이 다름&lt;br /&gt;
# Swing&lt;br /&gt;
#* 운영체제가 제공하는 native UI 사용 안 함&lt;br /&gt;
#* 운영체제가 새롭게 제공하는 UI 지원의 어려움&lt;br /&gt;
# JavaFX&lt;br /&gt;
#* Abode의 flash, Microsoft의 silverlight의 대항마&lt;br /&gt;
#* JDK 7부터 지원. JDK 8 권장.&lt;br /&gt;
#* JDK 11부터는 별도로 설치해야 함.&lt;br /&gt;
#* 화면 레이아웃과 스타일, 애플리케이션 로직 분리&lt;br /&gt;
#* Java 코드와 분리해서 스타일 시트(CSS)로 외관 작성 → 개발자와 디자이너의 동시 개발 가능&lt;br /&gt;
#* Java 코드에서도 레이아웃과 애플리케이션 로직을 분리하고 싶다면 레이아웃은 FXML로 작성, 로직은 Java로 작성&lt;br /&gt;
#* JavaFX 애플리케이션 구성 요소&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;50&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[레이아웃]'''&amp;lt;br/&amp;gt;자바 코드 파일&amp;lt;/br&amp;gt;또는 FXML 파일&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[외관 및 스타일]'''&amp;lt;br/&amp;gt;CSS 파일&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[리소스]'''&amp;lt;br/&amp;gt;그림 파일&amp;lt;br/&amp;gt;동영상 파일&amp;lt;br/&amp;gt;... &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[비즈니스 로직]'''&amp;lt;br/&amp;gt;자바 코드 파일&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JavaFX 애플리케이션 개발 시작 ==&lt;br /&gt;
=== 메인 클래스 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX 라이프사이클(life cycle) ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
    public AppMain() {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: AppMain() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: init() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: start() 호출&amp;quot;);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public void stop() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: stop() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: main() 호출&amp;quot;);&lt;br /&gt;
        launch(args);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
main: main() 호출&lt;br /&gt;
JavaFX Application Thread: AppMain() 호출&lt;br /&gt;
JavaFX-Launcher: init() 호출&lt;br /&gt;
JavaFX Application Thread: start() 호출&lt;br /&gt;
JavaFX Application Thread: stop() 호출 ← 프로그램을 끝내야 실행된다.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 메일 클래스 실행 매개값 얻기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
C:&amp;gt; java AppMain --ip=192.168.0.5 --port=50001&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* main()에서 launch(args)를 넘겨 받음&lt;br /&gt;
* init() 메소드에서 아래와 같이 실행할 수 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parameters params = getParameters();&lt;br /&gt;
List&amp;lt;String&amp;gt; list = params.getRaw();&lt;br /&gt;
Map&amp;lt;String, String&amp;gt; map = params.getNamed();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 무대(Stage)와 장면(Scene) ===&lt;br /&gt;
* 윈도우 : Stage&lt;br /&gt;
* Stage에는 하나의 Scene을 가질 수 있음&lt;br /&gt;
* Scene은 직접 생성해야 함&lt;br /&gt;
&lt;br /&gt;
[[file:CP2022_ch17.2_AppMain.png|thumb|AppMain 실행화면]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.application.Platform;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.layout.VBox;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        VBox root = new VBox();&lt;br /&gt;
        root.setPrefWidth(350);&lt;br /&gt;
        root.setPrefHeight(150);&lt;br /&gt;
        root.setAlignment(Pos.CENTER);&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Label label = new Label();&lt;br /&gt;
        label.setText(&amp;quot;Hello, JavaFX&amp;quot;);&lt;br /&gt;
        label.setFont(new Font(50));&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
        button.setOnAction(event-&amp;gt;Platform.exit());&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().add(label);&lt;br /&gt;
        root.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(root); // VBox를 루트 컨테이너(root container)로 해서 Scene 생성&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain입니다&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene); // 윈도우에 장면 설정&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 레이아웃 ==&lt;br /&gt;
=== 프로그램적 레이아웃 ===&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | 프로그램적 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.collections.ObservableList;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.TextField;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(10));&lt;br /&gt;
        hbox.setSpacing(10);&lt;br /&gt;
&lt;br /&gt;
        TextField textField = new TextField();&lt;br /&gt;
        textField.setPrefWidth(200);&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ObservableList list = hbox.getChildren();&lt;br /&gt;
        list.add(textField);&lt;br /&gt;
        list.add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 레이아웃 ===&lt;br /&gt;
* FXML 파일 (root.fxml)&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | FXML 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;padding&amp;gt;&lt;br /&gt;
        &amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/padding&amp;gt;&lt;br /&gt;
    &amp;lt;spacing&amp;gt;10&amp;lt;/spacing&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;children&amp;gt;&lt;br /&gt;
        &amp;lt;TextField&amp;gt;&lt;br /&gt;
            &amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&lt;br /&gt;
        &amp;lt;/TextField&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
    &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* AppMain 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;)); // ← FXML 로드&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 레이아웃(layout) 여백: 패딩(padding)과 마진(margin) ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cll&amp;gt;&lt;br /&gt;
구분      | HBox의 패딩                                                        | Button의 마진&lt;br /&gt;
개념      | [[file:CP-17.3.3-padding.png]]                                     | [[file:CP-17.3.3-margin.png]]&lt;br /&gt;
자바 코드 | HBox hbox = new HBox();&amp;lt;br/&amp;gt;'''hbox.setPadding(new Insets(50))'''; | Button button = new Button();&amp;lt;br/&amp;gt;'''HBox.setMargin(button, new Insets(50));'''&lt;br /&gt;
FXML 태그 | &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt; | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;HBox.margin&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Hbox.margin&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Margin, Padding 설정 방법&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// top, right, bottom, left를 모두 동일한 값으로 설정할 때&lt;br /&gt;
// Insets(double topRightBottomLeft)&lt;br /&gt;
new Insets(50);&lt;br /&gt;
&lt;br /&gt;
// top, right, bottom, left를 다를 값으로 설정할 때&lt;br /&gt;
// Insets(double top, double right, double bottom, double left)&lt;br /&gt;
new Insets(10, 20, 30, 40);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 패딩과 마진 적용 예&lt;br /&gt;
[[file:CP-17.3.3-AppMain.png|thumb|패딩과 마진 적용 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        // 패딩 설정&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(50, 10, 10, 50));&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setPrefSize(100, 100);&lt;br /&gt;
        &lt;br /&gt;
        // 마진 설정&lt;br /&gt;
        // HBox hbox = new HBox();&lt;br /&gt;
        // Button button = new Button();&lt;br /&gt;
        // button.setPrefSize(100, 100);&lt;br /&gt;
        // HBox.setMargin(button, new Insets(10, 10, 50, 50));&lt;br /&gt;
&lt;br /&gt;
        hbox.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 작성 규칙 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
TextField textField = new TextField();&amp;lt;br/&amp;gt;textField.setPrefWidth(200);&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/TextField&amp;gt;&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}   |  &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
ObsetvableList list = hbox.getChildren();&amp;lt;br/&amp;gt;list.add(textField);&amp;lt;br/&amp;gt;list.add(button);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;children&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Button&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 패키지(package) 선언 ====&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                          |   FXML 태그&lt;br /&gt;
import javafx.scene.layout.HBox;   |   &amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
import javafx.scene.control.*;     |   &amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;?import?&amp;gt;가 들어가는 위치는 &amp;lt;?xml ...&amp;gt;와 루트 컨테이너 태그 사이이다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;루트 컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/루트 컨테이너&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* import를 제대로 하지 않으면 not a valid type 메시지와 함께 javafx.fxml.LoadException 발생&lt;br /&gt;
&lt;br /&gt;
==== 태그(tag) 선언 ====&lt;br /&gt;
* 시작 태그와 끝 태그가 매칭되어야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 속성(attribute) 선언 ====&lt;br /&gt;
* 속성은 &amp;quot;나 '로 감싸야 한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;태그이름 속성명=&amp;quot;값&amp;quot; 속성명='값'&amp;gt; ... &amp;lt;/태그이름&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 속성명은 Setter 메소드 명이 옴&lt;br /&gt;
* 모든 Setter가 사용될 수 있는 것은 아님. 기본 타입(boolean, byte, short, char, int, long, float, double)의 값을 세팅하거나, String을 세팅하는 Setter만 올 수 있음&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML (Setter 태그)                                    | FXML (Setter 속성)&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;   | &amp;lt;Button text=&amp;quot;확인&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 객체 선언 ====&lt;br /&gt;
===== 클래스 속성 =====&lt;br /&gt;
* 생성자에 매개 변수가 있고, 매개 변수에 @NamedArg(javafx.beans.NamedArg) 어노테이션이 적용되어 있으면 속성명이나 자식 태그로 작성할 수 있음&lt;br /&gt;
&amp;lt;table2 class=wikitable sep=bar align=ll&amp;gt;&lt;br /&gt;
&amp;lt;클래스 매개변수=&amp;quot;값&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}     | &amp;lt;클래스&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;매개변수&amp;gt;값&amp;lt;/매개변수&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/클래스&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
** HBox를 패딩할 때 setPadding(Insets value) 메소드를 사용하는데&lt;br /&gt;
** Insets는 기본 생성자가 없고,&lt;br /&gt;
** Insets(double topRightBottomLeft) 또는 Insets(double top, double right, double bottom, double left)만 있음&lt;br /&gt;
** 이 경우 아래와 같이 선언 가능함&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:value =====&lt;br /&gt;
* 클래스가 valueOf(String) 메소드를 제공하는 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:value=&amp;quot;값&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
String.valueOf(&amp;quot;Hello, World!&amp;quot;);&amp;lt;br/&amp;gt;Integer.valueOf(&amp;quot;1&amp;quot;);&amp;lt;br/&amp;gt;Double.valueOf(&amp;quot;1.0&amp;quot;);&amp;lt;br/&amp;gt;Boolean.valueOf(&amp;quot;false&amp;quot;);  |  &amp;lt;String fx:value=&amp;quot;Hello, World!&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Integer fx:value=&amp;quot;1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Double fx:value=&amp;quot;1.0&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Boolean fx:value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:constant =====&lt;br /&gt;
*클래스에 정의된 상수값을 얻고 싶을 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:constant=&amp;quot;상수&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setMaxWidth( Double.MAX_VALUE );&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;maxWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/maxWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:factory =====&lt;br /&gt;
* 어떤 클래스는 new 연산자로 객체를 생성할 수 없고,&lt;br /&gt;
* 정적 메소드(이를 factory 메소드라 부른다)로 객체를 얻어야 하는 경우가 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:factory=&amp;quot;정적메소드&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예: &amp;lt;code&amp;gt;ObservableList&amp;lt;/code&amp;gt;의 구현 객체는 &amp;lt;code&amp;gt;javafx.collections.FXCollections&amp;lt;/code&amp;gt;의 정적 메소드인 &amp;lt;code&amp;gt;observableArrayList(E... items)&amp;lt;/code&amp;gt; 메소드로 얻을 수 있다.&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
ComboBox combo = new ComboBox();&amp;lt;br/&amp;gt;combo.setItems(FXCollections.observableArrayList(&amp;quot;공개&amp;quot;, &amp;quot;비공개&amp;quot;));&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;ComboBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Items&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;FXCollections fx:factory=&amp;quot;observableArrayList&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;비공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;/FXCollections&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/items&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/ComboBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 로딩과 Scene 생성 ===&lt;br /&gt;
* FXML 파일을 작성한 후 이를 이용하여 객체를 만들어야 한다. 이를 '''FXML loading'''이라고 한다.&lt;br /&gt;
* javafx.fxml.FXMLLoader를 이용&lt;br /&gt;
** 두 개의 load() 메소드 : 정적 메소드, 인스턴스 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* getClass() - 현재 클래스 리턴&lt;br /&gt;
* getResource() - 클래스가 위치하는 곳에서 상대 경로로 리소스의 URL을 리턴&lt;br /&gt;
* load() - FXML 파일을 로딩&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
FXMLLoader loader = new FXMLLoader(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
Parent root = (Parent)loader.load();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* load() - Parent 타입을 리턴함. 이것은 FXML 파일에서의 루트 태그로 선언된 컨테이너임&lt;br /&gt;
* 만을 루트 태그가 &amp;lt;HBox&amp;gt; 라면 다음과 같이 작성해도 됨&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
HBox hbox = (HBox) FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX Scene Builder ===&lt;br /&gt;
[[file:CP-SceneBuilder-1.png | thumb | Scene Builder로 root.fxml 띄움]]&lt;br /&gt;
* Scene Builder 다운로드 - https://gluonhq.com/products/scene-builder/&lt;br /&gt;
* [https://marketplace.visualstudio.com/items?itemName=bilalekrem.scenebuilderextension SceneBuilder extension for Visual Studio Code]&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 눌러 &amp;quot;Configure Scene Builder path&amp;quot;를 실행한다.&lt;br /&gt;
*** 경로를 다음과 같이 지정한다 : C:\Users\profs\AppData\Local\SceneBuilder 폴더의 SceneBuilder.exe 지정&lt;br /&gt;
&lt;br /&gt;
* Scene Builder 띄우는 방법&lt;br /&gt;
** fxml 파일을 선택한다.&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 누른다.&lt;br /&gt;
&lt;br /&gt;
== JavaFX 컨테이너 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
컨테이너   | 설명&lt;br /&gt;
AnchorPane | 컨트롤을 좌표로 배치하는 레이아웃&lt;br /&gt;
BorderPane | 위, 아래, 오른쪽, 왼쪽, 중앙에 컨트롤을 배치하는 레이아웃&lt;br /&gt;
FlowPane   | 행으로 배치하되 공간이 부족하면 새로운 행에 배치하는 레이아웃&lt;br /&gt;
GridPane   | 그리드로 배치하되 셀의 크기가 고정적이지 않은 레이아웃&lt;br /&gt;
StackPane  | 컨트롤을 겹쳐서 배치하는 레이아웃&lt;br /&gt;
TilePane   | 그리드로 배치하되 고정된 셀의 크기를 갖는 레이아웃&lt;br /&gt;
HBox       | 수평으로 배치하는 레이아웃&lt;br /&gt;
VBox       | 수직으로 배치하는 레이아웃&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AnchorPane 컨테이너 ===&lt;br /&gt;
[[file:CP-17.4.1-1.png]]&lt;br /&gt;
&lt;br /&gt;
* AnchorPane에서 사용할 수 있는 주요 설정&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명            | 적용&lt;br /&gt;
PrefWidth    | 폭을 설정       | AnchorPane&lt;br /&gt;
PrefHeight   | 높이를 설정     | AnchorPane&lt;br /&gt;
layoutX      | 컨트롤의 X 좌표 | 컨트롤&lt;br /&gt;
layoutY      | 컨트롤의 Y 좌표 | 컨트롤&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함   | AnchorPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.1-2.png | thumb | AnchorPane (Scene Builder)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.PasswordField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;150.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;28.0&amp;quot; text=&amp;quot;아이디&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;66.0&amp;quot; text=&amp;quot;패스워드&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;24.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;PasswordField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;62.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;97.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;164.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBox와 VBox 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                         | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                    | HBox, VBox&lt;br /&gt;
prefHeight   | 높이를 설정                  | HBox, VBox &lt;br /&gt;
alignment    | 컨트롤의 정렬을 설정         | HBox, VBox &lt;br /&gt;
spacing      | 컨트롤의 간격을 설정         | HBox, VBox&lt;br /&gt;
fillWidth    | 컨트롤의 폭 확장 여부 설정   | VBox&lt;br /&gt;
fillHeight   | 컨트롤의 높이 확장 여부 설정 | HBox&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함                | HBox, VBox&lt;br /&gt;
&amp;lt;HBox.hgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; | HBox의 남은 폭을 채움   | 컨트롤&lt;br /&gt;
&amp;lt;VBox.vgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/VBox.vgrow&amp;gt; | VBox의 남을 높이를 채움 | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root2.fxml&lt;br /&gt;
** 이 패키지의 하위 폴더로 &amp;lt;code&amp;gt;images&amp;lt;/code&amp;gt;를 만들고 여기에 javafx.png 파일을 복사해 넣어둔다. [[file:javafx.png | thumb | javafx.png]]&lt;br /&gt;
[[file:CP-17.4.3-project.png | thumb | images 폴더]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import java.lang.Double?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.Priority?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitWidth=&amp;quot;200.0&amp;quot; preserveRatio=&amp;quot;true&amp;quot;&amp;gt; &amp;lt;!-- 그림의 비율에 맞게 높이를 설정 --&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&lt;br /&gt;
          &amp;lt;Image url=&amp;quot;@images/javafx.png&amp;quot; /&amp;gt; &amp;lt;!-- 현재 경로 기준으로 상대경로로 파일 지정 --&amp;gt;&lt;br /&gt;
        &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;HBox alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;이전&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;다음&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;HBox.hgrow&amp;gt;&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; &amp;lt;!-- 오른쪽 남은 공간을 버튼이 모두 채우도록 설정 --&amp;gt;&lt;br /&gt;
              &amp;lt;maxWidth&amp;gt;&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;/maxWidth&amp;gt; &amp;lt;!-- 버튼의 폭을 자동으로 확장하기 위해 설정--&amp;gt;&lt;br /&gt;
            &amp;lt;/Button&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
         &amp;lt;VBox.margin&amp;gt;&lt;br /&gt;
           &amp;lt;Insets top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/VBox.margin&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.4.3-p874.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root2.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BorderPane 컨테이너 ===&lt;br /&gt;
* top, bottom, left, right, center 셀에 컨트롤을 배치하는 컨테이너&lt;br /&gt;
* 다른 컨테이너를 배치할 수도 있음&lt;br /&gt;
* 각 셀에는 '''하나'''의 컨트롤 또는 컨테이너만 배치할 수 있음&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-1.png | 250px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                           | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                      | BorderPane&lt;br /&gt;
prefHeight   | 높이를 설정                    | BorderPane&lt;br /&gt;
&amp;lt;top&amp;gt;        | top에 배치될 컨트롤을 포함     | BorderPane&lt;br /&gt;
&amp;lt;bottom&amp;gt;     | bottom에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;right&amp;gt;      | right에 배치될 컨트롤을 포함   | BorderPane&lt;br /&gt;
&amp;lt;left&amp;gt;       | left에 배치될 컨트롤을 포함    | BorderPane&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;center&amp;gt;&amp;lt;/nowiki&amp;gt;     | center에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.ToolBar?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;top&amp;gt;&lt;br /&gt;
      &amp;lt;ToolBar prefHeight=&amp;quot;40.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot; BorderPane.alignment=&amp;quot;CENTER&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;items&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/items&amp;gt;&lt;br /&gt;
      &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
   &amp;lt;/top&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea /&amp;gt; &amp;lt;!-- left와 right까지 확장--&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;BorderPane&amp;gt;&lt;br /&gt;
         &amp;lt;center&amp;gt;&lt;br /&gt;
           &amp;lt;TextField /&amp;gt; &amp;lt;!-- top, bottom, left까지 확장--&amp;gt;&lt;br /&gt;
         &amp;lt;/center&amp;gt;&lt;br /&gt;
         &amp;lt;right&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/right&amp;gt;&lt;br /&gt;
      &amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FlowPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                      | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                 | FlowPane&lt;br /&gt;
prefHeight   | 높이를 설정               | FlowPane&lt;br /&gt;
hgap         | 컨트롤의 수평 간격을 설정 | FlowPane&lt;br /&gt;
vgap         | 컨트롤의 수직 간격을 설정 | FlowPane&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함             |  FlowPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.5-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.FlowPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;FlowPane prefHeight=&amp;quot;70.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/FlowPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TilePane 컨테이너 ===&lt;br /&gt;
* 그리드로 컨트롤을 배치하되 고정된 셀(타일) 크기를 갖는 컨테이너&lt;br /&gt;
* 오른쪽에 배치할 공간이 부족하면 새로운 행에 컨트롤을 배치함&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-TilePane.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성   | 설명               | 적용&lt;br /&gt;
prefWidth      | 폭을 설정          | TilePane&lt;br /&gt;
prefHeight     | 높이를 설정        | TilePane&lt;br /&gt;
prefTileWidth  | 타일의 폭을 설정   | TilePane&lt;br /&gt;
prefTileHeight | 타일의 높이를 설정 | TilePane&lt;br /&gt;
&amp;lt;children&amp;gt;     | 컨트롤을 포함      | TilePane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:fruit1.jpg | fruit1.jpg&lt;br /&gt;
file:fruit2.jpg | fruit2.jpg&lt;br /&gt;
file:fruit3.jpg | fruit3.jpg&lt;br /&gt;
file:fruit4.jpg | fruit4.jpg&lt;br /&gt;
file:fruit5.jpg | fruit5.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.TilePane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TilePane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;100.0&amp;quot; prefWidth=&amp;quot;100.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit1.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit2.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit3.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit4.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit5.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/TilePane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GridPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성         | 설명                                 | 적용&lt;br /&gt;
prefWidth            | 폭을 설정                            | GridPane&lt;br /&gt;
prefHeight           | 놎이를 설정                          | GridPane&lt;br /&gt;
hgap                 | 수평 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
vgap                 | 수직 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
&amp;lt;children&amp;gt;           | 컨트롤을 포함                        | GridPane&lt;br /&gt;
GridPane.rowIndex    | 컨트롤이 위치하는 행 인덱스를 설정   | 컨트롤&lt;br /&gt;
GridPane.columnIndex | 컨트롤이 위치하는 컬럼 인덱스를 설정 | 컨트롤&lt;br /&gt;
GridPane.rowSpan     | 행 병합 수를 설정                    | 컨트롤&lt;br /&gt;
GridPane.columnSpan  | 컬럼 병합 수를 설정                  | 컨트롤&lt;br /&gt;
GridPane.hgrow       | 수평 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.vgrow       | 수직 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.halignment  | 컨트롤의 수평 정렬을 설정            | 컨트롤&lt;br /&gt;
GridPane.valignment  | 컨트롤의 수직 정렬을 설정            | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.7-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.ColumnConstraints?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.GridPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.RowConstraints?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GridPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; hgap=&amp;quot;10.0&amp;quot; vgap=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets topRightBottomLeft=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;아이디&amp;quot; GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;패스워드&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.columnIndex=&amp;quot;1&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
      &amp;lt;HBox GridPane.rowIndex=&amp;quot;2&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot;&lt;br /&gt;
                 GridPane.columnSpan=&amp;quot;2&amp;quot; GridPane.hgrow=&amp;quot;ALWAYS&amp;quot;&lt;br /&gt;
                 alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot; &amp;gt;  &amp;lt;!-- 컬럼 2개 병합 --&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/GridPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== StackPane 컨테이너 ===&lt;br /&gt;
* 컨트롤을 겹쳐 배치하는 컨테이너&lt;br /&gt;
* 카드 레이아웃(Card Layout)이라고도 함&lt;br /&gt;
* 만약 위에 있는 컨트롤이 투명하다면 밑에 있는 컨트롤이 겹쳐 보임&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:duke.jpg | duke.jpg&lt;br /&gt;
file:snow.jpg | snow.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.8-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.StackPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;StackPane  xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;300.0&amp;quot; prefWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitHeight=&amp;quot;300.0&amp;quot; fitWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/snow.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView preserveRatio=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/duke.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/StackPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 이벤트 처리 ==&lt;br /&gt;
&lt;br /&gt;
=== 이벤트 핸들러(EventHandler) ===&lt;br /&gt;
* JavaFX는 이벤트 발생 콘트롤과 이벤트 핸들러(EventHandler)를 분리하는 위임형(Delegation&amp;lt;ref&amp;gt;Design Pattern 중 Delegation Pattern&amp;lt;/ref&amp;gt;) 방식을 사용함&lt;br /&gt;
* 이를 위해 먼저 컨트롤에 EventHandler를 등록해야 함 (setOnXXX() 메소드. 예: setOnAction())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cccc&amp;gt;&lt;br /&gt;
컨트롤(control) | 사건        | 이벤트(event) 발생 | 이벤트 처리 담당 객체 | 이벤트 처리 메소드 실행 | 이벤트 처리 효과&lt;br /&gt;
Button          | 버튼을 누름 | ActionEvent        | EventHandler          | public void handle(...) {&amp;lt;br/&amp;gt;{{sp2}}이벤트 처리&amp;lt;/br/&amp;gt;} | 1. 윈도우 닫기&amp;lt;br/&amp;gt;2. 컨트롤 내용 변경&amp;lt;br/&amp;gt;3. 다이얼로그 띄우기&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Button 클릭 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Button button = new Button();&lt;br /&gt;
button.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(ActionEvent event) { ... }&lt;br /&gt;
}):&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* TableView에서 행을 마우스로 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TableView tableView = new TableView();&lt;br /&gt;
tableView.setOnMouseClicked(new EventHandler&amp;lt;MouseEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(MouseEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 윈도우 우측 상단(x) 버튼 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
stage.setOnCloseRequest(new EventHandler&amp;lt;WindowEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(WindowEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* EventHandler는 하나의 메소드를 가진 함수적 인터페이스이므로 람다식을 이용하여 이벤트 등록 가능&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
button.setOnAction( event-&amp;gt;{ ... } );&lt;br /&gt;
tableView.setOnMouseClicked( event-&amp;gt;{ ... } );&lt;br /&gt;
stage.setOnCloseRequest( event-&amp;gt;{ ... } );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.1-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox root = new HBox();&lt;br /&gt;
        root.setPrefSize(200, 50);&lt;br /&gt;
        root.setAlignment(Pos.CENTER); // 수평 중앙 정렬&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Button btn1 = new Button(&amp;quot;버튼1&amp;quot;);&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        Button btn2 = new Button(&amp;quot;버튼2&amp;quot;);&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;System.out.println(&amp;quot;버튼2 클릭&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().addAll(btn1, btn2); // HBox에 btn1과 btn2를 추가&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.setOnCloseRequest(event-&amp;gt;System.out.println(&amp;quot;종료 클릭&amp;quot;));&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FXML 컨트롤러(Controller) ===&lt;br /&gt;
&lt;br /&gt;
==== fx:controller 속성과 컨트롤러 클래스 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;루트컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;packageName.ControllerName&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/루트컨트롤러&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fx:id 속성과 @FXML 컨트롤 주입 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
      fx:controller=&amp;quot;sec05.exam02_fxml_controller.RootController&amp;quot;&lt;br /&gt;
      prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
      alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @FXML private Button btn1;&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML&lt;br /&gt;
    private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EventHandler 등록 ====&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.2-실행결과.png| thumb | 실행 결과]]&lt;br /&gt;
* AppMain.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* RootController.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private Button btn1; // import javafx.fxml.FXML 필요&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() { // 직접 EventHandler 생성 후 등록&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                handleBtn1Action(event);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;handleBtn2Action(event)); // 람다식 이용&lt;br /&gt;
        // btn3.setOnAction(event-&amp;gt;handleBtn3Action(event));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void handleBtn1Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void handleBtn2Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼2 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void handleBtn3Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼3 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root.xml&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
    fx:controller=&amp;quot;ch17.p889.RootController&amp;quot;&lt;br /&gt;
    prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
    alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; onAction=&amp;quot;#handleBtn3Action&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 이벤트 처리 메소드 매핑 ====&lt;br /&gt;
* FXML 파일&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button fx:id=&amp;quot;btn&amp;quot; text=&amp;quot;버튼&amp;quot; onAction=&amp;quot;#handleBtnAction&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Controller 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void handleBtnAction(ActionEvent event) { ... }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 속성 감시와 바인딩 ==&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=408</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/1124</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=408"/>
		<updated>2022-07-22T03:16:14Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* 이벤트 처리 메소드 매핑 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JavaFX 개요 ==&lt;br /&gt;
# AWT&lt;br /&gt;
#* Native UI 컴포넌트 사용&lt;br /&gt;
#* 운영체제 마다 UI 모양이 다름&lt;br /&gt;
# Swing&lt;br /&gt;
#* 운영체제가 제공하는 native UI 사용 안 함&lt;br /&gt;
#* 운영체제가 새롭게 제공하는 UI 지원의 어려움&lt;br /&gt;
# JavaFX&lt;br /&gt;
#* Abode의 flash, Microsoft의 silverlight의 대항마&lt;br /&gt;
#* JDK 7부터 지원. JDK 8 권장.&lt;br /&gt;
#* JDK 11부터는 별도로 설치해야 함.&lt;br /&gt;
#* 화면 레이아웃과 스타일, 애플리케이션 로직 분리&lt;br /&gt;
#* Java 코드와 분리해서 스타일 시트(CSS)로 외관 작성 → 개발자와 디자이너의 동시 개발 가능&lt;br /&gt;
#* Java 코드에서도 레이아웃과 애플리케이션 로직을 분리하고 싶다면 레이아웃은 FXML로 작성, 로직은 Java로 작성&lt;br /&gt;
#* JavaFX 애플리케이션 구성 요소&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;50&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[레이아웃]'''&amp;lt;br/&amp;gt;자바 코드 파일&amp;lt;/br&amp;gt;또는 FXML 파일&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[외관 및 스타일]'''&amp;lt;br/&amp;gt;CSS 파일&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[리소스]'''&amp;lt;br/&amp;gt;그림 파일&amp;lt;br/&amp;gt;동영상 파일&amp;lt;br/&amp;gt;... &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[비즈니스 로직]'''&amp;lt;br/&amp;gt;자바 코드 파일&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JavaFX 애플리케이션 개발 시작 ==&lt;br /&gt;
=== 메인 클래스 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX 라이프사이클(life cycle) ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
    public AppMain() {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: AppMain() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: init() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: start() 호출&amp;quot;);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public void stop() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: stop() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: main() 호출&amp;quot;);&lt;br /&gt;
        launch(args);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
main: main() 호출&lt;br /&gt;
JavaFX Application Thread: AppMain() 호출&lt;br /&gt;
JavaFX-Launcher: init() 호출&lt;br /&gt;
JavaFX Application Thread: start() 호출&lt;br /&gt;
JavaFX Application Thread: stop() 호출 ← 프로그램을 끝내야 실행된다.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 메일 클래스 실행 매개값 얻기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
C:&amp;gt; java AppMain --ip=192.168.0.5 --port=50001&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* main()에서 launch(args)를 넘겨 받음&lt;br /&gt;
* init() 메소드에서 아래와 같이 실행할 수 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parameters params = getParameters();&lt;br /&gt;
List&amp;lt;String&amp;gt; list = params.getRaw();&lt;br /&gt;
Map&amp;lt;String, String&amp;gt; map = params.getNamed();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 무대(Stage)와 장면(Scene) ===&lt;br /&gt;
* 윈도우 : Stage&lt;br /&gt;
* Stage에는 하나의 Scene을 가질 수 있음&lt;br /&gt;
* Scene은 직접 생성해야 함&lt;br /&gt;
&lt;br /&gt;
[[file:CP2022_ch17.2_AppMain.png|thumb|AppMain 실행화면]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.application.Platform;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.layout.VBox;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        VBox root = new VBox();&lt;br /&gt;
        root.setPrefWidth(350);&lt;br /&gt;
        root.setPrefHeight(150);&lt;br /&gt;
        root.setAlignment(Pos.CENTER);&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Label label = new Label();&lt;br /&gt;
        label.setText(&amp;quot;Hello, JavaFX&amp;quot;);&lt;br /&gt;
        label.setFont(new Font(50));&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
        button.setOnAction(event-&amp;gt;Platform.exit());&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().add(label);&lt;br /&gt;
        root.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(root); // VBox를 루트 컨테이너(root container)로 해서 Scene 생성&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain입니다&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene); // 윈도우에 장면 설정&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 레이아웃 ==&lt;br /&gt;
=== 프로그램적 레이아웃 ===&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | 프로그램적 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.collections.ObservableList;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.TextField;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(10));&lt;br /&gt;
        hbox.setSpacing(10);&lt;br /&gt;
&lt;br /&gt;
        TextField textField = new TextField();&lt;br /&gt;
        textField.setPrefWidth(200);&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ObservableList list = hbox.getChildren();&lt;br /&gt;
        list.add(textField);&lt;br /&gt;
        list.add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 레이아웃 ===&lt;br /&gt;
* FXML 파일 (root.fxml)&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | FXML 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;padding&amp;gt;&lt;br /&gt;
        &amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/padding&amp;gt;&lt;br /&gt;
    &amp;lt;spacing&amp;gt;10&amp;lt;/spacing&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;children&amp;gt;&lt;br /&gt;
        &amp;lt;TextField&amp;gt;&lt;br /&gt;
            &amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&lt;br /&gt;
        &amp;lt;/TextField&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
    &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* AppMain 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;)); // ← FXML 로드&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 레이아웃(layout) 여백: 패딩(padding)과 마진(margin) ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cll&amp;gt;&lt;br /&gt;
구분      | HBox의 패딩                                                        | Button의 마진&lt;br /&gt;
개념      | [[file:CP-17.3.3-padding.png]]                                     | [[file:CP-17.3.3-margin.png]]&lt;br /&gt;
자바 코드 | HBox hbox = new HBox();&amp;lt;br/&amp;gt;'''hbox.setPadding(new Insets(50))'''; | Button button = new Button();&amp;lt;br/&amp;gt;'''HBox.setMargin(button, new Insets(50));'''&lt;br /&gt;
FXML 태그 | &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt; | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;HBox.margin&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Hbox.margin&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Margin, Padding 설정 방법&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// top, right, bottom, left를 모두 동일한 값으로 설정할 때&lt;br /&gt;
// Insets(double topRightBottomLeft)&lt;br /&gt;
new Insets(50);&lt;br /&gt;
&lt;br /&gt;
// top, right, bottom, left를 다를 값으로 설정할 때&lt;br /&gt;
// Insets(double top, double right, double bottom, double left)&lt;br /&gt;
new Insets(10, 20, 30, 40);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 패딩과 마진 적용 예&lt;br /&gt;
[[file:CP-17.3.3-AppMain.png|thumb|패딩과 마진 적용 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        // 패딩 설정&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(50, 10, 10, 50));&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setPrefSize(100, 100);&lt;br /&gt;
        &lt;br /&gt;
        // 마진 설정&lt;br /&gt;
        // HBox hbox = new HBox();&lt;br /&gt;
        // Button button = new Button();&lt;br /&gt;
        // button.setPrefSize(100, 100);&lt;br /&gt;
        // HBox.setMargin(button, new Insets(10, 10, 50, 50));&lt;br /&gt;
&lt;br /&gt;
        hbox.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 작성 규칙 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
TextField textField = new TextField();&amp;lt;br/&amp;gt;textField.setPrefWidth(200);&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/TextField&amp;gt;&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}   |  &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
ObsetvableList list = hbox.getChildren();&amp;lt;br/&amp;gt;list.add(textField);&amp;lt;br/&amp;gt;list.add(button);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;children&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Button&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 패키지(package) 선언 ====&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                          |   FXML 태그&lt;br /&gt;
import javafx.scene.layout.HBox;   |   &amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
import javafx.scene.control.*;     |   &amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;?import?&amp;gt;가 들어가는 위치는 &amp;lt;?xml ...&amp;gt;와 루트 컨테이너 태그 사이이다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;루트 컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/루트 컨테이너&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* import를 제대로 하지 않으면 not a valid type 메시지와 함께 javafx.fxml.LoadException 발생&lt;br /&gt;
&lt;br /&gt;
==== 태그(tag) 선언 ====&lt;br /&gt;
* 시작 태그와 끝 태그가 매칭되어야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 속성(attribute) 선언 ====&lt;br /&gt;
* 속성은 &amp;quot;나 '로 감싸야 한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;태그이름 속성명=&amp;quot;값&amp;quot; 속성명='값'&amp;gt; ... &amp;lt;/태그이름&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 속성명은 Setter 메소드 명이 옴&lt;br /&gt;
* 모든 Setter가 사용될 수 있는 것은 아님. 기본 타입(boolean, byte, short, char, int, long, float, double)의 값을 세팅하거나, String을 세팅하는 Setter만 올 수 있음&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML (Setter 태그)                                    | FXML (Setter 속성)&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;   | &amp;lt;Button text=&amp;quot;확인&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 객체 선언 ====&lt;br /&gt;
===== 클래스 속성 =====&lt;br /&gt;
* 생성자에 매개 변수가 있고, 매개 변수에 @NamedArg(javafx.beans.NamedArg) 어노테이션이 적용되어 있으면 속성명이나 자식 태그로 작성할 수 있음&lt;br /&gt;
&amp;lt;table2 class=wikitable sep=bar align=ll&amp;gt;&lt;br /&gt;
&amp;lt;클래스 매개변수=&amp;quot;값&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}     | &amp;lt;클래스&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;매개변수&amp;gt;값&amp;lt;/매개변수&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/클래스&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
** HBox를 패딩할 때 setPadding(Insets value) 메소드를 사용하는데&lt;br /&gt;
** Insets는 기본 생성자가 없고,&lt;br /&gt;
** Insets(double topRightBottomLeft) 또는 Insets(double top, double right, double bottom, double left)만 있음&lt;br /&gt;
** 이 경우 아래와 같이 선언 가능함&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:value =====&lt;br /&gt;
* 클래스가 valueOf(String) 메소드를 제공하는 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:value=&amp;quot;값&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
String.valueOf(&amp;quot;Hello, World!&amp;quot;);&amp;lt;br/&amp;gt;Integer.valueOf(&amp;quot;1&amp;quot;);&amp;lt;br/&amp;gt;Double.valueOf(&amp;quot;1.0&amp;quot;);&amp;lt;br/&amp;gt;Boolean.valueOf(&amp;quot;false&amp;quot;);  |  &amp;lt;String fx:value=&amp;quot;Hello, World!&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Integer fx:value=&amp;quot;1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Double fx:value=&amp;quot;1.0&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Boolean fx:value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:constant =====&lt;br /&gt;
*클래스에 정의된 상수값을 얻고 싶을 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:constant=&amp;quot;상수&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setMaxWidth( Double.MAX_VALUE );&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;maxWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/maxWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:factory =====&lt;br /&gt;
* 어떤 클래스는 new 연산자로 객체를 생성할 수 없고,&lt;br /&gt;
* 정적 메소드(이를 factory 메소드라 부른다)로 객체를 얻어야 하는 경우가 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:factory=&amp;quot;정적메소드&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예: &amp;lt;code&amp;gt;ObservableList&amp;lt;/code&amp;gt;의 구현 객체는 &amp;lt;code&amp;gt;javafx.collections.FXCollections&amp;lt;/code&amp;gt;의 정적 메소드인 &amp;lt;code&amp;gt;observableArrayList(E... items)&amp;lt;/code&amp;gt; 메소드로 얻을 수 있다.&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
ComboBox combo = new ComboBox();&amp;lt;br/&amp;gt;combo.setItems(FXCollections.observableArrayList(&amp;quot;공개&amp;quot;, &amp;quot;비공개&amp;quot;));&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;ComboBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Items&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;FXCollections fx:factory=&amp;quot;observableArrayList&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;비공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;/FXCollections&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/items&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/ComboBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 로딩과 Scene 생성 ===&lt;br /&gt;
* FXML 파일을 작성한 후 이를 이용하여 객체를 만들어야 한다. 이를 '''FXML loading'''이라고 한다.&lt;br /&gt;
* javafx.fxml.FXMLLoader를 이용&lt;br /&gt;
** 두 개의 load() 메소드 : 정적 메소드, 인스턴스 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* getClass() - 현재 클래스 리턴&lt;br /&gt;
* getResource() - 클래스가 위치하는 곳에서 상대 경로로 리소스의 URL을 리턴&lt;br /&gt;
* load() - FXML 파일을 로딩&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
FXMLLoader loader = new FXMLLoader(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
Parent root = (Parent)loader.load();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* load() - Parent 타입을 리턴함. 이것은 FXML 파일에서의 루트 태그로 선언된 컨테이너임&lt;br /&gt;
* 만을 루트 태그가 &amp;lt;HBox&amp;gt; 라면 다음과 같이 작성해도 됨&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
HBox hbox = (HBox) FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX Scene Builder ===&lt;br /&gt;
[[file:CP-SceneBuilder-1.png | thumb | Scene Builder로 root.fxml 띄움]]&lt;br /&gt;
* Scene Builder 다운로드 - https://gluonhq.com/products/scene-builder/&lt;br /&gt;
* [https://marketplace.visualstudio.com/items?itemName=bilalekrem.scenebuilderextension SceneBuilder extension for Visual Studio Code]&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 눌러 &amp;quot;Configure Scene Builder path&amp;quot;를 실행한다.&lt;br /&gt;
*** 경로를 다음과 같이 지정한다 : C:\Users\profs\AppData\Local\SceneBuilder 폴더의 SceneBuilder.exe 지정&lt;br /&gt;
&lt;br /&gt;
* Scene Builder 띄우는 방법&lt;br /&gt;
** fxml 파일을 선택한다.&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 누른다.&lt;br /&gt;
&lt;br /&gt;
== JavaFX 컨테이너 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
컨테이너   | 설명&lt;br /&gt;
AnchorPane | 컨트롤을 좌표로 배치하는 레이아웃&lt;br /&gt;
BorderPane | 위, 아래, 오른쪽, 왼쪽, 중앙에 컨트롤을 배치하는 레이아웃&lt;br /&gt;
FlowPane   | 행으로 배치하되 공간이 부족하면 새로운 행에 배치하는 레이아웃&lt;br /&gt;
GridPane   | 그리드로 배치하되 셀의 크기가 고정적이지 않은 레이아웃&lt;br /&gt;
StackPane  | 컨트롤을 겹쳐서 배치하는 레이아웃&lt;br /&gt;
TilePane   | 그리드로 배치하되 고정된 셀의 크기를 갖는 레이아웃&lt;br /&gt;
HBox       | 수평으로 배치하는 레이아웃&lt;br /&gt;
VBox       | 수직으로 배치하는 레이아웃&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AnchorPane 컨테이너 ===&lt;br /&gt;
[[file:CP-17.4.1-1.png]]&lt;br /&gt;
&lt;br /&gt;
* AnchorPane에서 사용할 수 있는 주요 설정&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명            | 적용&lt;br /&gt;
PrefWidth    | 폭을 설정       | AnchorPane&lt;br /&gt;
PrefHeight   | 높이를 설정     | AnchorPane&lt;br /&gt;
layoutX      | 컨트롤의 X 좌표 | 컨트롤&lt;br /&gt;
layoutY      | 컨트롤의 Y 좌표 | 컨트롤&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함   | AnchorPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.1-2.png | thumb | AnchorPane (Scene Builder)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.PasswordField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;150.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;28.0&amp;quot; text=&amp;quot;아이디&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;66.0&amp;quot; text=&amp;quot;패스워드&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;24.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;PasswordField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;62.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;97.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;164.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBox와 VBox 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                         | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                    | HBox, VBox&lt;br /&gt;
prefHeight   | 높이를 설정                  | HBox, VBox &lt;br /&gt;
alignment    | 컨트롤의 정렬을 설정         | HBox, VBox &lt;br /&gt;
spacing      | 컨트롤의 간격을 설정         | HBox, VBox&lt;br /&gt;
fillWidth    | 컨트롤의 폭 확장 여부 설정   | VBox&lt;br /&gt;
fillHeight   | 컨트롤의 높이 확장 여부 설정 | HBox&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함                | HBox, VBox&lt;br /&gt;
&amp;lt;HBox.hgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; | HBox의 남은 폭을 채움   | 컨트롤&lt;br /&gt;
&amp;lt;VBox.vgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/VBox.vgrow&amp;gt; | VBox의 남을 높이를 채움 | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root2.fxml&lt;br /&gt;
** 이 패키지의 하위 폴더로 &amp;lt;code&amp;gt;images&amp;lt;/code&amp;gt;를 만들고 여기에 javafx.png 파일을 복사해 넣어둔다. [[file:javafx.png | thumb | javafx.png]]&lt;br /&gt;
[[file:CP-17.4.3-project.png | thumb | images 폴더]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import java.lang.Double?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.Priority?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitWidth=&amp;quot;200.0&amp;quot; preserveRatio=&amp;quot;true&amp;quot;&amp;gt; &amp;lt;!-- 그림의 비율에 맞게 높이를 설정 --&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&lt;br /&gt;
          &amp;lt;Image url=&amp;quot;@images/javafx.png&amp;quot; /&amp;gt; &amp;lt;!-- 현재 경로 기준으로 상대경로로 파일 지정 --&amp;gt;&lt;br /&gt;
        &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;HBox alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;이전&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;다음&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;HBox.hgrow&amp;gt;&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; &amp;lt;!-- 오른쪽 남은 공간을 버튼이 모두 채우도록 설정 --&amp;gt;&lt;br /&gt;
              &amp;lt;maxWidth&amp;gt;&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;/maxWidth&amp;gt; &amp;lt;!-- 버튼의 폭을 자동으로 확장하기 위해 설정--&amp;gt;&lt;br /&gt;
            &amp;lt;/Button&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
         &amp;lt;VBox.margin&amp;gt;&lt;br /&gt;
           &amp;lt;Insets top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/VBox.margin&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.4.3-p874.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root2.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BorderPane 컨테이너 ===&lt;br /&gt;
* top, bottom, left, right, center 셀에 컨트롤을 배치하는 컨테이너&lt;br /&gt;
* 다른 컨테이너를 배치할 수도 있음&lt;br /&gt;
* 각 셀에는 '''하나'''의 컨트롤 또는 컨테이너만 배치할 수 있음&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-1.png | 250px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                           | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                      | BorderPane&lt;br /&gt;
prefHeight   | 높이를 설정                    | BorderPane&lt;br /&gt;
&amp;lt;top&amp;gt;        | top에 배치될 컨트롤을 포함     | BorderPane&lt;br /&gt;
&amp;lt;bottom&amp;gt;     | bottom에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;right&amp;gt;      | right에 배치될 컨트롤을 포함   | BorderPane&lt;br /&gt;
&amp;lt;left&amp;gt;       | left에 배치될 컨트롤을 포함    | BorderPane&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;center&amp;gt;&amp;lt;/nowiki&amp;gt;     | center에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.ToolBar?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;top&amp;gt;&lt;br /&gt;
      &amp;lt;ToolBar prefHeight=&amp;quot;40.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot; BorderPane.alignment=&amp;quot;CENTER&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;items&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/items&amp;gt;&lt;br /&gt;
      &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
   &amp;lt;/top&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea /&amp;gt; &amp;lt;!-- left와 right까지 확장--&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;BorderPane&amp;gt;&lt;br /&gt;
         &amp;lt;center&amp;gt;&lt;br /&gt;
           &amp;lt;TextField /&amp;gt; &amp;lt;!-- top, bottom, left까지 확장--&amp;gt;&lt;br /&gt;
         &amp;lt;/center&amp;gt;&lt;br /&gt;
         &amp;lt;right&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/right&amp;gt;&lt;br /&gt;
      &amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FlowPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                      | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                 | FlowPane&lt;br /&gt;
prefHeight   | 높이를 설정               | FlowPane&lt;br /&gt;
hgap         | 컨트롤의 수평 간격을 설정 | FlowPane&lt;br /&gt;
vgap         | 컨트롤의 수직 간격을 설정 | FlowPane&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함             |  FlowPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.5-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.FlowPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;FlowPane prefHeight=&amp;quot;70.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/FlowPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TilePane 컨테이너 ===&lt;br /&gt;
* 그리드로 컨트롤을 배치하되 고정된 셀(타일) 크기를 갖는 컨테이너&lt;br /&gt;
* 오른쪽에 배치할 공간이 부족하면 새로운 행에 컨트롤을 배치함&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-TilePane.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성   | 설명               | 적용&lt;br /&gt;
prefWidth      | 폭을 설정          | TilePane&lt;br /&gt;
prefHeight     | 높이를 설정        | TilePane&lt;br /&gt;
prefTileWidth  | 타일의 폭을 설정   | TilePane&lt;br /&gt;
prefTileHeight | 타일의 높이를 설정 | TilePane&lt;br /&gt;
&amp;lt;children&amp;gt;     | 컨트롤을 포함      | TilePane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:fruit1.jpg | fruit1.jpg&lt;br /&gt;
file:fruit2.jpg | fruit2.jpg&lt;br /&gt;
file:fruit3.jpg | fruit3.jpg&lt;br /&gt;
file:fruit4.jpg | fruit4.jpg&lt;br /&gt;
file:fruit5.jpg | fruit5.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.TilePane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TilePane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;100.0&amp;quot; prefWidth=&amp;quot;100.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit1.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit2.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit3.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit4.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit5.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/TilePane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GridPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성         | 설명                                 | 적용&lt;br /&gt;
prefWidth            | 폭을 설정                            | GridPane&lt;br /&gt;
prefHeight           | 놎이를 설정                          | GridPane&lt;br /&gt;
hgap                 | 수평 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
vgap                 | 수직 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
&amp;lt;children&amp;gt;           | 컨트롤을 포함                        | GridPane&lt;br /&gt;
GridPane.rowIndex    | 컨트롤이 위치하는 행 인덱스를 설정   | 컨트롤&lt;br /&gt;
GridPane.columnIndex | 컨트롤이 위치하는 컬럼 인덱스를 설정 | 컨트롤&lt;br /&gt;
GridPane.rowSpan     | 행 병합 수를 설정                    | 컨트롤&lt;br /&gt;
GridPane.columnSpan  | 컬럼 병합 수를 설정                  | 컨트롤&lt;br /&gt;
GridPane.hgrow       | 수평 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.vgrow       | 수직 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.halignment  | 컨트롤의 수평 정렬을 설정            | 컨트롤&lt;br /&gt;
GridPane.valignment  | 컨트롤의 수직 정렬을 설정            | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.7-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.ColumnConstraints?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.GridPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.RowConstraints?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GridPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; hgap=&amp;quot;10.0&amp;quot; vgap=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets topRightBottomLeft=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;아이디&amp;quot; GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;패스워드&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.columnIndex=&amp;quot;1&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
      &amp;lt;HBox GridPane.rowIndex=&amp;quot;2&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot;&lt;br /&gt;
                 GridPane.columnSpan=&amp;quot;2&amp;quot; GridPane.hgrow=&amp;quot;ALWAYS&amp;quot;&lt;br /&gt;
                 alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot; &amp;gt;  &amp;lt;!-- 컬럼 2개 병합 --&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/GridPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== StackPane 컨테이너 ===&lt;br /&gt;
* 컨트롤을 겹쳐 배치하는 컨테이너&lt;br /&gt;
* 카드 레이아웃(Card Layout)이라고도 함&lt;br /&gt;
* 만약 위에 있는 컨트롤이 투명하다면 밑에 있는 컨트롤이 겹쳐 보임&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:duke.jpg | duke.jpg&lt;br /&gt;
file:snow.jpg | snow.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.8-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.StackPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;StackPane  xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;300.0&amp;quot; prefWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitHeight=&amp;quot;300.0&amp;quot; fitWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/snow.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView preserveRatio=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/duke.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/StackPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 이벤트 처리 ==&lt;br /&gt;
&lt;br /&gt;
=== 이벤트 핸들러(EventHandler) ===&lt;br /&gt;
* JavaFX는 이벤트 발생 콘트롤과 이벤트 핸들러(EventHandler)를 분리하는 위임형(Delegation&amp;lt;ref&amp;gt;Design Pattern 중 Delegation Pattern&amp;lt;/ref&amp;gt;) 방식을 사용함&lt;br /&gt;
* 이를 위해 먼저 컨트롤에 EventHandler를 등록해야 함 (setOnXXX() 메소드. 예: setOnAction())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cccc&amp;gt;&lt;br /&gt;
컨트롤(control) | 사건        | 이벤트(event) 발생 | 이벤트 처리 담당 객체 | 이벤트 처리 메소드 실행 | 이벤트 처리 효과&lt;br /&gt;
Button          | 버튼을 누름 | ActionEvent        | EventHandler          | public void handle(...) {&amp;lt;br/&amp;gt;{{sp2}}이벤트 처리&amp;lt;/br/&amp;gt;} | 1. 윈도우 닫기&amp;lt;br/&amp;gt;2. 컨트롤 내용 변경&amp;lt;br/&amp;gt;3. 다이얼로그 띄우기&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Button 클릭 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Button button = new Button();&lt;br /&gt;
button.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(ActionEvent event) { ... }&lt;br /&gt;
}):&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* TableView에서 행을 마우스로 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TableView tableView = new TableView();&lt;br /&gt;
tableView.setOnMouseClicked(new EventHandler&amp;lt;MouseEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(MouseEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 윈도우 우측 상단(x) 버튼 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
stage.setOnCloseRequest(new EventHandler&amp;lt;WindowEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(WindowEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* EventHandler는 하나의 메소드를 가진 함수적 인터페이스이므로 람다식을 이용하여 이벤트 등록 가능&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
button.setOnAction( event-&amp;gt;{ ... } );&lt;br /&gt;
tableView.setOnMouseClicked( event-&amp;gt;{ ... } );&lt;br /&gt;
stage.setOnCloseRequest( event-&amp;gt;{ ... } );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.1-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox root = new HBox();&lt;br /&gt;
        root.setPrefSize(200, 50);&lt;br /&gt;
        root.setAlignment(Pos.CENTER); // 수평 중앙 정렬&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Button btn1 = new Button(&amp;quot;버튼1&amp;quot;);&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        Button btn2 = new Button(&amp;quot;버튼2&amp;quot;);&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;System.out.println(&amp;quot;버튼2 클릭&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().addAll(btn1, btn2); // HBox에 btn1과 btn2를 추가&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.setOnCloseRequest(event-&amp;gt;System.out.println(&amp;quot;종료 클릭&amp;quot;));&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FXML 컨트롤러(Controller) ===&lt;br /&gt;
&lt;br /&gt;
==== fx:controller 속성과 컨트롤러 클래스 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;루트컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;packageName.ControllerName&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/루트컨트롤러&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fx:id 속성과 @FXML 컨트롤 주입 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
      fx:controller=&amp;quot;sec05.exam02_fxml_controller.RootController&amp;quot;&lt;br /&gt;
      prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
      alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @FXML private Button btn1;&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML&lt;br /&gt;
    private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EventHandler 등록 ====&lt;br /&gt;
&lt;br /&gt;
* AppMain.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* RootController.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private Button btn1; // import javafx.fxml.FXML 필요&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() { // 직접 EventHandler 생성 후 등록&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                handleBtn1Action(event);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;handleBtn2Action(event)); // 람다식 이용&lt;br /&gt;
        // btn3.setOnAction(event-&amp;gt;handleBtn3Action(event));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void handleBtn1Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void handleBtn2Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼2 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void handleBtn3Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼3 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root.xml&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
    fx:controller=&amp;quot;ch17.p889.RootController&amp;quot;&lt;br /&gt;
    prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
    alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; onAction=&amp;quot;#handleBtn3Action&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 이벤트 처리 메소드 매핑 ====&lt;br /&gt;
* FXML 파일&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button fx:id=&amp;quot;btn&amp;quot; text=&amp;quot;버튼&amp;quot; onAction=&amp;quot;#handleBtnAction&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Controller 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void handleBtnAction(ActionEvent event) { ... }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 속성 감시와 바인딩 ==&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=407</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/1124</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=407"/>
		<updated>2022-07-22T03:15:01Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* FXML 컨트롤러(Controller) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JavaFX 개요 ==&lt;br /&gt;
# AWT&lt;br /&gt;
#* Native UI 컴포넌트 사용&lt;br /&gt;
#* 운영체제 마다 UI 모양이 다름&lt;br /&gt;
# Swing&lt;br /&gt;
#* 운영체제가 제공하는 native UI 사용 안 함&lt;br /&gt;
#* 운영체제가 새롭게 제공하는 UI 지원의 어려움&lt;br /&gt;
# JavaFX&lt;br /&gt;
#* Abode의 flash, Microsoft의 silverlight의 대항마&lt;br /&gt;
#* JDK 7부터 지원. JDK 8 권장.&lt;br /&gt;
#* JDK 11부터는 별도로 설치해야 함.&lt;br /&gt;
#* 화면 레이아웃과 스타일, 애플리케이션 로직 분리&lt;br /&gt;
#* Java 코드와 분리해서 스타일 시트(CSS)로 외관 작성 → 개발자와 디자이너의 동시 개발 가능&lt;br /&gt;
#* Java 코드에서도 레이아웃과 애플리케이션 로직을 분리하고 싶다면 레이아웃은 FXML로 작성, 로직은 Java로 작성&lt;br /&gt;
#* JavaFX 애플리케이션 구성 요소&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;50&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[레이아웃]'''&amp;lt;br/&amp;gt;자바 코드 파일&amp;lt;/br&amp;gt;또는 FXML 파일&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[외관 및 스타일]'''&amp;lt;br/&amp;gt;CSS 파일&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[리소스]'''&amp;lt;br/&amp;gt;그림 파일&amp;lt;br/&amp;gt;동영상 파일&amp;lt;br/&amp;gt;... &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[비즈니스 로직]'''&amp;lt;br/&amp;gt;자바 코드 파일&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JavaFX 애플리케이션 개발 시작 ==&lt;br /&gt;
=== 메인 클래스 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX 라이프사이클(life cycle) ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
    public AppMain() {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: AppMain() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: init() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: start() 호출&amp;quot;);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public void stop() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: stop() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: main() 호출&amp;quot;);&lt;br /&gt;
        launch(args);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
main: main() 호출&lt;br /&gt;
JavaFX Application Thread: AppMain() 호출&lt;br /&gt;
JavaFX-Launcher: init() 호출&lt;br /&gt;
JavaFX Application Thread: start() 호출&lt;br /&gt;
JavaFX Application Thread: stop() 호출 ← 프로그램을 끝내야 실행된다.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 메일 클래스 실행 매개값 얻기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
C:&amp;gt; java AppMain --ip=192.168.0.5 --port=50001&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* main()에서 launch(args)를 넘겨 받음&lt;br /&gt;
* init() 메소드에서 아래와 같이 실행할 수 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parameters params = getParameters();&lt;br /&gt;
List&amp;lt;String&amp;gt; list = params.getRaw();&lt;br /&gt;
Map&amp;lt;String, String&amp;gt; map = params.getNamed();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 무대(Stage)와 장면(Scene) ===&lt;br /&gt;
* 윈도우 : Stage&lt;br /&gt;
* Stage에는 하나의 Scene을 가질 수 있음&lt;br /&gt;
* Scene은 직접 생성해야 함&lt;br /&gt;
&lt;br /&gt;
[[file:CP2022_ch17.2_AppMain.png|thumb|AppMain 실행화면]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.application.Platform;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.layout.VBox;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        VBox root = new VBox();&lt;br /&gt;
        root.setPrefWidth(350);&lt;br /&gt;
        root.setPrefHeight(150);&lt;br /&gt;
        root.setAlignment(Pos.CENTER);&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Label label = new Label();&lt;br /&gt;
        label.setText(&amp;quot;Hello, JavaFX&amp;quot;);&lt;br /&gt;
        label.setFont(new Font(50));&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
        button.setOnAction(event-&amp;gt;Platform.exit());&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().add(label);&lt;br /&gt;
        root.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(root); // VBox를 루트 컨테이너(root container)로 해서 Scene 생성&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain입니다&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene); // 윈도우에 장면 설정&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 레이아웃 ==&lt;br /&gt;
=== 프로그램적 레이아웃 ===&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | 프로그램적 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.collections.ObservableList;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.TextField;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(10));&lt;br /&gt;
        hbox.setSpacing(10);&lt;br /&gt;
&lt;br /&gt;
        TextField textField = new TextField();&lt;br /&gt;
        textField.setPrefWidth(200);&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ObservableList list = hbox.getChildren();&lt;br /&gt;
        list.add(textField);&lt;br /&gt;
        list.add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 레이아웃 ===&lt;br /&gt;
* FXML 파일 (root.fxml)&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | FXML 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;padding&amp;gt;&lt;br /&gt;
        &amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/padding&amp;gt;&lt;br /&gt;
    &amp;lt;spacing&amp;gt;10&amp;lt;/spacing&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;children&amp;gt;&lt;br /&gt;
        &amp;lt;TextField&amp;gt;&lt;br /&gt;
            &amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&lt;br /&gt;
        &amp;lt;/TextField&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
    &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* AppMain 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;)); // ← FXML 로드&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 레이아웃(layout) 여백: 패딩(padding)과 마진(margin) ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cll&amp;gt;&lt;br /&gt;
구분      | HBox의 패딩                                                        | Button의 마진&lt;br /&gt;
개념      | [[file:CP-17.3.3-padding.png]]                                     | [[file:CP-17.3.3-margin.png]]&lt;br /&gt;
자바 코드 | HBox hbox = new HBox();&amp;lt;br/&amp;gt;'''hbox.setPadding(new Insets(50))'''; | Button button = new Button();&amp;lt;br/&amp;gt;'''HBox.setMargin(button, new Insets(50));'''&lt;br /&gt;
FXML 태그 | &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt; | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;HBox.margin&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Hbox.margin&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Margin, Padding 설정 방법&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// top, right, bottom, left를 모두 동일한 값으로 설정할 때&lt;br /&gt;
// Insets(double topRightBottomLeft)&lt;br /&gt;
new Insets(50);&lt;br /&gt;
&lt;br /&gt;
// top, right, bottom, left를 다를 값으로 설정할 때&lt;br /&gt;
// Insets(double top, double right, double bottom, double left)&lt;br /&gt;
new Insets(10, 20, 30, 40);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 패딩과 마진 적용 예&lt;br /&gt;
[[file:CP-17.3.3-AppMain.png|thumb|패딩과 마진 적용 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        // 패딩 설정&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(50, 10, 10, 50));&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setPrefSize(100, 100);&lt;br /&gt;
        &lt;br /&gt;
        // 마진 설정&lt;br /&gt;
        // HBox hbox = new HBox();&lt;br /&gt;
        // Button button = new Button();&lt;br /&gt;
        // button.setPrefSize(100, 100);&lt;br /&gt;
        // HBox.setMargin(button, new Insets(10, 10, 50, 50));&lt;br /&gt;
&lt;br /&gt;
        hbox.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 작성 규칙 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
TextField textField = new TextField();&amp;lt;br/&amp;gt;textField.setPrefWidth(200);&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/TextField&amp;gt;&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}   |  &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
ObsetvableList list = hbox.getChildren();&amp;lt;br/&amp;gt;list.add(textField);&amp;lt;br/&amp;gt;list.add(button);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;children&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Button&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 패키지(package) 선언 ====&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                          |   FXML 태그&lt;br /&gt;
import javafx.scene.layout.HBox;   |   &amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
import javafx.scene.control.*;     |   &amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;?import?&amp;gt;가 들어가는 위치는 &amp;lt;?xml ...&amp;gt;와 루트 컨테이너 태그 사이이다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;루트 컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/루트 컨테이너&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* import를 제대로 하지 않으면 not a valid type 메시지와 함께 javafx.fxml.LoadException 발생&lt;br /&gt;
&lt;br /&gt;
==== 태그(tag) 선언 ====&lt;br /&gt;
* 시작 태그와 끝 태그가 매칭되어야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 속성(attribute) 선언 ====&lt;br /&gt;
* 속성은 &amp;quot;나 '로 감싸야 한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;태그이름 속성명=&amp;quot;값&amp;quot; 속성명='값'&amp;gt; ... &amp;lt;/태그이름&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 속성명은 Setter 메소드 명이 옴&lt;br /&gt;
* 모든 Setter가 사용될 수 있는 것은 아님. 기본 타입(boolean, byte, short, char, int, long, float, double)의 값을 세팅하거나, String을 세팅하는 Setter만 올 수 있음&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML (Setter 태그)                                    | FXML (Setter 속성)&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;   | &amp;lt;Button text=&amp;quot;확인&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 객체 선언 ====&lt;br /&gt;
===== 클래스 속성 =====&lt;br /&gt;
* 생성자에 매개 변수가 있고, 매개 변수에 @NamedArg(javafx.beans.NamedArg) 어노테이션이 적용되어 있으면 속성명이나 자식 태그로 작성할 수 있음&lt;br /&gt;
&amp;lt;table2 class=wikitable sep=bar align=ll&amp;gt;&lt;br /&gt;
&amp;lt;클래스 매개변수=&amp;quot;값&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}     | &amp;lt;클래스&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;매개변수&amp;gt;값&amp;lt;/매개변수&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/클래스&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
** HBox를 패딩할 때 setPadding(Insets value) 메소드를 사용하는데&lt;br /&gt;
** Insets는 기본 생성자가 없고,&lt;br /&gt;
** Insets(double topRightBottomLeft) 또는 Insets(double top, double right, double bottom, double left)만 있음&lt;br /&gt;
** 이 경우 아래와 같이 선언 가능함&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:value =====&lt;br /&gt;
* 클래스가 valueOf(String) 메소드를 제공하는 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:value=&amp;quot;값&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
String.valueOf(&amp;quot;Hello, World!&amp;quot;);&amp;lt;br/&amp;gt;Integer.valueOf(&amp;quot;1&amp;quot;);&amp;lt;br/&amp;gt;Double.valueOf(&amp;quot;1.0&amp;quot;);&amp;lt;br/&amp;gt;Boolean.valueOf(&amp;quot;false&amp;quot;);  |  &amp;lt;String fx:value=&amp;quot;Hello, World!&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Integer fx:value=&amp;quot;1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Double fx:value=&amp;quot;1.0&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Boolean fx:value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:constant =====&lt;br /&gt;
*클래스에 정의된 상수값을 얻고 싶을 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:constant=&amp;quot;상수&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setMaxWidth( Double.MAX_VALUE );&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;maxWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/maxWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:factory =====&lt;br /&gt;
* 어떤 클래스는 new 연산자로 객체를 생성할 수 없고,&lt;br /&gt;
* 정적 메소드(이를 factory 메소드라 부른다)로 객체를 얻어야 하는 경우가 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:factory=&amp;quot;정적메소드&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예: &amp;lt;code&amp;gt;ObservableList&amp;lt;/code&amp;gt;의 구현 객체는 &amp;lt;code&amp;gt;javafx.collections.FXCollections&amp;lt;/code&amp;gt;의 정적 메소드인 &amp;lt;code&amp;gt;observableArrayList(E... items)&amp;lt;/code&amp;gt; 메소드로 얻을 수 있다.&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
ComboBox combo = new ComboBox();&amp;lt;br/&amp;gt;combo.setItems(FXCollections.observableArrayList(&amp;quot;공개&amp;quot;, &amp;quot;비공개&amp;quot;));&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;ComboBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Items&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;FXCollections fx:factory=&amp;quot;observableArrayList&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;비공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;/FXCollections&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/items&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/ComboBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 로딩과 Scene 생성 ===&lt;br /&gt;
* FXML 파일을 작성한 후 이를 이용하여 객체를 만들어야 한다. 이를 '''FXML loading'''이라고 한다.&lt;br /&gt;
* javafx.fxml.FXMLLoader를 이용&lt;br /&gt;
** 두 개의 load() 메소드 : 정적 메소드, 인스턴스 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* getClass() - 현재 클래스 리턴&lt;br /&gt;
* getResource() - 클래스가 위치하는 곳에서 상대 경로로 리소스의 URL을 리턴&lt;br /&gt;
* load() - FXML 파일을 로딩&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
FXMLLoader loader = new FXMLLoader(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
Parent root = (Parent)loader.load();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* load() - Parent 타입을 리턴함. 이것은 FXML 파일에서의 루트 태그로 선언된 컨테이너임&lt;br /&gt;
* 만을 루트 태그가 &amp;lt;HBox&amp;gt; 라면 다음과 같이 작성해도 됨&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
HBox hbox = (HBox) FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX Scene Builder ===&lt;br /&gt;
[[file:CP-SceneBuilder-1.png | thumb | Scene Builder로 root.fxml 띄움]]&lt;br /&gt;
* Scene Builder 다운로드 - https://gluonhq.com/products/scene-builder/&lt;br /&gt;
* [https://marketplace.visualstudio.com/items?itemName=bilalekrem.scenebuilderextension SceneBuilder extension for Visual Studio Code]&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 눌러 &amp;quot;Configure Scene Builder path&amp;quot;를 실행한다.&lt;br /&gt;
*** 경로를 다음과 같이 지정한다 : C:\Users\profs\AppData\Local\SceneBuilder 폴더의 SceneBuilder.exe 지정&lt;br /&gt;
&lt;br /&gt;
* Scene Builder 띄우는 방법&lt;br /&gt;
** fxml 파일을 선택한다.&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 누른다.&lt;br /&gt;
&lt;br /&gt;
== JavaFX 컨테이너 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
컨테이너   | 설명&lt;br /&gt;
AnchorPane | 컨트롤을 좌표로 배치하는 레이아웃&lt;br /&gt;
BorderPane | 위, 아래, 오른쪽, 왼쪽, 중앙에 컨트롤을 배치하는 레이아웃&lt;br /&gt;
FlowPane   | 행으로 배치하되 공간이 부족하면 새로운 행에 배치하는 레이아웃&lt;br /&gt;
GridPane   | 그리드로 배치하되 셀의 크기가 고정적이지 않은 레이아웃&lt;br /&gt;
StackPane  | 컨트롤을 겹쳐서 배치하는 레이아웃&lt;br /&gt;
TilePane   | 그리드로 배치하되 고정된 셀의 크기를 갖는 레이아웃&lt;br /&gt;
HBox       | 수평으로 배치하는 레이아웃&lt;br /&gt;
VBox       | 수직으로 배치하는 레이아웃&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AnchorPane 컨테이너 ===&lt;br /&gt;
[[file:CP-17.4.1-1.png]]&lt;br /&gt;
&lt;br /&gt;
* AnchorPane에서 사용할 수 있는 주요 설정&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명            | 적용&lt;br /&gt;
PrefWidth    | 폭을 설정       | AnchorPane&lt;br /&gt;
PrefHeight   | 높이를 설정     | AnchorPane&lt;br /&gt;
layoutX      | 컨트롤의 X 좌표 | 컨트롤&lt;br /&gt;
layoutY      | 컨트롤의 Y 좌표 | 컨트롤&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함   | AnchorPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.1-2.png | thumb | AnchorPane (Scene Builder)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.PasswordField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;150.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;28.0&amp;quot; text=&amp;quot;아이디&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;66.0&amp;quot; text=&amp;quot;패스워드&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;24.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;PasswordField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;62.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;97.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;164.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBox와 VBox 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                         | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                    | HBox, VBox&lt;br /&gt;
prefHeight   | 높이를 설정                  | HBox, VBox &lt;br /&gt;
alignment    | 컨트롤의 정렬을 설정         | HBox, VBox &lt;br /&gt;
spacing      | 컨트롤의 간격을 설정         | HBox, VBox&lt;br /&gt;
fillWidth    | 컨트롤의 폭 확장 여부 설정   | VBox&lt;br /&gt;
fillHeight   | 컨트롤의 높이 확장 여부 설정 | HBox&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함                | HBox, VBox&lt;br /&gt;
&amp;lt;HBox.hgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; | HBox의 남은 폭을 채움   | 컨트롤&lt;br /&gt;
&amp;lt;VBox.vgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/VBox.vgrow&amp;gt; | VBox의 남을 높이를 채움 | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root2.fxml&lt;br /&gt;
** 이 패키지의 하위 폴더로 &amp;lt;code&amp;gt;images&amp;lt;/code&amp;gt;를 만들고 여기에 javafx.png 파일을 복사해 넣어둔다. [[file:javafx.png | thumb | javafx.png]]&lt;br /&gt;
[[file:CP-17.4.3-project.png | thumb | images 폴더]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import java.lang.Double?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.Priority?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitWidth=&amp;quot;200.0&amp;quot; preserveRatio=&amp;quot;true&amp;quot;&amp;gt; &amp;lt;!-- 그림의 비율에 맞게 높이를 설정 --&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&lt;br /&gt;
          &amp;lt;Image url=&amp;quot;@images/javafx.png&amp;quot; /&amp;gt; &amp;lt;!-- 현재 경로 기준으로 상대경로로 파일 지정 --&amp;gt;&lt;br /&gt;
        &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;HBox alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;이전&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;다음&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;HBox.hgrow&amp;gt;&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; &amp;lt;!-- 오른쪽 남은 공간을 버튼이 모두 채우도록 설정 --&amp;gt;&lt;br /&gt;
              &amp;lt;maxWidth&amp;gt;&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;/maxWidth&amp;gt; &amp;lt;!-- 버튼의 폭을 자동으로 확장하기 위해 설정--&amp;gt;&lt;br /&gt;
            &amp;lt;/Button&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
         &amp;lt;VBox.margin&amp;gt;&lt;br /&gt;
           &amp;lt;Insets top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/VBox.margin&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.4.3-p874.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root2.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BorderPane 컨테이너 ===&lt;br /&gt;
* top, bottom, left, right, center 셀에 컨트롤을 배치하는 컨테이너&lt;br /&gt;
* 다른 컨테이너를 배치할 수도 있음&lt;br /&gt;
* 각 셀에는 '''하나'''의 컨트롤 또는 컨테이너만 배치할 수 있음&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-1.png | 250px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                           | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                      | BorderPane&lt;br /&gt;
prefHeight   | 높이를 설정                    | BorderPane&lt;br /&gt;
&amp;lt;top&amp;gt;        | top에 배치될 컨트롤을 포함     | BorderPane&lt;br /&gt;
&amp;lt;bottom&amp;gt;     | bottom에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;right&amp;gt;      | right에 배치될 컨트롤을 포함   | BorderPane&lt;br /&gt;
&amp;lt;left&amp;gt;       | left에 배치될 컨트롤을 포함    | BorderPane&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;center&amp;gt;&amp;lt;/nowiki&amp;gt;     | center에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.ToolBar?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;top&amp;gt;&lt;br /&gt;
      &amp;lt;ToolBar prefHeight=&amp;quot;40.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot; BorderPane.alignment=&amp;quot;CENTER&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;items&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/items&amp;gt;&lt;br /&gt;
      &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
   &amp;lt;/top&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea /&amp;gt; &amp;lt;!-- left와 right까지 확장--&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;BorderPane&amp;gt;&lt;br /&gt;
         &amp;lt;center&amp;gt;&lt;br /&gt;
           &amp;lt;TextField /&amp;gt; &amp;lt;!-- top, bottom, left까지 확장--&amp;gt;&lt;br /&gt;
         &amp;lt;/center&amp;gt;&lt;br /&gt;
         &amp;lt;right&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/right&amp;gt;&lt;br /&gt;
      &amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FlowPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                      | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                 | FlowPane&lt;br /&gt;
prefHeight   | 높이를 설정               | FlowPane&lt;br /&gt;
hgap         | 컨트롤의 수평 간격을 설정 | FlowPane&lt;br /&gt;
vgap         | 컨트롤의 수직 간격을 설정 | FlowPane&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함             |  FlowPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.5-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.FlowPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;FlowPane prefHeight=&amp;quot;70.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/FlowPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TilePane 컨테이너 ===&lt;br /&gt;
* 그리드로 컨트롤을 배치하되 고정된 셀(타일) 크기를 갖는 컨테이너&lt;br /&gt;
* 오른쪽에 배치할 공간이 부족하면 새로운 행에 컨트롤을 배치함&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-TilePane.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성   | 설명               | 적용&lt;br /&gt;
prefWidth      | 폭을 설정          | TilePane&lt;br /&gt;
prefHeight     | 높이를 설정        | TilePane&lt;br /&gt;
prefTileWidth  | 타일의 폭을 설정   | TilePane&lt;br /&gt;
prefTileHeight | 타일의 높이를 설정 | TilePane&lt;br /&gt;
&amp;lt;children&amp;gt;     | 컨트롤을 포함      | TilePane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:fruit1.jpg | fruit1.jpg&lt;br /&gt;
file:fruit2.jpg | fruit2.jpg&lt;br /&gt;
file:fruit3.jpg | fruit3.jpg&lt;br /&gt;
file:fruit4.jpg | fruit4.jpg&lt;br /&gt;
file:fruit5.jpg | fruit5.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.TilePane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TilePane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;100.0&amp;quot; prefWidth=&amp;quot;100.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit1.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit2.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit3.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit4.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit5.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/TilePane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GridPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성         | 설명                                 | 적용&lt;br /&gt;
prefWidth            | 폭을 설정                            | GridPane&lt;br /&gt;
prefHeight           | 놎이를 설정                          | GridPane&lt;br /&gt;
hgap                 | 수평 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
vgap                 | 수직 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
&amp;lt;children&amp;gt;           | 컨트롤을 포함                        | GridPane&lt;br /&gt;
GridPane.rowIndex    | 컨트롤이 위치하는 행 인덱스를 설정   | 컨트롤&lt;br /&gt;
GridPane.columnIndex | 컨트롤이 위치하는 컬럼 인덱스를 설정 | 컨트롤&lt;br /&gt;
GridPane.rowSpan     | 행 병합 수를 설정                    | 컨트롤&lt;br /&gt;
GridPane.columnSpan  | 컬럼 병합 수를 설정                  | 컨트롤&lt;br /&gt;
GridPane.hgrow       | 수평 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.vgrow       | 수직 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.halignment  | 컨트롤의 수평 정렬을 설정            | 컨트롤&lt;br /&gt;
GridPane.valignment  | 컨트롤의 수직 정렬을 설정            | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.7-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.ColumnConstraints?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.GridPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.RowConstraints?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GridPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; hgap=&amp;quot;10.0&amp;quot; vgap=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets topRightBottomLeft=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;아이디&amp;quot; GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;패스워드&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.columnIndex=&amp;quot;1&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
      &amp;lt;HBox GridPane.rowIndex=&amp;quot;2&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot;&lt;br /&gt;
                 GridPane.columnSpan=&amp;quot;2&amp;quot; GridPane.hgrow=&amp;quot;ALWAYS&amp;quot;&lt;br /&gt;
                 alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot; &amp;gt;  &amp;lt;!-- 컬럼 2개 병합 --&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/GridPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== StackPane 컨테이너 ===&lt;br /&gt;
* 컨트롤을 겹쳐 배치하는 컨테이너&lt;br /&gt;
* 카드 레이아웃(Card Layout)이라고도 함&lt;br /&gt;
* 만약 위에 있는 컨트롤이 투명하다면 밑에 있는 컨트롤이 겹쳐 보임&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:duke.jpg | duke.jpg&lt;br /&gt;
file:snow.jpg | snow.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.8-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.StackPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;StackPane  xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;300.0&amp;quot; prefWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitHeight=&amp;quot;300.0&amp;quot; fitWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/snow.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView preserveRatio=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/duke.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/StackPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 이벤트 처리 ==&lt;br /&gt;
&lt;br /&gt;
=== 이벤트 핸들러(EventHandler) ===&lt;br /&gt;
* JavaFX는 이벤트 발생 콘트롤과 이벤트 핸들러(EventHandler)를 분리하는 위임형(Delegation&amp;lt;ref&amp;gt;Design Pattern 중 Delegation Pattern&amp;lt;/ref&amp;gt;) 방식을 사용함&lt;br /&gt;
* 이를 위해 먼저 컨트롤에 EventHandler를 등록해야 함 (setOnXXX() 메소드. 예: setOnAction())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cccc&amp;gt;&lt;br /&gt;
컨트롤(control) | 사건        | 이벤트(event) 발생 | 이벤트 처리 담당 객체 | 이벤트 처리 메소드 실행 | 이벤트 처리 효과&lt;br /&gt;
Button          | 버튼을 누름 | ActionEvent        | EventHandler          | public void handle(...) {&amp;lt;br/&amp;gt;{{sp2}}이벤트 처리&amp;lt;/br/&amp;gt;} | 1. 윈도우 닫기&amp;lt;br/&amp;gt;2. 컨트롤 내용 변경&amp;lt;br/&amp;gt;3. 다이얼로그 띄우기&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Button 클릭 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Button button = new Button();&lt;br /&gt;
button.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(ActionEvent event) { ... }&lt;br /&gt;
}):&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* TableView에서 행을 마우스로 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TableView tableView = new TableView();&lt;br /&gt;
tableView.setOnMouseClicked(new EventHandler&amp;lt;MouseEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(MouseEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 윈도우 우측 상단(x) 버튼 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
stage.setOnCloseRequest(new EventHandler&amp;lt;WindowEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(WindowEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* EventHandler는 하나의 메소드를 가진 함수적 인터페이스이므로 람다식을 이용하여 이벤트 등록 가능&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
button.setOnAction( event-&amp;gt;{ ... } );&lt;br /&gt;
tableView.setOnMouseClicked( event-&amp;gt;{ ... } );&lt;br /&gt;
stage.setOnCloseRequest( event-&amp;gt;{ ... } );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.1-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox root = new HBox();&lt;br /&gt;
        root.setPrefSize(200, 50);&lt;br /&gt;
        root.setAlignment(Pos.CENTER); // 수평 중앙 정렬&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Button btn1 = new Button(&amp;quot;버튼1&amp;quot;);&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        Button btn2 = new Button(&amp;quot;버튼2&amp;quot;);&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;System.out.println(&amp;quot;버튼2 클릭&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().addAll(btn1, btn2); // HBox에 btn1과 btn2를 추가&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.setOnCloseRequest(event-&amp;gt;System.out.println(&amp;quot;종료 클릭&amp;quot;));&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FXML 컨트롤러(Controller) ===&lt;br /&gt;
&lt;br /&gt;
==== fx:controller 속성과 컨트롤러 클래스 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;루트컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; fx:controller=&amp;quot;packageName.ControllerName&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/루트컨트롤러&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fx:id 속성과 @FXML 컨트롤 주입 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
      fx:controller=&amp;quot;sec05.exam02_fxml_controller.RootController&amp;quot;&lt;br /&gt;
      prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
      alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ControllerName implements Initializable {&lt;br /&gt;
    @FXML private Button btn1;&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML&lt;br /&gt;
    private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== EventHandler 등록 ====&lt;br /&gt;
&lt;br /&gt;
* AppMain.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* RootController.java&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch17.p889;&lt;br /&gt;
&lt;br /&gt;
import java.net.URL;&lt;br /&gt;
import java.util.ResourceBundle;&lt;br /&gt;
&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.fxml.FXML;&lt;br /&gt;
import javafx.fxml.Initializable;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
&lt;br /&gt;
public class RootController implements Initializable {&lt;br /&gt;
    @FXML private Button btn1; // import javafx.fxml.FXML 필요&lt;br /&gt;
    @FXML private Button btn2;&lt;br /&gt;
    @FXML private Button btn3;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void initialize(URL location, ResourceBundle resources) {&lt;br /&gt;
&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() { // 직접 EventHandler 생성 후 등록&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                handleBtn1Action(event);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;handleBtn2Action(event)); // 람다식 이용&lt;br /&gt;
        // btn3.setOnAction(event-&amp;gt;handleBtn3Action(event));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void handleBtn1Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void handleBtn2Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼2 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void handleBtn3Action(ActionEvent event) {&lt;br /&gt;
        System.out.println(&amp;quot;버튼3 클릭&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root.xml&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; &lt;br /&gt;
    fx:controller=&amp;quot;ch17.p889.RootController&amp;quot;&lt;br /&gt;
    prefHeight=&amp;quot;50.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot;&lt;br /&gt;
    alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn1&amp;quot; text=&amp;quot;버튼1&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn2&amp;quot; text=&amp;quot;버튼2&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button fx:id=&amp;quot;btn3&amp;quot; text=&amp;quot;버튼3&amp;quot; onAction=&amp;quot;#handleBtn3Action&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== 이벤트 처리 메소드 매핑 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button fx:id=&amp;quot;btn&amp;quot; text=&amp;quot;버튼&amp;quot; onAction=&amp;quot;#handleBtnAction&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public void handleBtnAction(ActionEvent event) { ... }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 속성 감시와 바인딩 ==&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=406</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/1124</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=406"/>
		<updated>2022-07-22T02:49:57Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* JavaFX 이벤트 처리 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JavaFX 개요 ==&lt;br /&gt;
# AWT&lt;br /&gt;
#* Native UI 컴포넌트 사용&lt;br /&gt;
#* 운영체제 마다 UI 모양이 다름&lt;br /&gt;
# Swing&lt;br /&gt;
#* 운영체제가 제공하는 native UI 사용 안 함&lt;br /&gt;
#* 운영체제가 새롭게 제공하는 UI 지원의 어려움&lt;br /&gt;
# JavaFX&lt;br /&gt;
#* Abode의 flash, Microsoft의 silverlight의 대항마&lt;br /&gt;
#* JDK 7부터 지원. JDK 8 권장.&lt;br /&gt;
#* JDK 11부터는 별도로 설치해야 함.&lt;br /&gt;
#* 화면 레이아웃과 스타일, 애플리케이션 로직 분리&lt;br /&gt;
#* Java 코드와 분리해서 스타일 시트(CSS)로 외관 작성 → 개발자와 디자이너의 동시 개발 가능&lt;br /&gt;
#* Java 코드에서도 레이아웃과 애플리케이션 로직을 분리하고 싶다면 레이아웃은 FXML로 작성, 로직은 Java로 작성&lt;br /&gt;
#* JavaFX 애플리케이션 구성 요소&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;50&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[레이아웃]'''&amp;lt;br/&amp;gt;자바 코드 파일&amp;lt;/br&amp;gt;또는 FXML 파일&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[외관 및 스타일]'''&amp;lt;br/&amp;gt;CSS 파일&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[리소스]'''&amp;lt;br/&amp;gt;그림 파일&amp;lt;br/&amp;gt;동영상 파일&amp;lt;br/&amp;gt;... &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[비즈니스 로직]'''&amp;lt;br/&amp;gt;자바 코드 파일&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JavaFX 애플리케이션 개발 시작 ==&lt;br /&gt;
=== 메인 클래스 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX 라이프사이클(life cycle) ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
    public AppMain() {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: AppMain() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: init() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: start() 호출&amp;quot;);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public void stop() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: stop() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: main() 호출&amp;quot;);&lt;br /&gt;
        launch(args);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
main: main() 호출&lt;br /&gt;
JavaFX Application Thread: AppMain() 호출&lt;br /&gt;
JavaFX-Launcher: init() 호출&lt;br /&gt;
JavaFX Application Thread: start() 호출&lt;br /&gt;
JavaFX Application Thread: stop() 호출 ← 프로그램을 끝내야 실행된다.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 메일 클래스 실행 매개값 얻기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
C:&amp;gt; java AppMain --ip=192.168.0.5 --port=50001&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* main()에서 launch(args)를 넘겨 받음&lt;br /&gt;
* init() 메소드에서 아래와 같이 실행할 수 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parameters params = getParameters();&lt;br /&gt;
List&amp;lt;String&amp;gt; list = params.getRaw();&lt;br /&gt;
Map&amp;lt;String, String&amp;gt; map = params.getNamed();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 무대(Stage)와 장면(Scene) ===&lt;br /&gt;
* 윈도우 : Stage&lt;br /&gt;
* Stage에는 하나의 Scene을 가질 수 있음&lt;br /&gt;
* Scene은 직접 생성해야 함&lt;br /&gt;
&lt;br /&gt;
[[file:CP2022_ch17.2_AppMain.png|thumb|AppMain 실행화면]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.application.Platform;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.layout.VBox;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        VBox root = new VBox();&lt;br /&gt;
        root.setPrefWidth(350);&lt;br /&gt;
        root.setPrefHeight(150);&lt;br /&gt;
        root.setAlignment(Pos.CENTER);&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Label label = new Label();&lt;br /&gt;
        label.setText(&amp;quot;Hello, JavaFX&amp;quot;);&lt;br /&gt;
        label.setFont(new Font(50));&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
        button.setOnAction(event-&amp;gt;Platform.exit());&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().add(label);&lt;br /&gt;
        root.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(root); // VBox를 루트 컨테이너(root container)로 해서 Scene 생성&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain입니다&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene); // 윈도우에 장면 설정&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 레이아웃 ==&lt;br /&gt;
=== 프로그램적 레이아웃 ===&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | 프로그램적 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.collections.ObservableList;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.TextField;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(10));&lt;br /&gt;
        hbox.setSpacing(10);&lt;br /&gt;
&lt;br /&gt;
        TextField textField = new TextField();&lt;br /&gt;
        textField.setPrefWidth(200);&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ObservableList list = hbox.getChildren();&lt;br /&gt;
        list.add(textField);&lt;br /&gt;
        list.add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 레이아웃 ===&lt;br /&gt;
* FXML 파일 (root.fxml)&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | FXML 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;padding&amp;gt;&lt;br /&gt;
        &amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/padding&amp;gt;&lt;br /&gt;
    &amp;lt;spacing&amp;gt;10&amp;lt;/spacing&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;children&amp;gt;&lt;br /&gt;
        &amp;lt;TextField&amp;gt;&lt;br /&gt;
            &amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&lt;br /&gt;
        &amp;lt;/TextField&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
    &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* AppMain 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;)); // ← FXML 로드&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 레이아웃(layout) 여백: 패딩(padding)과 마진(margin) ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cll&amp;gt;&lt;br /&gt;
구분      | HBox의 패딩                                                        | Button의 마진&lt;br /&gt;
개념      | [[file:CP-17.3.3-padding.png]]                                     | [[file:CP-17.3.3-margin.png]]&lt;br /&gt;
자바 코드 | HBox hbox = new HBox();&amp;lt;br/&amp;gt;'''hbox.setPadding(new Insets(50))'''; | Button button = new Button();&amp;lt;br/&amp;gt;'''HBox.setMargin(button, new Insets(50));'''&lt;br /&gt;
FXML 태그 | &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt; | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;HBox.margin&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Hbox.margin&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Margin, Padding 설정 방법&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// top, right, bottom, left를 모두 동일한 값으로 설정할 때&lt;br /&gt;
// Insets(double topRightBottomLeft)&lt;br /&gt;
new Insets(50);&lt;br /&gt;
&lt;br /&gt;
// top, right, bottom, left를 다를 값으로 설정할 때&lt;br /&gt;
// Insets(double top, double right, double bottom, double left)&lt;br /&gt;
new Insets(10, 20, 30, 40);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 패딩과 마진 적용 예&lt;br /&gt;
[[file:CP-17.3.3-AppMain.png|thumb|패딩과 마진 적용 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        // 패딩 설정&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(50, 10, 10, 50));&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setPrefSize(100, 100);&lt;br /&gt;
        &lt;br /&gt;
        // 마진 설정&lt;br /&gt;
        // HBox hbox = new HBox();&lt;br /&gt;
        // Button button = new Button();&lt;br /&gt;
        // button.setPrefSize(100, 100);&lt;br /&gt;
        // HBox.setMargin(button, new Insets(10, 10, 50, 50));&lt;br /&gt;
&lt;br /&gt;
        hbox.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 작성 규칙 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
TextField textField = new TextField();&amp;lt;br/&amp;gt;textField.setPrefWidth(200);&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/TextField&amp;gt;&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}   |  &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
ObsetvableList list = hbox.getChildren();&amp;lt;br/&amp;gt;list.add(textField);&amp;lt;br/&amp;gt;list.add(button);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;children&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Button&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 패키지(package) 선언 ====&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                          |   FXML 태그&lt;br /&gt;
import javafx.scene.layout.HBox;   |   &amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
import javafx.scene.control.*;     |   &amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;?import?&amp;gt;가 들어가는 위치는 &amp;lt;?xml ...&amp;gt;와 루트 컨테이너 태그 사이이다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;루트 컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/루트 컨테이너&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* import를 제대로 하지 않으면 not a valid type 메시지와 함께 javafx.fxml.LoadException 발생&lt;br /&gt;
&lt;br /&gt;
==== 태그(tag) 선언 ====&lt;br /&gt;
* 시작 태그와 끝 태그가 매칭되어야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 속성(attribute) 선언 ====&lt;br /&gt;
* 속성은 &amp;quot;나 '로 감싸야 한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;태그이름 속성명=&amp;quot;값&amp;quot; 속성명='값'&amp;gt; ... &amp;lt;/태그이름&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 속성명은 Setter 메소드 명이 옴&lt;br /&gt;
* 모든 Setter가 사용될 수 있는 것은 아님. 기본 타입(boolean, byte, short, char, int, long, float, double)의 값을 세팅하거나, String을 세팅하는 Setter만 올 수 있음&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML (Setter 태그)                                    | FXML (Setter 속성)&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;   | &amp;lt;Button text=&amp;quot;확인&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 객체 선언 ====&lt;br /&gt;
===== 클래스 속성 =====&lt;br /&gt;
* 생성자에 매개 변수가 있고, 매개 변수에 @NamedArg(javafx.beans.NamedArg) 어노테이션이 적용되어 있으면 속성명이나 자식 태그로 작성할 수 있음&lt;br /&gt;
&amp;lt;table2 class=wikitable sep=bar align=ll&amp;gt;&lt;br /&gt;
&amp;lt;클래스 매개변수=&amp;quot;값&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}     | &amp;lt;클래스&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;매개변수&amp;gt;값&amp;lt;/매개변수&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/클래스&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
** HBox를 패딩할 때 setPadding(Insets value) 메소드를 사용하는데&lt;br /&gt;
** Insets는 기본 생성자가 없고,&lt;br /&gt;
** Insets(double topRightBottomLeft) 또는 Insets(double top, double right, double bottom, double left)만 있음&lt;br /&gt;
** 이 경우 아래와 같이 선언 가능함&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:value =====&lt;br /&gt;
* 클래스가 valueOf(String) 메소드를 제공하는 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:value=&amp;quot;값&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
String.valueOf(&amp;quot;Hello, World!&amp;quot;);&amp;lt;br/&amp;gt;Integer.valueOf(&amp;quot;1&amp;quot;);&amp;lt;br/&amp;gt;Double.valueOf(&amp;quot;1.0&amp;quot;);&amp;lt;br/&amp;gt;Boolean.valueOf(&amp;quot;false&amp;quot;);  |  &amp;lt;String fx:value=&amp;quot;Hello, World!&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Integer fx:value=&amp;quot;1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Double fx:value=&amp;quot;1.0&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Boolean fx:value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:constant =====&lt;br /&gt;
*클래스에 정의된 상수값을 얻고 싶을 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:constant=&amp;quot;상수&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setMaxWidth( Double.MAX_VALUE );&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;maxWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/maxWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:factory =====&lt;br /&gt;
* 어떤 클래스는 new 연산자로 객체를 생성할 수 없고,&lt;br /&gt;
* 정적 메소드(이를 factory 메소드라 부른다)로 객체를 얻어야 하는 경우가 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:factory=&amp;quot;정적메소드&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예: &amp;lt;code&amp;gt;ObservableList&amp;lt;/code&amp;gt;의 구현 객체는 &amp;lt;code&amp;gt;javafx.collections.FXCollections&amp;lt;/code&amp;gt;의 정적 메소드인 &amp;lt;code&amp;gt;observableArrayList(E... items)&amp;lt;/code&amp;gt; 메소드로 얻을 수 있다.&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
ComboBox combo = new ComboBox();&amp;lt;br/&amp;gt;combo.setItems(FXCollections.observableArrayList(&amp;quot;공개&amp;quot;, &amp;quot;비공개&amp;quot;));&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;ComboBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Items&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;FXCollections fx:factory=&amp;quot;observableArrayList&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;비공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;/FXCollections&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/items&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/ComboBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 로딩과 Scene 생성 ===&lt;br /&gt;
* FXML 파일을 작성한 후 이를 이용하여 객체를 만들어야 한다. 이를 '''FXML loading'''이라고 한다.&lt;br /&gt;
* javafx.fxml.FXMLLoader를 이용&lt;br /&gt;
** 두 개의 load() 메소드 : 정적 메소드, 인스턴스 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* getClass() - 현재 클래스 리턴&lt;br /&gt;
* getResource() - 클래스가 위치하는 곳에서 상대 경로로 리소스의 URL을 리턴&lt;br /&gt;
* load() - FXML 파일을 로딩&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
FXMLLoader loader = new FXMLLoader(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
Parent root = (Parent)loader.load();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* load() - Parent 타입을 리턴함. 이것은 FXML 파일에서의 루트 태그로 선언된 컨테이너임&lt;br /&gt;
* 만을 루트 태그가 &amp;lt;HBox&amp;gt; 라면 다음과 같이 작성해도 됨&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
HBox hbox = (HBox) FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX Scene Builder ===&lt;br /&gt;
[[file:CP-SceneBuilder-1.png | thumb | Scene Builder로 root.fxml 띄움]]&lt;br /&gt;
* Scene Builder 다운로드 - https://gluonhq.com/products/scene-builder/&lt;br /&gt;
* [https://marketplace.visualstudio.com/items?itemName=bilalekrem.scenebuilderextension SceneBuilder extension for Visual Studio Code]&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 눌러 &amp;quot;Configure Scene Builder path&amp;quot;를 실행한다.&lt;br /&gt;
*** 경로를 다음과 같이 지정한다 : C:\Users\profs\AppData\Local\SceneBuilder 폴더의 SceneBuilder.exe 지정&lt;br /&gt;
&lt;br /&gt;
* Scene Builder 띄우는 방법&lt;br /&gt;
** fxml 파일을 선택한다.&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 누른다.&lt;br /&gt;
&lt;br /&gt;
== JavaFX 컨테이너 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
컨테이너   | 설명&lt;br /&gt;
AnchorPane | 컨트롤을 좌표로 배치하는 레이아웃&lt;br /&gt;
BorderPane | 위, 아래, 오른쪽, 왼쪽, 중앙에 컨트롤을 배치하는 레이아웃&lt;br /&gt;
FlowPane   | 행으로 배치하되 공간이 부족하면 새로운 행에 배치하는 레이아웃&lt;br /&gt;
GridPane   | 그리드로 배치하되 셀의 크기가 고정적이지 않은 레이아웃&lt;br /&gt;
StackPane  | 컨트롤을 겹쳐서 배치하는 레이아웃&lt;br /&gt;
TilePane   | 그리드로 배치하되 고정된 셀의 크기를 갖는 레이아웃&lt;br /&gt;
HBox       | 수평으로 배치하는 레이아웃&lt;br /&gt;
VBox       | 수직으로 배치하는 레이아웃&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AnchorPane 컨테이너 ===&lt;br /&gt;
[[file:CP-17.4.1-1.png]]&lt;br /&gt;
&lt;br /&gt;
* AnchorPane에서 사용할 수 있는 주요 설정&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명            | 적용&lt;br /&gt;
PrefWidth    | 폭을 설정       | AnchorPane&lt;br /&gt;
PrefHeight   | 높이를 설정     | AnchorPane&lt;br /&gt;
layoutX      | 컨트롤의 X 좌표 | 컨트롤&lt;br /&gt;
layoutY      | 컨트롤의 Y 좌표 | 컨트롤&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함   | AnchorPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.1-2.png | thumb | AnchorPane (Scene Builder)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.PasswordField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;150.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;28.0&amp;quot; text=&amp;quot;아이디&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;66.0&amp;quot; text=&amp;quot;패스워드&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;24.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;PasswordField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;62.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;97.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;164.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBox와 VBox 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                         | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                    | HBox, VBox&lt;br /&gt;
prefHeight   | 높이를 설정                  | HBox, VBox &lt;br /&gt;
alignment    | 컨트롤의 정렬을 설정         | HBox, VBox &lt;br /&gt;
spacing      | 컨트롤의 간격을 설정         | HBox, VBox&lt;br /&gt;
fillWidth    | 컨트롤의 폭 확장 여부 설정   | VBox&lt;br /&gt;
fillHeight   | 컨트롤의 높이 확장 여부 설정 | HBox&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함                | HBox, VBox&lt;br /&gt;
&amp;lt;HBox.hgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; | HBox의 남은 폭을 채움   | 컨트롤&lt;br /&gt;
&amp;lt;VBox.vgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/VBox.vgrow&amp;gt; | VBox의 남을 높이를 채움 | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root2.fxml&lt;br /&gt;
** 이 패키지의 하위 폴더로 &amp;lt;code&amp;gt;images&amp;lt;/code&amp;gt;를 만들고 여기에 javafx.png 파일을 복사해 넣어둔다. [[file:javafx.png | thumb | javafx.png]]&lt;br /&gt;
[[file:CP-17.4.3-project.png | thumb | images 폴더]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import java.lang.Double?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.Priority?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitWidth=&amp;quot;200.0&amp;quot; preserveRatio=&amp;quot;true&amp;quot;&amp;gt; &amp;lt;!-- 그림의 비율에 맞게 높이를 설정 --&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&lt;br /&gt;
          &amp;lt;Image url=&amp;quot;@images/javafx.png&amp;quot; /&amp;gt; &amp;lt;!-- 현재 경로 기준으로 상대경로로 파일 지정 --&amp;gt;&lt;br /&gt;
        &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;HBox alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;이전&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;다음&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;HBox.hgrow&amp;gt;&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; &amp;lt;!-- 오른쪽 남은 공간을 버튼이 모두 채우도록 설정 --&amp;gt;&lt;br /&gt;
              &amp;lt;maxWidth&amp;gt;&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;/maxWidth&amp;gt; &amp;lt;!-- 버튼의 폭을 자동으로 확장하기 위해 설정--&amp;gt;&lt;br /&gt;
            &amp;lt;/Button&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
         &amp;lt;VBox.margin&amp;gt;&lt;br /&gt;
           &amp;lt;Insets top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/VBox.margin&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.4.3-p874.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root2.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BorderPane 컨테이너 ===&lt;br /&gt;
* top, bottom, left, right, center 셀에 컨트롤을 배치하는 컨테이너&lt;br /&gt;
* 다른 컨테이너를 배치할 수도 있음&lt;br /&gt;
* 각 셀에는 '''하나'''의 컨트롤 또는 컨테이너만 배치할 수 있음&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-1.png | 250px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                           | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                      | BorderPane&lt;br /&gt;
prefHeight   | 높이를 설정                    | BorderPane&lt;br /&gt;
&amp;lt;top&amp;gt;        | top에 배치될 컨트롤을 포함     | BorderPane&lt;br /&gt;
&amp;lt;bottom&amp;gt;     | bottom에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;right&amp;gt;      | right에 배치될 컨트롤을 포함   | BorderPane&lt;br /&gt;
&amp;lt;left&amp;gt;       | left에 배치될 컨트롤을 포함    | BorderPane&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;center&amp;gt;&amp;lt;/nowiki&amp;gt;     | center에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.ToolBar?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;top&amp;gt;&lt;br /&gt;
      &amp;lt;ToolBar prefHeight=&amp;quot;40.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot; BorderPane.alignment=&amp;quot;CENTER&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;items&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/items&amp;gt;&lt;br /&gt;
      &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
   &amp;lt;/top&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea /&amp;gt; &amp;lt;!-- left와 right까지 확장--&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;BorderPane&amp;gt;&lt;br /&gt;
         &amp;lt;center&amp;gt;&lt;br /&gt;
           &amp;lt;TextField /&amp;gt; &amp;lt;!-- top, bottom, left까지 확장--&amp;gt;&lt;br /&gt;
         &amp;lt;/center&amp;gt;&lt;br /&gt;
         &amp;lt;right&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/right&amp;gt;&lt;br /&gt;
      &amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FlowPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                      | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                 | FlowPane&lt;br /&gt;
prefHeight   | 높이를 설정               | FlowPane&lt;br /&gt;
hgap         | 컨트롤의 수평 간격을 설정 | FlowPane&lt;br /&gt;
vgap         | 컨트롤의 수직 간격을 설정 | FlowPane&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함             |  FlowPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.5-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.FlowPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;FlowPane prefHeight=&amp;quot;70.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/FlowPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TilePane 컨테이너 ===&lt;br /&gt;
* 그리드로 컨트롤을 배치하되 고정된 셀(타일) 크기를 갖는 컨테이너&lt;br /&gt;
* 오른쪽에 배치할 공간이 부족하면 새로운 행에 컨트롤을 배치함&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-TilePane.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성   | 설명               | 적용&lt;br /&gt;
prefWidth      | 폭을 설정          | TilePane&lt;br /&gt;
prefHeight     | 높이를 설정        | TilePane&lt;br /&gt;
prefTileWidth  | 타일의 폭을 설정   | TilePane&lt;br /&gt;
prefTileHeight | 타일의 높이를 설정 | TilePane&lt;br /&gt;
&amp;lt;children&amp;gt;     | 컨트롤을 포함      | TilePane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:fruit1.jpg | fruit1.jpg&lt;br /&gt;
file:fruit2.jpg | fruit2.jpg&lt;br /&gt;
file:fruit3.jpg | fruit3.jpg&lt;br /&gt;
file:fruit4.jpg | fruit4.jpg&lt;br /&gt;
file:fruit5.jpg | fruit5.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.TilePane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TilePane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;100.0&amp;quot; prefWidth=&amp;quot;100.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit1.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit2.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit3.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit4.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit5.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/TilePane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GridPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성         | 설명                                 | 적용&lt;br /&gt;
prefWidth            | 폭을 설정                            | GridPane&lt;br /&gt;
prefHeight           | 놎이를 설정                          | GridPane&lt;br /&gt;
hgap                 | 수평 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
vgap                 | 수직 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
&amp;lt;children&amp;gt;           | 컨트롤을 포함                        | GridPane&lt;br /&gt;
GridPane.rowIndex    | 컨트롤이 위치하는 행 인덱스를 설정   | 컨트롤&lt;br /&gt;
GridPane.columnIndex | 컨트롤이 위치하는 컬럼 인덱스를 설정 | 컨트롤&lt;br /&gt;
GridPane.rowSpan     | 행 병합 수를 설정                    | 컨트롤&lt;br /&gt;
GridPane.columnSpan  | 컬럼 병합 수를 설정                  | 컨트롤&lt;br /&gt;
GridPane.hgrow       | 수평 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.vgrow       | 수직 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.halignment  | 컨트롤의 수평 정렬을 설정            | 컨트롤&lt;br /&gt;
GridPane.valignment  | 컨트롤의 수직 정렬을 설정            | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.7-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.ColumnConstraints?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.GridPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.RowConstraints?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GridPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; hgap=&amp;quot;10.0&amp;quot; vgap=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets topRightBottomLeft=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;아이디&amp;quot; GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;패스워드&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.columnIndex=&amp;quot;1&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
      &amp;lt;HBox GridPane.rowIndex=&amp;quot;2&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot;&lt;br /&gt;
                 GridPane.columnSpan=&amp;quot;2&amp;quot; GridPane.hgrow=&amp;quot;ALWAYS&amp;quot;&lt;br /&gt;
                 alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot; &amp;gt;  &amp;lt;!-- 컬럼 2개 병합 --&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/GridPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== StackPane 컨테이너 ===&lt;br /&gt;
* 컨트롤을 겹쳐 배치하는 컨테이너&lt;br /&gt;
* 카드 레이아웃(Card Layout)이라고도 함&lt;br /&gt;
* 만약 위에 있는 컨트롤이 투명하다면 밑에 있는 컨트롤이 겹쳐 보임&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:duke.jpg | duke.jpg&lt;br /&gt;
file:snow.jpg | snow.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.8-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.StackPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;StackPane  xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;300.0&amp;quot; prefWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitHeight=&amp;quot;300.0&amp;quot; fitWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/snow.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView preserveRatio=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/duke.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/StackPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 이벤트 처리 ==&lt;br /&gt;
&lt;br /&gt;
=== 이벤트 핸들러(EventHandler) ===&lt;br /&gt;
* JavaFX는 이벤트 발생 콘트롤과 이벤트 핸들러(EventHandler)를 분리하는 위임형(Delegation&amp;lt;ref&amp;gt;Design Pattern 중 Delegation Pattern&amp;lt;/ref&amp;gt;) 방식을 사용함&lt;br /&gt;
* 이를 위해 먼저 컨트롤에 EventHandler를 등록해야 함 (setOnXXX() 메소드. 예: setOnAction())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cccc&amp;gt;&lt;br /&gt;
컨트롤(control) | 사건        | 이벤트(event) 발생 | 이벤트 처리 담당 객체 | 이벤트 처리 메소드 실행 | 이벤트 처리 효과&lt;br /&gt;
Button          | 버튼을 누름 | ActionEvent        | EventHandler          | public void handle(...) {&amp;lt;br/&amp;gt;{{sp2}}이벤트 처리&amp;lt;/br/&amp;gt;} | 1. 윈도우 닫기&amp;lt;br/&amp;gt;2. 컨트롤 내용 변경&amp;lt;br/&amp;gt;3. 다이얼로그 띄우기&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Button 클릭 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Button button = new Button();&lt;br /&gt;
button.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(ActionEvent event) { ... }&lt;br /&gt;
}):&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* TableView에서 행을 마우스로 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TableView tableView = new TableView();&lt;br /&gt;
tableView.setOnMouseClicked(new EventHandler&amp;lt;MouseEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(MouseEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 윈도우 우측 상단(x) 버튼 클릭할 때 처리하는 이벤트 등록&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
stage.setOnCloseRequest(new EventHandler&amp;lt;WindowEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(WindowEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* EventHandler는 하나의 메소드를 가진 함수적 인터페이스이므로 람다식을 이용하여 이벤트 등록 가능&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
button.setOnAction( event-&amp;gt;{ ... } );&lt;br /&gt;
tableView.setOnMouseClicked( event-&amp;gt;{ ... } );&lt;br /&gt;
stage.setOnCloseRequest( event-&amp;gt;{ ... } );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.1-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox root = new HBox();&lt;br /&gt;
        root.setPrefSize(200, 50);&lt;br /&gt;
        root.setAlignment(Pos.CENTER); // 수평 중앙 정렬&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Button btn1 = new Button(&amp;quot;버튼1&amp;quot;);&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        Button btn2 = new Button(&amp;quot;버튼2&amp;quot;);&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;System.out.println(&amp;quot;버튼2 클릭&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().addAll(btn1, btn2); // HBox에 btn1과 btn2를 추가&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.setOnCloseRequest(event-&amp;gt;System.out.println(&amp;quot;종료 클릭&amp;quot;));&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FXML 컨트롤러(Controller) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 속성 감시와 바인딩 ==&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=File:CP-17.5.1-%EC%8B%A4%ED%96%89%EA%B2%B0%EA%B3%BC.png&amp;diff=405</id>
		<title>File:CP-17.5.1-실행결과.png</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=File:CP-17.5.1-%EC%8B%A4%ED%96%89%EA%B2%B0%EA%B3%BC.png&amp;diff=405"/>
		<updated>2022-07-21T12:27:46Z</updated>

		<summary type="html">&lt;p&gt;Swpark: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=404</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/1124</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/1124&amp;diff=404"/>
		<updated>2022-07-21T12:27:35Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* JavaFX 이벤트 처리 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== JavaFX 개요 ==&lt;br /&gt;
# AWT&lt;br /&gt;
#* Native UI 컴포넌트 사용&lt;br /&gt;
#* 운영체제 마다 UI 모양이 다름&lt;br /&gt;
# Swing&lt;br /&gt;
#* 운영체제가 제공하는 native UI 사용 안 함&lt;br /&gt;
#* 운영체제가 새롭게 제공하는 UI 지원의 어려움&lt;br /&gt;
# JavaFX&lt;br /&gt;
#* Abode의 flash, Microsoft의 silverlight의 대항마&lt;br /&gt;
#* JDK 7부터 지원. JDK 8 권장.&lt;br /&gt;
#* JDK 11부터는 별도로 설치해야 함.&lt;br /&gt;
#* 화면 레이아웃과 스타일, 애플리케이션 로직 분리&lt;br /&gt;
#* Java 코드와 분리해서 스타일 시트(CSS)로 외관 작성 → 개발자와 디자이너의 동시 개발 가능&lt;br /&gt;
#* Java 코드에서도 레이아웃과 애플리케이션 로직을 분리하고 싶다면 레이아웃은 FXML로 작성, 로직은 Java로 작성&lt;br /&gt;
#* JavaFX 애플리케이션 구성 요소&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;50&amp;quot;&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[레이아웃]'''&amp;lt;br/&amp;gt;자바 코드 파일&amp;lt;/br&amp;gt;또는 FXML 파일&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[외관 및 스타일]'''&amp;lt;br/&amp;gt;CSS 파일&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | '''[리소스]'''&amp;lt;br/&amp;gt;그림 파일&amp;lt;br/&amp;gt;동영상 파일&amp;lt;br/&amp;gt;... &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | '''[비즈니스 로직]'''&amp;lt;br/&amp;gt;자바 코드 파일&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== JavaFX 애플리케이션 개발 시작 ==&lt;br /&gt;
=== 메인 클래스 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX 라이프사이클(life cycle) ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
    public AppMain() {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: AppMain() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: init() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: start() 호출&amp;quot;);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public void stop() throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: stop() 호출&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
        System.out.println(Thread.currentThread().getName() + &amp;quot;: main() 호출&amp;quot;);&lt;br /&gt;
        launch(args);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
main: main() 호출&lt;br /&gt;
JavaFX Application Thread: AppMain() 호출&lt;br /&gt;
JavaFX-Launcher: init() 호출&lt;br /&gt;
JavaFX Application Thread: start() 호출&lt;br /&gt;
JavaFX Application Thread: stop() 호출 ← 프로그램을 끝내야 실행된다.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 메일 클래스 실행 매개값 얻기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
C:&amp;gt; java AppMain --ip=192.168.0.5 --port=50001&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* main()에서 launch(args)를 넘겨 받음&lt;br /&gt;
* init() 메소드에서 아래와 같이 실행할 수 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parameters params = getParameters();&lt;br /&gt;
List&amp;lt;String&amp;gt; list = params.getRaw();&lt;br /&gt;
Map&amp;lt;String, String&amp;gt; map = params.getNamed();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 무대(Stage)와 장면(Scene) ===&lt;br /&gt;
* 윈도우 : Stage&lt;br /&gt;
* Stage에는 하나의 Scene을 가질 수 있음&lt;br /&gt;
* Scene은 직접 생성해야 함&lt;br /&gt;
&lt;br /&gt;
[[file:CP2022_ch17.2_AppMain.png|thumb|AppMain 실행화면]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.application.Platform;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.Label;&lt;br /&gt;
import javafx.scene.layout.VBox;&lt;br /&gt;
import javafx.scene.text.Font;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        VBox root = new VBox();&lt;br /&gt;
        root.setPrefWidth(350);&lt;br /&gt;
        root.setPrefHeight(150);&lt;br /&gt;
        root.setAlignment(Pos.CENTER);&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Label label = new Label();&lt;br /&gt;
        label.setText(&amp;quot;Hello, JavaFX&amp;quot;);&lt;br /&gt;
        label.setFont(new Font(50));&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
        button.setOnAction(event-&amp;gt;Platform.exit());&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().add(label);&lt;br /&gt;
        root.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(root); // VBox를 루트 컨테이너(root container)로 해서 Scene 생성&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain입니다&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene); // 윈도우에 장면 설정&lt;br /&gt;
        primaryStage.show();        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 레이아웃 ==&lt;br /&gt;
=== 프로그램적 레이아웃 ===&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | 프로그램적 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.collections.ObservableList;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.control.TextField;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(10));&lt;br /&gt;
        hbox.setSpacing(10);&lt;br /&gt;
&lt;br /&gt;
        TextField textField = new TextField();&lt;br /&gt;
        textField.setPrefWidth(200);&lt;br /&gt;
&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setText(&amp;quot;확인&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        ObservableList list = hbox.getChildren();&lt;br /&gt;
        list.add(textField);&lt;br /&gt;
        list.add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 레이아웃 ===&lt;br /&gt;
* FXML 파일 (root.fxml)&lt;br /&gt;
[[file:CP_2022_ch17.3.1.AppMain.png | thumb | FXML 레이아웃]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;padding&amp;gt;&lt;br /&gt;
        &amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/padding&amp;gt;&lt;br /&gt;
    &amp;lt;spacing&amp;gt;10&amp;lt;/spacing&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;children&amp;gt;&lt;br /&gt;
        &amp;lt;TextField&amp;gt;&lt;br /&gt;
            &amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&lt;br /&gt;
        &amp;lt;/TextField&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Button&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;/Button&amp;gt;&lt;br /&gt;
    &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* AppMain 클래스&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;)); // ← FXML 로드&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 레이아웃(layout) 여백: 패딩(padding)과 마진(margin) ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=cll&amp;gt;&lt;br /&gt;
구분      | HBox의 패딩                                                        | Button의 마진&lt;br /&gt;
개념      | [[file:CP-17.3.3-padding.png]]                                     | [[file:CP-17.3.3-margin.png]]&lt;br /&gt;
자바 코드 | HBox hbox = new HBox();&amp;lt;br/&amp;gt;'''hbox.setPadding(new Insets(50))'''; | Button button = new Button();&amp;lt;br/&amp;gt;'''HBox.setMargin(button, new Insets(50));'''&lt;br /&gt;
FXML 태그 | &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt; | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;HBox.margin&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets topRightBottomLeft=&amp;quot;50&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Hbox.margin&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Margin, Padding 설정 방법&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// top, right, bottom, left를 모두 동일한 값으로 설정할 때&lt;br /&gt;
// Insets(double topRightBottomLeft)&lt;br /&gt;
new Insets(50);&lt;br /&gt;
&lt;br /&gt;
// top, right, bottom, left를 다를 값으로 설정할 때&lt;br /&gt;
// Insets(double top, double right, double bottom, double left)&lt;br /&gt;
new Insets(10, 20, 30, 40);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 패딩과 마진 적용 예&lt;br /&gt;
[[file:CP-17.3.3-AppMain.png|thumb|패딩과 마진 적용 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.geometry.Insets;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        // 패딩 설정&lt;br /&gt;
        HBox hbox = new HBox();&lt;br /&gt;
        hbox.setPadding(new Insets(50, 10, 10, 50));&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        button.setPrefSize(100, 100);&lt;br /&gt;
        &lt;br /&gt;
        // 마진 설정&lt;br /&gt;
        // HBox hbox = new HBox();&lt;br /&gt;
        // Button button = new Button();&lt;br /&gt;
        // button.setPrefSize(100, 100);&lt;br /&gt;
        // HBox.setMargin(button, new Insets(10, 10, 50, 50));&lt;br /&gt;
&lt;br /&gt;
        hbox.getChildren().add(button);&lt;br /&gt;
&lt;br /&gt;
        Scene scene = new Scene(hbox);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 작성 규칙 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
TextField textField = new TextField();&amp;lt;br/&amp;gt;textField.setPrefWidth(200);&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/TextField&amp;gt;&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}   |  &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
ObsetvableList list = hbox.getChildren();&amp;lt;br/&amp;gt;list.add(textField);&amp;lt;br/&amp;gt;list.add(button);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;children&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;prefWidth&amp;gt;200&amp;lt;/prefWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/TextField&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/Button&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 패키지(package) 선언 ====&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                          |   FXML 태그&lt;br /&gt;
import javafx.scene.layout.HBox;   |   &amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
import javafx.scene.control.*;     |   &amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;?import?&amp;gt;가 들어가는 위치는 &amp;lt;?xml ...&amp;gt;와 루트 컨테이너 태그 사이이다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.*?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;루트 컨테이너 xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/루트 컨테이너&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* import를 제대로 하지 않으면 not a valid type 메시지와 함께 javafx.fxml.LoadException 발생&lt;br /&gt;
&lt;br /&gt;
==== 태그(tag) 선언 ====&lt;br /&gt;
* 시작 태그와 끝 태그가 매칭되어야 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 속성(attribute) 선언 ====&lt;br /&gt;
* 속성은 &amp;quot;나 '로 감싸야 한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;태그이름 속성명=&amp;quot;값&amp;quot; 속성명='값'&amp;gt; ... &amp;lt;/태그이름&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 속성명은 Setter 메소드 명이 옴&lt;br /&gt;
* 모든 Setter가 사용될 수 있는 것은 아님. 기본 타입(boolean, byte, short, char, int, long, float, double)의 값을 세팅하거나, String을 세팅하는 Setter만 올 수 있음&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
자바 코드                                                              |   FXML (Setter 태그)                                    | FXML (Setter 속성)&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setText(&amp;quot;확인&amp;quot;);&amp;lt;br/&amp;gt;{{sp2}}  |   &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;text&amp;gt;확인&amp;lt;/text&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/Button&amp;gt;   | &amp;lt;Button text=&amp;quot;확인&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 객체 선언 ====&lt;br /&gt;
===== 클래스 속성 =====&lt;br /&gt;
* 생성자에 매개 변수가 있고, 매개 변수에 @NamedArg(javafx.beans.NamedArg) 어노테이션이 적용되어 있으면 속성명이나 자식 태그로 작성할 수 있음&lt;br /&gt;
&amp;lt;table2 class=wikitable sep=bar align=ll&amp;gt;&lt;br /&gt;
&amp;lt;클래스 매개변수=&amp;quot;값&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}     | &amp;lt;클래스&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;매개변수&amp;gt;값&amp;lt;/매개변수&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/클래스&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예&lt;br /&gt;
** HBox를 패딩할 때 setPadding(Insets value) 메소드를 사용하는데&lt;br /&gt;
** Insets는 기본 생성자가 없고,&lt;br /&gt;
** Insets(double topRightBottomLeft) 또는 Insets(double top, double right, double bottom, double left)만 있음&lt;br /&gt;
** 이 경우 아래와 같이 선언 가능함&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
프로그램적 레이아웃 자바 코드 | FXML 레이아웃 태그&lt;br /&gt;
HBox hbox = new HBox();&amp;lt;br/&amp;gt;hbox.setPadding(new Inset(10, 10, 10, 10));&amp;lt;br/&amp;gt;hbox.setSpacing(10);&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}    |    &amp;lt;HBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;padding&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Insets top=&amp;quot;10&amp;quot; right=&amp;quot;10&amp;quot; bottom=&amp;quot;10&amp;quot; left=&amp;quot;10&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/padding&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:value =====&lt;br /&gt;
* 클래스가 valueOf(String) 메소드를 제공하는 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:value=&amp;quot;값&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
String.valueOf(&amp;quot;Hello, World!&amp;quot;);&amp;lt;br/&amp;gt;Integer.valueOf(&amp;quot;1&amp;quot;);&amp;lt;br/&amp;gt;Double.valueOf(&amp;quot;1.0&amp;quot;);&amp;lt;br/&amp;gt;Boolean.valueOf(&amp;quot;false&amp;quot;);  |  &amp;lt;String fx:value=&amp;quot;Hello, World!&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Integer fx:value=&amp;quot;1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Double fx:value=&amp;quot;1.0&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Boolean fx:value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:constant =====&lt;br /&gt;
*클래스에 정의된 상수값을 얻고 싶을 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:constant=&amp;quot;상수&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
Button button = new Button();&amp;lt;br/&amp;gt;button.setMaxWidth( Double.MAX_VALUE );&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;Button&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;maxWidth&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/maxWidth&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;Button&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 클래스 fx:factory =====&lt;br /&gt;
* 어떤 클래스는 new 연산자로 객체를 생성할 수 없고,&lt;br /&gt;
* 정적 메소드(이를 factory 메소드라 부른다)로 객체를 얻어야 하는 경우가 있음&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;클래스 fx:factory=&amp;quot;정적메소드&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예: &amp;lt;code&amp;gt;ObservableList&amp;lt;/code&amp;gt;의 구현 객체는 &amp;lt;code&amp;gt;javafx.collections.FXCollections&amp;lt;/code&amp;gt;의 정적 메소드인 &amp;lt;code&amp;gt;observableArrayList(E... items)&amp;lt;/code&amp;gt; 메소드로 얻을 수 있다.&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
기본 코드  | FXML&lt;br /&gt;
ComboBox combo = new ComboBox();&amp;lt;br/&amp;gt;combo.setItems(FXCollections.observableArrayList(&amp;quot;공개&amp;quot;, &amp;quot;비공개&amp;quot;));&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}  | &amp;lt;ComboBox&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Items&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;FXCollections fx:factory=&amp;quot;observableArrayList&amp;quot;&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}{{sp2}}&amp;lt;String fx:value=&amp;quot;비공개&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}{{sp2}}&amp;lt;/FXCollections&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;/items&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/ComboBox&amp;gt;&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FXML 로딩과 Scene 생성 ===&lt;br /&gt;
* FXML 파일을 작성한 후 이를 이용하여 객체를 만들어야 한다. 이를 '''FXML loading'''이라고 한다.&lt;br /&gt;
* javafx.fxml.FXMLLoader를 이용&lt;br /&gt;
** 두 개의 load() 메소드 : 정적 메소드, 인스턴스 메소드&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* getClass() - 현재 클래스 리턴&lt;br /&gt;
* getResource() - 클래스가 위치하는 곳에서 상대 경로로 리소스의 URL을 리턴&lt;br /&gt;
* load() - FXML 파일을 로딩&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
FXMLLoader loader = new FXMLLoader(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
Parent root = (Parent)loader.load();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* load() - Parent 타입을 리턴함. 이것은 FXML 파일에서의 루트 태그로 선언된 컨테이너임&lt;br /&gt;
* 만을 루트 태그가 &amp;lt;HBox&amp;gt; 라면 다음과 같이 작성해도 됨&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
HBox hbox = (HBox) FXMLLoader.load(getClass().getResource(&amp;quot;xxx.fxml&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaFX Scene Builder ===&lt;br /&gt;
[[file:CP-SceneBuilder-1.png | thumb | Scene Builder로 root.fxml 띄움]]&lt;br /&gt;
* Scene Builder 다운로드 - https://gluonhq.com/products/scene-builder/&lt;br /&gt;
* [https://marketplace.visualstudio.com/items?itemName=bilalekrem.scenebuilderextension SceneBuilder extension for Visual Studio Code]&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 눌러 &amp;quot;Configure Scene Builder path&amp;quot;를 실행한다.&lt;br /&gt;
*** 경로를 다음과 같이 지정한다 : C:\Users\profs\AppData\Local\SceneBuilder 폴더의 SceneBuilder.exe 지정&lt;br /&gt;
&lt;br /&gt;
* Scene Builder 띄우는 방법&lt;br /&gt;
** fxml 파일을 선택한다.&lt;br /&gt;
** vscode에서 Ctrl-Shift-P를 누른다.&lt;br /&gt;
&lt;br /&gt;
== JavaFX 컨테이너 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
컨테이너   | 설명&lt;br /&gt;
AnchorPane | 컨트롤을 좌표로 배치하는 레이아웃&lt;br /&gt;
BorderPane | 위, 아래, 오른쪽, 왼쪽, 중앙에 컨트롤을 배치하는 레이아웃&lt;br /&gt;
FlowPane   | 행으로 배치하되 공간이 부족하면 새로운 행에 배치하는 레이아웃&lt;br /&gt;
GridPane   | 그리드로 배치하되 셀의 크기가 고정적이지 않은 레이아웃&lt;br /&gt;
StackPane  | 컨트롤을 겹쳐서 배치하는 레이아웃&lt;br /&gt;
TilePane   | 그리드로 배치하되 고정된 셀의 크기를 갖는 레이아웃&lt;br /&gt;
HBox       | 수평으로 배치하는 레이아웃&lt;br /&gt;
VBox       | 수직으로 배치하는 레이아웃&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AnchorPane 컨테이너 ===&lt;br /&gt;
[[file:CP-17.4.1-1.png]]&lt;br /&gt;
&lt;br /&gt;
* AnchorPane에서 사용할 수 있는 주요 설정&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명            | 적용&lt;br /&gt;
PrefWidth    | 폭을 설정       | AnchorPane&lt;br /&gt;
PrefHeight   | 높이를 설정     | AnchorPane&lt;br /&gt;
layoutX      | 컨트롤의 X 좌표 | 컨트롤&lt;br /&gt;
layoutY      | 컨트롤의 Y 좌표 | 컨트롤&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함   | AnchorPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.1-2.png | thumb | AnchorPane (Scene Builder)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.PasswordField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.AnchorPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;AnchorPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;150.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;28.0&amp;quot; text=&amp;quot;아이디&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Label layoutX=&amp;quot;42.0&amp;quot; layoutY=&amp;quot;66.0&amp;quot; text=&amp;quot;패스워드&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;24.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;PasswordField layoutX=&amp;quot;120.0&amp;quot; layoutY=&amp;quot;62.0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;97.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button layoutX=&amp;quot;164.0&amp;quot; layoutY=&amp;quot;106.0&amp;quot; text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/AnchorPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HBox와 VBox 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                         | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                    | HBox, VBox&lt;br /&gt;
prefHeight   | 높이를 설정                  | HBox, VBox &lt;br /&gt;
alignment    | 컨트롤의 정렬을 설정         | HBox, VBox &lt;br /&gt;
spacing      | 컨트롤의 간격을 설정         | HBox, VBox&lt;br /&gt;
fillWidth    | 컨트롤의 폭 확장 여부 설정   | VBox&lt;br /&gt;
fillHeight   | 컨트롤의 높이 확장 여부 설정 | HBox&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함                | HBox, VBox&lt;br /&gt;
&amp;lt;HBox.hgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; | HBox의 남은 폭을 채움   | 컨트롤&lt;br /&gt;
&amp;lt;VBox.vgrow&amp;gt;&amp;lt;br/&amp;gt;{{sp2}}&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/VBox.vgrow&amp;gt; | VBox의 남을 높이를 채움 | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* root2.fxml&lt;br /&gt;
** 이 패키지의 하위 폴더로 &amp;lt;code&amp;gt;images&amp;lt;/code&amp;gt;를 만들고 여기에 javafx.png 파일을 복사해 넣어둔다. [[file:javafx.png | thumb | javafx.png]]&lt;br /&gt;
[[file:CP-17.4.3-project.png | thumb | images 폴더]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import java.lang.Double?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.VBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.Priority?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VBox xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitWidth=&amp;quot;200.0&amp;quot; preserveRatio=&amp;quot;true&amp;quot;&amp;gt; &amp;lt;!-- 그림의 비율에 맞게 높이를 설정 --&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&lt;br /&gt;
          &amp;lt;Image url=&amp;quot;@images/javafx.png&amp;quot; /&amp;gt; &amp;lt;!-- 현재 경로 기준으로 상대경로로 파일 지정 --&amp;gt;&lt;br /&gt;
        &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;HBox alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;이전&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;다음&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;HBox.hgrow&amp;gt;&amp;lt;Priority fx:constant=&amp;quot;ALWAYS&amp;quot;/&amp;gt;&amp;lt;/HBox.hgrow&amp;gt; &amp;lt;!-- 오른쪽 남은 공간을 버튼이 모두 채우도록 설정 --&amp;gt;&lt;br /&gt;
              &amp;lt;maxWidth&amp;gt;&amp;lt;Double fx:constant=&amp;quot;MAX_VALUE&amp;quot;/&amp;gt;&amp;lt;/maxWidth&amp;gt; &amp;lt;!-- 버튼의 폭을 자동으로 확장하기 위해 설정--&amp;gt;&lt;br /&gt;
            &amp;lt;/Button&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
         &amp;lt;VBox.margin&amp;gt;&lt;br /&gt;
           &amp;lt;Insets top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/VBox.margin&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/VBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제&lt;br /&gt;
[[file:CP-17.4.3-p874.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.fxml.FXMLLoader;&lt;br /&gt;
import javafx.scene.Parent;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        Parent root = FXMLLoader.load(getClass().getResource(&amp;quot;root2.fxml&amp;quot;));&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BorderPane 컨테이너 ===&lt;br /&gt;
* top, bottom, left, right, center 셀에 컨트롤을 배치하는 컨테이너&lt;br /&gt;
* 다른 컨테이너를 배치할 수도 있음&lt;br /&gt;
* 각 셀에는 '''하나'''의 컨트롤 또는 컨테이너만 배치할 수 있음&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-1.png | 250px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                           | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                      | BorderPane&lt;br /&gt;
prefHeight   | 높이를 설정                    | BorderPane&lt;br /&gt;
&amp;lt;top&amp;gt;        | top에 배치될 컨트롤을 포함     | BorderPane&lt;br /&gt;
&amp;lt;bottom&amp;gt;     | bottom에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;right&amp;gt;      | right에 배치될 컨트롤을 포함   | BorderPane&lt;br /&gt;
&amp;lt;left&amp;gt;       | left에 배치될 컨트롤을 포함    | BorderPane&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;center&amp;gt;&amp;lt;/nowiki&amp;gt;     | center에 배치될 컨트롤을 포함  | BorderPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.4-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.ToolBar?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextArea?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.BorderPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BorderPane prefHeight=&amp;quot;200.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;top&amp;gt;&lt;br /&gt;
      &amp;lt;ToolBar prefHeight=&amp;quot;40.0&amp;quot; prefWidth=&amp;quot;200.0&amp;quot; BorderPane.alignment=&amp;quot;CENTER&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;items&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/items&amp;gt;&lt;br /&gt;
      &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
   &amp;lt;/top&amp;gt;&lt;br /&gt;
   &amp;lt;center&amp;gt;&lt;br /&gt;
      &amp;lt;TextArea /&amp;gt; &amp;lt;!-- left와 right까지 확장--&amp;gt;&lt;br /&gt;
   &amp;lt;/center&amp;gt;&lt;br /&gt;
   &amp;lt;bottom&amp;gt;&lt;br /&gt;
      &amp;lt;BorderPane&amp;gt;&lt;br /&gt;
         &amp;lt;center&amp;gt;&lt;br /&gt;
           &amp;lt;TextField /&amp;gt; &amp;lt;!-- top, bottom, left까지 확장--&amp;gt;&lt;br /&gt;
         &amp;lt;/center&amp;gt;&lt;br /&gt;
         &amp;lt;right&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/right&amp;gt;&lt;br /&gt;
      &amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
   &amp;lt;/bottom&amp;gt;&lt;br /&gt;
&amp;lt;/BorderPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FlowPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성 | 설명                      | 적용&lt;br /&gt;
prefWidth    | 폭을 설정                 | FlowPane&lt;br /&gt;
prefHeight   | 높이를 설정               | FlowPane&lt;br /&gt;
hgap         | 컨트롤의 수평 간격을 설정 | FlowPane&lt;br /&gt;
vgap         | 컨트롤의 수직 간격을 설정 | FlowPane&lt;br /&gt;
&amp;lt;children&amp;gt;   | 컨트롤을 포함             |  FlowPane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.5-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.FlowPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;FlowPane prefHeight=&amp;quot;70.0&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets bottom=&amp;quot;10.0&amp;quot; left=&amp;quot;10.0&amp;quot; right=&amp;quot;10.0&amp;quot; top=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;Button text=&amp;quot;Button&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/FlowPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TilePane 컨테이너 ===&lt;br /&gt;
* 그리드로 컨트롤을 배치하되 고정된 셀(타일) 크기를 갖는 컨테이너&lt;br /&gt;
* 오른쪽에 배치할 공간이 부족하면 새로운 행에 컨트롤을 배치함&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-TilePane.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성   | 설명               | 적용&lt;br /&gt;
prefWidth      | 폭을 설정          | TilePane&lt;br /&gt;
prefHeight     | 높이를 설정        | TilePane&lt;br /&gt;
prefTileWidth  | 타일의 폭을 설정   | TilePane&lt;br /&gt;
prefTileHeight | 타일의 높이를 설정 | TilePane&lt;br /&gt;
&amp;lt;children&amp;gt;     | 컨트롤을 포함      | TilePane&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:fruit1.jpg | fruit1.jpg&lt;br /&gt;
file:fruit2.jpg | fruit2.jpg&lt;br /&gt;
file:fruit3.jpg | fruit3.jpg&lt;br /&gt;
file:fruit4.jpg | fruit4.jpg&lt;br /&gt;
file:fruit5.jpg | fruit5.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.6-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.TilePane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TilePane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;100.0&amp;quot; prefWidth=&amp;quot;100.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit1.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit2.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit3.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit4.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView&amp;gt;&lt;br /&gt;
        &amp;lt;image&amp;gt;&amp;lt;Image url=&amp;quot;@images/fruit5.jpg&amp;quot; /&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/TilePane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GridPane 컨테이너 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
태그 및 속성         | 설명                                 | 적용&lt;br /&gt;
prefWidth            | 폭을 설정                            | GridPane&lt;br /&gt;
prefHeight           | 놎이를 설정                          | GridPane&lt;br /&gt;
hgap                 | 수평 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
vgap                 | 수직 컨트롤 간격을 설정              | GridPane&lt;br /&gt;
&amp;lt;children&amp;gt;           | 컨트롤을 포함                        | GridPane&lt;br /&gt;
GridPane.rowIndex    | 컨트롤이 위치하는 행 인덱스를 설정   | 컨트롤&lt;br /&gt;
GridPane.columnIndex | 컨트롤이 위치하는 컬럼 인덱스를 설정 | 컨트롤&lt;br /&gt;
GridPane.rowSpan     | 행 병합 수를 설정                    | 컨트롤&lt;br /&gt;
GridPane.columnSpan  | 컬럼 병합 수를 설정                  | 컨트롤&lt;br /&gt;
GridPane.hgrow       | 수평 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.vgrow       | 수직 빈 공간을 채우기로 설정         | 컨트롤&lt;br /&gt;
GridPane.halignment  | 컨트롤의 수평 정렬을 설정            | 컨트롤&lt;br /&gt;
GridPane.valignment  | 컨트롤의 수직 정렬을 설정            | 컨트롤&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.7-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.geometry.Insets?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Button?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.Label?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.control.TextField?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.ColumnConstraints?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.GridPane?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.HBox?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.RowConstraints?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GridPane xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefWidth=&amp;quot;300.0&amp;quot; hgap=&amp;quot;10.0&amp;quot; vgap=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;padding&amp;gt;&lt;br /&gt;
      &amp;lt;Insets topRightBottomLeft=&amp;quot;10.0&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/padding&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;아이디&amp;quot; GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.rowIndex=&amp;quot;0&amp;quot; GridPane.columnIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;Label text=&amp;quot;패스워드&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;TextField GridPane.columnIndex=&amp;quot;1&amp;quot; GridPane.rowIndex=&amp;quot;1&amp;quot;&lt;br /&gt;
                 GridPane.hgrow=&amp;quot;ALWAYS&amp;quot; /&amp;gt; &amp;lt;!-- 오른쪽 빈공간까지 확장 --&amp;gt;&lt;br /&gt;
      &amp;lt;HBox GridPane.rowIndex=&amp;quot;2&amp;quot; GridPane.columnIndex=&amp;quot;0&amp;quot;&lt;br /&gt;
                 GridPane.columnSpan=&amp;quot;2&amp;quot; GridPane.hgrow=&amp;quot;ALWAYS&amp;quot;&lt;br /&gt;
                 alignment=&amp;quot;CENTER&amp;quot; spacing=&amp;quot;20.0&amp;quot; &amp;gt;  &amp;lt;!-- 컬럼 2개 병합 --&amp;gt;&lt;br /&gt;
         &amp;lt;children&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;로그인&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Button text=&amp;quot;취소&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/children&amp;gt;&lt;br /&gt;
      &amp;lt;/HBox&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/GridPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== StackPane 컨테이너 ===&lt;br /&gt;
* 컨트롤을 겹쳐 배치하는 컨테이너&lt;br /&gt;
* 카드 레이아웃(Card Layout)이라고도 함&lt;br /&gt;
* 만약 위에 있는 컨트롤이 투명하다면 밑에 있는 컨트롤이 겹쳐 보임&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
file:duke.jpg | duke.jpg&lt;br /&gt;
file:snow.jpg | snow.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.4.8-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?import javafx.scene.image.ImageView?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.image.Image?&amp;gt;&lt;br /&gt;
&amp;lt;?import javafx.scene.layout.StackPane?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;StackPane  xmlns:fx=&amp;quot;http://javafx.com/fxml&amp;quot; prefHeight=&amp;quot;300.0&amp;quot; prefWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;children&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView fitHeight=&amp;quot;300.0&amp;quot; fitWidth=&amp;quot;500.0&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/snow.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
      &amp;lt;ImageView preserveRatio=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;image&amp;gt;&lt;br /&gt;
            &amp;lt;Image url=&amp;quot;@images/duke.jpg&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/image&amp;gt;&lt;br /&gt;
      &amp;lt;/ImageView&amp;gt;&lt;br /&gt;
   &amp;lt;/children&amp;gt;&lt;br /&gt;
&amp;lt;/StackPane&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 이벤트 처리 ==&lt;br /&gt;
&lt;br /&gt;
=== 이벤트 핸들러(EventHandler) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Button button = new Button();&lt;br /&gt;
button.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(ActionEvent event) { ... }&lt;br /&gt;
}):&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
TableView tableView = new TableView();&lt;br /&gt;
tableView.setOnMouseClicked(new EventHandler&amp;lt;MouseEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(MouseEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
stage.setOnCloseRequest(new EventHandler&amp;lt;WindowEvent&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public void handle(WindowEvent event) { ... }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
button.setOnAction( event-&amp;gt;{ ... } );&lt;br /&gt;
tableView.setOnMouseClicked( event-&amp;gt;{ ... } );&lt;br /&gt;
stage.setOnCloseRequest( event-&amp;gt;{ ... } );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:CP-17.5.1-실행결과.png | thumb | 실행 결과]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javafx.application.Application;&lt;br /&gt;
import javafx.event.ActionEvent;&lt;br /&gt;
import javafx.event.EventHandler;&lt;br /&gt;
import javafx.geometry.Pos;&lt;br /&gt;
import javafx.scene.Scene;&lt;br /&gt;
import javafx.scene.control.Button;&lt;br /&gt;
import javafx.scene.layout.HBox;&lt;br /&gt;
import javafx.stage.Stage;&lt;br /&gt;
&lt;br /&gt;
public class AppMain extends Application {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void start(Stage primaryStage) throws Exception {&lt;br /&gt;
        HBox root = new HBox();&lt;br /&gt;
        root.setPrefSize(200, 50);&lt;br /&gt;
        root.setAlignment(Pos.CENTER); // 수평 중앙 정렬&lt;br /&gt;
        root.setSpacing(20);&lt;br /&gt;
&lt;br /&gt;
        Button btn1 = new Button(&amp;quot;버튼1&amp;quot;);&lt;br /&gt;
        btn1.setOnAction(new EventHandler&amp;lt;ActionEvent&amp;gt;() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void handle(ActionEvent event) {&lt;br /&gt;
                System.out.println(&amp;quot;버튼1 클릭&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        Button btn2 = new Button(&amp;quot;버튼2&amp;quot;);&lt;br /&gt;
        btn2.setOnAction(event-&amp;gt;System.out.println(&amp;quot;버튼2 클릭&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        root.getChildren().addAll(btn1, btn2); // HBox에 btn1과 btn2를 추가&lt;br /&gt;
        Scene scene = new Scene(root);&lt;br /&gt;
&lt;br /&gt;
        primaryStage.setTitle(&amp;quot;AppMain&amp;quot;);&lt;br /&gt;
        primaryStage.setScene(scene);&lt;br /&gt;
        primaryStage.setOnCloseRequest(event-&amp;gt;System.out.println(&amp;quot;종료 클릭&amp;quot;));&lt;br /&gt;
        primaryStage.show();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        launch(args);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FXML 컨트롤러(Controller) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaFX 속성 감시와 바인딩 ==&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)&amp;diff=403</id>
		<title>컴퓨터프로그래밍및실습 (2022년)</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)&amp;diff=403"/>
		<updated>2022-07-21T12:16:00Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* 강의 내용 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 강의 내용 ==&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0901 | (9/01) 오리엔테이션]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0905 | (9/05) 변수와 타입]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0908 | (9/08) 연산자]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0912 | (9/12) 추석 연휴 – 온라인 강의로 대체. Karel을 이용한 프로그래밍 연습]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0915 | (9/15) 조건문, 반복문]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0919 | (9/19) 참조 타입]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0922 | (9/22) 클래스 1]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0926 | (9/26) 클래스 2]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0929 | (9/29) 상속]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1003 | (10/03) 개천절 – 온라인 강의로 대체. Karel을 이용한 클래스 연습]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1006 | (10/06) 인터페이스, 중첩 클래스와 중첩 인터페이스]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1010 | (10/10) 한글날 (대체 휴업일) - 온라인 강의로 대체. Karel을 이용한 상속, 인터페이스 연습]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1013 | (10/13) 예외 처리]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1017 | (10/17) 기본 API 클래스 1]]&lt;br /&gt;
&lt;br /&gt;
* (10/20) 중간고사&lt;br /&gt;
* (10/24) 중간고사&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1027 | (10/27) 기본 API 클래스 2]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1031 | (10/31) Thread 1]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1103 | (11/03) Thread 2]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1107 | (11/07) 제네릭(Generic)]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1110 | (11/10) 람다식]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1114 | (11/14) 컬렉션 프레임워크 1]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1117 | (11/17) 컬렉션 프레임워크 2]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1121 | (11/21) 스트림과 병렬처리]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1124 | (11/24) JavaFX 1]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1128 | (11/28) JavaFX 2]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1201 | (12/01) JavaFX 3]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1205 | (12/05) IO 기반 입출력]]&lt;br /&gt;
&lt;br /&gt;
* (12/8) 기말고사&lt;br /&gt;
* (12/12) 기말고사&lt;br /&gt;
&lt;br /&gt;
[[category:컴퓨터프로그래밍및실습]]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/0919&amp;diff=402</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/0919</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/0919&amp;diff=402"/>
		<updated>2022-07-21T12:13:59Z</updated>

		<summary type="html">&lt;p&gt;Swpark: Swpark moved page 컴퓨터프로그래밍및실습 (2022년)/0922 to 컴퓨터프로그래밍및실습 (2022년)/0919 without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 데이터 타입 분류 ==&lt;br /&gt;
# 기본 타입(primitive type)&lt;br /&gt;
#* 정수 타입&lt;br /&gt;
#** byte&lt;br /&gt;
#** char&lt;br /&gt;
#** short&lt;br /&gt;
#** int&lt;br /&gt;
#** int&lt;br /&gt;
#** long&lt;br /&gt;
#* 실수 타입&lt;br /&gt;
#** float&lt;br /&gt;
#** double&lt;br /&gt;
#* 논리 타입&lt;br /&gt;
#** boolean&lt;br /&gt;
# 참조 타입(reference type)&lt;br /&gt;
#* 배열 타입(array type)&lt;br /&gt;
#* 열거 타입(enumeration type)&lt;br /&gt;
#* 클래스(class)&lt;br /&gt;
#* 인터페이스(interface)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// 기본 타입 변수&lt;br /&gt;
int age = 25;&lt;br /&gt;
double price = 100.5&lt;br /&gt;
&lt;br /&gt;
// 참조 타입 변수(reference type variable)&lt;br /&gt;
String name = &amp;quot;신용권&amp;quot;; // 객체는 힙(heap) 영역에 존재한다.&lt;br /&gt;
String hobby = &amp;quot;독서&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 참조 변수인 name에는 &amp;quot;신용권&amp;quot; 객체가 저장되어 있는 메모리의 주소가 저장되어 있다.&lt;br /&gt;
* 교재 p.139 그림 참조&lt;br /&gt;
&lt;br /&gt;
== 메모리 사용 영역 ==&lt;br /&gt;
* 교재 p.140 그림 참조&lt;br /&gt;
&lt;br /&gt;
# 메소드(method) 영역&lt;br /&gt;
#* Java 소스 코드(XXX.java)를 컴파일하여 만들어진 실행 코드(bytecode) (XXX.class)가 적재된 메모리 영역&lt;br /&gt;
#* 클래스 로더(class loader)가 class 파일을 읽어 메모리에 올림&lt;br /&gt;
#* 상수풀(runtime constant pool), 필대(field) 데이터, 메소드(method) 데이터, 메소드 코드, 생성자(construct) 코드 등 실행에 필요한 바이트코드 및 상수, 전역 변수(클래스 변수, class field)&lt;br /&gt;
# 힙(heap) 영역&lt;br /&gt;
#* 프로그래머가 생명 주기(life time)을 제어할 수 있는 메모리가 위치하는 영역임&lt;br /&gt;
#* new 연산자를 이용하여 생성하는 객체&lt;br /&gt;
#* 배열, String도 객체이므로 힙에 존재함&lt;br /&gt;
#* new 연사자를 호출하여 객체를 생성하면 만들어지고, garbage가 되면 사라짐&lt;br /&gt;
# 스택(stack) 영역&lt;br /&gt;
#* 스택 영역은 스레드 마다 독립적으로 존재함&lt;br /&gt;
#* 특별히 스레드를 만들지 않았다면 main 메소드가 실행되고 있는 main 스레드만 존재하므로 스택 영역도 하나임&lt;br /&gt;
#* 메소드의 인자, 지역 변수(local variable), 리턴 값, 리턴 주소가 저장됨. 이를 activation record라 부름.&lt;br /&gt;
#* p.142 그림 참조&lt;br /&gt;
&lt;br /&gt;
* 아래 코드에서 (1), (2), (3) 지점에서의 스택 영역의 형태는?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
char v1 = 'A'; // (1)&lt;br /&gt;
&lt;br /&gt;
if (v1 == 'A') { // (2)&lt;br /&gt;
    int v2 = 100;&lt;br /&gt;
    double v3 = 3.14;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
boolean v4 = true; // (3)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 참조 변수의 &amp;lt;nowikI&amp;gt;==&amp;lt;/nowiki&amp;gt;, &amp;lt;nowiki&amp;gt;!=&amp;lt;/nowiki&amp;gt; 연산 ==&lt;br /&gt;
* 교재 p.143 그림 참조&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
refVar1 = 객체_1;&lt;br /&gt;
refVar2 = 객체_2;&lt;br /&gt;
refVar3 = 객체_2;&lt;br /&gt;
&lt;br /&gt;
refVar1 == refVar2  // 결과 : false&lt;br /&gt;
refVar1 != refVar2  // 결과 : true&lt;br /&gt;
&lt;br /&gt;
refVar2 == refVar3  // 결과 : true&lt;br /&gt;
refVar2 != refVar3  // 결과 : false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== null과 NullPointerException ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
refVar1 = 객체_1;&lt;br /&gt;
refVar2 = null;&lt;br /&gt;
&lt;br /&gt;
refVar1 == null // 결과 : false&lt;br /&gt;
refVar1 != null // 결과 : true&lt;br /&gt;
&lt;br /&gt;
refVar2 == null // 결과 : true&lt;br /&gt;
refVar2 != null // 결과 : false&lt;br /&gt;
&lt;br /&gt;
int[] intArray = null;&lt;br /&gt;
intArray[0] = 10;  // NullPointerException 발생&lt;br /&gt;
&lt;br /&gt;
String str = null;&lt;br /&gt;
System.out.println(&amp;quot;총 문자수 : &amp;quot; + str.length()); // NullPointerException 발생&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== String 타입 ==&lt;br /&gt;
* String은 상수 객체이다. 왜냐하면 String에는 자신이 가진 값을 변경하는 메소드가 없기 때문이다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
String 변수 = &amp;quot;문자열&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
String name;&lt;br /&gt;
name = &amp;quot;신용권&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
String hobby = &amp;quot;자바&amp;quot;;&lt;br /&gt;
hobby = null; // garbage가 된다.&lt;br /&gt;
&lt;br /&gt;
String name1 = &amp;quot;신용권&amp;quot;;&lt;br /&gt;
String name2 = &amp;quot;신용권&amp;quot;; // 리터럴이 동일하면 동일한 객체를 가리킴&lt;br /&gt;
&lt;br /&gt;
name1 = &amp;quot;신민철&amp;quot;;&lt;br /&gt;
name2 = &amp;quot;신민철&amp;quot;;&lt;br /&gt;
String name3 = new String(&amp;quot;신민철&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
boolean result = name1 == name2; // true&lt;br /&gt;
result = name1 == name3; // false&lt;br /&gt;
result = name1.equals(name3); // true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 배열 타입 ==&lt;br /&gt;
* 동일한 타입을 여러 개 만들어야 할 때&lt;br /&gt;
&lt;br /&gt;
=== 배열이라? === &lt;br /&gt;
* 다음은 성가시다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int score1 = 83;&lt;br /&gt;
int score2 = 90;&lt;br /&gt;
int score3 = 87;&lt;br /&gt;
int score4 = 99;&lt;br /&gt;
int score5 = 48;&lt;br /&gt;
int score6 = 21;&lt;br /&gt;
int score7 = 38;&lt;br /&gt;
int score8 = 83;&lt;br /&gt;
int score9 = 78;&lt;br /&gt;
int score10 = 92;&lt;br /&gt;
int score11 = 95;&lt;br /&gt;
int score12 = 29;&lt;br /&gt;
int score13 = 55;&lt;br /&gt;
int score14 = 66;&lt;br /&gt;
int score15 = 88;&lt;br /&gt;
int score16 = 77;&lt;br /&gt;
int score17 = 44;&lt;br /&gt;
int score18 = 34;&lt;br /&gt;
int score19 = 84;&lt;br /&gt;
int score20 = 81;&lt;br /&gt;
int score21 = 60;&lt;br /&gt;
int score22 = 85;&lt;br /&gt;
int score23 = 44;&lt;br /&gt;
int score24 = 23;&lt;br /&gt;
int score25 = 84;&lt;br /&gt;
int score26 = 48;&lt;br /&gt;
int score27 = 40;&lt;br /&gt;
int score28 = 58;&lt;br /&gt;
int score29 = 78;&lt;br /&gt;
int score30 = 75;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 평균을 구하고자 한다면 코드를 어떻게 작성해야 하나?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int sum = score1;&lt;br /&gt;
sum += score2;&lt;br /&gt;
sum += score3;&lt;br /&gt;
sum += score4;&lt;br /&gt;
sum += score5;&lt;br /&gt;
sum += score6;&lt;br /&gt;
sum += score7;&lt;br /&gt;
sum += score8;&lt;br /&gt;
sum += score9;&lt;br /&gt;
sum += score10;&lt;br /&gt;
sum += score11;&lt;br /&gt;
sum += score12;&lt;br /&gt;
sum += score13;&lt;br /&gt;
sum += score14;&lt;br /&gt;
sum += score15;&lt;br /&gt;
sum += score16;&lt;br /&gt;
sum += score17;&lt;br /&gt;
sum += score18;&lt;br /&gt;
sum += score19;&lt;br /&gt;
sum += score20;&lt;br /&gt;
sum += score21;&lt;br /&gt;
sum += score22;&lt;br /&gt;
sum += score23;&lt;br /&gt;
sum += score24;&lt;br /&gt;
sum += score25;&lt;br /&gt;
sum += score26;&lt;br /&gt;
sum += score27;&lt;br /&gt;
sum += score28;&lt;br /&gt;
sum += score29;&lt;br /&gt;
sum += score30;&lt;br /&gt;
&lt;br /&gt;
int avg = sum / 30;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 얼마나 번거러운가? 아래와 같이 바꿔보자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// score는 배열이다.&lt;br /&gt;
int[] score = {83, 90, 87, 99, 48, 21, 38, 83, 78, 92, 95, 29, 55, 66, 88, 77, 44, 34, 84, 81, 60, 85, 44, 23, 84, 48, 40, 58, 78, 75};&lt;br /&gt;
&lt;br /&gt;
int sum = 0;&lt;br /&gt;
for(int i = 0; i &amp;lt; score.length; i++)  // 여기서 score.length는 30&lt;br /&gt;
    sum += score[i]; // score[0]는 83, score[1]은 90 ...&lt;br /&gt;
int avg = sum / score.length;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 왜 배열이 필요한지 이해가 되는가?&lt;br /&gt;
&lt;br /&gt;
=== 배열 선언 ===&lt;br /&gt;
&lt;br /&gt;
* 두 표현은 동일하다.&lt;br /&gt;
&amp;lt;table2 class=wikitable sep=bar align=lllllll&amp;gt;&lt;br /&gt;
int[] intArray;          | int intArray[];&lt;br /&gt;
double[] doubleArray;    | double doubleArray[];&lt;br /&gt;
String[] strArray;       | String strArray[]&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 참고할 배열이 없다면 &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;로 지정한다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int[] intArray = null;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 값 목록으로 배열 선언 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
String[] names = { &amp;quot;신용권&amp;quot;, &amp;quot;홍길동&amp;quot;, &amp;quot;감자바&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
names[1] = &amp;quot;홍삼원&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//--------------------------------------&lt;br /&gt;
&lt;br /&gt;
String[] names = null;&lt;br /&gt;
names = new String[] { &amp;quot;신용권&amp;quot;, &amp;quot;홍길동&amp;quot;, &amp;quot;감자바&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
//--------------------------------------&lt;br /&gt;
&lt;br /&gt;
// 다음과 같은 add 메소드가 있다면&lt;br /&gt;
int add(int[] scores) {&lt;br /&gt;
    int sum = 0;&lt;br /&gt;
    for(int i = 0; i &amp;lt; scores.length; i++)&lt;br /&gt;
        sum += scores[i];&lt;br /&gt;
    return sum;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 이를 호출하는 방법으로&lt;br /&gt;
int result = add( {95, 85, 90} ); // 컴파일 에러 발생&lt;br /&gt;
&lt;br /&gt;
int result = add( new int[] {95, 85, 90} ); // OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== new 연산자로 배열 생성 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int[] scores = new int[30]; // 앞의 예제에서 빈 배열을 만들고자 한다면. 모두 0으로 초기화된다.&lt;br /&gt;
scores[0] = 83; // 인덱스는 0부터 시작한다.&lt;br /&gt;
scores[1] = 90;&lt;br /&gt;
scores[2] = 75;&lt;br /&gt;
&lt;br /&gt;
String[] names = new String[30]; // 모두 null로 초기화된다.&lt;br /&gt;
names[0] = &amp;quot;신용권&amp;quot;;&lt;br /&gt;
names[1] = &amp;quot;홍길동&amp;quot;;&lt;br /&gt;
names[2] = &amp;quot;감자바&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 배열 길이 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int[] intArray = { 10, 20, 30 };&lt;br /&gt;
System.out.println(intArray.length); // 3이 출력됨&lt;br /&gt;
&lt;br /&gt;
intArray.length = 10; // 에러. length는 상수이다. 즉, 값을 변경할 수 없다.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 커맨드 라인(command line) 입력 ===&lt;br /&gt;
* 명령창에서 다음과 같이 Java 프로그램 실행&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
C:&amp;gt; java MainStringArrayArgument 10 20&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class MainStringArrayArgument {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        if (args.length != 2) { // 입력 데이터가 2개가 아닌 경우&lt;br /&gt;
            System.out.println(&amp;quot;Usage: java MainStringArrayArgument num1 num2&amp;quot;);&lt;br /&gt;
            System.exit(0); // 프로그램 강제 종료&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        String strNum1 = args[0];&lt;br /&gt;
        String strNum2 = args[1];&lt;br /&gt;
&lt;br /&gt;
        int num1 = Integer.parseInt(strNum1); // Integer 클래스의 parseInt 메소드를 이용하여 문자열을 정수로 변환&lt;br /&gt;
        int num2 = Integer.parseInt(strNum2);&lt;br /&gt;
&lt;br /&gt;
        int result = num1 + num2;&lt;br /&gt;
        System.out.println(num1 + &amp;quot;+&amp;quot; + num2 + &amp;quot;=&amp;quot; + result);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
10+20=30&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 다차원 배열 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int[][] scores = new int[2][3];&lt;br /&gt;
&lt;br /&gt;
System.out.println(scores.length);  // 2&lt;br /&gt;
System.out.println(scores[0].length); // 3&lt;br /&gt;
System.out.println(scores[1].length); // 3&lt;br /&gt;
&lt;br /&gt;
//--------------------------------------------&lt;br /&gt;
&lt;br /&gt;
int[][] scores = new int[2][];&lt;br /&gt;
scores[0] = new int[2];&lt;br /&gt;
scores[1] = new int[3];&lt;br /&gt;
&lt;br /&gt;
System.out.println(scores.length);  // 2&lt;br /&gt;
System.out.println(scores[0].length); // 2&lt;br /&gt;
System.out.println(scores[1].length); // 3&lt;br /&gt;
&lt;br /&gt;
//--------------------------------------------&lt;br /&gt;
// 다차원 배열 초기화&lt;br /&gt;
&lt;br /&gt;
int[][] scores = { {95, 80}, {92, 96} };&lt;br /&gt;
&lt;br /&gt;
System.out.println( scores[0][0] ); // 95&lt;br /&gt;
System.out.println( scores[1][1] ); // 96&lt;br /&gt;
&lt;br /&gt;
int[][] javaScores = { {95, 80}, {92, 96, 80} };&lt;br /&gt;
&lt;br /&gt;
for(int i = 0; i &amp;lt; javaScores.length; i++) {&lt;br /&gt;
    for(int k = 0; k &amp;lt; javaScores[i].length; k++) {&lt;br /&gt;
        System.out.println( javaScores[i][k] );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 배열 복사 ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ArrayCopyExample {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        // for 문 이용&lt;br /&gt;
&lt;br /&gt;
        int[] oldIntArray = { 1, 2, 3 };&lt;br /&gt;
        int[] newIntArray = new int[5];&lt;br /&gt;
&lt;br /&gt;
        for(int i = 0; i &amp;lt; oldIntArray.length; i++)&lt;br /&gt;
            newIntArray[i] = oldIntArray[i];&lt;br /&gt;
&lt;br /&gt;
        for(int i = 0; i &amp;lt; newIntArray.length; i++)&lt;br /&gt;
            System.out.print(newIntArray[i] + &amp;quot;,&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
&lt;br /&gt;
        // arraycopy 이용&lt;br /&gt;
        String[] oldStrArray = { &amp;quot;java&amp;quot;, &amp;quot;array&amp;quot;, &amp;quot;copy&amp;quot; };&lt;br /&gt;
        String[] newStrArray = new String[5];&lt;br /&gt;
&lt;br /&gt;
        System.arraycopy(oldStrArray, 0, newStrArray, 0, oldIntArray.length); // p.169 그림 참조&lt;br /&gt;
&lt;br /&gt;
        for(int i = 0; i &amp;lt; newStrArray.length; i++)&lt;br /&gt;
            System.out.print(newStrArray[i] + &amp;quot;, &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
1,2,3,0,0,&lt;br /&gt;
java, array, copy, null, null,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 향상된 for 문 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ch05;&lt;br /&gt;
&lt;br /&gt;
public class ArrayCopyExample {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        // for 문 이용&lt;br /&gt;
&lt;br /&gt;
        int[] oldIntArray = { 1, 2, 3 };&lt;br /&gt;
        int[] newIntArray = new int[5];&lt;br /&gt;
&lt;br /&gt;
        for(int i = 0; i &amp;lt; oldIntArray.length; i++)&lt;br /&gt;
            newIntArray[i] = oldIntArray[i];&lt;br /&gt;
&lt;br /&gt;
        for(int value : newIntArray) // ← 배열 전체를 스캔하는데 인덱스가 필요없음&lt;br /&gt;
            System.out.print(value + &amp;quot;,&amp;quot; );&lt;br /&gt;
        System.out.println();&lt;br /&gt;
&lt;br /&gt;
        // arraycopy 이용&lt;br /&gt;
        String[] oldStrArray = { &amp;quot;java&amp;quot;, &amp;quot;array&amp;quot;, &amp;quot;copy&amp;quot; };&lt;br /&gt;
        String[] newStrArray = new String[5];&lt;br /&gt;
&lt;br /&gt;
        System.arraycopy(oldStrArray, 0, newStrArray, 0, oldIntArray.length);&lt;br /&gt;
&lt;br /&gt;
        for(String str : newStrArray) // ← 배열 전체를 스캔하는데 인덱스가 필요없음&lt;br /&gt;
            System.out.print(str + &amp;quot;, &amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 열거 타입(Enumeration Type) ==&lt;br /&gt;
* Java에서 이름 짓는 법&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
종류                       | 예                  | 설명&lt;br /&gt;
변수                       | name                | 소문자를 이용하여 짓는다. 영어가 아닌 한국어로 변수 이름을 지어도 되지만 관례적으로 로마자를 사용한다.&lt;br /&gt;
                           | myName, myFirstName | 두 개의 단어가 연이어 나오면 새로운 단어의 시작은 대문자로 한다.&lt;br /&gt;
메소드                     | move()              | 소문자로 짓는다. 이름 뒤에 연이어 괄호가 나오기 때문에 이름으로 변수와 메소드를 구분할 수 있다.&lt;br /&gt;
                           | moveLeft()          | 두 개의 단어가 연이어 나오면 새로운 단어의 시작은 대문자로 한다.&lt;br /&gt;
클래스, 인터페이스, 열거형 | Car                 | 시작 문자를 대문자로 한다.&lt;br /&gt;
                           | BlueCar             | 두 개의 단어가 연이어 나오면 새로운 단어의 시작은 대문자로 한다.&lt;br /&gt;
상수(static final)         | COLOR               | 모든 문자를 대문자로 한다.&lt;br /&gt;
                           | BLUE_COLOR          | 두 개의 단어가 연이어 나오면 단어 사이에 _를 붙인다.&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 열거 타입 선언 ===&lt;br /&gt;
&lt;br /&gt;
* 상수를 여러 개 만들고 싶을 때&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public enum Week { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY };&lt;br /&gt;
&lt;br /&gt;
public enum LoginResult { LOGIN_SUCCESS, LOGIN_FAILED };&lt;br /&gt;
&lt;br /&gt;
Week today;&lt;br /&gt;
Week reservationDay;&lt;br /&gt;
Week birthday = null;&lt;br /&gt;
&lt;br /&gt;
today = Week.SUNDAY;&lt;br /&gt;
&lt;br /&gt;
if (today == Week.SUNDAY) { // true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Calendar 객체를 이용한 열거형 연습&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Calendar now = Calendar.getInstance();&lt;br /&gt;
&lt;br /&gt;
int year = now.get(Calendar.YEAR); // 년&lt;br /&gt;
int month = now.get(Calendar.MONTH) + 1; // 월&lt;br /&gt;
int day = now.get(Calendar.DAY_OF_MONTH); // 일&lt;br /&gt;
int week = now.get(Calendar.DAY_OF_WEEK); // 요일 (1~7)&lt;br /&gt;
int hour = now.get(Calendar.HOUR); // 시간 &lt;br /&gt;
int minute = now.get(Calendar.MINUTE); // 분&lt;br /&gt;
int second = now.get(Calendar.SECOND); // 초&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 열거 객체의 메소드 ===&lt;br /&gt;
* 열거 객체는 java.lang.Enum 클래스로부터 상속받음.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
리턴 타입 | 메소드(매개 변수)    | 설명&lt;br /&gt;
String    | name()               | 열거 객체의 문자열을 리턴&lt;br /&gt;
int       | ordinal()            | 열거 객체의 순번(0부터 시작)을 리턴&lt;br /&gt;
int       | compareTo()          | 열거 객체를 비교하여 순번 차이를 리턴&lt;br /&gt;
열거 타입 | valueOf(String name) | 주어진 문자열의 열거 객체를 리턴 &lt;br /&gt;
열거 배열 | values()             | 모든 열거 객체들을 배열로 리턴&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Week today = Week.SUNDAY;&lt;br /&gt;
&lt;br /&gt;
String name = today.name(); // &amp;quot;SUNDAY&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int ordinal = today.ordinal(); // 6. 0부터 시작하여 6번째 데이터라는 뜻임&lt;br /&gt;
&lt;br /&gt;
Week day1 = Week.MONDAY;&lt;br /&gt;
Week day2 = Week.WEDNESDAY;&lt;br /&gt;
&lt;br /&gt;
int result1 = day1.compareTo(day2); // -2 (0 - 2)&lt;br /&gt;
int result2 = day2.compareTo(day1); // 2 (2 - 0)&lt;br /&gt;
&lt;br /&gt;
Week weekDay = Week.valueOf(&amp;quot;SATURDAY&amp;quot;); // Week.SATURDAY&lt;br /&gt;
&lt;br /&gt;
Week[] days = Week.values();&lt;br /&gt;
for(Week day : days)&lt;br /&gt;
    System.out.println(day);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category:컴퓨터프로그래밍및실습]]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)&amp;diff=401</id>
		<title>컴퓨터프로그래밍및실습 (2022년)</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)&amp;diff=401"/>
		<updated>2022-07-21T12:13:50Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* 강의 내용 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 강의 내용 ==&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0901 | (9/01) 오리엔테이션]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0905 | (9/05) 변수와 타입]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0908 | (9/08) 연산자]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0912 | (9/12) 추석 연휴 – 온라인 강의로 대체. Karel을 이용한 프로그래밍 연습]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0915 | (9/15) 조건문, 반복문]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0919 | (9/19) 참조 타입]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0922 | (9/22) 참조 타입]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0926 | (9/26) 클래스 1]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0929 | (9/29) 클래스 2]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1003 | (10/03) 개천절 – 온라인 강의로 대체. Karel을 이용한 클래스 연습]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1006 | (10/06) 상속]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1010 | (10/10) 한글날 (대체 휴업일) - 온라인 강의로 대체. Karel을 이용한 상속, 인터페이스 연습]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1013 | (10/13) 인터페이스, 중첩 클래스와 중첩 인터페이스]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1017 | (10/17) 예외 처리]]&lt;br /&gt;
&lt;br /&gt;
* (10/20) 중간고사&lt;br /&gt;
* (10/24) 중간고사&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1027 | (10/27) 기본 API 클래스 1]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1031 | (10/31) 기본 API 클래스 2]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1103 | (11/03) Thread 1]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1107 | (11/07) Thread 2]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1110 | (11/10) 제네릭]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1114 | (11/14) 람다식]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1117 | (11/17) 컬렉션 프레임워크]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1121 | (11/21) 스트림과 병렬처리]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1124 | (11/24) JavaFX 1]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1128 | (11/28) JavaFX 2]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1201 | (12/01) JavaFX 3]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1205 | (12/05) IO 기반 입출력]]&lt;br /&gt;
&lt;br /&gt;
* (12/8) 기말고사&lt;br /&gt;
* (12/12) 기말고사&lt;br /&gt;
&lt;br /&gt;
[[category:컴퓨터프로그래밍및실습]]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/0915&amp;diff=400</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/0915</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/0915&amp;diff=400"/>
		<updated>2022-07-21T12:13:25Z</updated>

		<summary type="html">&lt;p&gt;Swpark: Swpark moved page 컴퓨터프로그래밍및실습 (2022년)/0919 to 컴퓨터프로그래밍및실습 (2022년)/0915 without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 조건문 ==&lt;br /&gt;
{{본문|컴퓨터프로그래밍및실습 (2022년)/조건문}}&lt;br /&gt;
&lt;br /&gt;
{{:컴퓨터프로그래밍및실습 (2022년)/조건문}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 반복문 ==&lt;br /&gt;
{{본문|컴퓨터프로그래밍및실습 (2022년)/반복문}}&lt;br /&gt;
&lt;br /&gt;
{{:컴퓨터프로그래밍및실습 (2022년)/반복문}}&lt;br /&gt;
&lt;br /&gt;
[[category:컴퓨터프로그래밍및실습]]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)&amp;diff=399</id>
		<title>컴퓨터프로그래밍및실습 (2022년)</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)&amp;diff=399"/>
		<updated>2022-07-21T12:13:13Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* 강의 내용 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 강의 내용 ==&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0901 | (9/01) 오리엔테이션]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0905 | (9/05) 변수와 타입]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0908 | (9/08) 연산자]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0912 | (9/12) 추석 연휴 – 온라인 강의로 대체. Karel을 이용한 프로그래밍 연습]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0915 | (9/15) 조건문, 반복문]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0919 | (9/19) 조건문, 반복문]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0922 | (9/22) 참조 타입]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0926 | (9/26) 클래스 1]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0929 | (9/29) 클래스 2]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1003 | (10/03) 개천절 – 온라인 강의로 대체. Karel을 이용한 클래스 연습]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1006 | (10/06) 상속]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1010 | (10/10) 한글날 (대체 휴업일) - 온라인 강의로 대체. Karel을 이용한 상속, 인터페이스 연습]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1013 | (10/13) 인터페이스, 중첩 클래스와 중첩 인터페이스]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1017 | (10/17) 예외 처리]]&lt;br /&gt;
&lt;br /&gt;
* (10/20) 중간고사&lt;br /&gt;
* (10/24) 중간고사&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1027 | (10/27) 기본 API 클래스 1]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1031 | (10/31) 기본 API 클래스 2]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1103 | (11/03) Thread 1]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1107 | (11/07) Thread 2]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1110 | (11/10) 제네릭]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1114 | (11/14) 람다식]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1117 | (11/17) 컬렉션 프레임워크]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1121 | (11/21) 스트림과 병렬처리]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1124 | (11/24) JavaFX 1]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1128 | (11/28) JavaFX 2]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1201 | (12/01) JavaFX 3]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1205 | (12/05) IO 기반 입출력]]&lt;br /&gt;
&lt;br /&gt;
* (12/8) 기말고사&lt;br /&gt;
* (12/12) 기말고사&lt;br /&gt;
&lt;br /&gt;
[[category:컴퓨터프로그래밍및실습]]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/0908&amp;diff=398</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/0908</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/0908&amp;diff=398"/>
		<updated>2022-07-21T12:12:45Z</updated>

		<summary type="html">&lt;p&gt;Swpark: Swpark moved page 컴퓨터프로그래밍및실습 (2022년)/0915 to 컴퓨터프로그래밍및실습 (2022년)/0908 without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 연산자와 연산식 ==&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=semicolon align=clccl&amp;gt;&lt;br /&gt;
연산자 종류 ; 연산자           ; 피연산자 수          ; 산출값      ; 기능 설명                             ; 예&lt;br /&gt;
산술        ; +, -, *, /, %    ; 이항                 ; 숫자        ; 사칙연산 및 나머지 연산               ; 2 + 3&lt;br /&gt;
부호        ; +, -             ; 단항                 ; 숫자        ; 음수와 양수의 부호                    ; -2&lt;br /&gt;
문자열      ; +                ; 이항                 ; 문자열      ; 두 문자열을 연결                      ; &amp;quot;abc&amp;quot; + &amp;quot;def&amp;quot;&lt;br /&gt;
대입        ; =, +=, -=, *=, /=, %=, &amp;amp;= &amp;lt;br/&amp;gt;^=, !=, &amp;lt;&amp;lt;=, &amp;gt;&amp;gt;=, &amp;gt;&amp;gt;&amp;gt;= ; 이항 ; 다양 ; 우변의 값을 좌변의 변수에 대입 ; i += 3&lt;br /&gt;
증감        ; ++, --           ; 단항                 ; 숫자        ; 1만큼 증가/감소                       ; i++&lt;br /&gt;
비교        ; ==, !=, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=&amp;lt;br/&amp;gt;instanceof  ; 이항 ; boolean ; 값의 비교                             ; i &amp;gt; j&lt;br /&gt;
논리        ; !, &amp;amp;, |, &amp;amp;&amp;amp;, &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; ; 단항&amp;lt;br/&amp;gt;이항        ; boolean     ; 논리적 NOT, AND, OR 연산              ; !(a &amp;lt; 3), (a &amp;lt; 3) &amp;amp;&amp;amp; (a &amp;gt; 1) &lt;br /&gt;
조건        ; (조건식) ? A : B ; 삼항                 ; 다양        ; 조건식에 따라 A 또는 B 중 하나를 선택 ; a = (x &amp;gt; y) ? x : y&lt;br /&gt;
비트        ; ~, &amp;amp;, |, ^       ; 단항&amp;lt;br/&amp;gt;이항        ; 숫자&amp;lt;br/&amp;gt;boolean ; 비트 NOT, AND, OR, XOR 연산      ; ~a, a &amp;amp; b&lt;br /&gt;
쉬프트      ; &amp;gt;&amp;gt;, &amp;lt;&amp;lt;, &amp;gt;&amp;gt;&amp;gt;      ; 이항                 ; 숫자        ; 비트를 좌측/우측으로 밀어서 이동      ; a &amp;gt;&amp;gt; 3&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 연산의 방향과 우선순위 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
x &amp;gt; 0 &amp;amp;&amp;amp; y &amp;lt; 0 // 어떤 순으로 연산될 것인가?&lt;br /&gt;
&lt;br /&gt;
v1 = 100 * 2 / 3 % 5; // v1 = (((100 * 2) / 3) % 5)&lt;br /&gt;
&lt;br /&gt;
a = b = c = 5; // (a = (b = (c = 5)));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 연산자 우선순위&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=semicolon align=&amp;quot;lcc&amp;quot;&amp;gt;&lt;br /&gt;
연산자                   ; 연산 방향 ; 우선 순위&lt;br /&gt;
++, --, +, -, ~, !       ; ←        ; 높음&lt;br /&gt;
*, /, %                  ; →        ; &lt;br /&gt;
+, -                     ; →        ;&lt;br /&gt;
&amp;lt;&amp;lt;, &amp;gt;&amp;gt;, &amp;gt;&amp;gt;&amp;gt;              ; →        ;&lt;br /&gt;
&amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;=, instanceof ; →        ;&lt;br /&gt;
==, !=                   ; →        ;&lt;br /&gt;
&amp;amp;                        ; →        ;&lt;br /&gt;
^                        ; →        ;&lt;br /&gt;
|                        ; →        ;&lt;br /&gt;
&amp;amp;&amp;amp;                       ; →        ;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;      ; →        ;&lt;br /&gt;
? :                      ; →        ;&lt;br /&gt;
=, +=, -=, *=, /=, %=, &amp;amp;=, ^=, |=, &amp;lt;&amp;lt;=, &amp;gt;&amp;gt;=, &amp;gt;&amp;gt;&amp;gt;= ; ← ; 낮음&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int var1 = 1;&lt;br /&gt;
int var2 = 3;&lt;br /&gt;
int var3 = 2;&lt;br /&gt;
int result = var1 + var2 * var3;&lt;br /&gt;
&lt;br /&gt;
int result = (var1 + var2) * var3;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 단항 연산자 ==&lt;br /&gt;
&lt;br /&gt;
=== 부호 연산자 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int i1 = +100;  // 부호 + (양수)&lt;br /&gt;
int i2 = -100;  // 부호 - (음수)&lt;br /&gt;
double d1 = +3.14;&lt;br /&gt;
&lt;br /&gt;
int x = -100;&lt;br /&gt;
int result1 = -x; // OK&lt;br /&gt;
&lt;br /&gt;
short s1 = 100;&lt;br /&gt;
short s2 = -s1; // 오류. 정수 연산은 int로 바뀌기 때문&lt;br /&gt;
int i3 = -s1; // OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 증감 연산자(++, --) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
++i;&lt;br /&gt;
i++;&lt;br /&gt;
&lt;br /&gt;
--i;&lt;br /&gt;
i--;&lt;br /&gt;
&lt;br /&gt;
//------------------&lt;br /&gt;
int x = 10;&lt;br /&gt;
int z;&lt;br /&gt;
&lt;br /&gt;
z = ++x;&lt;br /&gt;
&lt;br /&gt;
// 위 코드는 아래와 동일&lt;br /&gt;
x = x + 1;&lt;br /&gt;
z = x;&lt;br /&gt;
&lt;br /&gt;
//-------------------&lt;br /&gt;
int x = 10;&lt;br /&gt;
int z;&lt;br /&gt;
&lt;br /&gt;
z = x++;&lt;br /&gt;
&lt;br /&gt;
// 위 코드는 아래와 동일&lt;br /&gt;
z = x;&lt;br /&gt;
x = x + 1;&lt;br /&gt;
&lt;br /&gt;
//------------------&lt;br /&gt;
int x = 10;&lt;br /&gt;
int z;&lt;br /&gt;
&lt;br /&gt;
z = --x;&lt;br /&gt;
&lt;br /&gt;
// 위 코드는 아래와 동일&lt;br /&gt;
x = x - 1;&lt;br /&gt;
z = x;&lt;br /&gt;
&lt;br /&gt;
//-------------------&lt;br /&gt;
int x = 10;&lt;br /&gt;
int z;&lt;br /&gt;
&lt;br /&gt;
z = x--;&lt;br /&gt;
&lt;br /&gt;
// 위 코드는 아래와 동일&lt;br /&gt;
z = x;&lt;br /&gt;
x = x - 1;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 논리 부정 연산자 ! ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
boolean play = true;&lt;br /&gt;
&lt;br /&gt;
play = !play;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 비트 반전 연산자 ~ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
byte v1 = 10; // 00001010&lt;br /&gt;
byte v2 = ~v1; // 오류. 정수 종류의 연산은 자동으로 int로 변환됨&lt;br /&gt;
&lt;br /&gt;
int i2 = ~v1; // OK. 11111111 11111111 11111111 11110101&lt;br /&gt;
&lt;br /&gt;
int i3 = ~v1 + 1; // -10 (2의 보수)&lt;br /&gt;
&lt;br /&gt;
System.out.println( Integer.toBinaryString(i3) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 이항 연산잔 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 산술 연산자 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
byte byte1 = 1;&lt;br /&gt;
byte byte2 = 1;&lt;br /&gt;
byte byte3 = byte1 + byte2; // 오류. 정수 타입의 산술 연산은 32비트인 int로 형변환됨&lt;br /&gt;
&lt;br /&gt;
int result1 = byte1 + byte2; // OK&lt;br /&gt;
&lt;br /&gt;
int int1 = 10;&lt;br /&gt;
int int2 = 4;&lt;br /&gt;
int result2 = int1 / int2;  // 2&lt;br /&gt;
double result3 = int1 / int2; // 2.0&lt;br /&gt;
&lt;br /&gt;
double result4 = (double) int1 / int2; // 2.5&lt;br /&gt;
&lt;br /&gt;
char c1 = 'A' + 1; // OK 'B'&lt;br /&gt;
char c2 = 'A';&lt;br /&gt;
char c3 = c2 + 1; // 컴파일 에러. c2가 int로 형변환됨&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 오버플로우 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int x = 1000000;&lt;br /&gt;
int y = 1000000;&lt;br /&gt;
&lt;br /&gt;
int z = x * y; // z에는 오버플로우되어 -727379968와 같이 알 수 없는 값이 저장됨&lt;br /&gt;
&lt;br /&gt;
//-------------&lt;br /&gt;
&lt;br /&gt;
long x = 1000000;&lt;br /&gt;
long y = 1000000;&lt;br /&gt;
&lt;br /&gt;
long z = x * y; // OK&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 정확한 계산은 정수 사용 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int apple = 1;&lt;br /&gt;
double priceUnit = 0.1;&lt;br /&gt;
int number = 7;&lt;br /&gt;
&lt;br /&gt;
double result = apple - number * priceUnit; // 0.3이 되어야 할 것 같지만 아님. 왜?&lt;br /&gt;
&lt;br /&gt;
System.out.println(result); // 0.29999999999999993&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NaN과 Infinity 연산 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
5 / 0 → ArithmeticException 예외 발생&lt;br /&gt;
5 % 0 → ArithmeticException 예외 발생&lt;br /&gt;
&lt;br /&gt;
5 / 0.0 → Infinity&lt;br /&gt;
5 % 0.0 → NaN&lt;br /&gt;
&lt;br /&gt;
double val = Double.valueOf(&amp;quot;NaN&amp;quot;); // NaN 입력&lt;br /&gt;
&lt;br /&gt;
if (Double.isNaN(val)) { // NaN인지 검사&lt;br /&gt;
    System.out.println(&amp;quot;OOPS&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 문자열 연결 연산자 (+) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
String str1 = &amp;quot;JDK&amp;quot; + 6.0; // &amp;quot;JDK6.0&amp;quot;&lt;br /&gt;
String str2 = str1 + &amp;quot; 특징&amp;quot;; // &amp;quot;JDK6.0 특징&amp;quot;&lt;br /&gt;
&lt;br /&gt;
String str3 = &amp;quot;JDK&amp;quot; + 3 + 3.0; // (&amp;quot;JDK&amp;quot; + 3) + 3.0 → (&amp;quot;JDK&amp;quot; + &amp;quot;3&amp;quot;) + 3.0 → &amp;quot;JDK3&amp;quot; + &amp;quot;3.0&amp;quot; → &amp;quot;JDK33.0&amp;quot;&lt;br /&gt;
String str4 = 3 + 3.0 + &amp;quot;JDK&amp;quot;; // (3 + 3.0) + &amp;quot;JDK&amp;quot; → (3.0 + 3.0) + &amp;quot;JDK&amp;quot; → &amp;quot;6.0&amp;quot; + &amp;quot;JDK&amp;quot; → &amp;quot;6.0JDK&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 비교 연산자 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int num1 = 10;&lt;br /&gt;
int num2 = 10;&lt;br /&gt;
&lt;br /&gt;
boolean result1 = num1 == num2;&lt;br /&gt;
boolean result2 = (num1 != num2);&lt;br /&gt;
boolean result3 = (num1 &amp;lt;= num2);&lt;br /&gt;
&lt;br /&gt;
char char1 = 'A';&lt;br /&gt;
char char2 = 'B';&lt;br /&gt;
&lt;br /&gt;
boolean result4 = (char1 &amp;lt; char2);&lt;br /&gt;
&lt;br /&gt;
//------------------&lt;br /&gt;
&lt;br /&gt;
'A' == 65 → true&lt;br /&gt;
3 == 3.0 → true&lt;br /&gt;
0.1 == 0.1f → false // 2진수로 변환하기 때문에 정확한 0.1 표현이 안됨. &lt;br /&gt;
                     // 0.1을 2진수로 바꾸었다가 10진수로 변환하면 0.10000000149011612와 같이 표현됨&lt;br /&gt;
&lt;br /&gt;
//------------------&lt;br /&gt;
&lt;br /&gt;
String strVar1 = &amp;quot;신용권&amp;quot;;&lt;br /&gt;
String strVal2 = &amp;quot;신용권&amp;quot;;&lt;br /&gt;
String strVal3 = new String(&amp;quot;신용권&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
strVal1 == strVal2 → true&lt;br /&gt;
strVar2 == strVal3 → false&lt;br /&gt;
&lt;br /&gt;
strVal1.equals(strVal2) → true&lt;br /&gt;
strVal2.equals(strVal3) → true // 내용으로 비교하기 때문&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 논리 연산자 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=semicolon align=cccc&amp;gt;&lt;br /&gt;
구분 ; 연산식              ; 설명&lt;br /&gt;
AND  ; &amp;amp;&amp;amp;                  ; 모두 참일 때만 참&lt;br /&gt;
OR   ; &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; ; 모두 거짓일 때만 거짓&lt;br /&gt;
XOR  ; ^                   ; 배타적 논리합. 하나는 true, 다른 하나는 false 일 때만 true&lt;br /&gt;
NOT  ; !                   ; 피연산자의 논리값을 바꿈&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int charCode = 'A';&lt;br /&gt;
&lt;br /&gt;
if (charCode &amp;gt;= 'A' &amp;amp;&amp;amp; charCode &amp;lt;= 'Z') {&lt;br /&gt;
    System.out.println(&amp;quot;대문자입니다&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 비트 연산자 ===&lt;br /&gt;
&lt;br /&gt;
==== 비트 논리 연산자 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
byte num1 = 45;&lt;br /&gt;
byte num2 = 25;&lt;br /&gt;
&lt;br /&gt;
byte result1 = num1 &amp;amp; num2;&lt;br /&gt;
byte result2 = num1 | num2;&lt;br /&gt;
byte result3 = num1 ^ num2;&lt;br /&gt;
byte result4 = ~num1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=semicolon align=llcl&amp;gt;&lt;br /&gt;
변수    ; 값       ; 십진수 ; 연산&lt;br /&gt;
num1    ; 00101101 ; 45     ;&lt;br /&gt;
num2    ; 00011001 ; 25     ;  &lt;br /&gt;
result1 ; 00001001 ; 9      ; num1 &amp;amp; num2&lt;br /&gt;
result2 ; 00111101 ; 61     ; num1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; num2&lt;br /&gt;
result3 ; 00110100 ; 52     ; num1 ^ num2&lt;br /&gt;
result4 ; 11010010 ; -46    ; ~num1&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 비트 이동 연산자 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int result1 = 1 &amp;lt;&amp;lt; 3;&lt;br /&gt;
int result2 = -8 &amp;gt;&amp;gt; 3;&lt;br /&gt;
int result3 = -8 &amp;gt;&amp;gt;&amp;gt; 3;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lllll&amp;gt;&lt;br /&gt;
변수    | 값        | 연산     | 이진값                             | 비고&lt;br /&gt;
        | 1         |          | 00000000 00000000 0000000 00000001 | &lt;br /&gt;
result1 | 8         | 1 &amp;lt;&amp;lt; 3   | 00000000 00000000 0000000 00001000 | 2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
        | -8        |          | 11111111 11111111 1111111 11111000 |&lt;br /&gt;
resutl2 | -1        | -8 &amp;gt;&amp;gt; 3  | 11111111 11111111 1111111 11111111 |&lt;br /&gt;
result3 | 536870911 | -8 &amp;gt;&amp;gt;&amp;gt; 3 | 00011111 11111111 1111111 11111111 |&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 대입 연산자 ===&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class AssignmentOperatorExample {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        int result = 0;&lt;br /&gt;
&lt;br /&gt;
        result += 10; // result = result + 10;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
&lt;br /&gt;
        result -= 5; // result = result - 10;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
&lt;br /&gt;
        result *= 3; // result = result * 3;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
&lt;br /&gt;
        result /= 5; // result = result / 5;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
&lt;br /&gt;
        result %= 3;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
10&lt;br /&gt;
5&lt;br /&gt;
15&lt;br /&gt;
3&lt;br /&gt;
0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 유용한 경우&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int result *= x + y * z; // result = result * (x + y * z);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 삼항 연산자 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int score = 95;&lt;br /&gt;
&lt;br /&gt;
char grade = (score &amp;gt; 90) ? 'A' : 'B';&lt;br /&gt;
&lt;br /&gt;
// 아래와 동일한 의미의 코드이다.&lt;br /&gt;
&lt;br /&gt;
int score = 95&lt;br /&gt;
&lt;br /&gt;
char grade;&lt;br /&gt;
if (score &amp;gt; 90)&lt;br /&gt;
    grade = 'A';&lt;br /&gt;
else&lt;br /&gt;
    grade = 'B';&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category:컴퓨터프로그래밍및실습]]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)&amp;diff=397</id>
		<title>컴퓨터프로그래밍및실습 (2022년)</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)&amp;diff=397"/>
		<updated>2022-07-21T12:12:32Z</updated>

		<summary type="html">&lt;p&gt;Swpark: /* 강의 내용 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 강의 내용 ==&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0901 | (9/01) 오리엔테이션]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0905 | (9/05) 변수와 타입]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0908 | (9/08) 연산자]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0912 | (9/12) 추석 연휴 – 온라인 강의로 대체. Karel을 이용한 프로그래밍 연습]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0915 | (9/15) 연산자]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0919 | (9/19) 조건문, 반복문]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0922 | (9/22) 참조 타입]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0926 | (9/26) 클래스 1]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/0929 | (9/29) 클래스 2]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1003 | (10/03) 개천절 – 온라인 강의로 대체. Karel을 이용한 클래스 연습]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1006 | (10/06) 상속]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1010 | (10/10) 한글날 (대체 휴업일) - 온라인 강의로 대체. Karel을 이용한 상속, 인터페이스 연습]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1013 | (10/13) 인터페이스, 중첩 클래스와 중첩 인터페이스]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1017 | (10/17) 예외 처리]]&lt;br /&gt;
&lt;br /&gt;
* (10/20) 중간고사&lt;br /&gt;
* (10/24) 중간고사&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1027 | (10/27) 기본 API 클래스 1]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1031 | (10/31) 기본 API 클래스 2]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1103 | (11/03) Thread 1]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1107 | (11/07) Thread 2]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1110 | (11/10) 제네릭]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1114 | (11/14) 람다식]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1117 | (11/17) 컬렉션 프레임워크]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1121 | (11/21) 스트림과 병렬처리]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1124 | (11/24) JavaFX 1]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1128 | (11/28) JavaFX 2]]&lt;br /&gt;
&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1201 | (12/01) JavaFX 3]]&lt;br /&gt;
* [[컴퓨터프로그래밍및실습 (2022년)/1205 | (12/05) IO 기반 입출력]]&lt;br /&gt;
&lt;br /&gt;
* (12/8) 기말고사&lt;br /&gt;
* (12/12) 기말고사&lt;br /&gt;
&lt;br /&gt;
[[category:컴퓨터프로그래밍및실습]]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
	<entry>
		<id>http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/0905&amp;diff=396</id>
		<title>컴퓨터프로그래밍및실습 (2022년)/0905</title>
		<link rel="alternate" type="text/html" href="http://dislab.hufs.ac.kr/w/index.php?title=%EC%BB%B4%ED%93%A8%ED%84%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EB%B0%8F%EC%8B%A4%EC%8A%B5_(2022%EB%85%84)/0905&amp;diff=396"/>
		<updated>2022-07-21T12:11:49Z</updated>

		<summary type="html">&lt;p&gt;Swpark: Swpark moved page 컴퓨터프로그래밍및실습 (2022년)/0908 to 컴퓨터프로그래밍및실습 (2022년)/0905 without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 변수 ==&lt;br /&gt;
* 변수란 기억 장소(메모리)에 대한 별칭이다.&lt;br /&gt;
&lt;br /&gt;
=== 변수의 선언 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int age;  // 정수(int) 값을 저장할 수 있는 age 변수 선언&lt;br /&gt;
double value; // 실수(double) 값을 저장할 수 있는 value 변수 선언&lt;br /&gt;
&lt;br /&gt;
int x, y, z;  // 여러 개를 선언할 수 있음&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 변수 이름을 붇이는 규칙 ===&lt;br /&gt;
# 첫 번째 글자는 문자이거나 $, _ 이어야 하고 숫자로 시작할 수 없다. (필수)&lt;br /&gt;
# 영어 대소문자가 구분된다. (필수)&lt;br /&gt;
# 첫 문자는 영어 소문자로 시작하되, 다른 단어가 붙을 경우 첫 문자는 대문자로 한다. (관례) (maxSpeed, firstName, carBodyColor)&lt;br /&gt;
# 문자 수(길이)의 제한은 없다.&lt;br /&gt;
# 자바 예약어는 사용할 수 없다. (필수) &lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ll&amp;gt;&lt;br /&gt;
분류                  | 예약어&lt;br /&gt;
기본 데이터 타입      | boolean, byte, char, short, int, long, float, double&lt;br /&gt;
접근 지정자           | private, protected, public&lt;br /&gt;
클래스와 관련된 것    | class, abstract, interface, extends, implements, enum&lt;br /&gt;
객체와 관련된 것      | new, instanceof, this, super, null&lt;br /&gt;
메소드와 관련된 것    | void, return&lt;br /&gt;
제어문과 관련된 것    | if, else, switch, case, default, for, do, while, break, continue&lt;br /&gt;
논리값                | true, false&lt;br /&gt;
예외 처리와 관련된 것 | try, catch, finally, throw, throws&lt;br /&gt;
기타                  | transient, volatile, package, import, synchronized, native, final, static, strictfp, assert&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 변수의 사용 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int score;    // 변수 선언&lt;br /&gt;
score = 90;   // 값 저장&lt;br /&gt;
&lt;br /&gt;
int score = 90; /// 선언과 동시에 값 저장&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Literal ===&lt;br /&gt;
* 리터럴(literal) : 소스 코드 내에서 직접 작성된 값&lt;br /&gt;
** 정수 리터럴 : 0, 75, -100 (10진수), 02, -04 (8진수), 0x5, 0xA, 0xB3, 0xac08 (16진수)&lt;br /&gt;
** 실수 리터럴 : 0.25, -3.14 (10진수), 5E7, 0.12E-5 (0.12×10&amp;lt;sup&amp;gt;-5&amp;lt;/sup&amp;gt;)&lt;br /&gt;
** 문자 리터럴 : 'A', '한', '\t', '\tn' &lt;br /&gt;
&amp;lt;table2 class=wikitable sep=bar head=top align=lll&amp;gt;&lt;br /&gt;
Escape 문자 | 용도                       | Unicode&lt;br /&gt;
\t          | 수평 탭                    | 0x0009&lt;br /&gt;
\n          | 줄 바꿈                    | 0x000A&lt;br /&gt;
\r          | 리턴                       | 0x000D&lt;br /&gt;
\&amp;quot;          | &amp;quot;(큰 따옴표)               | 0x0022&lt;br /&gt;
\           | '(작은 따옴표)             | 0x0027&lt;br /&gt;
\\          | \                          | 0x005C&lt;br /&gt;
\u16진수    | 16진수에 해당하는 유니코드 | 0x0000 ~ 0xFFFF&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 변수의 초기화 ===&lt;br /&gt;
* 초기화하지 않고 사용하면 오류&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int value;&lt;br /&gt;
int result = value + 10; // value 값을 초기화하지 않아 오류가 남&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 초기화하여 사용한 예&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int value = 30;&lt;br /&gt;
int result = value + 10;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 변수의 사용 범위 ===&lt;br /&gt;
* 변수는 블록 범위 내에서 정의, 사용할 수 있음&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class VariableScopeExample {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        int v1 = 15;&lt;br /&gt;
        if (v1 &amp;gt; 10) {&lt;br /&gt;
            int v2 = v1 - 10;&lt;br /&gt;
        }&lt;br /&gt;
        int v3 = v1 + v2 + 5; // v2 변수를 사용할 수 없기 때문에 컴파일 에러가 생김&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 데이터 타입 (Data Type) ==&lt;br /&gt;
&lt;br /&gt;
=== 기본(원시: primitive) 타입 ===&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=llll&amp;gt;&lt;br /&gt;
값의 종류 | 기본 타입 | 메모리 사용 크기  | 저장되는 값의 범위&lt;br /&gt;
정수      | byte      | 1 byte (8 bits)   | -2&amp;lt;sup&amp;gt;7&amp;lt;/sup&amp;gt; ~ 2&amp;lt;sup&amp;gt;7&amp;lt;/sup&amp;gt;-1 (-128 ~ 127)&lt;br /&gt;
          | char      | 2 bytes (16 bits) | 0 ~ 2&amp;lt;sup&amp;gt;16&amp;lt;/sup&amp;gt;-1 (\u0000 ~ \uFFFF, 0 ~ 65535)&lt;br /&gt;
          | short     | 2 bytes (16 bits) | -2&amp;lt;sup&amp;gt;15&amp;lt;/sup&amp;gt; ~ 2&amp;lt;sup&amp;gt;15&amp;lt;/sup&amp;gt;-1 (-32,768 ~ 32,767)&lt;br /&gt;
          | int       | 4 bytes (32 bits) | -2&amp;lt;sup&amp;gt;31&amp;lt;/sup&amp;gt; ~ 2&amp;lt;sup&amp;gt;31&amp;lt;/sup&amp;gt;-1 (-2,147,483,648 ~ 2,147,483,647)&lt;br /&gt;
          | long      | 8 bytes (64 bits) | -2&amp;lt;sup&amp;gt;63&amp;lt;/sup&amp;gt; ~ 2&amp;lt;sup&amp;gt;63&amp;lt;/sup&amp;gt;-1&lt;br /&gt;
실수      | float     | 4 bytes (32 bits) | (+/-)1.4E-45 ~ (+/-)13.4028235E38&lt;br /&gt;
          | double    | 8 bytes (64 bits) | (+/-)4.9E-324 ~ (+/-)1.7976931348623157E308&lt;br /&gt;
논리      | boolean   | 1 byte (8 bits)   | true, false&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 정수 타입 ===&lt;br /&gt;
* byte, char, short, int, long&lt;br /&gt;
* 음수는 2의 보수로 표현함&lt;br /&gt;
&lt;br /&gt;
==== byte ====&lt;br /&gt;
&amp;lt;table2 head=top sep=bar align=lr&amp;gt;&lt;br /&gt;
이진수   | 십진수&lt;br /&gt;
01111111 | 127&lt;br /&gt;
01111110 | 128&lt;br /&gt;
...      | ...&lt;br /&gt;
00000001 | 1&lt;br /&gt;
00000000 | 0&lt;br /&gt;
11111111 | -1&lt;br /&gt;
11111110 | -2&lt;br /&gt;
...      | ...&lt;br /&gt;
10000001 | -127&lt;br /&gt;
10000000 | -128&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class ByteExample {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        byte var1 = -128;&lt;br /&gt;
        byte var2 = -30;&lt;br /&gt;
        byte var3 = 0;&lt;br /&gt;
        byte var4 = 30;&lt;br /&gt;
        byte var5 = 127;&lt;br /&gt;
        // byte var6 = 128; // 컴파일 에러&lt;br /&gt;
&lt;br /&gt;
        System.out.println(var5);&lt;br /&gt;
        var5++;&lt;br /&gt;
        System.out.println(var1); // var1은 왜 음수가 되는가?&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
127&lt;br /&gt;
-128&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== char ====&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class CharExample {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        char c1 = 'A';&lt;br /&gt;
        char c2 = 65;&lt;br /&gt;
        char c3 = '\u0041'; // 10진수로 표현하면 65&lt;br /&gt;
&lt;br /&gt;
        char c4 = '가';&lt;br /&gt;
        char c5 = 44032;&lt;br /&gt;
        char c6 = '\uac00'; // 10진수로 표현하면 44032&lt;br /&gt;
&lt;br /&gt;
        int uniCode = c1;&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(c1);&lt;br /&gt;
        System.out.println(c2);&lt;br /&gt;
        System.out.println(c3);&lt;br /&gt;
        System.out.println(c4);&lt;br /&gt;
        System.out.println(c5);&lt;br /&gt;
        System.out.println(c6);&lt;br /&gt;
        System.out.println(uniCode);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
A&lt;br /&gt;
A&lt;br /&gt;
A&lt;br /&gt;
가&lt;br /&gt;
가&lt;br /&gt;
가&lt;br /&gt;
65&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* String과 char&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
String name = &amp;quot;홍길동&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
char c1 = '';  // 컴파일 에러&lt;br /&gt;
char c2 = ' '; // 에러가 나지 않음. 스페이스 문자&lt;br /&gt;
&lt;br /&gt;
String str = &amp;quot;&amp;quot;; // 빈 문자열&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== int ====&lt;br /&gt;
* 10진수로 10인 정수(int)의 경우 4 바이트로 다음과 같이 표현&lt;br /&gt;
&amp;lt;table2 class=wikitable sep=bar align=cccc&amp;gt;&lt;br /&gt;
00000000 | 00000000 | 00000000 | 00001010&lt;br /&gt;
1 byte   | 1 byte   | 1 byte   | 1 byte&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제 코드 (int &amp;amp; long)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class IntExample {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        int var1 = 10;  // 10진수로 저장&lt;br /&gt;
        int var2 = 012; // 8진수로 저장&lt;br /&gt;
        int var3 = 0xA; // 16진수로 저장&lt;br /&gt;
&lt;br /&gt;
        System.out.println(var1);&lt;br /&gt;
        System.out.println(var2);&lt;br /&gt;
        System.out.println(var3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
10&lt;br /&gt;
10&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== long ====&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class LongExample {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        long var1 = 10;&lt;br /&gt;
        long var2 = 20L;&lt;br /&gt;
        // long var3 = 1_0000_0000_0000; // 컴파일 에러&lt;br /&gt;
        long var4 = 1_0000_0000_0000L;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(var1);&lt;br /&gt;
        System.out.println(var2);&lt;br /&gt;
        System.out.println(var4);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
10&lt;br /&gt;
20&lt;br /&gt;
1000000000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실수 타입(float &amp;amp; double) ===&lt;br /&gt;
* + m × 10&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&lt;br /&gt;
** + : 부호&lt;br /&gt;
** m : 가수(mantissa)&lt;br /&gt;
** n : 지수(exponent)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=ccrcccc&amp;gt;&lt;br /&gt;
타입   | 부호  | 지수   | 가수   | 비트 수 | 바이트 수&lt;br /&gt;
float  | 1 bit | 8 bit  | 23 bit | 32 bit  | 4 byte&lt;br /&gt;
double | 1 bit | 11 bit | 52 bit | 64 bit  | 8 byte&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class FloatDoubleExample {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        // 실수값 저장&lt;br /&gt;
        double var1 = 3.14;&lt;br /&gt;
        // float var2 = 3.14; // 컴파일 에러 (Type mismatch)&lt;br /&gt;
        float var3 = 3.14F;&lt;br /&gt;
&lt;br /&gt;
        // 정밀도 테스트&lt;br /&gt;
        double var4 = 0.1234567890123456789;&lt;br /&gt;
        float var5 = 0.1234567890123456789F;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;var1: &amp;quot; + var1);&lt;br /&gt;
        System.out.println(&amp;quot;var3: &amp;quot; + var3); // 교재 오류&lt;br /&gt;
        System.out.println(&amp;quot;var4: &amp;quot; + var4);&lt;br /&gt;
        System.out.println(&amp;quot;var5: &amp;quot; + var5);&lt;br /&gt;
&lt;br /&gt;
        // e 사용하기&lt;br /&gt;
        int var6 = 3_000_000;&lt;br /&gt;
        double var7 = 3e6;&lt;br /&gt;
        float var8 = 3e6F;&lt;br /&gt;
        double var9 = 2e-3;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;var6: &amp;quot; + var6);&lt;br /&gt;
        System.out.println(&amp;quot;var7: &amp;quot; + var7);&lt;br /&gt;
        System.out.println(&amp;quot;var8: &amp;quot; + var8);&lt;br /&gt;
        System.out.println(&amp;quot;var9: &amp;quot; + var9);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
var1: 3.14&lt;br /&gt;
var3: 3.14&lt;br /&gt;
var4: 0.12345678901234568&lt;br /&gt;
var5: 0.12345679&lt;br /&gt;
var6: 3000000&lt;br /&gt;
var7: 3000000.0&lt;br /&gt;
var8: 3000000.0&lt;br /&gt;
var9: 0.002&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 논리 타입(boolean) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
boolean stop = true;&lt;br /&gt;
if (stop) {&lt;br /&gt;
    System.out.println(&amp;quot;중지합니다.&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
    System.out.println(&amp;quot;시작합니다.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 타입 변환 ==&lt;br /&gt;
&lt;br /&gt;
=== 자동 변환 타입 ===&lt;br /&gt;
* 큰 타입에서 작은 타입으로의 변환&lt;br /&gt;
* byte(1) &amp;lt; short(2) &amp;lt; int(4) &amp;lt; long(8) &amp;lt; float(4) &amp;lt; double(8)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
byte byteValue = 200;&lt;br /&gt;
int intValue = byteValue; // 자동 형 변환이 일어난다. 00000000 00000000 00000000 00001010 &amp;lt;- 00001010&lt;br /&gt;
&lt;br /&gt;
int intValue = 200;&lt;br /&gt;
double doubleValue = intValue; // 200.0 &amp;lt;- 200&lt;br /&gt;
&lt;br /&gt;
char charValue = 'A';&lt;br /&gt;
int intValue = charValue;  // 65 &amp;lt;- 'A'&lt;br /&gt;
&lt;br /&gt;
byteValue = 65;&lt;br /&gt;
charValue = byteValue; // 컴파일 오류. 1 바이트 크기의 데이터를 2 바이트 크기의 메모리에 저장 시도&lt;br /&gt;
char charData = (char) byteData; // 강제 형변환&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 강제 타입 변환 ===&lt;br /&gt;
* 큰 크기의 타입에서 작은 크기의 타입에 대입할 경우&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// 값을 잃음&lt;br /&gt;
int intValue = 103029770; // 00000100 00100100 00011100 00001010&lt;br /&gt;
byte byteValue = (byte) intValue; // 00001010 &amp;lt;- 00000100 00100100 00011100 00001010&lt;br /&gt;
&lt;br /&gt;
// 값을 잃지 않음&lt;br /&gt;
intValue = 10;&lt;br /&gt;
byteValue = (byte) intValue; // 00001010 &amp;lt;- 00000000 00000000 00000000 00001010&lt;br /&gt;
&lt;br /&gt;
long longValue = 300;&lt;br /&gt;
int intValue = (int) longValue;&lt;br /&gt;
&lt;br /&gt;
intValue = 'A';&lt;br /&gt;
char charValue = (char) intValue; // 문자는 2 바이트 값이므로 값 유지됨&lt;br /&gt;
System.out.println(charValue);&lt;br /&gt;
&lt;br /&gt;
double doubleValue = 3.14;&lt;br /&gt;
intValue = (int) doubleValue; // 3 &amp;lt;-- 3.14&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 최대값 &amp;amp; 최소값&lt;br /&gt;
&amp;lt;table2 class=wikitable head=top sep=bar align=lll&amp;gt;&lt;br /&gt;
기본 타입 | 최대값 상수       | 최소값 상수&lt;br /&gt;
byte      | Byte.MAX_VALUE    | Byte.MIN_VALUE&lt;br /&gt;
short     | Short.MAX_VALUE   | Short.MIN_VALUE&lt;br /&gt;
int       | Integer.MAX_VALUE | Integer.MIN_VALUE&lt;br /&gt;
long      | Long.MAX_VALUE    | Long.MIN_VALUE&lt;br /&gt;
float     | Float.MAX_VALUE   | Float.MIN_VALUE&lt;br /&gt;
double    | Double.MAX_VALUE  | Double.MIN_VALUE&lt;br /&gt;
&amp;lt;/table2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 정수 타입을 실수 타입으로 변환할 때 정밀도 손실 발생 ====&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class FromIntToFloatDouble {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        int num1 = 123_456_780;&lt;br /&gt;
&lt;br /&gt;
        float num2 = num1;&lt;br /&gt;
        int num3 = (int) num2;      // 정밀도 손실 발생&lt;br /&gt;
&lt;br /&gt;
        int result = num1 - num3;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
&lt;br /&gt;
        double num4 = num1;&lt;br /&gt;
        int num5 = (int) num4;      // 정밀도 손실 없음&lt;br /&gt;
&lt;br /&gt;
        result = num1 - num5;&lt;br /&gt;
        System.out.println(result);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
-4&lt;br /&gt;
0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 연산식에서의 자동 타입 변환 ===&lt;br /&gt;
* 4 바이트 보다 작은 정수(byte, char, short)는 4 바이트 크기의 int로 변환된 후 연산된다.&lt;br /&gt;
* 정수 연산에서 피연산자 중 하나가 long이면 long으로 변환된 후 연산된다.&lt;br /&gt;
* float 끼리의 연산은 float이지만, 피연산자 중 하나가 double이면 double로 변환된 후 연산된다.&lt;br /&gt;
* 실수 리터럴은 double이다. &lt;br /&gt;
&lt;br /&gt;
* 예제 코드&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class OperationPromotionExample {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        byte byteValue1 = 10;&lt;br /&gt;
        byte byteValue2 = 20;&lt;br /&gt;
        // byte byteValue3 = byteValue1 + byteValue2; // 컴파일 에러. byte는 int로 변환된 후 연산됨&lt;br /&gt;
        int intValue1 = byteValue1 + byteValue2;&lt;br /&gt;
        System.out.println(intValue1);&lt;br /&gt;
&lt;br /&gt;
        char charValue1 = 'A';&lt;br /&gt;
        char charValue2 = 1;&lt;br /&gt;
        // char charValue3 = charValue1 + charValue2; // 컴파일 에러. char는 int로 변환된 후 연산됨&lt;br /&gt;
        int intValue2 = charValue1 + charValue2;&lt;br /&gt;
        System.out.println(&amp;quot;유니코드=&amp;quot; + intValue2);&lt;br /&gt;
        System.out.println((char)intValue2);&lt;br /&gt;
&lt;br /&gt;
        int intValue3 = 10;&lt;br /&gt;
        int intValue4 = intValue3 / 4;&lt;br /&gt;
        System.out.println(intValue4);&lt;br /&gt;
&lt;br /&gt;
        int intValue5 = 10;&lt;br /&gt;
        // int intValue6 = 10 / 4.0; // 컴파일 에러&lt;br /&gt;
        double doubleValue = intValue5 / 4.0;&lt;br /&gt;
        System.out.println(doubleValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행 결과&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
30&lt;br /&gt;
유니코드=66&lt;br /&gt;
B&lt;br /&gt;
2&lt;br /&gt;
2.5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category:컴퓨터프로그래밍및실습]]&lt;/div&gt;</summary>
		<author><name>Swpark</name></author>
	</entry>
</feed>