메서드 오버라이딩은 하위 클래스에서 상위 클래스의 이미 정의된 메서드를 재정의하는 과정을 의미한다.

 

이때, 하위 클래스에서 재정의된 메서드는 상위 클래스의 메서드와 '시그니처'가 반드시 동일해야 한다.

 

만약 시그니처가 동일하지 않다면, 이는 오버라이딩이 아닌 새로운 메서드를 정의한 것으로 간주된다.

메서드 오버라이딩에서 '시그니처'는 매우 중요한 역할을 한다. 시그니처는 메서드의 이름, 매개변수의 타입 및 개수 등을 포함한다. 오버라이딩된 메서드는 상위 클래스의 메서드와 시그니처가 동일해야 하지만, 메서드의 구현 내용은 하위 클래스에서 자유롭게 재정의될 수 있다. 이렇게 되면, 하위 클래스에서 오버라이딩된 메서드를 호출할 때 상위 클래스의 메서드 시그니처를 사용하게 된다.

public class Animal {
    public void makeSound() {
        System.out.println("The animal makes a sound");
    }
}

public class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow");
    }
}

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Cat();
        Animal animal2 = new Dog();
        animal1.makeSound();
        animal2.makeSound();
    }
}

위 코드에서, Animal 클래스 makeSound() 메서드가 정의..

Cat 클래스와 Dog 클래스는 Animal 클래스를 상속받고, makeSound() 메서드를 오버라이딩하여 재정의. 각 클래스의 makeSound() 메서드는 다른 메시지를 출력...

main() 메서드에서는 Cat와 Dog 인스턴스를 생성하여 Animal 타입의 변수에 저장하고, 각각의 makeSound() 메서드를 호출합니다. 이때 makeSound() 메서드의 시그니처는 Animal 클래스에 정의된 것과 동일. 따라서 컴파일러는 Cat 인스턴스의 makeSound() 메서드와 Dog 인스턴스의 makeSound() 메서드를 각각 호출하며, 출력 결과는 각각 "Meow"와 "Woof"가 된다.

숫자 리터럴은 소스 코드에서 직접 나타나는 숫자 값이다. 예를 들어, 123, 3.14, -5, 0b1010, 0xFF 등이 모두 숫자 리터럴에 해당 된다.

숫자 리터럴은 프로그램에서 사용되는 다양한 데이터 타입으로 해석된다.

예를 들어, 123은 정수 리터럴이고, 3.14는 실수 리터럴 이다.

숫자 리터럴의 데이터 타입은 소수점, 접두사, 접미사 등에 따라 결정 된다.

Java에서는 다양한 진법으로 표현된 숫자 리터럴도 지원한다. 예를 들어, 0b1010은 이진수 1010을 나타내는 정수 리터럴이다.


0b0: 이진수 0을 나타낸다. 10진수로는 0이다.

0b1: 이진수 1을 나타낸다. 10진수로는 1이다.

0b101: 이진수 101을 나타낸다. 10진수로는 5이다.

0b1100: 이진수 1100을 나타낸다. 10진수로는 12이다.


또한, 숫자 리터럴에는 수치 값 외에도 특별한 값을 나타내는 특수한 리터럴도 있다. 예를 들어, null은 null 값이 들어 있는 참조 변수를 나타내는 특수한 리터럴이다.

 

 

참고: https://www.youtube.com/watch?v=D1Yg1Q9Zd0A&list=PLG7te9eYUi7toebNnbA1cZNRDoUcHmsGd&index=14 

 

PDT(Primitive Data Type)


①PDT (Primitive Data Type): 기본 자료형이라고도 불리며, Java에서 제공하는 8가지 기본 자료형을 의미 한다.

PDT는 8가지 형태가 있다.

boolean, byte, double,short,int,long,float, char

이러한 기본 자료형은 정수, 실수, 문자,논리 등의 값을 저장할 수 있는 데이터 타입이다.

