<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>보통사람</title>
    <link>https://pej4303.tistory.com/</link>
    <description>안녕하세요.  보통사람의 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Thu, 18 Jun 2026 23:49:19 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>pej4303</managingEditor>
    <item>
      <title>hibernate 쿼리 파라미터 바인딩 출력</title>
      <link>https://pej4303.tistory.com/82</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hibernate_logo.png&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wocxp/btsq1Kqkiir/UwYxZOdL6KNYbpGwzeIkok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wocxp/btsq1Kqkiir/UwYxZOdL6KNYbpGwzeIkok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wocxp/btsq1Kqkiir/UwYxZOdL6KNYbpGwzeIkok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwocxp%2Fbtsq1Kqkiir%2FUwYxZOdL6KNYbpGwzeIkok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;457&quot; height=&quot;373&quot; data-filename=&quot;hibernate_logo.png&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;환경설정&lt;br /&gt;&lt;br /&gt;개발툴 : InteliJ&lt;br /&gt;Spring Boot : 2.7.14&lt;br /&gt;Hibernate : 5.6.15&lt;br /&gt;Java : 11&lt;br /&gt;Gradle&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;검색을 해보면 application.properties 파일에 아래의 내용처럼 추가하면 파라미터 바인딩이 출력된다고 하는데,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;나의 경우에는 그렇게 해도 나오지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691900946333&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;logging.level.org.hibernate.SQL = debug
logging.level.org.hibernate.type.descriptor.sql = trace&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1691901046644&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;hibernate 의 완성된(?) 쿼리를 확인 하는 방법 문의 드립니다 - 인프런 | 질문 &amp;amp; 답변&quot; data-og-description=&quot;안녕하세요.IntelliJ 를 통해서hibernate 에서 어떤식으로 쿼리를 만들어 내는지 확인이 가능한데요,파라미터는 ? 표로 표시됩니다.혹시 ? 에 어떤 값이 최종적으로 들어왔는지도 같이 확인 할 수 있&quot; data-og-host=&quot;www.inflearn.com&quot; data-og-source-url=&quot;https://www.inflearn.com/questions/59014/hibernate-%EC%9D%98-%EC%99%84%EC%84%B1%EB%90%9C-%EC%BF%BC%EB%A6%AC%EB%A5%BC-%ED%99%95%EC%9D%B8-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EB%AC%B8%EC%9D%98-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4&quot; data-og-url=&quot;https://www.inflearn.com/questions/59014/hibernate-%EC%9D%98-%EC%99%84%EC%84%B1%EB%90%9C-%EC%BF%BC%EB%A6%AC%EB%A5%BC-%ED%99%95%EC%9D%B8-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EB%AC%B8%EC%9D%98-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/E9zyM/hyTCJ4mXw2/BeNdfvDwEmSmc3UhQRxAZk/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_462,https://scrap.kakaocdn.net/dn/H0SxH/hyTCDJRKin/8imhSHYycnVLMT9fcxkfQk/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_462,https://scrap.kakaocdn.net/dn/OiOlK/hyTCLA7UY8/iBebOqtoPDPaEbfueEbfNk/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/questions/59014/hibernate-%EC%9D%98-%EC%99%84%EC%84%B1%EB%90%9C-%EC%BF%BC%EB%A6%AC%EB%A5%BC-%ED%99%95%EC%9D%B8-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EB%AC%B8%EC%9D%98-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.inflearn.com/questions/59014/hibernate-%EC%9D%98-%EC%99%84%EC%84%B1%EB%90%9C-%EC%BF%BC%EB%A6%AC%EB%A5%BC-%ED%99%95%EC%9D%B8-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EB%AC%B8%EC%9D%98-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/E9zyM/hyTCJ4mXw2/BeNdfvDwEmSmc3UhQRxAZk/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_462,https://scrap.kakaocdn.net/dn/H0SxH/hyTCDJRKin/8imhSHYycnVLMT9fcxkfQk/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=751_416_794_462,https://scrap.kakaocdn.net/dn/OiOlK/hyTCLA7UY8/iBebOqtoPDPaEbfueEbfNk/img.png?width=768&amp;amp;height=500&amp;amp;face=0_0_768_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;hibernate 의 완성된(?) 쿼리를 확인 하는 방법 문의 드립니다 - 인프런 | 질문 &amp;amp; 답변&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요.IntelliJ 를 통해서hibernate 에서 어떤식으로 쿼리를 만들어 내는지 확인이 가능한데요,파라미터는 ? 표로 표시됩니다.혹시 ? 에 어떤 값이 최종적으로 들어왔는지도 같이 확인 할 수 있&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.inflearn.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 참고하여하니 원하는 결과가 나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. build.gradle 파일에 추가&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1691901460280&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. logback.xml 파일 추가&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;경로 : resources &amp;gt; logback.xml&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691901693576&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;configuration&amp;gt;
    &amp;lt;appender name=&quot;STDOUT&quot; class=&quot;ch.qos.logback.core.ConsoleAppender&quot;&amp;gt;
        &amp;lt;layout class=&quot;ch.qos.logback.classic.PatternLayout&quot;&amp;gt;
            &amp;lt;Pattern&amp;gt;%d{HH:mm} %-5level %logger{36} - %msg%n&amp;lt;/Pattern&amp;gt;
        &amp;lt;/layout&amp;gt;
    &amp;lt;/appender&amp;gt;

    &amp;lt;logger name=&quot;org.hibernate.type&quot; level=&quot;trace&quot; /&amp;gt;

    &amp;lt;root level=&quot;info&quot;&amp;gt;
        &amp;lt;appender-ref ref=&quot;STDOUT&quot; /&amp;gt;
    &amp;lt;/root&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. 실행 결과&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ8w0w/btsq0Dk1nVd/8Vn7ZWW7TZ1V56vfHdGMcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ8w0w/btsq0Dk1nVd/8Vn7ZWW7TZ1V56vfHdGMcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ8w0w/btsq0Dk1nVd/8Vn7ZWW7TZ1V56vfHdGMcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ8w0w%2Fbtsq0Dk1nVd%2F8Vn7ZWW7TZ1V56vfHdGMcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;598&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;참조&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.inflearn.com/questions/59014/hibernate-%EC%9D%98-%EC%99%84%EC%84%B1%EB%90%9C-%EC%BF%BC%EB%A6%AC%EB%A5%BC-%ED%99%95%EC%9D%B8-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EB%AC%B8%EC%9D%98-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/questions/59014/hibernate-%EC%9D%98-%EC%99%84%EC%84%B1%EB%90%9C-%EC%BF%BC%EB%A6%AC%EB%A5%BC-%ED%99%95%EC%9D%B8-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EB%AC%B8%EC%9D%98-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JPA</category>
      <category>hibernate</category>
      <author>pej4303</author>
      <guid isPermaLink="true">https://pej4303.tistory.com/82</guid>
      <comments>https://pej4303.tistory.com/82#entry82comment</comments>
      <pubDate>Sun, 13 Aug 2023 13:45:52 +0900</pubDate>
    </item>
    <item>
      <title>Spring Boot  Quartz 연동 예제</title>
      <link>https://pej4303.tistory.com/81</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;spring_boot_logo.png&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo9IBD/btsq8HlODTL/PdQkKo2L9mYaYBGcQPK4t1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo9IBD/btsq8HlODTL/PdQkKo2L9mYaYBGcQPK4t1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo9IBD/btsq8HlODTL/PdQkKo2L9mYaYBGcQPK4t1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo9IBD%2Fbtsq8HlODTL%2FPdQkKo2L9mYaYBGcQPK4t1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;979&quot; height=&quot;398&quot; data-filename=&quot;spring_boot_logo.png&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;환경설정&lt;br /&gt;&lt;br /&gt;개발툴 : InteliJ&lt;br /&gt;Spring Boot : 2.7.14&lt;br /&gt;Quartz : 2.3.2&lt;br /&gt;Java : 11&lt;br /&gt;Gradle&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. bulid.gradle 파일에 추가&lt;/h3&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;implementation &quot;org.springframework.boot:spring-boot-starter-quartz&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. @Scheduled 어노테이션을 이용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스케쥴러를 적용할 메소드에 @Scheduled 어노테이션을 사용한다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;@Controller
