[항해99] Pre-onboarding 6일차

kyuu·2022년 11월 12일
0

항해99

목록 보기
11/19
post-thumbnail

항해99 Pre-onboarding 1주차 항해일지 <6day - TIL>

📍Today I Learn(Day 6 - Chapter 5)

배운 것 :

  • 배열
  • 열거타입

배열이란?

📌 같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스(번호)를 부여해놓은 자료구조

(1.1) 배열

  • 배열의 특징 :
    1️⃣ 같은 타입의 데이터만 저장할 수 있다
    ㄴ - int 배열은 int의 값만 저장이 가능하고, String 배열은 문자열만 저장한다.
    2️⃣ 한번 생성된 배열은 길이를 늘리거나, 줄일 수 없다.

(1.2) 배열의 선언

1. 타입[] 변수;
int[] intArray;
double[] doubleArray;

2. 타입 변수[];
int intArray[];
double doubleArray[];

(1.3) 배열 생성

int[] intArray = { 0, 1, 2, 3};
String[] names = { "신용권", "홍길동", "김자바"};
ㄴ 변경 : names[1] = "홍동길";

*/ 배열 변수를 미리 선언하고, 값 목록이 나중에 결정된다면 new 연산자를 사용하여 값 목록을 지정하면 된다
String[] names = null;
names = new String[]{"신용권", "홍길동", "김자바"

*/ 배열의 크기를 알고있고, 향후 값들을 저장할 배열을 미리 만들고 싶으면 아래와 같이 만들 수 있다.
int[] intArray = new int[5];
String[] names = new String[30];

(1.4) 다차원 배열

  • 값들이 행과 열로서 구성된 배열을 2차원 배열이라고 함
    (2(행) x 4(열) 행열을 만들때 필요)

(1.5) 참조 타입의 배열

  • 기본타입의 배열은 각 항목에 직접 값을 갖고 있지만, 참조 타입의 배열은 각 항목에 객체의 번지를 갖고있음
  • 문자열 비교를 위해서는 == 연산자(다른값을 참조하고 있기 때문에 flase로 나옴)가 아닌, equals() 메소드를 사용해야함

(1.6) 배열 복사

  • 배열은 생성 후 크기를 변경 할 수없기 때문에 더 많은 저장공간이 필요하다면 큰 배열을 만들고, 항목 값을 복사해야함.
  • 사용 방법 :
    • for문 혹은 System.arraycopy()메소드를 사용
1. for문
public class exam_coding_5_4 {
    public static void main(String[] args){
        int[] ordArray = {1,2,3};
        int[] newArray = new int[5];

        for (int i=0; i< ordArray.length; i++){ //ordArray배열의 크기만큼 반복
            newArray[i] = ordArray[i]; //  // newarray에 ordArray값을 넣는다
        }

        for (int i=0; i< newArray.length; i++){
            System.out.print(newArray[i]+",");
        }
    }
}

2. System.arraycopy()메소드 
public class Exam_code_5_5 {
    public static void main(String[] args){
        String[] oldStrArray = {"Java", "Array", "copy"};
        String[] newStrArray = new String[5];

        System.arraycopy(oldStrArray,0,newStrArray,0,oldStrArray.length);
        ㄴ System.arraycopy(기존배열,시작인덱스번호,새로운배열,시작인덱스번호,복사할갯수)

        for (int i=0; i< newStrArray.length; i++){
            System.out.print(newStrArray[i]+",");
        }
    }
}
결과값 : Java,Array,copy,null,null, 
ㄴ 복사되지 않은 항목은 String[] 배열의 초기값인 null으로 유지된다

📍 5-2 Chapter 예제

  • 키보드로 학생수/학생점수입력 받아 최고 점수 및 평균 점수를 구하는 프로그램 만들기
import java.util.Scanner;

public class exam_5_8 {
    public static void main(String[] args) {
        boolean run = true;
        int studentNum = 0;
        int[] Score = null;
        Scanner scanner = new Scanner(System.in);

        while (run) {
            System.out.println("===========================================");
            System.out.println(" 1. 학생수 | 2. 점수입력 | 3. 점수리스트 | 4.분석 | 5. 종료");
            System.out.println("===========================================");
            System.out.println(" 선택 > ");
            int selectNo = Integer.parseInt(scanner.nextLine());

            if (selectNo == 1) {
                System.out.print(" 학생수 >");
                studentNum = Integer.parseInt(scanner.nextLine());
                Score = new int[studentNum];
            } else if (selectNo == 2) {
                for (int i=0; i<Score.length; i++){
                    System.out.println("Score[" + i + "]>");
                    Score[i] = Integer.parseInt(scanner.nextLine());
                }
            } else if (selectNo == 3) {
                for (int i=0; i<Score.length; i++){
                    System.out.println("Score[" + i + "]>" + Score[i]);
                }
            } else if (selectNo == 4) {
                int max = 0;
                double avg = 0.0;
                int sum = 0;
                int count = 0;

                for (int i=0; i< Score.length; i++){
                    if ( max < Score[i]){
                        max = Score[i];
                    }
                    sum += Score[i];
                    count ++;
                }

                avg = (double)sum / count;

                System.out.println("max : " + max);
                System.out.println("avg : " + avg);

            } else if (selectNo == 5) {
                run = false;
            }
            System.out.println("프로그램 종료");
        }
    }
}

💡 main() 메소드의 매개값인 String[] args가 필요한 이유?

public static void main(String[] args){
  • public은 제한자 부분으로, 모든 함수의 앞에는 이 함수를 어디에서 접근할 수 있는지 범위를 지정
    (제한자는 public, private, protected 종류를 지정할 수 있지만 main 함수는 public을 지정해야함)

  • static: static / heap 중 어디에 선언할것인지 지정
    ( Main 메소드는 프로그램에 없어서는 안되는 기본함수로 GC에 의해 정리되지않도록 static에 선언해야함)

  • void: return 타입이 없다는 뜻으로, Main함수는 시작과 끝으로 마무리하여 Return값이 필요없음
  • main: 디버깅시 Entry Point (제일 먼저 시작하는 코드)

  • String[] args : String 배열의 args 변수
    ( 프로그램의 실행 순간에 외부의 값을 가져와서 프로그램 내 사용하고자 할 때 메모리에 저장할 공간을 미리 선언해 두는 것)

열거타입이란?

📌 요일, 계절처럼 한정된 값(=열거상수)만을 갖는 타입을 열거 타입이라 함

  • 열거타입을 선언했다면, 열거 상수를 선언하는데 관례적으로 열거 상수는 모두 대문자로 작성한다.
열거타입 코드 

#Week.java(enum)
public enum Week {
    MONDAY,
    TUESDAY,
    WEDENSEDAY,
    THIRDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

#exam_test.java
import java.util.Calendar;
// 캘린더 클래스를 import

public class exam_5_9 {
    public static void main(String[] args) {
        Week today = null;

        Calendar cal = Calendar.getInstance();
        int week = cal.get(Calendar.DAY_OF_WEEK);
		/week 변수에 일(1)~토(7)까지의 숫자를 리턴 받음
        
        switch (week) {
            case 1:
                today = Week.SUNDAY; // 열거 상수 대입
                break;
            case 2:
                today = Week.MONDAY;
                break;
            case 3:
                today = Week.TUESDAY;
                break;
            case 4:
                today = Week.WEDENSEDAY;
                break;
            case 5:
                today = Week.THIRDAY;
                break;
            case 6:
                today = Week.FRIDAY;
                break;
            case 7:
                today = Week.SATURDAY;
                break;
        }

        System.out.println("오늘 요일:" + today);
    }
}

🔍 실행 결과

오늘은 토요일 룰룰루

✏️ 알게 된 것 (CSRF,CORS)

CSRF란

  • Cross Site Request Forgery(사이트 간 요청 위조)의 줄임말
  • 공격자가 유저의 권한을 도용하여 유저의 의도와는 무관하게 특정 웹 사이트의 기능을 실행하게 하는 공격
  1. CSRF의 공격가능 조건
유저가 공격자가 만든 피싱 사이트에 접속 할 것
공격자가 유저 권한을 통해 요청을 보낼 사이트에 로그인 되어 있을 것 
*) CSRF공격은 서버에 직접적으로 공격을 가하지 않기 때문에 위와 같은 조건이 만족해야함
  1. CSRF 공격이 이루어지는 과정
    (1) 위조요청을 보낼 사이트에 유저가 로그인 되어 있는 상태로 피싱 사이트에 접속
    (2) 피싱 사이트에서 유저로 가장하여 요청을 위조해서 위조요청을 보냄
    (3) 위조 요청을 받은 사이트는 해당 요청에 대한 응답을 하게되고, 의도하지않은 행동이 실행됨

  2. CSRF 방어 방법

  • 여러가지의 대응 방법 중 CSRF 토큰에 대해서 알아보았다.

    🔍 CSRF Token?

    • 서버에 들어온 요청이 실제 서버에서 허용한 요청이 맞는지 확인하기 위한 토큰
    • 임의의 난수를 생성하고 세션에 저장하여 사용자의 매 요청마다 해당 난수값을 포함시켜서 전송
    • 요청이 들어올 때 마다 백엔드에서 세션에 저장된 값과 요청으로 전송된 값이 일치하는지 검증하여 방어한다.

CORS란

  • CORS(Cross-Origin Resource Sharing) 교차 출처 자원 공유방식의 줄임말
  • 한 도메인의 웹페이지가 다른 도메인을 가진 리소스에 access 할 수 있도록 만들어진 매커니즘
  • CORS를 아려면, 먼저 SOP에 대해서 알아야한다.

1. SOP(Same-origin policy, 동일 출처 정책)

  • 자바스크립트 엔진 표준 스펙의 보안 규칙으로, 동일한 출처 사이에서만 리소스를 공유 할 수 있다는 정책이다.
    ㄴ *) 동일 출처란 [프로토콜, 호스트명, 포트]가 같은 것을 말한다.

  • 하지만 최근 서비스중인 어플리케이션의 프론트단에서 다른 도메인의 제 3자가 제공하는 API를 호출하는 등, 다른 출처로 요청을하고 응답을 받는 수요가 증가함에 따라 SOP정책의 해결 방법이 필요해졌고 CORS가 등장하게 되었다.

2. CORS

  • 웹 애플리케이션은 자신과 동일한 출처의 리소스만 불러올 수 있고, 다른 출처의 리소스를 불러오려면 그 출처에서 올바른 CORS 헤더를 포함한 응답을 반환해야 함
profile
엔지니어 꿈틀 개발자

0개의 댓글

관련 채용 정보