객체가 아니기 때문에, 메소드를 호출하거나 속성에 접근할 수 없다. 따라서, 기본 타입을 객체로 다루기 위해서는 해당 타입을 참조 타입으로 변환해야 한다. Java에서는 이를 위해 오토박싱(Auto-boxing)이나 오토언박싱(Auto-unboxing) 기능을 제공한다.


상세

boolean : 논리값을 저장하는 데이터 타입으로, true와 false만을 값으로 가진다.

byte : 8비트 정수 값을 저장하는 데이터 타입으로, 범위는 -128부터 127까지 이다.

short : 16비트 정수 값을 저장하는 데이터 타입으로, 범위는 -32,768부터 32,767까지 이다.

int : 32비트 정수 값을 저장하는 데이터 타입으로, 범위는 -2,147,483,648부터 2,147,483,647까지 이다.

long : 64비트 정수 값을 저장하는 데이터 타입으로, 범위는 -9,223,372,036,854,775,808부터 9,223,372,036,854,775,807까지 이다.

float : 32비트 실수 값을 저장하는 데이터 타입으로, IEEE 754 표준에 따라 부동소수점 값으로 표현 된다.

double : 64비트 실수 값을 저장하는 데이터 타입으로, IEEE 754 표준에 따라 부동소수점 값으로 표현 된다.

char : 16비트 Unicode 문자 값을 저장하는 데이터 타입으로, 범위는 0부터 65,535까지 이다.

UDDT(User-Defined Data Type)


UDDT (User-Defined Data Type): 사용자 정의 자료형이라고도 불리며, 프로그래머가 필요에 따라 자신이 원하는 데이터 타입을 정의하여 사용할 수 있다.

이를 위해 클래스를 선언하고, 이를 이용하여 객체를 생성하여 사용한다.

즉, 클래스를 사용하여 사용자가 원하는 자료형을 만들 수 있는 것.

예를 들어,

학생(Student)이라는 자료형을 만들어 이름, 학번, 전공 등의 정보를 저장할 수 있다.

PDT와 UDDT는 모두 Java에서 데이터를 다룰 때 사용되는 개념이며, 이들을 잘 이해하고 사용하는 것이 Java 프로그래밍에 있어서 중요한 요소 중 하나 이다.

 

참고: https://www.youtube.com/watch?v=j5vhNKT6hG4&list=PLG7te9eYUi7toebNnbA1cZNRDoUcHmsGd&index=13 

 

< low 추가 방법 >

1.번호 1부터 마지막줄까지 드래그 후 빨간 박스(row추가)를 누르면, 드래그 한 수만큼 추가가 된다. 

2.드래그 없이 로우 추가 시, 1줄씩 추가 된다. 

 

 

이후 원하는 Data를 입력하고, ctrl+s 혹은  빨간 박스 옆 쪽의 "Save"를 통해 저장 한다. 


< 테이블의 특정 컬럼 추출 방법 >

< Syntax >"SELECT 컬럼명 FROM 테이블명"

 

이후 빨간 박스를 눌러 실행.


< ORDER BY >

"카테고리"를 가나다 순으로 정렬 해보기

"카테고리"를 가나다 순으로 정렬 후, 가격순 정렬 하기

 

'SQL' 카테고리의 다른 글

SQL 연습 문제(中)  (0) 2023.06.01
SQL 문제 연습(下)  (0) 2023.06.01
문자형 함수  (0) 2023.05.12
Order By  (0) 2023.05.12
LIKE,IS NULL,AND,OR,NOT  (0) 2023.05.12

아래 사진과 같이 "ㅎㅏㄴㄱㅡㄹㅇㅣ ㅇㅣㅅㅏㅇㅎㅏㄱㅔ" 이렇게 이상하게 타이핑이 입력된다.

 

 

< 해결 방법 >

 

 Ctrl+shift+esc로 작업 관리자 창을 연다.

프로세스 탭에서 Microsoft Text input Application을 찾아서 작업 끝내기를 누른다.

이후에 타이핑하면 해결된다.

  th:with="s_id=${session?.loginMemberShip?.memberId},
    s_email=${session?.loginMemberShip?.memberEmail},
    s_name=${session?.loginMemberShip?.memberName}"
    th:data-member-id="${s_id}"
    th:data-member-email="${s_email}"
    th:data-member-name="${s_name}">