public class QuartzController {
    @Scheduled(cron = &quot;0/5 * * * * ?&quot;)
    public void everyFiveSeconds() {
        DateTimeFormatter patten = DateTimeFormatter.ofPattern(&quot;yyyy-MM-dd HH:mm:ss&quot;);
        String formatDt = patten.format(LocalDateTime.now());

        System.out.println(formatDt);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@SpringBootApplication이 붙은 파일에 @EnableScheduling 어노테이션 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 하지 않으면 스케쥴러가 실행되지 않는다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;@SpringBootApplication
@EnableScheduling
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;@EnableScheduling&lt;br /&gt;&lt;br /&gt;스케쥴러를 기능을 켜는 역할을 하며, @Scheduled 어노테이션을 찾아서 실행을 시킨다.&lt;br /&gt;&lt;br /&gt;Enables Spring's scheduled task execution capability, similar to functionality found in Spring's XML namespace.&lt;br /&gt;This enables detection of @Scheduled annotations on any Spring-managed bean in the container.&lt;/blockquote&gt;
&lt;figure id=&quot;og_1691855322720&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;EnableScheduling (Spring Framework 6.0.11 API)&quot; data-og-description=&quot;Enables Spring's scheduled task execution capability, similar to functionality found in Spring's XML namespace. To be used on @Configuration classes as follows: @Configuration @EnableScheduling public class AppConfig { // various @Bean definitions } This e&quot; data-og-host=&quot;docs.spring.io&quot; data-og-source-url=&quot;https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html&quot; data-og-url=&quot;https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;EnableScheduling (Spring Framework 6.0.11 API)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Enables Spring's scheduled task execution capability, similar to functionality found in Spring's XML namespace. To be used on @Configuration classes as follows: @Configuration @EnableScheduling public class AppConfig { // various @Bean definitions } This e&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.spring.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 실행 결과&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5초마다 실행 된것을 확인 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DP8JB/btsq2iG1IWP/ccEvNBdhAQE70beKCNg4y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DP8JB/btsq2iG1IWP/ccEvNBdhAQE70beKCNg4y1/img.png&quot; data-alt=&quot;스케쥴러 실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DP8JB/btsq2iG1IWP/ccEvNBdhAQE70beKCNg4y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDP8JB%2Fbtsq2iG1IWP%2FccEvNBdhAQE70beKCNg4y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;564&quot; height=&quot;281&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스케쥴러 실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참조&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html&quot;&gt;https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Spring</category>
      <category>Quartz</category>
      <category>springboot</category>
      <author>pej4303</author>
      <guid isPermaLink="true">https://pej4303.tistory.com/81</guid>
      <comments>https://pej4303.tistory.com/81#entry81comment</comments>
      <pubDate>Sun, 13 Aug 2023 00:34:53 +0900</pubDate>
    </item>
    <item>
      <title>[오류] 톰캣 프로세스 여러개 뜨는 경우</title>
      <link>https://pej4303.tistory.com/80</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;환경버전&lt;br /&gt;&lt;br /&gt;개발툴 : 이클립스&lt;br /&gt;Spring : 4.3.3&lt;br /&gt;Quartz : 2.3.0&lt;br /&gt;Tomcat : 8.5&amp;nbsp;&amp;nbsp;&lt;br /&gt;서버 :CentOS&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 오류&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;개발서버에서 톰캣 프로세스가 여러개가 뜨면서 메모리 너무 많이 잡아먹는 현상이 발생하였다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;netstate -tnlp 하면 8080포트는 하나만 나오고, ps -ef | grep tomcat 하면 여러개 나왔다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 원인&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;검색을 하다가 아래의 글을 보고 quartz 스케쥴러의 문제라고 생각이 들었다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;톰캣 서버가 종료되어도 이미 실행된 job 스레드는 종료되지 않고 계속 남는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1691768576917&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Tomcat]  톰켓 프로세스 종료 이슈 (shutdown 시 PID 남음)&quot; data-og-description=&quot;이슈 내용 Tomcat을 종료하는 스크립트(shutdown.sh)를 실행했지만 프로세스가 죽지 않고 그대로 남는다. netstate -tnlp 상으로는 확인되지 않고, ps -ef 상으로는 PID 번호가 확인된다. 기존 프로세스를 kil&quot; data-og-host=&quot;log4day.tistory.com&quot; data-og-source-url=&quot;https://log4day.tistory.com/m/59&quot; data-og-url=&quot;https://log4day.tistory.com/59&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/beZ6Ig/hyTCyOQEJc/PG38Nig0SBJXJfJMJ9bO2K/img.jpg?width=539&amp;amp;height=371&amp;amp;face=0_0_539_371,https://scrap.kakaocdn.net/dn/sCvMD/hyTCJv4i67/YIqM4bdO8WVTILxoOZcGE1/img.jpg?width=539&amp;amp;height=371&amp;amp;face=0_0_539_371&quot;&gt;&lt;a href=&quot;https://log4day.tistory.com/m/59&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://log4day.tistory.com/m/59&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/beZ6Ig/hyTCyOQEJc/PG38Nig0SBJXJfJMJ9bO2K/img.jpg?width=539&amp;amp;height=371&amp;amp;face=0_0_539_371,https://scrap.kakaocdn.net/dn/sCvMD/hyTCJv4i67/YIqM4bdO8WVTILxoOZcGE1/img.jpg?width=539&amp;amp;height=371&amp;amp;face=0_0_539_371');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Tomcat] 톰켓 프로세스 종료 이슈 (shutdown 시 PID 남음)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이슈 내용 Tomcat을 종료하는 스크립트(shutdown.sh)를 실행했지만 프로세스가 죽지 않고 그대로 남는다. netstate -tnlp 상으로는 확인되지 않고, ps -ef 상으로는 PID 번호가 확인된다. 기존 프로세스를 kil&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;log4day.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. 해결&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;destroy-method 속성을 이용해서 &lt;span style=&quot;font-family: 'Nanum Gothic'; color: #333333; text-align: start;&quot;&gt;SchedulerFactoryBean 클래스에 있는 &lt;/span&gt;destroy() 메소드를 추가해줬다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691840172528&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;bean id=&quot;qcrmJobScheduler&quot; class=&quot;org.springframework.scheduling.quartz.SchedulerFactoryBean&quot; destroy-method=&quot;destroy&quot;&amp;gt;
    &amp;lt;property name=&quot;triggers&quot;&amp;gt;
        &amp;lt;list&amp;gt;
            &amp;lt;ref bean=&quot;testJobTrigger&quot; /&amp;gt;
        &amp;lt;/list&amp;gt;
    &amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;destory-method-속성&quot; style=&quot;color: #333333; text-align: start;&quot; data-line=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;하지만 모든 job을 종료시키는 destroy() 메소드는 빈 소멸시 자동으로 호출되는 것 같은데, 왜 실행되지 않았던걸까?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691838897742&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * Shut down the Quartz scheduler on bean factory shutdown,
 * stopping all scheduled jobs.
 */
@Override
public void destroy() throws SchedulerException {
    if (this.scheduler != null) {
        logger.info(&quot;Shutting down Quartz Scheduler&quot;);
        this.scheduler.shutdown(this.waitForJobsToCompleteOnShutdown);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;+ 추가(2023.10.13)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위 방법으로 적용 후에도&amp;nbsp; 계속 발생하여 젠킨스 배포시 실행중인 톰캣 프로세스 모두 종료시키는 쉘 스크립트를 추가하였다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1697377864415&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash

tomcat_pids=$(ps aux | grep tomcat | grep java | grep -v grep | awk '{print $2}')

if [ -n &quot;$tomcat_pids&quot; ]; then
    for pid in $tomcat_pids; do
        echo &quot;PID: $pid&quot;
        kill -9 $pid
    done
fi&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;참조&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;a href=&quot;https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/quartz/SchedulerFactoryBean.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/quartz/SchedulerFactoryBean.html&lt;/a&gt;&lt;a href=&quot;https://log4day.tistory.com/m/59&quot;&gt;https://log4day.tistory.com/m/59&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://log4day.tistory.com/m/59&quot;&gt;https://log4day.tistory.com/m/59&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>오류</category>
      <category>Tomcat</category>
      <category>오류</category>
      <author>pej4303</author>
      <guid isPermaLink="true">https://pej4303.tistory.com/80</guid>
      <comments>https://pej4303.tistory.com/80#entry80comment</comments>
      <pubDate>Sat, 12 Aug 2023 00:45:38 +0900</pubDate>
    </item>
    <item>
      <title>[오류] https 도메인인데 request.isSecure() return false인 경우</title>
      <link>https://pej4303.tistory.com/79</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 오류&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;request.isSecure() 메소드를 이용해서 js를 분기처리 하는데 SSL 적용이 된 운영서버에서 http 리소스가 로드되어서 에러가 발생하였다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691767163865&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%
   if( !request.isSecure() ) {
%&amp;gt;
	&amp;lt;!-- http --&amp;gt;
&amp;lt;%
    } else {
%&amp;gt;
	&amp;lt;!-- https --&amp;gt;
&amp;lt;%
    }
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 원인&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;web서버에서 was서버를 호출할때는 http 통신이기 때문에 isSecure() 메소드에서 false가 나온 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1613&quot; data-origin-height=&quot;603&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VAZFq/btsq2kYHAF9/r0CBvQcd7i8KHtmGS7BAf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VAZFq/btsq2kYHAF9/r0CBvQcd7i8KHtmGS7BAf0/img.png&quot; data-alt=&quot;클라이언트 - 서버 통신&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VAZFq/btsq2kYHAF9/r0CBvQcd7i8KHtmGS7BAf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVAZFq%2Fbtsq2kYHAF9%2Fr0CBvQcd7i8KHtmGS7BAf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1613&quot; height=&quot;603&quot; data-origin-width=&quot;1613&quot; data-origin-height=&quot;603&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클라이언트 - 서버 통신&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. 해결&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1691767327167&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;방법1) 
request.getHeader(&quot;x-forwarded-proto&quot;)

방법2) 
request.getRequestURL().indexOf(&quot;http://&quot;) != -1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위와 같이 2가지 방법이 있는데 처음에는 x-forwarded-proto를 이용해서 하였으나 로드밸런서가 없는 로컬과 개발에서는 null로 나와서 방법 2로 변경하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;x-forwarded-proto : 클라이언트가 로드밸런서에 접속할 때 사용한 프토토콜을&amp;nbsp;식별하는 표준 헤더&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;참조&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;a href=&quot;https://zetawiki.com/wiki/X-Forwarded-Proto&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://zetawiki.com/wiki/X-Forwarded-Proto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>오류</category>
      <category>https</category>
      <category>오류</category>
      <author>pej4303</author>
      <guid isPermaLink="true">https://pej4303.tistory.com/79</guid>
      <comments>https://pej4303.tistory.com/79#entry79comment</comments>
      <pubDate>Thu, 10 Aug 2023 23:15:41 +0900</pubDate>
    </item>
    <item>
      <title>[오류] 팝업 여러개 띄울때 화면 reload 발생</title>
      <link>https://pej4303.tistory.com/78</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 오류&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;A팝업 -&amp;gt; B팝업 -&amp;gt; C팝업으로 호출하는 경우 B팝업에서만 팝업 호출 시 해당 화면이 reload 되는 현상이 발생했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 원인&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1690728011599&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form&amp;gt;
    &amp;lt;button onclick=&quot;test();&quot;&amp;gt;&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;form 태그 안에&amp;nbsp; button 태그가 1개만 있는 경우에 onclick() 이벤트와 동시에 submit()도 같이 동작&lt;/b&gt;된다. 그래서 발생한 오류였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. 해결&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1690728269984&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 방법1)
&amp;lt;form id=&quot;testForm&quot; method=&quot;post&quot; target=&quot;iframe1&quot;&amp;gt;
    &amp;lt;iframe id=&quot;iframe1&quot; name=&quot;iframe1&quot; style=&quot;display:none&quot;&amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/form&amp;gt;

// 방법2)
&amp;lt;form id=&quot;testForm&quot; method=&quot;post&quot; target=&quot;iframe1&quot;&amp;gt;
    &amp;lt;button type=&quot;button&quot; onclick=&quot;test();&quot;&amp;gt;&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이런 방법 말고도 검색해보면 다른 방법이 많이 있지만 나의 경우에는 이 2가지 방법으로 했을 때 오류가 발생하지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;button 태그에 대해서 좀 더 알아보다가 재미난 글을 발견하였다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1690728771876&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;버튼에 타입을 쓰는 이유 (button type=&amp;quot;button&amp;quot;)&quot; data-og-description=&quot;프롤로그 가끔 이렇게 type을 명시한 버튼을 마주칠 때가 있는데 전 항상 궁금하더라구요. &amp;quot;아니 버튼이면 버튼이지 버튼 타입 버튼은 대체 뭐람&amp;quot; 그러고보면 비슷하게 타입을 명시하는 이라는 &quot; data-og-host=&quot;nykim.work&quot; data-og-source-url=&quot;https://nykim.work/96&quot; data-og-url=&quot;https://nykim.work/96&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yAwlq/hyTvk3IuhX/rDzuwjV9XbHBuNGDLNEtZ1/img.png?width=800&amp;amp;height=430&amp;amp;face=0_0_800_430,https://scrap.kakaocdn.net/dn/blLXNh/hyTveh8c1H/wx72GHonLIlM7k19YWH7L0/img.png?width=800&amp;amp;height=430&amp;amp;face=0_0_800_430,https://scrap.kakaocdn.net/dn/bUxDbZ/hyTtutmETj/fDzLW3pNZ4mluclMzHdPG0/img.png?width=1163&amp;amp;height=716&amp;amp;face=0_0_1163_716&quot;&gt;&lt;a href=&quot;https://nykim.work/96&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nykim.work/96&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yAwlq/hyTvk3IuhX/rDzuwjV9XbHBuNGDLNEtZ1/img.png?width=800&amp;amp;height=430&amp;amp;face=0_0_800_430,https://scrap.kakaocdn.net/dn/blLXNh/hyTveh8c1H/wx72GHonLIlM7k19YWH7L0/img.png?width=800&amp;amp;height=430&amp;amp;face=0_0_800_430,https://scrap.kakaocdn.net/dn/bUxDbZ/hyTtutmETj/fDzLW3pNZ4mluclMzHdPG0/img.png?width=1163&amp;amp;height=716&amp;amp;face=0_0_1163_716');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;버튼에 타입을 쓰는 이유 (button type=&quot;button&quot;)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;프롤로그 가끔 이렇게 type을 명시한 버튼을 마주칠 때가 있는데 전 항상 궁금하더라구요. &quot;아니 버튼이면 버튼이지 버튼 타입 버튼은 대체 뭐람&quot; 그러고보면 비슷하게 타입을 명시하는 이라는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nykim.work&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;요약하자면 &lt;b&gt;button 태그 type에는 reset, submit, button 이 있으며 기본값은 submit으로 지정&lt;/b&gt;된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그래서 form 태그 안에 button 태그가 1개만 있는 경우에 submit()이 될 수 있는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;참조&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;a href=&quot;https://nykim.work/96&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nykim.work/96&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>오류</category>
      <category>HTML</category>
      <category>오류</category>
      <author>pej4303</author>
      <guid isPermaLink="true">https://pej4303.tistory.com/78</guid>
      <comments>https://pej4303.tistory.com/78#entry78comment</comments>
      <pubDate>Sun, 30 Jul 2023 23:56:54 +0900</pubDate>
    </item>
    <item>
      <title>[오류] 자동으로 도메인에 https가 붙는 경우</title>
      <link>https://pej4303.tistory.com/77</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 오류&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발서버 https 적용으로 아래와 같이 http 요청 블락 에러가 발생하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1690705039973&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;This request has been blocked; the content must be served over HTTPS.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 아래의 메타 태그를 추가해 줬다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1690705142662&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;meta http-equiv=&quot;Content-Security-Policy&quot; content=&quot;upgrade-insecure-requests&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 개발서버 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;https&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;적용을 해제하면서부터 화면 접속시 자동으로 https:// 로 붙어서 js, css를 읽는 경우가 발생하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 원인&lt;/h3&gt;
&lt;pre id=&quot;code_1690720585980&quot; class=&quot;routeros&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;meta http-equiv=&quot;Content-Security-Policy&quot; content=&quot;upgrade-insecure-requests&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;https때문에 추가했던 메타 태그의 문제로, &lt;b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;content-security-policy를 설정할 경우 자동으로 https로 호출해 주는 것이었다.&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;The HTTP Content-Security-Policy (CSP) upgrade-insecure-requests&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;directive instructs user agents to treat all of a site's insecure URLs (those served over HTTP) as though they have been replaced with secure URLs (those served over HTTPS).&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;HTTP Content-Security-Policy(CSP) upgrade-insecure-requests 지시문은 사이트의 모든 안전하지 않은 URL(HTTP를 통해 제공되는 URL)을 보안 URL(HTTPS를 통해 제공되는 URL)로 대체된 것처럼 처리하도록 사용자 에이전트에 지시합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1690720696155&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;CSP: upgrade-insecure-requests - HTTP | MDN&quot; data-og-description=&quot;The HTTP Content-Security-Policy (CSP) upgrade-insecure-requests directive instructs user agents to treat all of a site's insecure URLs (those served over HTTP) as though they have been replaced with secure URLs (those served over HTTPS). This directive is&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests&quot; data-og-url=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bO0qRC/hyTvhToUG3/pT6ArgfR9ZbRRKLexFEJcK/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bO0qRC/hyTvhToUG3/pT6ArgfR9ZbRRKLexFEJcK/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;CSP: upgrade-insecure-requests - HTTP | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The HTTP Content-Security-Policy (CSP) upgrade-insecure-requests directive instructs user agents to treat all of a site's insecure URLs (those served over HTTP) as though they have been replaced with secure URLs (those served over HTTPS). This directive is&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. 해결&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해당 태그를 주석처리 하면 현상은 해결되지만, 개발서버에 https 적용 시 http 요청 블락 에러를 이 방법 말고 다른 방법으로 해야 될 것 같다. 로컬은 http인데 개발서버는 https인 경우에는 이 메타태그를 사용하는 것은 좋은 방법이 아닌 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;참조&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>오류</category>
      <category>https</category>
      <category>오류</category>
      <author>pej4303</author>
      <guid isPermaLink="true">https://pej4303.tistory.com/77</guid>
      <comments>https://pej4303.tistory.com/77#entry77comment</comments>
      <pubDate>Sun, 30 Jul 2023 21:53:34 +0900</pubDate>
    </item>
    <item>
      <title>[Study-14주차] 제네릭(Generics)</title>
      <link>https://pej4303.tistory.com/64</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; letter-spacing: -1px; font-family: 'Nanum Gothic';&quot;&gt;목표&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic';&quot;&gt;자바의 제네릭에 대해 학습하세요.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; letter-spacing: -1px; font-family: 'Nanum Gothic';&quot;&gt;학습할 것 (필수)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;제네릭 사용법&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;제네릭 주요 개념 (바운디드 타입, 와일드 카드)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;제네릭 메소드 만들기&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Erasure&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0. 제네릭(Generics)&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;어떤 타입이든 한 가지 타입으로 담을 수 있음&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;클래스나 메소드에서 컴파일시 타입 체크를 해주는 기능을 함&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;장점&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;타입 안전성을 제공&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;타입 체크와 형변환을 생략 할 수 있으므로 코드가 간결해짐&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;다른 타입의 객체로 저장되는 것을 방지하며 원래의 타입과 다른 타입으로 형변환 되어 발생 할 수 있는 오류를 줄여줌&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 제네릭 사용법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;선언하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1614341966494&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MyGenerics&amp;lt;T&amp;gt; {
    // T : 타입변수 
    T name;
    
    public void setName(T name) {
        this.name = name;
    }
    
    public T getName() {
        return name;
    }
}

public class GenericsTest {

    public static void main(String[] args) {
        // String 타입만 가능함
        MyGenerics&amp;lt;String&amp;gt; my = new MyGenerics&amp;lt;&amp;gt;();
        my.setName(&quot;TEST&quot;);
        my.setName(123);    // 에러 발생
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic';&quot;&gt;컴파일시 &lt;b&gt;하위 버전과의 호환성 때문에&lt;/b&gt; 컴파일러가 제네릭 타입이 맞는지 소스를 체크하고 필요한 부분에 형변환을 넣어주고 제네릭 타입을 제거함 그래서 &lt;b&gt;클래스 파일에는 제네릭 타입이 없음&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 제네릭 주요 개념&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;바운드 타입 매개변수(Bounded Type Parameters)&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;extends 키워드를 이용하여 &lt;b&gt;타입의 제한을 주고자 할 때&lt;/b&gt; 사용함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Multiple Bounds&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;여러개로 타입의 제한을 주고자 할 때 사용함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;lt;T extends A &amp;amp; B&amp;amp; C&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;와일드 카드&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;어떠한 타입도 들어 갈 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;&quot;&gt;제네릭 타입이 다른 것만으로는 재정의(오버로딩)이 성립하지 않기 때문에 와일드 카드가 고안됨&lt;/span&gt;&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;&quot;&gt;Object 타입과 다른 점이 없기 때문에 extends, super로&amp;nbsp; 제한 할 수 있음&lt;/span&gt;&lt;span style=&quot;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;amp;를 사용 할 수 없음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1614958925313&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;? extends T&amp;gt; : T와 그 자손들만 가능
&amp;lt;? super T&amp;gt;   : T와 그 조상들만 가능
&amp;lt;?&amp;gt;           : 모든 타입 가능 &amp;lt;? extends Object&amp;gt;와 동일
&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1614940213042&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 출처 - https://docs.oracle.com/javase/tutorial/java/generics/bounded.html

// 바운드 타입 매개변수
public &amp;lt;U extends Number&amp;gt; void inspect (U u) {
    System.out.println ( &quot;T :&quot;+ t.getClass (). getName ());
    System.out.println ( &quot;U :&quot;+ u.getClass (). getName ());
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. 제네릭 메소드 만들기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;클래스 생성자, static 메소드, 일반 메소드 모두 제네릭 허용됨&lt;/span&gt;&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;static 메소드의 경우 반환 타입도 제네릭 타입이어야 함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1614938676399&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 출처 - https://docs.oracle.com/javase/tutorial/java/generics/methods.html
public static &amp;lt;K, V&amp;gt; boolean compare(Pair&amp;lt;K, V&amp;gt; p1, Pair&amp;lt;K, V&amp;gt; p2) {
    return p1.getKey().equals(p2.getKey()) &amp;amp;&amp;amp;
    p1.getValue().equals(p2.getValue());
}

public class Pair&amp;lt;K, V&amp;gt; {

    private K key;
    private V value;

    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public void setKey(K key) { this.key = key; }
    public void setValue(V value) { this.value = value; }
    public K getKey()   { return key; }
    public V getValue() { return value; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4. Type Erasure&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;일반 클래스, 인터페이스 및 메소드에서 컴파일시 제네릭 타입 유형은 없어지고 바인드된 유형으로 형변환이 됨&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;타입의 제한이 없는 경우 또는 유형이 바인드되지 않은 경우는 Object로 변경함&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1614939269147&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 출처 - https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html
public class Node&amp;lt;T&amp;gt; {

    private T data;
    private Node&amp;lt;T&amp;gt; next;

    public Node(T data, Node&amp;lt;T&amp;gt; next) {
        this.data = data;
        this.next = next;
    }

    public T getData() { return data; }
    ...
}

// T타입은 제한되지 않으므로 Object로 변경됨
public class Node {

    private Object data;
    private Node next;

    public Node(Object data, Node next) {
        this.data = data;
        this.next = next;
    }

    public Object getData() { return data; }
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1614939406774&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 출처 - https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html
public class Node&amp;lt;T extends Comparable&amp;lt;T&amp;gt;&amp;gt; {

    private T data;
    private Node&amp;lt;T&amp;gt; next;

    public Node(T data, Node&amp;lt;T&amp;gt; next) {
        this.data = data;
        this.next = next;
    }

    public T getData() { return data; }
    ...
}

// T타입을 Comparable로 변경함
public class Node {

    private Comparable data;
    private Node next;

    public Node(Comparable data, Node next) {
        this.data = data;
        this.next = next;
    }

    public Comparable getData() { return data; }
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;※ 참조&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Java의 정석&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://docs.oracle.com/javase/tutorial/java/generics/erasure.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;docs.oracle.com/javase/tutorial/java/generics/erasure.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1614939045400&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Type Erasure (The Java&amp;trade; Tutorials &amp;gt;        
            Learning the Java Language &amp;gt; Generics (Updated))&quot; data-og-description=&quot;The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated&quot; data-og-host=&quot;docs.oracle.com&quot; data-og-source-url=&quot;https://docs.oracle.com/javase/tutorial/java/generics/erasure.html&quot; data-og-url=&quot;https://docs.oracle.com/javase/tutorial/java/generics/erasure.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javase/tutorial/java/generics/erasure.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.oracle.com/javase/tutorial/java/generics/erasure.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Type Erasure (The Java&amp;trade; Tutorials &amp;gt; Learning the Java Language &amp;gt; Generics (Updated))&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;docs.oracle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Study</category>
      <category>14주차</category>
      <category>자바기초스터디</category>
      <category>제네릭</category>
      <author>pej4303</author>
      <guid isPermaLink="true">https://pej4303.tistory.com/64</guid>
      <comments>https://pej4303.tistory.com/64#entry64comment</comments>
      <pubDate>Tue, 23 Feb 2021 22:59:23 +0900</pubDate>
    </item>
    <item>
      <title>[Study-13주차] I/O(입출력)</title>
      <link>https://pej4303.tistory.com/63</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;목표&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic';&quot;&gt;자바의 Input과 Ontput에 대해 학습하세요.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic';&quot;&gt;학습할 것(필수)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;InputStream과 OutputStream&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Byte와 Character 스트림&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;표준 스트림 (System.in, System.out, System.err)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;파일 읽고 쓰기&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 스트림(Stream) / 버퍼(Buffer) / 채널 (Channel) 기반의 I/O&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1.1. 스트림(Stream) 기반의 I/O&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;단방향통신만 가능함 따라서 입력과 출력을 동시에 하려면 입력스트림, 출력스트림이 필요함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Queue 구조처럼 먼저 보낸 데이터를 먼저 받게됨(FIFO)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;java.io 패키지에서 사용함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1.2. 버퍼(Buffer) 기반의 I/O&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;실제 데이터를 주고받는 스트림이 아니어서 입출력 할 수 없음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;스트림의 기능을 향상시키거나 다른 기능을 추가 할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;기반 스트림을 먼저 생성한 다음에 이를 이용해서 보조 스트림을 생성해야 함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1613735891379&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FileReader fReader = new FileReader(&quot;test.txt&quot;);    // 기반 스트림 생성
BufferedReader br = new BufferedReader(fReader);    // 보조 스트림 생성
...
br.read();
br.flush();
br.close();&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;FilterInputStream, FilterOutputStream은 모든 보조 스트림의 조상&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;기반 스트림이 필요하기 때문에 단순히 기반 스트림의 메소드를 그대로 호출함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;기반스트림의 close(), flush()를 호출 할 필요없이 보조 스트림에 있는걸로 호출하기만 하면 됨&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1.3. 채널(Channel) 기반의 I/O&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;양방향 입출력이 가능&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;항상 버퍼를 이용해서 입출력을 함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;java.nio 패키지에서 사용함&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2.&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;InputStream과 OutputStream&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2.1. &lt;span style=&quot;color: #333333;&quot;&gt;InputStream&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic';&quot;&gt;InputStream Class의 주요 메소드&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;read() : byte 단위로 데이터를 읽어오며(0~255 사이의 값) 데이터가 없으면 -1을 반환함&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;close() : 입력 스트림 자원을 닫음&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;available() : 읽어 올 수 있는 데이터의 크기를 반환함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;skip() : 주어진 길이만큼 데이터를 건너뜀&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;mark() : 현재 위치를 표시해 놓음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;reset() : 마지막으로 mark()가 호출되었던 위치로 되돌아감&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;markSuppoprted()을 통해서 mark(), reset()을 사용 할 수 있는 스트림인지 확인하고 사용해야 함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2.2. &lt;span style=&quot;color: #333333;&quot;&gt;OutputStream&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;OutputStream의 주요 메소드&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;write() : 데이터를 출력함&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic';&quot;&gt;flush() : 버퍼에 있는 모든 출력 자원을 사용함(버퍼가 있는 출력스트림인 경우에만 의미가 있음)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;close() : 출력 스트림 자원을 닫음&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;※&amp;nbsp; 참조&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;프로그램 종료시 닫지 않은 스트림을 JVM이 자동적으로 닫아 주긴 하지만 &lt;/span&gt;&lt;b&gt;반드시 다 사용한 후에는 close()를 호출해야 한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic';&quot;&gt;예외적으로 메모리를 사용하는 스트림과 표준 입출력 스트림은 따로 닫아주지 않아도 된다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;3. &lt;span style=&quot;color: #333333;&quot;&gt;Byte와 Character 스트림&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3.1.&lt;/span&gt;&lt;/span&gt;Byte 스트림&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1Byte로 처리함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;InputStream, OutputStream이 바이트기반 스트림의 조상&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;byte 배열을 이용&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF0tA2/btqX1oIEkAO/yTdgOxzIyFmYkaBWiSUWoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF0tA2/btqX1oIEkAO/yTdgOxzIyFmYkaBWiSUWoK/img.png&quot; data-alt=&quot;출처 - Java의 정석&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF0tA2/btqX1oIEkAO/yTdgOxzIyFmYkaBWiSUWoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF0tA2%2FbtqX1oIEkAO%2FyTdgOxzIyFmYkaBWiSUWoK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 - Java의 정석&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3.2. Character 스트림&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;문자 데이터를 이용할 때 사용&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;바이트기반의 스트림으로 2Byte인 데이터를 처리하는데 어려움이 있어서 이를 보완하기 위해서 제공됨&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2Byte로 처리를 하며 유니코드간의 변환을 자동적으로 처리해 줌&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Reader, Writer가 문자 스트림의 조상&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;char 배열을 이용&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nFpQp/btqXZJftANn/YP2X08Fj8BMqzZaw4Hg6ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nFpQp/btqXZJftANn/YP2X08Fj8BMqzZaw4Hg6ik/img.png&quot; data-alt=&quot;출처 - Java의 정석&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nFpQp/btqXZJftANn/YP2X08Fj8BMqzZaw4Hg6ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnFpQp%2FbtqXZJftANn%2FYP2X08Fj8BMqzZaw4Hg6ik%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 - Java의 정석&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;4. &lt;span style=&quot;color: #333333;&quot;&gt;표준 스트림 (System.in, System.out, System.err)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4.0. &lt;span&gt;System Class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic';&quot;&gt;final 클래스로 상속 및 인스턴스를 만들 수 없음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1613738568424&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public final class System {
...
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;표준 입력, 표준 출력 및 오류 출력 스트림 기능이 있으며&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;외부에서 정의된 속성 및 환경 변수에 대한 정보 제공,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;배열 일부를 빠르게 복사하기 위한 유틸리티 메소드가 있음&lt;/span&gt;&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;별도의 스트림을 생성하는 코드를 작성하지 않아도 자동적으로 생성됨&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4.1.&amp;nbsp; 표준 입출력&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;System.in&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;콘솔로부터 데이터를 입력받을 때 사용&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;반환타입이 InputStream&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1613738839592&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public final static InputStream in = null;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;System.out&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;콘솔로 데이터를 출력할 때 사용&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;반환타입이 PrintStream&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1613738929543&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public final static PrintStream out = null;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;System.err&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;콘솔로 오류 데이터를 출력할 때 사용&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;반환타입이 PrintStream&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1613739025295&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public final static PrintStream err = null;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4.2. 표준입출력의 대상변경&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;setIn() :&amp;nbsp;표준 입력 스트림을 지정한 대상으로 재할당함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;setOut() :&amp;nbsp;표준 출력 스트림을 지정한 대상으로 재할당함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;setErr() :&amp;nbsp;표준 오류 출력 스트림을 지정한 대상으로 재할당함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1613739257689&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PrintStream ps = null;
FileOutputStream output = null;
String filePath = &quot;D:\\project\\workspace\\studyhalle\\src\\main\\java\\s1\\week13\\test.txt&quot;;

try {
    output = new FileOutputStream(filePath);
    ps = new PrintStream(output);
    System.setOut(ps);    // 출력대상을 파일로 변경
    
} catch (Exception e) {
    e.printStackTrace();
}

// System.out은 파일로 대상을 변경했기 때문에 System.err 내용만 나옴 
System.out.println(&quot;## System.out ##&quot;);
System.err.println(&quot;## System.err ##&quot;);

[ 실행결과 ]
## System.err ##&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;5. &lt;span style=&quot;color: #333333;&quot;&gt;파일 읽고 쓰기&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;5.0.&amp;nbsp; File Class&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;File 인스턴스는 파일 또는 디렉토리일수도 있음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;File 인스턴스는 변경 할 수 없으며 일단 생성되면 File 객체의 경로는 절대로 변경되지 않음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pUvZE/btqXTm0rZc6/9avznRr0EkGsg6fdgLbnI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pUvZE/btqXTm0rZc6/9avznRr0EkGsg6fdgLbnI0/img.png&quot; data-alt=&quot;출처 -&amp;amp;amp;nbsp; https://docs.oracle.com/javase/8/docs/api/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pUvZE/btqXTm0rZc6/9avznRr0EkGsg6fdgLbnI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpUvZE%2FbtqXTm0rZc6%2F9avznRr0EkGsg6fdgLbnI0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 -&amp;nbsp; https://docs.oracle.com/javase/8/docs/api/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;OS마다 파일 경로 구분자, 파일명 구분자가 다르기 때문에 File class에는 static 변수를 이용하는 것이 좋음&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1613738017630&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// OS에 사용하는 경로 구분자를 반환( 윈도우 : ';' / 유닉스 :  ':' )
public static final char pathSeparatorChar = fs.getPathSeparator();
public static final String pathSeparator = &quot;&quot; + pathSeparatorChar;

// OS에 사용하는 이름 구분자를 반환( 윈도우 : '\' / 유닉스 :  '/' )
public static final char separatorChar = fs.getSeparator();
public static final String separator = &quot;&quot; + separatorChar;
System.out.println(&quot;## File.pathSeparator     = &quot; + File.pathSeparator);
System.out.println(&quot;## File.pathSeparatorChar = &quot; + File.pathSeparatorChar);

System.out.println(&quot;## File.separator         = &quot; + File.separator);
System.out.println(&quot;## File.separatorChar     = &quot; + File.separatorChar);

[ 실행결과 ]
## File.pathSeparator     = ;
## File.pathSeparatorChar = ;
## File.separator         = \
## File.separatorChar     = \&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;5.1. 파일 생성&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;File 인스턴스를 생성한다고 파일이 생성되는 것이 아님&lt;br /&gt;(File 인스턴스 생성 != 파일 생성)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;createNewFile() : 빈 파일을 생성하지만 이미 생성되어 있으면 만들지 않음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1613738270046&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 파일 경로만으로 File 인스턴스 생성
String filePath = &quot;D:\\project\\workspace\\studyhalle\\src\\main\\java\\s1\\week13&quot;;

File file = new File(filePath);

System.out.println(&quot;## file.exists()       = &quot; + file.exists());
System.out.println(&quot;## file.getPath()      = &quot; + file.getPath());
System.out.println(&quot;============================================&quot;);

// 2. 파일 경로, 파일명으로  File 인스턴스 생성
String filePath2 = &quot;D:\\project\\workspace\\studyhalle\\src\\main\\java\\s1\\week13\\&quot;;
String fileName2 = &quot;file2.txt&quot;;
File file2 = new File(filePath2, fileName2);

System.out.println(&quot;## file2.exists()      = &quot; + file2.exists());
System.out.println(&quot;## file2.getPath()     = &quot; + file2.getPath());
System.out.println(&quot;============================================&quot;);

// 3. 파일 경로+파일명으로  File 인스턴스 생성
String filefullPath = &quot;D:\\project\\workspace\\studyhalle\\src\\main\\java\\s1\\week13\\file3.txt&quot;;
File file3 = new File(filefullPath);

// File 인스턴스 생성 != File 생성
// 파일명까지 넣은 경우 해당 위치에 파일이 있어야함
try {
    file3.createNewFile();
} catch (IOException e) {
    e.printStackTrace();
}

System.out.println(&quot;## file3.exists()      = &quot; + file3.exists());
System.out.println(&quot;## file3.getPath()     = &quot; + file3.getPath());
System.out.println(&quot;============================================&quot;);

[ 실행결과 ]
## file.exists()       = true
## file.getPath()      = D:\project\workspace\studyhalle\src\main\java\s1\week13
============================================
## file2.exists()      = false
## file2.getPath()     = D:\project\workspace\studyhalle\src\main\java\s1\week13\file2.txt
============================================
## file3.exists()      = true
## file3.getPath()     = D:\project\workspace\studyhalle\src\main\java\s1\week13\file3.txt
============================================&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;5.2. 파일 쓰기&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1613738292470&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String fileFullPath = &quot;D:\\project\\workspace\\studyhalle\\src\\main\\java\\s1\\week13\\writeFile.txt&quot;;
String str =&quot;파일 쓰기 테스트 입니다!!&quot;;

try ( FileWriter fWriter = new FileWriter(fileFullPath); 
     BufferedWriter bw = new BufferedWriter(fWriter); ) {
   
   bw.write(str);
    
} catch (FileNotFoundException e) {
   e.printStackTrace();
} catch(IOException e){
   e.getStackTrace();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;5.3. 파일 읽기&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1613738299982&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String fileFullPath = &quot;D:\\project\\workspace\\studyhalle\\src\\main\\java\\s1\\week13\\writeFile.txt&quot;;
        
try ( FileReader fReader = new FileReader(fileFullPath); 
      BufferedReader br = new BufferedReader(fReader); ) {
    String line = &quot;&quot;;
    
    while ( (line = br.readLine()) != null ) {
        System.out.print(line);
    }
    
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch(IOException e){
    e.getStackTrace();
}

[ 실행결과 ]
파일 쓰기 테스트 입니다!!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;5.4. RandomAccessFile&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;하나의 클래스로 파일에 대한 입출력이 모두 가능함(DataInput, DataOutput 인터페이스를 모두 구현)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;기본 자료형 단위로 데이터를 입출력 할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;내부적으로 파일포인터 때문에 파일의 어느 위치에서나 읽기, 쓰기가 가능함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1613753371650&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] tmpArr = { 1, 10, 100, 1000, 2, 20, 200, 2000 };
        
// int배열의 데이터를 txt에 저장한 다음 출력함
String filePath = &quot;D:\\project\\workspace\\studyhalle\\src\\main\\java\\s1\\week13\\testRandomAccess.txt&quot;;
String mode = &quot;rw&quot;;

try {
    RandomAccessFile file = new RandomAccessFile(filePath, mode);
    for (int i=0; i&amp;lt;tmpArr.length; i++) {
        file.writeInt(tmpArr[i]);
    }
    
    file.seek(0);    // write()하면서 파일포인터가 마지막으로 이동했기때문에 포인터의 위치를 다시 처음으로 이동시킴
    
    // while(true) {
    // 아무것도 읽지 못하고 EOFException이 발생하는 것을 방지함
    while(file.length() != file.getFilePointer()) {
        System.out.println(file.readInt());
    }
    
} catch (Exception e) {
    e.printStackTrace();
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;testRandomAccess.txt 파일이 생성이 되지만 안의 내용은 알아 볼 수 없음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;450&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yE2UA/btqXTn6dNZK/TkSHwnHAwnx482wTXUh4j0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yE2UA/btqXTn6dNZK/TkSHwnHAwnx482wTXUh4j0/img.png&quot; data-alt=&quot;testRandomAccess.txt&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yE2UA/btqXTn6dNZK/TkSHwnHAwnx482wTXUh4j0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyE2UA%2FbtqXTn6dNZK%2FTkSHwnHAwnx482wTXUh4j0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;450&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;testRandomAccess.txt&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;※ 참조&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Java의 정석&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/&quot;&gt;https://docs.oracle.com/javase/8/docs/api/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1613738404598&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Java Platform SE 8&quot; data-og-description=&quot;&quot; data-og-host=&quot;docs.oracle.com&quot; data-og-source-url=&quot;https://docs.oracle.com/javase/8/docs/api/&quot; data-og-url=&quot;https://docs.oracle.com/javase/8/docs/api/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.oracle.com/javase/8/docs/api/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Java Platform SE 8&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;docs.oracle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://sshkim.tistory.com/98&quot;&gt;https://sshkim.tistory.com/98&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1613738421377&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Java] NIO 기반 입출력 및 네트워킹 - NIO, 파일 &amp;amp; 디렉토리&quot; data-og-description=&quot;출처:&amp;nbsp;http://palpit.tistory.com/640 1. NIO 소개 &amp;nbsp;자바 4부터 새로운 입출력(NIO: New Input/Output)이라는 뜻에서 java.nio 패키지가 포함되었는데, 자바 7로 버전업하면서 자바 IO와 자바 NIO 사이의 일관성..&quot; data-og-host=&quot;sshkim.tistory.com&quot; data-og-source-url=&quot;https://sshkim.tistory.com/98&quot; data-og-url=&quot;https://sshkim.tistory.com/98&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/RwZ1i/hyJkPF8U5F/MxdPpnJS8q6ggAtutVdlyk/img.gif?width=425&amp;amp;height=270&amp;amp;face=0_0_425_270,https://scrap.kakaocdn.net/dn/dE8kiE/hyJkT2QK7A/PWrkw67mk3hlL8k3U1uhf1/img.gif?width=425&amp;amp;height=270&amp;amp;face=0_0_425_270,https://scrap.kakaocdn.net/dn/71Zxf/hyJkO8iPyb/eAuXNypXstn0Ajr1abBP20/img.png?width=485&amp;amp;height=348&amp;amp;face=0_0_485_348&quot;&gt;&lt;a href=&quot;https://sshkim.tistory.com/98&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sshkim.tistory.com/98&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/RwZ1i/hyJkPF8U5F/MxdPpnJS8q6ggAtutVdlyk/img.gif?width=425&amp;amp;height=270&amp;amp;face=0_0_425_270,https://scrap.kakaocdn.net/dn/dE8kiE/hyJkT2QK7A/PWrkw67mk3hlL8k3U1uhf1/img.gif?width=425&amp;amp;height=270&amp;amp;face=0_0_425_270,https://scrap.kakaocdn.net/dn/71Zxf/hyJkO8iPyb/eAuXNypXstn0Ajr1abBP20/img.png?width=485&amp;amp;height=348&amp;amp;face=0_0_485_348');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[Java] NIO 기반 입출력 및 네트워킹 - NIO, 파일 &amp;amp; 디렉토리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;출처:&amp;nbsp;http://palpit.tistory.com/640 1. NIO 소개 &amp;nbsp;자바 4부터 새로운 입출력(NIO: New Input/Output)이라는 뜻에서 java.nio 패키지가 포함되었는데, 자바 7로 버전업하면서 자바 IO와 자바 NIO 사이의 일관성..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;sshkim.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Study</category>
      <category>13주차</category>
      <category>I/O</category>
      <category>자바기초스터디</category>
      <author>pej4303</author>
      <guid isPermaLink="true">https://pej4303.tistory.com/63</guid>
      <comments>https://pej4303.tistory.com/63#entry63comment</comments>
      <pubDate>Fri, 12 Feb 2021 01:41:18 +0900</pubDate>
    </item>
    <item>
      <title>[Study-12주차] 어노테이션(Annotation)</title>
      <link>https://pej4303.tistory.com/62</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;목표&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic';&quot;&gt;자바의 어노테이션에 대해 학습하세요.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; letter-spacing: -1px; font-family: 'Nanum Gothic';&quot;&gt;학습할 것 (필수)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;어노테이션 정의하는 방법&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;@retention&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;@target&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;@documented&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;어노테이션 프로세서&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. 어노테이션(Annotation)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;소스 코드 안에 추가하여 사용 할 수 있는 메타데이터의 일종&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;주석처럼 프로그램에는 영향을 주지 않으며 프로그램에 유용한 정보를 제공할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;용도&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic';&quot;&gt;컴파일시 어노테이션을 사용하여 오류 및 경고를 알려 줄 수 있음 &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic';&quot;&gt;어노테이션 정보를 이용하여 코드, XML 파일 등을 생성할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;정의하는 방법&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;@interface&lt;/b&gt; 키워드를 이용&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1612408091088&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;접근제어자 @interface 어노테이션명 {
    // 내용 기입
}


public @interface MyAnnotation {
    // 내용 기입
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;어노테이션의 기본 구조&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1612409102047&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.METHOD })
public @interface MyAnnotation {
    // 기본형 타입 및 String, 배열로 선언 할 수 있음
    int version();
    boolean flag();
    String name();
    String[] typeArr();

    // enum으로도 선언 할 수 있음
    public enum Season {
        SPRING, SUMMBER, FALL, WINTER
    }
    // 기본값도 지정 할 수 있음
    Season season() default Season.WINTER;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1612408783436&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@MyAnnotation(name = &quot;pej&quot;, typeArr = { &quot;A&quot;, &quot;B&quot; }, flag = false, version = 0)
public void test() {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 메타 어노테이션&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;어노테이션을 위한 어노테이션으로 java.lang.annotation에 정의되어 있음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;어노테이션에 붙이는 어노테이션&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P4DU6/btqVbvseXnM/5HG4KWreIQOWKJFIZkiFBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P4DU6/btqVbvseXnM/5HG4KWreIQOWKJFIZkiFBK/img.png&quot; data-alt=&quot;출처 - Java의 정석&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P4DU6/btqVbvseXnM/5HG4KWreIQOWKJFIZkiFBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP4DU6%2FbtqVbvseXnM%2F5HG4KWreIQOWKJFIZkiFBK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 - Java의 정석&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2.1. @Retention&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1612186505864&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Retention(유지되는 범위)


@Retention(RetentionPolicy.SOURCE)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;RetentionPolicy.SOURCE&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;소스 파일(*.java)에서만 유지됨&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;RetentionPolicy.CLASS&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;컴파일 시 컴파일러에 의해 유지되며 JVM에서는 무시됨&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;클래스 파일(*. class)에 있으나 런타임 시 사용할 수 없음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;RetentionPolicy.RUNTIME&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;클래스파일(*.class)에 있으나 런타임 시에만 사용할 수 있으며 JVM에 의해 유지됨&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;런타임 시에 리플렉션(reflection)을 이용해 클래스 파일에 저장된 어노테이션 정보를 읽어서 처리할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2.2. @Documented&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;@Override, @SuppressWarnings 을 빼고 기본적으로 어노테이션은 Javadoc에 포함되지 않음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2.3. @Target&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1612186644040&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Target({적용가능한 대상})


@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZUjtD/btqVdMng4bE/Be7fmjFGtzNYa5YU8egpJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZUjtD/btqVdMng4bE/Be7fmjFGtzNYa5YU8egpJk/img.png&quot; data-alt=&quot;출처 -&amp;amp;amp;nbsp;https://docs.oracle.com/javase/tutorial/java/annotations/predefined.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZUjtD/btqVdMng4bE/Be7fmjFGtzNYa5YU8egpJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZUjtD%2FbtqVdMng4bE%2FBe7fmjFGtzNYa5YU8egpJk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 -&amp;nbsp;https://docs.oracle.com/javase/tutorial/java/annotations/predefined.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. 어노테이션 프로세서(Annotation Processing)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;컴파일시 어노테이션을 찾아서 그에 맞는 소스 코드를 만들어주는&lt;/b&gt; javac 빌드툴의 일종&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic';&quot;&gt;어노테이션을 사용하기 위해서는 어노테이션 프로세서가 필요함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;모든 어노테이션 프로세서는 &lt;/span&gt;&lt;b&gt;AbstractProcessor&lt;/b&gt; 추상클래스를 상속 받아야 함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1612412322166&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package javax.annotation.processing;

import java.util.Set;
import java.util.HashSet;
import java.util.Collections;
import java.util.Objects;
import javax.lang.model.element.*;
import javax.lang.model.SourceVersion;
import javax.tools.Diagnostic;

public abstract class AbstractProcessor implements Processor {

    protected ProcessingEnvironment processingEnv;
    private boolean initialized = false;

    protected AbstractProcessor() {}

   /*
    * 
    */
    public synchronized void init(ProcessingEnvironment processingEnv) {
        if (initialized)
            throw new IllegalStateException(&quot;Cannot call init more than once.&quot;);
        Objects.requireNonNull(processingEnv, &quot;Tool provided null ProcessingEnvironment&quot;);

        this.processingEnv = processingEnv;
        initialized = true;
    }
   
   /*
    * 각각 프로세의 main() 메소드 역할을 수행
    */
   public abstract boolean process(Set&amp;lt;? extends TypeElement&amp;gt; annotations,RoundEnvironment roundEnv);
    
   public Set&amp;lt;String&amp;gt; getSupportedAnnotationTypes() {
        SupportedAnnotationTypes sat = this.getClass().getAnnotation(SupportedAnnotationTypes.class);
        if  (sat == null) {
            if (isInitialized())
                processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING,
                                                         &quot;No SupportedAnnotationTypes annotation &quot; +
                                                         &quot;found on &quot; + this.getClass().getName() +
                                                         &quot;, returning an empty set.&quot;);
            return Collections.emptySet();
        }
        else
            return arrayToSet(sat.value());
    }

   /*
    * 특정 자바버전을 지정할 때 사용
    *
    * Java 1.6을 사용하고 싶으면 SourceVersion.RELEASE_6 이용
    * 보통 SourceVersion.latestSupported() 사용하는 것을 권장
    */
    public SourceVersion getSupportedSourceVersion() {
        SupportedSourceVersion ssv = this.getClass().getAnnotation(SupportedSourceVersion.class);
        SourceVersion sv = null;
        if (ssv == null) {
            sv = SourceVersion.RELEASE_6;
            if (isInitialized())
                processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING,
                                                         &quot;No SupportedSourceVersion annotation &quot; +
                                                         &quot;found on &quot; + this.getClass().getName() +
                                                         &quot;, returning &quot; + sv + &quot;.&quot;);
        } else
            sv = ssv.value();
        return sv;
    }

    /*
     * 어노테이션 프로세서가 처리할 어노테이션을 명시
     */
    public Set&amp;lt;String&amp;gt; getSupportedAnnotationTypes() {
            SupportedAnnotationTypes sat = this.getClass().getAnnotation(SupportedAnnotationTypes.class);
            if  (sat == null) {
                if (isInitialized())
                    processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING,
                                                             &quot;No SupportedAnnotationTypes annotation &quot; +
                                                             &quot;found on &quot; + this.getClass().getName() +
                                                             &quot;, returning an empty set.&quot;);
                return Collections.emptySet();
            }
            else
                return arrayToSet(sat.value());
    }

    ....
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size14&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;동작 순서&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li data-ke-size=&quot;size14&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;자바 컴파일 실행&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size14&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;어노테이션 프로세서에서 어노테이션에 대한 처리를 함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size14&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;자바 컴파일러가 모든 어노테이션 프로세서가 실행 되었는지 검사(실행되지 않았다면 반복함)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;※ 참조&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic';&quot;&gt;Java의 정석&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://docs.oracle.com/javase/tutorial/java/annotations/basics.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;docs.oracle.com/javase/tutorial/java/annotations/basics.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1612410362301&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Annotations Basics (The Java&amp;trade; Tutorials &amp;gt;        
            Learning the Java Language &amp;gt; Annotations)&quot; data-og-description=&quot;The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated&quot; data-og-host=&quot;docs.oracle.com&quot; data-og-source-url=&quot;https://docs.oracle.com/javase/tutorial/java/annotations/basics.html&quot; data-og-url=&quot;https://docs.oracle.com/javase/tutorial/java/annotations/basics.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javase/tutorial/java/annotations/basics.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.oracle.com/javase/tutorial/java/annotations/basics.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Annotations Basics (The Java&amp;trade; Tutorials &amp;gt; Learning the Java Language &amp;gt; Annotations)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;docs.oracle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javase/tutorial/java/annotations/predefined.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;docs.oracle.com/javase/tutorial/java/annotations/predefined.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1612410348256&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Predefined Annotation Types (The Java&amp;trade; Tutorials &amp;gt;        
            Learning the Java Language &amp;gt; Annotations)&quot; data-og-description=&quot;The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated&quot; data-og-host=&quot;docs.oracle.com&quot; data-og-source-url=&quot;https://docs.oracle.com/javase/tutorial/java/annotations/predefined.html&quot; data-og-url=&quot;https://docs.oracle.com/javase/tutorial/java/annotations/predefined.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javase/tutorial/java/annotations/predefined.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.oracle.com/javase/tutorial/java/annotations/predefined.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Predefined Annotation Types (The Java&amp;trade; Tutorials &amp;gt; Learning the Java Language &amp;gt; Annotations)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;docs.oracle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;http://ko.wikipedia.org/wiki/자바_애너테이션&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ko.wikipedia.org/wiki/자바_애너테이션&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1612410359420&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;자바 애너테이션 - 위키백과, 우리 모두의 백과사전&quot; data-og-description=&quot;위키백과, 우리 모두의 백과사전. 자바 애너테이션(Java Annotation)은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. 보통 @ 기호를 앞에 붙여서 사용한다. JDK 1.5 버전 이상에서&quot; data-og-host=&quot;ko.wikipedia.org&quot; data-og-source-url=&quot;http://ko.wikipedia.org/wiki/자바_애너테이션&quot; data-og-url=&quot;https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EC%95%A0%EB%84%88%ED%85%8C%EC%9D%B4%EC%85%98&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://ko.wikipedia.org/wiki/자바_애너테이션&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://ko.wikipedia.org/wiki/자바_애너테이션&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;자바 애너테이션 - 위키백과, 우리 모두의 백과사전&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;위키백과, 우리 모두의 백과사전. 자바 애너테이션(Java Annotation)은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. 보통 @ 기호를 앞에 붙여서 사용한다. JDK 1.5 버전 이상에서&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;ko.wikipedia.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://medium.com/@jason_kim/annotation-processing-101-%EB%B2%88%EC%97%AD-be333c7b913&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;medium.com/@jason_kim/annotation-processing-101-%EB%B2%88%EC%97%AD-be333c7b913&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1612413660231&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Annotation Processing 101 (번역)&quot; data-og-description=&quot;Hannes Dorfmann 가 작성한 &amp;ldquo;Annotation Processing 101&amp;rdquo; 을 원작자의 동의를 받아 번역한 글입니다.&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/@jason_kim/annotation-processing-101-%EB%B2%88%EC%97%AD-be333c7b913&quot; data-og-url=&quot;https://medium.com/@jason_kim/annotation-processing-101-%EB%B2%88%EC%97%AD-be333c7b913&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://medium.com/@jason_kim/annotation-processing-101-%EB%B2%88%EC%97%AD-be333c7b913&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/@jason_kim/annotation-processing-101-%EB%B2%88%EC%97%AD-be333c7b913&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Annotation Processing 101 (번역)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Hannes Dorfmann 가 작성한 &amp;ldquo;Annotation Processing 101&amp;rdquo; 을 원작자의 동의를 받아 번역한 글입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Study</category>
      <category>12주차</category>
      <category>애노테이션</category>
      <category>자바기초스터디</category>
      <author>pej4303</author>
      <guid isPermaLink="true">https://pej4303.tistory.com/62</guid>
      <comments>https://pej4303.tistory.com/62#entry62comment</comments>
      <pubDate>Sun, 31 Jan 2021 22:46:18 +0900</pubDate>
    </item>
    <item>
      <title>[Study-11주차] Enum</title>
      <link>https://pej4303.tistory.com/61</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;목표&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; font-family: 'Nanum Gothic';&quot;&gt;자바의 열거형에 대해 학습하세요.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; letter-spacing: -1px;&quot;&gt;학습할 것 (필수)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;enum 정의하는 방법&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;enum이 제공하는 메소드 (values()와 valueOf())&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;java.lang.Enum&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;EnumSet&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;0. Enum&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;변수가 상수 집합이 되도록 하는 특수한 데이터 유형&lt;/b&gt;으로 고정된 상수 집합인 경우에 사용함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;상수값이 바뀌면 해당 상수를 참조하는 모든 소스를 다시 컴파일해야 하지만 열거형 상수를 이용하면 기존의 소스를 다시 컴파일하지 않아도 됨&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;값뿐만 아니라 타입까지 체크함(&lt;b&gt;typesafe enum&lt;/b&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1611927691869&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;System.out.println( Season.FALL == Season.SPRING );
System.out.println( Season.FALL == Season.FALL );

[실행결과]
false
true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. Enum 정의 방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;enum&lt;/b&gt; 키워드를 이용하여 정의함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;상수이기 때문에 필드는 대문자로 함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1611662171680&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum 열거형명 { 상수명1, 상수명2 .... }


public enum Season {
      SPRING
    , SUMMER
    , FALL
    , WINTER 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. Enum 사용 방법&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;static 변수를 사용하는 것과 동일하게 &lt;b&gt;열거형.상수명&lt;/b&gt;으로 호출하면 됨&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;열거형 상수 각각이 열거형 타입의 인스턴스로 상수값이 인스턴스의 주소를 의미&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;'==' 으로 비교 할 수 있으며 대소 비교는 compareTo()를 이용해야 함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;상수에 여러값을 지정하는 경우 생성자 및 인스턴스 변수를 추가해주어야 함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;인스턴스 변수와 생성자도 추가 할 수 있으나 생성자는 묵시적으로 private이며 new 연산자를 이용하여 인스턴스 생성할 수 없음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1611935256246&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.study.halle.s1.week11;

import java.util.EnumSet;

public enum Direction {
      EAST(1, &quot;동&quot;)
    , WEST(2, &quot;서&quot;)
    , SOUTH(3, &quot;남&quot;)
    , NORTH(4, &quot;북&quot;)
    ;
    
    Direction(int order, String name) {
        this.order = order;
        this.name = name;
    }
    
    private final int order;
    private final String name;
    
    public int getOrder() {
        return order;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. E&lt;span style=&quot;color: #333333;&quot;&gt;num이 제공하는 메소드 (values()와 valueOf())&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;values(), valueOf() 메소드는 &lt;b&gt;컴파일러가 자동적으로 추가&lt;/b&gt;해주며 모든 열거형이 가지고 있음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1611933736401&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;staic E values()
staic E valueOf(String name)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1611933814628&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.study.halle.s1.week11;

public enum Season {
      SPRING
    , SUMMER
    , FALL
    , WINTER 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MJ5Jc/btqU52jfHcQ/OCWN9DRL7bszqUEsixPCKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MJ5Jc/btqU52jfHcQ/OCWN9DRL7bszqUEsixPCKk/img.png&quot; data-alt=&quot;바이트코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MJ5Jc/btqU52jfHcQ/OCWN9DRL7bszqUEsixPCKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMJ5Jc%2FbtqU52jfHcQ%2FOCWN9DRL7bszqUEsixPCKk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;바이트코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;values()&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;열거형의 모든 상수를 순서대로 해당 열거형 배열로 반환해줌&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1611665239030&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Season tmp = Season.valueOf(&quot;WINTER&quot;);
        
switch (tmp) {
    case SPRING :
        System.out.println(&quot;봄&quot;);
        break;
    case SUMMER :
        System.out.println(&quot;여름&quot;);
        break;
    case FALL :
        System.out.println(&quot;가을&quot;);
        break;
    case WINTER :
        System.out.println(&quot;겨울&quot;);
        break;
    default :
}

[실행결과]
겨울&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;valueOf()&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;String 타입의 상수명을 입력받아 열거형의 상수로 반환함&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;존재하지 않는 상수명이 들어오면 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;IllegalArgumentException 에러 발생함&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1611665488972&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Season[] arr = Season.values();

for ( Season s : arr) {
    System.out.println(s);
}

[실행결과]
SPRING
SUMMER
FALL
WINTER&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;4. &lt;span style=&quot;color: #333333;&quot;&gt;java.lang.Enum&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;모든 열거형의 조상&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;모든 열거형은 &lt;b&gt;암시적으로 java.lang.Enum을 상속 받음&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;5. &lt;span style=&quot;color: #333333;&quot;&gt;EnumSet&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;열거형 유형을 사용하기 위한 Set&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;내부적으로 bit vector로 표시됨&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;NULL을 허용하지 않음&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1611937610368&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EnumSet&amp;lt;Direction&amp;gt; enumSet = EnumSet.allOf(Direction.class);
System.out.println(enumSet);

[실행결과]
[EAST, WEST, SOUTH, NORTH]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;※ 참조&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Java의 정석&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;docs.oracle.com/javase/tutorial/java/javaOO/enum.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Study</category>
      <category>11주차</category>
      <category>Enum</category>
      <category>자바기초스터디</category>
      <author>pej4303</author>
      <guid isPermaLink="true">https://pej4303.tistory.com/61</guid>
      <comments>https://pej4303.tistory.com/61#entry61comment</comments>
      <pubDate>Tue, 26 Jan 2021 20:00:29 +0900</pubDate>
    </item>
  </channel>
</rss>