<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>geuna_park.log</title>
        <link>https://velog.io/</link>
        <description>비전공자의 뚝딱이의 우탕탕 공부</description>
        <lastBuildDate>Tue, 12 Nov 2024 00:45:16 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>geuna_park.log</title>
            <url>https://velog.velcdn.com/images/geuna_park/profile/53ebe70e-c6c2-492d-accf-22ce413595f7/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. geuna_park.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/geuna_park" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[ASP란]]></title>
            <link>https://velog.io/@geuna_park/ASP%EB%9E%80</link>
            <guid>https://velog.io/@geuna_park/ASP%EB%9E%80</guid>
            <pubDate>Tue, 12 Nov 2024 00:45:16 GMT</pubDate>
            <description><![CDATA[<h4 id="asp란-active-server-pages">ASP란 {Active Server Pages}</h4>
<ul>
<li><p>동적 웹 페이지를 생성할 수 있는 기술이다.</p>
</li>
<li><p>주로 HTML 과 VBScript , JavaScript등을 사용해 작성된다. </p>
</li>
<li><p>서버에서 코드가 실행된 후 HTML로 전환되어 클라이언트에게 전송된다.</p>
</li>
<li><p>ASP의 파일의 확장자는 .asp이다.</p>
<pre><code class="language-asp">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;body&gt;
&lt;%
response.write(&quot;MY first ASP script!&quot;)
%&gt;
&lt;/body&gt;
&lt;/html&gt;

-&gt; MY first ASP script!</code></pre>
</li>
</ul>
<h4 id="asp의-작동원리">ASP의 작동원리</h4>
<pre><code>→ 브라우저가 일반 HTML 파일을 요청하면 서버는 파일을 반환한다

→ 브라우저가 ASP 파일을 요청하면 서버는 요청을 ASP 엔진에게 전달하여 ASP 파일을 읽고 파일에서 서버 스크립트를 실행한다

→ ASP 파일이 일반 HTML 로 브라우저에 반환이 된다</code></pre><h4 id="asp의-예제">ASP의 예제</h4>
<pre><code class="language-asp">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;body&gt;
 &lt;!-- p 태그 --&gt;
&lt;p&gt;ASP can output HTML tags as well as plain text:&lt;/p&gt;
&lt;%
 &#39; h태그 적용시키기
 response.write(&quot;&lt;h1&gt;Hello World!&lt;/h1&gt;&quot;)

 &#39; 글자 컬러 css 적용
 response.write(&quot;&lt;p style=&#39;color:#0000ff&#39;&gt;This text is styled&lt;/p&gt;&quot;)

 &#39; 변수 선언
 dim name &#39;name 이라는 변수를 선언
 name = &quot;Donald Duck&quot; &#39;name에 Donald Duck이라는 이름을 할당
 response.write(&quot;My name is: &quot; &amp; name)

 &#39; 배열
 dim famname(5), i
 famname(0) = &quot;geuna01&quot;
 famname(1) = &quot;geuna02&quot;
 famname(2) = &quot;geuna03&quot;
 famname(3) = &quot;geuna04&quot;
 famname(4) = &quot;geuna05&quot;
 famname(5) = &quot;geuna06&quot;

 For i = 0 to 5
     response.write(famname(i) &amp; &quot;&lt;br&gt;&quot;)
 Next

 &#39; 반복문
 For i = 0 to 5
     response.write(&quot;The number is &quot; &amp; i &amp; &quot;&lt;br&gt;&quot;)
 Next

 &#39;
%&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h4 id="날짜-함수-종류">날짜 함수 종류</h4>
<p>→ date() : 현재 날짜를 반환하는 함수이다.
→ time() : 현재 시스템 시간만 반환하는 함수이다.
→ now()  : 현재 날짜와 시간 둘 다 반환하는 함수이다.
→ Month() : 주어진 날짜에서 월만 추출하여 반환하는 함수이다.
→ Day() : 주어진 날짜에서 일만 추출하여 반환하는 함수이다.
→ Year() : 주어진 날짜에서 연도만 추출하여 반환하는 함수이다.
→ Weekday(date) : 주어진 날짜에서 해당하는 요일 번호를 반환하는 함수이다.
→ WeekdayName(weekdayNumber) : 주어진 요일 번호에 해당하는 요일 이름을 반환하는 함수이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JPA[Java Persistence API]]]></title>
            <link>https://velog.io/@geuna_park/JPAJava-Persistence-API</link>
            <guid>https://velog.io/@geuna_park/JPAJava-Persistence-API</guid>
            <pubDate>Wed, 28 Aug 2024 06:28:52 GMT</pubDate>
            <description><![CDATA[<p>목적 : 자바 객체를 데이터베이스 테이블에 매핑하여 SQL 쿼리 없이 데이터베이스 작업을 수행하도록 한다</p>
<p>ORM : 객체  - 관계 매핑을 통해 자바 객체와 데이터베이스 간의 매핑을 자동으로 처리한</p>
<ul>
<li><p><strong>Entity[엔티티] 란?</strong></p>
<p>  Spring Boot 와 같은 Java 기반 프레임워크에서 <strong>“엔티티[Entity]”</strong> 는 주로 데이터 베이스의 테이블을 나타내는 클래스를 의미한다, 이 클래스는 <strong>JPA</strong>[Java Persistence API] 를 사용하여 데이터 베이스에 저장되고 관리한다.</p>
</li>
</ul>
<pre><code>즉 → Entity 클래스는 실제 데이터베이스의 테이블과 1:1 매핑되는 클래스이다.

→ Entity 클래스는 테이블의 컬럼에 해당하는 속성(필드)을 가져야 한다 

필요한 경우 테이블에 매핑되지 않는 필드도 가질 수 있다, 이때 매핑되지 않는 필드는

`@Transient`어노테이션으로 표시한다.

주의점 : 

→ 엔티티 클래스는 인터페이스를 구현하거나 추상 클래스를 상속받아서는 안되지만 , 다른 엔티티 클래스를 상속받을 수 있다 .

→ 엔티티 클래스는 반드시 기본 생성자를 가져야한다 , 이 생성자는 `Public` 또는 `Protected`라는 접근 제어자를 가져야한다.

**Entity[엔티티]  클래스 특징**

→ `@Entity` 어노테이션 : **JPA** 가 해당 클래스를 엔티티로 인식하기 위해 클래스 선언 위에 `@Entity` 어노테이션을 붙여줘야한다.

→ 기본 생성자 : JPA 스펙에 따라 엔티티 클래스는 반드시 기본 생성자를 가져야 합니다

→ 식별자 필드 : 각 엔티티 인스턴스를 유일하게 식별할 수 있는 식별자 필드가 필요하다, 이 필드는 `@ ID` 어노테이션으로 마크되며 일반적으로 숫자 `ID` 또는 `UUID`등을 사용한다.

```java
@Entity // 이 어노테이션이 JPA 엔티티임을 나타낸다
public class user {

    @Id // 이 필드가 기본 키 (Primary Key)임을 나타낸다
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // 기본 키를 자동으로 생성하도록 지정합니다.
    private Long id;

    private String name;
    private String email;

    //기본 생성자 (JAP 에서는 필수)
    public User(){}

    //매개변수가 있는 생성자
    public User(String name , String email){
        this.name = name;
        this.email = email;
    }

  // Getters and Setters (JPA는 필드에 접근할 때 이 메서드를 사용합니다)
  public Long getId() {
      return id;
  }

  public void setId(Long id) {
      this.id = id;
  }

  public String getName() {
      return name;
  }

  public void setName(String name) {
      this.name = name;
  }

  public String getEmail() {
      return email;
  }

  public void setEmail(String email) {
      this.email = email;
  }
}
```</code></pre><ul>
<li><p><strong>JPQL - 객체지향 쿼리 언어 [Java Persistence Query Language]</strong></p>
<p>  → JPA 는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공</p>
<p>  → JPQL 은 SQL을 추상화했기 때문에 특정 데이터베이스 SQL에 의존하지 않는다.</p>
<p>  →JPQL 에서도 SELECT , FROM , WHERE , GROUP BY , HAVING , JOIN 을 지원한다.</p>
<pre><code class="language-java">  String jpql = &quot;SELECT M FROM MEMBER M WHERE M.NAME LIKE &#39;%HELLO%&#39;&quot;;
  List&lt;Member&gt; result = em.createQuery(jpql , Member.class).getREsultList();

  for(Member member : result){
          System.out.println(&quot;member = &quot; + member);
  }</code></pre>
<p>  →JPQL은 객체를 대상으로 쿼리 작성.</p>
<p>  → 위 코드에서는 Member 객체를 대상으로 이름에 “hello” 가 포함된 모든 회원을 검색한다</p>
<p>  <strong>문제점</strong>:</p>
<ul>
<li><p>JPQL은 문자열로 작성되어 컴파일 타임에 에러 발생하지 않음. 런타임 시 문제 발생 가능.</p>
</li>
<li><p>동적 쿼리 작성에 비효율적. 특정 조건에 따라 쿼리를 동적으로 작성하는 데 제한적.</p>
</li>
<li><p><em>JPQL과 SQL의 차이점*</em>:</p>
</li>
<li><p>JPQL: 엔티티 객체를 대상으로 쿼리 작성.</p>
</li>
<li><p>SQL: 데이터베이스 테이블을 대상으로 쿼리 작성.</p>
</li>
</ul>
</li>
<li><p><strong>JPA의 어노테이션 정리</strong></p>
<p>  <code>@Entity</code> :</p>
<p>  Entity가 붙은 클래스를 엔티티라고 하며 JPA가 관리한다</p>
<p>  JPA 를 사용해서 테이블과 매핑 할 클래스는 엔티티가 필수이다</p>
<pre><code class="language-java">  @Entity 
  public class Member{
      @ID
      private Long id;
      private String name;
  }</code></pre>
<p>  <code>@Table</code>  :</p>
<p>  엔티티와 데이터베이스 테이블의 이름을 매핑한다 , 기본적으로 클래스 이름이 테이블 이름으로 사용된다</p>
<p>  <code>@Id</code> : 엔티티의 기본키를 정의하며 엔티티의 각 인스턴스를 고유하게 식별하는 필드에 사용된다.</p>
<pre><code class="language-java">  @Entity
  @Table(name = &quot;member_table&quot;)
  public class Member{
      @Id

      private Long id; 
      private String name;
  }</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVA 변수의 선언 위치에 따른 변수 종류와 메모리 할당 위치]]></title>
            <link>https://velog.io/@geuna_park/JAVA-%EB%B3%80%EC%88%98%EC%9D%98-%EC%84%A0%EC%96%B8-%EC%9C%84%EC%B9%98%EC%97%90-%EB%94%B0%EB%A5%B8-%EB%B3%80%EC%88%98-%EC%A2%85%EB%A5%98%EC%99%80-%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%95%A0%EB%8B%B9-%EC%9C%84%EC%B9%98</link>
            <guid>https://velog.io/@geuna_park/JAVA-%EB%B3%80%EC%88%98%EC%9D%98-%EC%84%A0%EC%96%B8-%EC%9C%84%EC%B9%98%EC%97%90-%EB%94%B0%EB%A5%B8-%EB%B3%80%EC%88%98-%EC%A2%85%EB%A5%98%EC%99%80-%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%95%A0%EB%8B%B9-%EC%9C%84%EC%B9%98</guid>
            <pubDate>Wed, 28 Aug 2024 06:27:24 GMT</pubDate>
            <description><![CDATA[<h3 id="선언위치에-따른-변수의-종류">선언위치에 따른 변수의 종류</h3>
<p><strong>변수의 종류</strong></p>
<blockquote>
<p>정적 (static) 변수
인스턴스 (instance) 
지역 (local)변수</p>
</blockquote>
<p><strong>선언위치</strong></p>
<blockquote>
<p>클래스 영역
클래스 영역
클래스 영역 이외의 영역 (메서드, 생성자 , 초기화 블럭 내)</p>
</blockquote>
<p><strong>생성시기</strong></p>
<blockquote>
<p>클래스가 메모리에 올라갈 때
인스턴스가 생성되었을 때
변수 선언문이 수행되었을 때</p>
</blockquote>
<p><strong>메모리 위치</strong></p>
<blockquote>
<p>Method 영역
Heap 영역
Heap 영역</p>
</blockquote>
<h3 id="정적-변수">정적 변수</h3>
<ul>
<li><code>static</code>을 붙여서 선언합니다.</li>
<li>클래스의 모든 인스턴스가 공통된 저장공간을 공유합니다.</li>
<li>인스턴스를 생성하지 않고도 접근 가능하며, 클래스가 메모리에 로딩될 때 생성되어 프로그램 종료 시까지 유지됩니다.</li>
<li><code>public static</code>으로 선언하면 같은 프로그램 내에서 어디서나 접근할 수 있으며, <code>private static</code>은 클래스 외부에서 접근할 수 없습니다.</li>
</ul>
<pre><code class="language-jsx">public class Example{
    public static int staticVar = 0; //정적변수

    public static void increment(){
        staticVar++;
        -&gt; staticVar = staticVar + 1
    }
}

public class Main{
    public static void main(String[] args){
        Example.increment();
        System.out.println(Example.staticVar)
    }
}

결과 -&gt; 1</code></pre>
<h3 id="인스턴스-변수">인스턴스 변수</h3>
<ul>
<li>클래스 블록 내에서 선언되며, 객체가 생성될 때 메모리에 할당됩니다.</li>
<li>인스턴스마다 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있습니다.</li>
<li>값을 읽거나 저장하려면 먼저 인스턴스를 생성해야 합니다.</li>
</ul>
<pre><code class="language-jsx">public class Example {
    public int a = 0;

    public void increment(){
        a++;
    }
}

public class Main{
    public static void main(String[] args){
        Example o1 = new Example();
        Example o2 = new Example();

        o1.a();
        o2.a();

        System.out.println(o1.a);
        System.out.println(o2.a);

    }
}

결과 
1
1</code></pre>
<blockquote>
<p>각자의 다 다른 객체이다</p>
</blockquote>
<aside>
🦖 정적변수와 인스턴스 변수
정적변수는 회사의 공용 사물함이라고 생각하면 된다
인스턴스 변수는 개인의 사물함이라고 생각하면 된

</aside>

<h3 id="지역-변수">지역 변수</h3>
<ul>
<li>메서드 내에 선언되어 메서드 내에서만 사용이 가능하다. 메서드 종료시 소멸되어 사용이 불가능하다.</li>
</ul>
<h2 id="java-메모리-구조">JAVA 메모리 구조</h2>
<h3 id="메서드-영역-method-area">메서드 영역 (Method Area)</h3>
<ul>
<li>위치 : JVM의 메모리 영역 중 하나이다.</li>
<li>클래스와 인터페이스의 메타데이터와 정적 변수를 저장한다.</li>
<li>JVM이 실행되는 동안 메서드 영역에 저장된 데이터는 프로그램 종료까지 유지가 된다.</li>
</ul>
<h3 id="힙-영역-heap-area">힙 영역 (Heap Area)</h3>
<ul>
<li>위치 : JVM 의 메모리에서 가장 큰 영역이다.</li>
<li>객체와 배열이 저장된다.</li>
<li>모든 객체는 이 영역에 생성되며 , 객체는 가비지 컬렉션에 위해 메모리에서 해체된다.</li>
</ul>
<h3 id="스택-영역-stack-atra">스택 영역 (Stack Atra)</h3>
<ul>
<li>위치 : JVM 의 메모리에서 각 스레드마다 독립적으로 존재한다.</li>
<li>메서드 호출 시 생성되는 스택 프레임에 포함이되며 , 각 스택 프레임은 메서드의 로컬 변수와 매개변수 , 실행중인 바이트코드의 상태 등을 저장한다</li>
<li>메서드 호출과 반환 시 스택 프레임이 생성되고 파괴된다.</li>
<li>지역 변수와 매개변수는 이 영역에 저장된다.</li>
</ul>
<h3 id="pc-register-program-counter-register">PC Register (Program Counter Register)</h3>
<ul>
<li>위치 : 각 스레드마다 존재하는 스택 영역의 일부로 간주된다.</li>
<li>현재 실행 중인 스레드의 바이트코드 명령어의 주소를 저장한다.</li>
<li>JVM이 바이트코드를 실행할 대  , PC Register는 현재 명령어의 주소를 제공하여 실행 흐름을 추적한다</li>
<li>멀티스레딩 환경에서는 각 스레드가 독립적인 PC Register를 가진다</li>
</ul>
<p>[멀티스레딩이란 : 여러 개의 스레드를 통해 하나의 프로그램에서 동시에 여러 개의 일을 수행할 수 있도록 해주는 것이다.]</p>
<h3 id="네이티브-메소드-스택-native-method-stack">네이티브 메소드 스택 (Native Method Stack)</h3>
<ul>
<li>위치 : JVM의 메모리 영역 중 하나이다.</li>
<li>네이티브 메소드 호출에 사용되는 스택이다.</li>
<li>자바와 JNI 를 통해 호출되는 네이티브 메소드의 실행 상태를 저장한다</li>
<li>네이티브 메소드 스택은 자바와 직접적인 상호작용이 필요한 경우 사용된다.</li>
</ul>
<p>참조</p>
<p><a href="https://dev-minjeong.tistory.com/28">https://dev-minjeong.tistory.com/28</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[오버로딩과 오버라이딩]]></title>
            <link>https://velog.io/@geuna_park/%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9%EA%B3%BC-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9</link>
            <guid>https://velog.io/@geuna_park/%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9%EA%B3%BC-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9</guid>
            <pubDate>Wed, 28 Aug 2024 06:19:44 GMT</pubDate>
            <description><![CDATA[<h3 id="오버로딩overloading">오버로딩(Overloading)</h3>
<p>메서드의 이름은 같고 매개변수의 유형과 개수가 다르도록 하는 것을 의미한다.</p>
<p>→ 기존에 없던 새로운 메서드를 정의하는 것이다.</p>
<pre><code class="language-jsx">class OverloadingMethods{
        public void print(){
                System.out.println(&quot;오버로딩1&quot;);
        }

        String print(Integer a){
                System.out.println(&quot;Integer -오버로딩2&quot;);
                 return a.toString();
        }

        void print(String a){
                System.out.println(&quot;String - 오버로딩3&quot;);
                System.out.println(a);
        }

        String print(Integer a , Integer b){
                System.out.println(&quot;Integer , Integer - 오버로딩4&quot;);
                return a.toString() + b.toString();
        }
}

class OverloadingTest{

    public static void main(String[] args){
        OverloadingMethods om = new OberloadingMethods();

        om.print();
        System.out.println(om.print(3));
        om.print(&quot;Hello&quot;);
        System.out.println(om.print(4,5));

    }
}

-&gt; 실행결과
오버로딩1
Integer - 오버로딩2
3
String - 오버로딩3
Hello
Integer , Integer - 오버로딩4
45
</code></pre>
<p>매서드의 이름을 중복하여 사용할 수 있다는 장점이 있다.</p>
<blockquote>
<p>오버로딩은 매개변수의 타입이 달라야하며 , 매개변수의 개수가 달라야하며 , 매개변수의 순서가 달라야 사용할 수 있다</p>
</blockquote>
<h3 id="오버라이딩overriding">오버라이딩(Overriding)</h3>
<p>상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 것을 의미한다.</p>
<p>(메서드의 이름은 물론 파라미터의 개수나 타입도 동일해야하며 , 주로 상위 클래스의 동작을 상속받는 하위 클래스에서 변경하기 위해 사용된다)</p>
<p>→ 즉 오버라이딩은 상속받은 메서드의 내용만 변경하는 것이다.</p>
<p>메서드의 이름이 서로 같고 , 매개변수가 같고 , 반환형이 같을 경우에 상속받은 메서드를 덮어 쓴다</p>
<pre><code class="language-jsx">class SuwonMember{
    String test(){
        return &quot;저는 수원에 거주중입니다&quot;
    }
}

class SuwonMember extends SuwonMember{
&#39;extends SuwonMember를 통해 부모클래스를 상속을 받는&#39;
    String test(){
        return &quot;저는 수원 입니다&quot;
    }
}

public class OverridingTest{

    public static void main(String[] args){
        SuwonMember sm = new SuwonMember();

        System.out.println(sm.test());
    }
}</code></pre>
<p>주의 할 점 </p>
<blockquote>
<p>자식 클래스에서 오버라이딩하는 메소드의 접근 제어자는 부모 클래스보다 더 좁게 설정할 수 없다.</p>
</blockquote>
<blockquote>
<p>예외는 부모 클래스의 메소드보다 많이 선언 할 수 없다.</p>
</blockquote>
<blockquote>
<p>static 메서드를 인스턴스의 메서드로 또는 그 반대로 바꿀 수 없다.</p>
</blockquote>
<blockquote>
<p>(상위 클래스의 static 메서드는 클래스에 속하는 메서드이기 때문에 상속되지 않고 따라서 오버라이딩 되지 않는다 또한 final이 지정된 메서드 역시 오버라이딩이 불가능하다.</p>
</blockquote>
<blockquote>
<p>private 접근 제어자를 가진 메서드는 상속 자체가 불가능하기 때문에 오버라이딩이 성립되지 않는다).</p>
</blockquote>
<aside>
🦖  오버라이딩과 오버로딩의 차이점

</aside>

<p>오버라이딩</p>
<p>접근제어자 : 부모 클래스의 메소드의 접근 제어자보다 더 넓은 범위의 접근 제어자를 자식 클래스의 메소드에서 설정 할 수 있다</p>
<p>리턴형:동일해야 한다.</p>
<p>메소드명 :동일해야 한다.</p>
<p>매개변수 :동일해야한다.</p>
<p>적용범위 :상속관계에서 적용된다</p>
<p>오버로딩</p>
<p>접근 제어자 :모든 접근 제어자를 사용할 수 있다</p>
<p>리턴형:달라도 된다.</p>
<p>메소드명 :동일해야 한다.</p>
<p>매개변수 :달라야 한다.</p>
<p>적용범위 :같은 클래스 내에서 적용된다.</p>
]]></description>
        </item>
    </channel>
</rss>