th:with은 변수를 선언하고 초기화 한다.

?은 Nullable연산자. null일 경우 메소드 진행 안하고 null값 반환.

예를 들어서

s_id=${session?.loginMemberShip?.memberId}

이 경우 `session`이 `null`이면 `session.loginMemberShip`을 호출하지 않고 바로 `null`을 반환 함. 이렇게 하면 `NullPointerException`을 방지할 수 있음.

마찬가지로, `session.loginMemberShip`이 `null`인 경우, memberId 속성에 접근하지 않고 `null`을 반환.

`th:data-*`HTML5 `data-*속성을 동적으로 설정 가능하게 함. 아래의 코드가 있다고 가정.

th:data-member-id="${s_id}"

th:data-member-email="${s_email}"

th:data-member-name="${s_name}"

이 경우, `th:data-*`속성을 사용하여 HTML 요소에 회원정보 저장함.

즉, data-member-id 에는 {s_id}이 저장되는 거임

s_id 변수의 값이 1234라고 한다면, 최종적으로 생성되는 HTML 요소는 다음과 같다.

data-member-id="1234"

    th:fragment="main(title,styles,scripts,style,script,upm,header,nav,main,footer)">

이 속성은 'main'이라는 이름의 프래그먼트를 정의하고, 여러 개의 파라미터를 전달할 수 있도록 설정한다. 이 프래그먼트는 다른 페이지에서 th:replace나 th:insert를 사용하여 가져올 수 있다.


이것은 mainAterLogin에 쓰인 html이다.

th:fragment="main(title,styles,scripts,style,script,upm,header,nav,main,footer)">으로 fragment="main"으로 main에 main html의 값들을 넣어줘서

replace로 가져올 수 있었다.

그런데 ~{}도 있는데, 그것은 해당 fragment를 사용하지 않겠다는 것이다.

여기서는 style,styles,script를 사용하지 않는 것으로 본다.

https://maven.apache.org/download.cgi

Maven – Download Apache Maven

C:\Program Files 경로에 설치

설치 후 환경변수

1.JAVA_HOME

C:\Program Files\Java\jdk-17

2.MAVEN_HOME

C:\Program Files\apache-maven-3.9.1

path에서

%JAVA_HOME%\bin

%MAVEN_HOME%\bin

H2 Database Engine Download/settings

Java8 se 다운

https://www.oracle.com/kr/java/technologies/javase/javase8-archive-downloads.html

Intellij Ultimate 다운

https://www.jetbrains.com/ko-kr/idea/download/#section=windows

H2 Database Engine 다운로드

H2 Database Engine

JDBC URL jdbc:h2:~/test로 바꾼다.

Intellij Ultimate file->new->project maven

아래 코드는 pom.xml에 복사 붙여넣기


	4.0.0
	
		org.springframework.boot
		spring-boot-starter-parent
		3.0.4
		 
	
	com.example
	demo
	0.0.1-SNAPSHOT
	demo
	Demo project for Spring Boot
	
		17
	
	
		
			org.springframework.boot
			spring-boot-starter-web
		
		
			org.springframework.boot
			spring-boot-devtools
			runtime
			true
		
		
			org.springframework.boot
			spring-boot-starter-test
			test
		
		
			com.h2database
			h2
			runtime
			2.1.214
		
	

	
		
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	


밑의 코드는 main->rescources->META-INF.maven에 있는 xml에 붙여넣어야 한다.

Dependency Injection (DI)은 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로, 클래스 간의 결합도를 낮추고 코드의 유연성과 재사용성을 높이는데 도움을 준다. DI는 클래스 내부에서 직접적으로 객체를 생성하는 대신, 외부에서 생성된 객체(의존성)를 주입하는 방식으로 작동한다.

 

이 패턴의 주요 이점은 다음과 같다:

 

① 코드의 모듈성: 의존성 주입을 사용하면 클래스들이 서로 덜 의존하게 되므로, 코드의 모듈성이 향상된다.

② 유연성과 확장성: 클래스 간 결합도가 낮아지면, 기능 변경이나 확장이 더 쉽고 간단해진다.

③ 테스트 용이성: 의존성 주입을 사용하면, 테스트 시 의존성을 쉽게 대체하거나 모의 객체로 교체할 수 있어 테스트 용이성이 향상된다.

DI는 주로 생성자 주입, 세터 주입, 인터페이스 주입 등의 방식으로 구현할 수 있다. 프레임워크나 라이브러리를 통해 자동화된 의존성 주입을 사용할 수도 있다. 대표적인 예로 Java의 Spring 프레임워크, .NET의 ASP.NET Core, Python의 Flask-Injector 등이 있다.

 

예시코드


  1. MessageService Interface를 만든다.
public interface MessageService {
  String getMessage();
}
  1. `MessageService` 인터페이스를 구현한 `HelloMessageService` 클래스를 생성한다.
import org.springframework.stereotype.Service;

@Service
public class HelloMessageService implements MessageService {
  @Override
  public String getMessage() {
    return "Hello, Spring Boot!"
  }
}
  1. `MessageController` 클래스를 생성하고, `MessageService`를 의존성을 주입한다.

이때 @Autowired 사용한다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MessageController {
  private final MessageService messageService;
  
  @Autowired
  public MessageController(MessageService messageService) {
    this.messageService = messageService;
  }
  
  @GetMapping("/message")
  public String getMessage() {
    return messageService.getMessage();
  }
}

위 코드에서 `MessageController`의 생성자에 `@Autowired` 사용하여

`MessageService`의 구현체인 `HelloMessageService`를 자동으로 주입한다.

이렇게 하면 `MessageController`는 `MessageService`의 구체적인 구현에 대해 알 필요 없이 인터페이스를 통해 메서드를 호출할 수 있다. 이 방식은 코드의 결합도를 낮추고 유연성을 높이는 데 도움을 준다.

만약 MessageService 인터페이스의 구현체를 바꾸고 @Autowired에 되는 걸 바꾸고 싶다면,

1.일단 MessageService 인터페이스의 구현체를 하나 더 만든다.

import org.springframework.stereotype.Service;

@Service
public class GoodbyeMessageService implements MessageService {
  @Override
  public String getMessage() {
    return "Goodbye, Spring Boot!"
  }
  
}

2.MessageConfiguration 설정 클래스를 하나 만들어서 GoodbyeMessageService를 사용하도록 설정한다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MessageConfiguration {
  
  @Bean
  public MessageService messageService() {
    return new GoodbyeMessageService();
  }
}

위의 코드에서 `MessageConfiguration` 클래스를 사용해서

`MessageService` 빈을 `GoodbyeMessageService`의 인스턴스로 설정했다.

이제 `MessageController`에서 `MessageService`인터페이스의 구현체로

`GoodbyeMessageService`가 주입되어 사용된다.

ssg(build time) vs SSR(request time)

ssg: 빌드 타임에 미리 정적 파일 생성

ssr: 특정 url 접근할 때 그때서야 pre-render

next-js 둘 다 제공함.

next.js활용하면 페이지별로 Pre-rendering 방식 선택 가능.

getStaticProps -> ssg

getServerSideProps -> ssr


-Marketing pages

-blog post

-E-commerce product listings

-Help and documentation

정적으로 만들어 놓으면 업데이트될 때 동안 한동안 변하지 않는 것들을 상대로 하면 좋다.

적용 여부 선택 기준

사용자가 페이지를 요청하기 전에 Pre-render 할 수 있는가?

Yes라면 SSG(로그인하기 전에도 볼 페이지를 미리 정할 수 있으면)

No 라면 SSR 혹은 ISR 혹은 CSR(로그인 구분 하고 나서 Pre-render)


만약에 SSG를 쓰고 있다가 SSR로 바꾸려고 하더라도 굉장히 편하다

getStaticProps에서 getServerSideProps로만 바꿔주면 되기 때문에..

ssg의 2가지 케이스

1. 외부 데이터 없이(외부 API, 외부 DATA, DB) 없이 정적인 것) pre-rendering

2. 외부 데이터를 가져와서(외부의 DB, API, DATA) pre-rendering

2번을 공부하기 위해 다른 파일을 읽어보자

https://nextjs.org/learn/basics/data-fetching/blog-data 들어가서

아래 코드들을 복사하자. 그리고 blog파일의 root에 "post" Folder를 만든 후

pre-rendering.md File 생성한다. 그 이후 아래 코드를 넣어준다.

---
title: 'Two Forms of Pre-rendering'
date: '2020-01-01'
---

Next.js has two forms of pre-rendering: **Static Generation** and **Server-side Rendering**. The difference is in **when** it generates the HTML for a page.

- **Static Generation** is the pre-rendering method that generates the HTML at **build time**. The pre-rendered HTML is then _reused_ on each request.
- **Server-side Rendering** is the pre-rendering method that generates the HTML on **each request**.

Importantly, Next.js lets you **choose** which pre-rendering form to use for each page. You can create a "hybrid" Next.js app by using Static Generation for most pages and using Server-side Rendering for others.

이후 하나 더.. ssg-ssr.md file도 만들어서 아래 코드를 복사 붙여 넣기 한다.

---
title: 'When to Use Static Generation v.s. Server-side Rendering'
date: '2020-01-02'
---

We recommend using **Static Generation** (with and without data) whenever possible because your page can be built once and served by CDN, which makes it much faster than having a server render the page on every request.

You can use Static Generation for many types of pages, including:

- Marketing pages
- Blog posts
- E-commerce product listings
- Help and documentation

You should ask yourself: "Can I pre-render this page **ahead** of a user's request?" If the answer is yes, then you should choose Static Generation.

On the other hand, Static Generation is **not** a good idea if you cannot pre-render a page ahead of a user's request. Maybe your page shows frequently updated data, and the page content changes on every request.

In that case, you can use **Server-Side Rendering**. It will be slower, but the pre-rendered page will always be up-to-date. Or you can skip pre-rendering and use client-side JavaScript to populate data.

---

title: 'When to Use Static Generation v.s. Server-side Rendering'

date: '2020-01-02'

---

이렇게 -으로 감싸진 것을 YAML Front Matter라고 한다. Head component에 넣어야 되는 Meta data처럼, 이 블로그 글에 대한 metadata를 담고 있다.

이 파일을 해석하기 위해선 yarn add gray-matter명령어를 설치해야 한다.

그리고 https://nextjs.org/learn/basics/data-fetching/implement-getstaticprops에 가서 6page에 있는 걸 복사. 이후 Root에 lib Folder 만들고,

post.js 생성

import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';

//Service가 돌고 있는 root 즉 blog에 있는,'posts' 파일(md file저장 해놓은 곳)
const postsDirectory = path.join(process.cwd(), 'posts');

export function getSortedPostsData()/*정렬된 데이터를 가져옴*/ {
  // Get file names under /posts
  //fs는 파일 시스템을 읽어오는 node.js의 라이브러리다.
  const fileNames = fs.readdirSync(postsDirectory);
  const allPostsData = fileNames.map((fileName) => {
    // Remove ".md" from file name to get id
    // .md를 제거하면 pre-rendering ssg-ssr만 남고

    //그것을 id로 삼는다.
    const id = fileName.replace(/\.md$/, '');

    // Read markdown file as string
    //fileName은 여전히 md가 있다.
    //fullPath는 root에서 pre-rendering.md가 만들어질거고
    const fullPath = path.join(postsDirectory, fileName);
    //직접 utf-8형식으로 읽어서 fileContents에 담는다.
    const fileContents = fs.readFileSync(fullPath, 'utf8');
    //담고난 뒤엔 -으로 감싸진 부분만 해석 하기 위해  grey-matter 설치했다.

    //matter로 감싸주면 matterResult로 metadata를 다 읽어낸다.
    // Use gray-matter to parse the post metadata section
    const matterResult = matter(fileContents);

    // Combine the data with the id
    //id는 파일 이름이었고, 그것을 빼내주는 것이 getSortedPostsData 함수다.
    return {
      id,
      ...matterResult.data,
    };
  });
  // Sort posts by date
  //날짜가 느린것을 앞에보내고 날짜가 빠른 것을 앞에 보내는 것
  //즉 최신 순이다.
  return allPostsData.sort((a, b) => {
    if (a.date < b.date) {
      return 1;
    } else {
      return -1;
    }
  });
}

이후 index.js에서

import Head from 'next/head'
import Layout, { siteTitle } from '../components/layout'
import { getSortedPostsData } from '../lib/post'
import utilStyles from '../styles/utils.module.css'

//ssr로 바꾸고 싶으면 getServerSideProps로 바꾸면 끝임
export async function getStaticProps() {
  //ssg Data가 담겨져 있다.
  const allPostsData = getSortedPostsData()

  return {
//ssg가 담겨있는 props retrun
props: {
  allPostsData,
},
  }
}

export default function Home({ allPostsData }) {
  return (
    
      
        {siteTitle}

I love coding 😍

(This is a sample website - you’ll be building a site like this on {' '} our Next.js tutorial.)

Blog

  • {title}
    {id}
    {date}
        
    
  )
}
//allPostsData를 map으로 돌면서 id key로 주고 title,id(파일이름),date를 준다.


CSR로 바꾸는 방법

root경로의 pages 폴더에서 에서 api 폴더를 하나 더 만들고

posts.js 파일 생성. 이후 아래 참조.

//getSortedPostsData 가져온다.
import { getSortedPostsData } from "../../lib/post"

export default function handler(req, res) {
    const allPostsData = getSortedPostsData()
    res.status(200).json({allPostsData})
}

이후 index.js로.. 여기서 getSortedPostsData import를 제거해줘야 한다.

import Head from 'next/head'
import { useEffect } from 'react'
import Layout, { siteTitle } from '../components/layout'
import utilStyles from '../styles/utils.module.css'
import React, { useState } from 'react';
//ssr로 바꾸고 싶으면 getServerSideProps로 바꾸면 끝임
//export async function getStaticProps() {
//ssg Data가 담겨져 있다.
//const allPostsData = getSortedPostsData()
//return {
//ssg가 담겨있는 props retrun
//props: {
//allPostsData,
//},
//}
//}

//CSR로 바꾸는 방법. 
export default function Home() {
const [allPostsData, setAllPostsData] = useState([])
useEffect(()=>{
  //posts에서 response가 오면 json으로 바꿔주고.data가 오면 A
  fetch('/api/posts')
  .then((res) => res.json())
  .then((data) => setAllPostsData(data.allPostsData))
}, [])

  return (
    
      
        {siteTitle}

I love coding 😍

(This is a sample website - you’ll be building a site like this on {' '} our Next.js tutorial.)

Blog

  • {title}
    {id}
    {date}
        
    
  ) 
}

//allPostsData를 map으로 돌면서 id key로 주고 title,id(파일이름),date를 준다.

이렇게 CSR로 바꾸면 File System에서 읽은 값들이 Client Network tap에 보인다.

Vscode에 있는 Powershell 터미널창에 yarn dev 명렁어 입력 시, 아래 오류 출력

 

PS C:\Users\Administrator\nextjs-blog> yarn dev

yarn : 이 시스템에서 스크립트를 실행할 수 없으므로 C:\Users\Administrator\AppData\Roaming\npm\ya

rn.ps1 파일을 로드할 수 없습니다. 자세한 내용은 about_Execution_Policies(https://go.microsoft.co

m/fwlink/?LinkID=135170)를 참조하십시오.

위치 줄:1 문자:1

+ yarn dev

+ ~~~~

    + CategoryInfo          : 보안 오류: (:) [], PSSecurityException

    + FullyQualifiedErrorId : UnauthorizedAccess

< 해결 방법>

 

Vscode에있는 "Powershell"이 아닌, 시작->Powershell 권리자 권한 실행->

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force 입력 후,엔터

-> Vscode에 다시 들어가서 year dev

+ Recent posts