개발/대덕인재개발원

대덕 240903-자바:변수/DB:데이터베이스 개념

월은 2024. 9. 3. 18:37

<09:00~12:50 자바 기초>

 

변수 선언

컴퓨터가 어떤 것을 저장할 때는 비어있는 메모리의 여러 번지(주소) 중 비어있는 곳을 찾아 자동으로 저장을 한다

저장할 때는 별도의 명칭을 부여하여 다시 꺼내 쓸 때 편리하도록 한다

이 별칭이 바로 변수이다

 

변수:값을 저장할 수 있는 메모리의 특정 번지에 붙여진 이름

변수 선언:변수 사용하기 위해선 변수 선언이 필요하다. 변수에 어떤 타입의 데이터를 저장할 것인지, 

                 변수의 이름이 무엇인지 결정한다

int age; //정수(int)(4바이트) 값을 저장할 수 있는 age 변수 선언

double value; //실수(double)값을 저장할 수 있는 value 변수 선언

//같은 타입의 변수는 콤마 이용하여 한꺼번에 선언 가능

 

<변수 작성규칙>

-첫 글자는 문자,'$','_' 만 가능

-첫 글자는 소문자로 시작하되, 여러 단어가 붙으면 두번째 단어부터 대문자로(카멜 표기법)(관례)

-영어 대소문자 구분

-길이제한 없음

-명령어 등 이미 사용되고 있는 자바 예약어를 중복으로 사용 불가

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package kr.or.ddit.study02.sec01;
 
public class Vartest05 {
 
    public static void main(String[] args) {
        /*
         *   1.정수형 변수 x를 선언하고
         *   2.값 10을 저장하고 
         *   3.변수 x에 저장된 값을 출력해보자
         *   
         *   4.정수형 변수 y 20으로 선언과 동시에 초기화하고
         *   5.변수 y에 저장된 값을 출력해보자
         *   
         *   6.정수형 변수 z에서 변수 x와 y의 합계를 저장하고 출력해보자
         */
        
        int x;
        x = 10;
        
        int y = 20;
        
        int z = x + y;
        
        System.out.println("x =" + x);
        System.out.println("y =" + y);
        System.out.println("z = x + y =" + z);

x =10
y =20
z = x + y =30
        
cs

 

값 저장소

값을 저장할 경우 대입 연산자 '=' 사용

'='은 '같다' 라는 의미가 아니라 '오른쪽의 값을 왼쪽의 변수에 저장한다' 라는 의미이다

*변수 초기화:메모리에 최초로 값이 저장될 때 메모리에 변수 초기값이 생성되는 것

*초기화를 하지 않으면 메모리에서 값을 읽을 수 없다(초기값이 없으니까)

 

변수 사용 범위

메인 메소드 블록  내에서 선언된 변수를 로컬(지역) 변수라 하는데, 로컬 변수는 메소드 블록 내에서만 사용된다

변수는 블록 내 어디서든 선언할 수 있지만 자신이 선언된 위치로부터 자신이 속한블록 내부에서만 사용 가능

*변수는 블록, 즉 괄호{} 안에 갇혀있다

 

변수 타입

정수 타입

메모리 사용 크기와 저장되는 값의 허용 범위 각각 다름

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class IntTest {
 
    public static void main(String[] args) {
        /*
         *     정수형
         *   1.byte    : 1byte ( -128 ~ 127 )
         *   2.short   : 2byte ( -32768 ~ 32767 )
         *   3.int     : 4byte ( 약-21억 ~ 약21억 ) -> -2^31 ~ 2^31-1
         *   4.long    : 8byte ( -2^63 ~ 2^63-1 )
         *   n-1제곱한 이유는 첫번째 비트는 부호 비트 , -1한 이유는 양수는 0부터 시작
         */
        
        byte b1 = 127;
        System.out.println("b1 =" + b1);
        
        //byte b2 = 128;
        short s1 = 128;
        System.out.println("s1 =" + s1);
        
        //byte, short 데이터를 계산식에 사용하면 int형으로 변환 후 계산한다.
        //큰 자료형의 값을 작은 자료형의 변수에 저장하려면 형변환을 해서 저장해야 한다.
        //방법) (변환할자료형이름)값
        short s2 = (short)(s1 + 10);
        System.out.println("s2 =" + s2);
        
        int i1 = 100;
        int i2 = i1 + 20;
        
        long l1 = 100L;
        long l2 = 10000000000L;
        // long형을 나타내는 리터럴에는 숫자 뒤에 영문자 L을 붙여준다.
// 왜냐하면 기본적으로 자바는 정수형을 int로 인식하기 때문에 21억이 넘어가면
// int의 허용기준을 넘는 것으로 간주하여 에러가 나기 때문이다

//console
b1 =127
s1 =128
s2 =138
        
    }
 
}
 
cs

1.리터럴:소스 코드에서 프로그래머에 의해 직접 입력된 정수값(2/8/10/16진수)

*최종적으로 2진수로 가지만 우리가 일반적으로 사용하는 10진수를 바로 2진수로 바꾸기에는 숫자가 너무 커져 버리기 때문에 8진수,16진수로 먼저 변환한 뒤 2진수로 바꾼다

 

2.char 타입:하나의 문자를 저장하는 타입

1
2
3
4
5
6
7
8
9
10
11
char var1 = 'A';  //유니코드:65
        char var2 = 'B';  //유니코드:66
        char var3 = '가';  //유니코드: 44032
        char var4 = '각';  //유니코드: 44033
        //작은 따옴표로 감싼 문자 리터럴은 유니코드로 변환되어 저장
        //char 타입은 정수 타입
        
        char c = 65;      //10진수
        char c = 0x0041;  //16진수
       //char는 정수 타입이므로 10진수 또는 16진수 형태의 유니코드 저장 가능
        
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class CharTest {
 
    public static void main(String[] args) {
        // char : 부호없는 2byte 정수 ( 0 ~ 65535 )
        
        //작은 따옴표(')를 사용해서 나타낸다
        char c1 = 'A';
        System.out.println("c1 =" + c1);
        
        char c2 = 97;  //문자의 코드값을 직접 저장할 수 있다
        System.out.println("c1 =" + c2);
        
        char c3= 44032;
        System.out.println("c3 =" + c3);
        
        int i3 = c3;
        System.out.println("i3 =" + i3);
        System.out.println("i3 =" +(char)i3);


//console
c1 =A
c1 =a
c3 =가
i3 =44032
i3 =가
    }
 
}
cs

 

 

 

3.문자:큰따옴표로 감싼 문자들

 

' 문자 리터럴

" 문자열

 

-문자열은 char 타입에 저장 불가

-String 타입 변수로 저장

 

4.escape 문자 '\'

1
2
3
4
5
6
7
8
String str = "내 이름은\"홍길동\"입니다";
        System.out.println(str);
        
        String str = "번호\t이름\t나이";
        System.out.println(str);
        
        String str = "홍길동\n감자";
        System.out.println(str);
cs

-특정 문자를 포함시키거나, 문자열의 출력 제어 가능

\t 탭만큼 띄움
\n 줄바꿈(라인 피드)
\r 캐리지리턴(
\" "출력
\' '출력
\\ \출력
\u16진수 16진수 유니코드에 해당하는 문자 출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class StringTest {
 
    public static void main(String[] args) {
        /*
         * 문자와 문자열
         * 문자(char)    : 한 글자를 나타낸다. (' ' 로 묶어서 표현한다.)
         * 문자열(String) : 0개 이상의 글자들의 집합 (" " 로 묶어서 표현한다.)
         *                     ==> 기본 자료형이 아니고 참조형 자료이다.
         *                     ==> 즉 객체이다.
         * 
         */
        
        char c1 = 'A';
        String s1 = "홍길동";
        String s2 = new String("402호");
        
        System.out.println(s2 + "," + s1);
        
        //Blank character explaining
        char c2 =' '//character type at least have to explain blank 
        String s3 = ""//empty String
        
        /*
         * escape character
         * \t : effect like pressing tab key
         * \n : line break
         * \r : carrage return
         * \" : indication double quatation marks
         * \' : indicates a single quatation mark
         * \\ : Represent a backslash character
         */
        
        String str1 = s1 + "\n" + s2;
        System.out.println(str1);
        
        System.out.println();
        System.out.println(s1 + "\t" + s2);
    
        System.out.println();
        System.out.println("\"" + s1 + "\t" + s2 + "\"");
        
        System.out.println(s1 + "\\\t\\" + s2);
        
        String year = "" + 20 + 24//"20" + 24 ==> "2024"
        System.out.println(year);
    }
 
}
402호,홍길동
홍길동
402호

홍길동 402호

"홍길동 402호"
홍길동\ \402호
2024

 
cs

 

실수 타입

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class FloatTest {
 
    public static void main(String[] args) {
        /*
         *   실수형 자료
         *   
         *   1.float    : 4byte
         *   
         *   2.double   : 8byte
         *   
       */
           //실수형 리터럴은 기본적으로 double형으로 인식
           //float형의 리터럴을 나타내기 위해서는 데이터값 뒤에 F를 붙인다.
           float f1 =3.141592f;
           double d1 = 3.141592;
           
           if(f1 == d1) {
               System.out.println("같은 값");
           }else {
               System.out.println("다른 값");
           }
           
           double d2 = 3.141592f;
           if(d1 == d2) {
               System.out.println("같은 값");
           }else {
               System.out.println("다른 값");
           }
 
    }
 
}

//console
다른 값
다른 값
 
cs

 

실수를 저장할 수 있는 타입.

기본적으로 소수점 이하를 정확히 표시할 수 있는 double 타입을 주로 사용하며

float타입으로 저장하려는 경우 리터럴 뒤에 f또는F를 붙여 float 타입을 표시한다

 

논리 타입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class BooleanTest {
 
    public static void main(String[] args) {
        /*
         * 논리형 자료 : true, false
         * 
         * 주로 제어문에서 실행의 흐름을 변경하는데 사용한다
         * 
         */
        
        boolean flag = false;
        flag = true;
        
        
        int age = 16;
        
        flag = age > 19;
        
        System.out.println("flag = " + flag);
        
        if(flag) {
            System.out.println("성년입니다");
        }else {
            System.out.println("미성년입니다");
        }
    }
}
x =10
y =20
z = x + y =30
 
cs

 

 

참과 거짓에 해당하는 true 와 false 리터럴을 저장하는 타입

boolean 함수의 변수를 이용하여

if 문 사용, else 로 boolean false 값 대응

 

<13:50~17:40 DB기초>

오라클SQL 시간 설정

오라클에 SELECT SYSTIMESTAMP FROM DUAL; 입력

시간대가 영국 그리니치 천문대 기준으로 나온다(9시간 늦음)

bash4.4# 우분투 관리자 모드로 진입하여

기존 로컬타임을 지우고(rm)

서울 기준 시간대로 로컬타임을 재생성한다(ln) 

*

1. PS를 통해 Ubuntu 실행

2. 해당 컨테이너 실행  docker exec -u 0 -it Oracle23c

3. etc폴더의 localtime 파일 삭제

cd /etc

rm –f localtime

4. 리눅스 시간(타임존)을 한국 표준시(KST)로 변경하기

ln -s /usr/share/zoneinfo/Asia/Seoul localtime

5. Docker Container를 재시작 

docker restart Oracle23c

옳게 된 시간

 

 

1.1데이터베이스와 데이터베이스 시스템

특징)

-실시간 접근성

-계속적인 변화

-동시 공유

-내용에 따른 참조

데이터베이스 시스템의 구성)

-DBMS:사용자와 데이터베이스를 연결시켜주는 소프트웨어

-데이터베이스:데이터를 모아둔 토대

-데이터 모델:데이터가 저장되는 기법에 관한 내용

 

1.2 데이터베이스 시스템의 발전

파일시스템)

-데이터베이스 전에 사용되던 방식

-데이터를 파일단위로 서버에 저장

-응용 프로그램에 종속적=>필연적으로 데이터의 중복 발생 

데이터베이스 시스템)

-DBMS서버가 파일을 다루며 데이터의 일관성 유지, 복구, 동시 접근 제어 등의 기능 수행

-데이터의 중복을 줄이고 데이터를 표준화하며 무결성을 유지함(대신 개발자는 죽어남..ㅋㅋ)

웹 데이터베이스 시스템)

-데이터베이스를 웹 브라우저에서 사용할 수 있도록 서비스하는 시스템

-불특정 다수를 대상으로 하는 서비스 등에 적용

 

분산 데이터베이스 시스템)

- 논리적으로 하나의 시스템에 속하지만 물리적으로는 네트워크를 통해 연결된 여러 개의 컴퓨터 사이트에 분산 되어 있는 데이터 베이스 시스템

-대규모의 응용 시스템에 사용됨

 

1.3데이터베이스 시스템의 구성

3단계 데이터베이스-스키마)

- 데이터베이스의 논리적 정의 : 데이터구조와 제약조건에 대한 명세를 기술한 것

- 데이터 구조를 표현하는 개체(entity), 개체들의 특성을 표현하는 속성(attribute), 이들간에 존재하는 관계(relationship)에    대한 정의와 이들이 유지해야 할 제약조건이 포함

 

데이터 언어)

1.데이터 정의어(DDL:Data, Definition Language)

-데이터베이스를 정의하거나 그 정의를 수정할 목적으로 사용하는 언어

-데이터베이스 스키마를 컴퓨터가 이해할 수 있게끔 기술하는 언어

ex) CREATE(객체 생성),DROP(객체 삭제)

 

2.데이터 조작어(DML:Data Manpulation Language)

-사용자로 하여금 데이터를 처리할 수 있게 하는 도구

-데이터의 겁색,삽입,삭제,변경 등을 포함

ex)INSERT,UPDATE,DELETE,MANIPULATION

 

3.데이터 제어어(DCL:Data control Language)

- 데이터 제어를 정의하고 기술하는 언어

- commit을 rollback 하는 기능 등 부가적인 데이터 관리 기능 포함

 

 

  데이터 모델)

-데이터를 저장하는 이론적인 방법으 로 데이터베이스에서 데이터가 어떻게 구조화되어 저장되는지를 결정

-가장 많이 사용되는 데이터 모델은 관계 데이터 모델(부모 자식 관계 간에 키를 이용해서 관계 수행)

 

DBMS)

- 사용자와 데이터베이스를 연결시켜 주는 소프트웨어로, 데이터베이스 사용자가 데이터베이스를 생성, 공유, 관리할 수 있도록 지원해주는 총체적인 역할

 

1.4관계 데이터 모델

관계 데이터 모델의 개념

-1970년대 IBM의 Edger F.Codd에 의해 제안(통계학자)

-관계형 데이터 베이스 모델의 이론적인 모델을 제공

-테이블 형태의 집합의 개념으로 자료를 처리

-2차원 배열 구조를 가지는 테이블로 구성

-I.E 및 Backer 형식 등이 있다

 

관계 데이터 모델

릴레이션 스키마

-'도서번호'와 같이 각 열들의 이름과 속성(attribute)을 가짐

속성(ATTRIBUTE)

-릴레이션 스키마가 가지고 있는 속성

도메인(DOMAIN)

-속성들이 가질 수 있는 값들의 범위가 지정되어 있는 집합

치수(DEGREE)

-릴레이션 스키마에서 애트리뷰트들은 적어도 1개 이상을 가져야 하며 이 애트리뷰트의 수를 말함

 

릴레이션의 특징)

-투플의 유일성

-투플의 무순서

-속성의 무순서

-속성의 원자성

 

 

키(key)

-테이블에서 튜플을 유일하게 식별할 수 있는 속성 혹은 속성들의 집합(ex:주민등록번호)

-중복되지 않음

슈퍼 키(Super Key)

-튜플을 유일하게 식별할 수 있는 하나의 속성 또는 속성들의 집합(ex:주민등록자의 기타 신상정보)

후보 키(Candidate Key)

-기본 키가 될 수 있는 후보의 집합

- 키가 되는 속성(혹은 속성의 집합)은 반드시 값이 달라서 튜플들을 서로 구별할 수 있어야 함(유일성,최소성)

대체 키(Alternate Key)

- 후보 키 중에서 선정된 기본 키를 제외한 나머지 후보 키

 기본 키(Primary Key)(PK)

-NULL(length:0)을 허용하지 않고 중복된 값을 가질 수 없음

-왜? 검색 효율을 높이기 위해서

-빨리, 쉽게 찾으려고

외래 키(Foreign Key)

-부모 것이 참조되어 그대로 사용되며 이때 부모 측의 속성이 무결성이다(때로는 스스로 참조하는 자기참조도 있으며 서로 참조될 때도 있다)

-다른 테이블, 릴레이션의 기본 키를 참조하는 속성 또는 속성들의 집합을 의미

-참조 테이블의 기본 키와 동일한 키 속성을 지님

-데이터가 잘못되지 않게, 엉터리 데이터가 들어가지 않게(기본 키를 지우려면 먼저 외래키를 지워야 기본키가 지워진다)

==> 참조무결성

 

상품 카테고리(부모)에는 상품코드가 있고

고객 카테고리(부모)에는 고객번호가 있다

이 둘 사이에 실선으로 연결한 주문 카테고리 상위에 존재해야 하는 것은 기본키이며 하위에는 날짜, 수량 등이 존재한다

그러나 상품코드와 고객코드를 그대로 부모로부터 가져와 쓴다면 기본키의 중복불가라는 특성 때문에 한 고객이 평생 한번밖에 구매하지 못하는 불상사가 발생한다. 

때문에  부모 간에 가져온 것을 테이블 하위로 내려 외래키로 사용하며 기본키에는 가상의 더미 키를 사용하여 쓰기도 한다 

 

<기본 정규화>

1:1 사원마다 별명 1개가 있어서 별명 한개만 뿌려주면 됨(최소 1테이블 이상)

1:N 별명 N개를 만들기 위해 사원의 이름 주소 등 중복되기 때문에 별도의 테이블을 만들어줌(최소 2테이블 이상)

 

N:N 내 별명을 다른 사람도 쓸 수 있다면 별명 외 구분되는 특징이 있기 때문에 별명 전용 테이블을  하나 더 만들어서 1:N에서 만든 테이블의 부모, 각 사원의 프로필 또한 부모가 되어 전부가 한 덩어리를 이루어 Relation이 된다

(보통 최소 3개의 테이블 이상) 

 

제약조건(Constraint)

 

2.1 SQL 기초

SQL 구성요소

데이터 정의 언어(Data Definition Language: DDL)

-릴레이션 스키마의 정의, 삭제, 수정하는 명령어를 제공 

-DDL에 속하는 명령으로는 'CREATE', 'ALTER', 'DROP', 'TRUNCATE‘등이 존재

 

데이터 조작 언어(Data Manipulation Language: DML)

-데이터베이스에 정보를 질의하고, 튜플(Tuple)을 삽입, 삭제, 수정하는 기능을 제공

-DML에 속하는 명령어로는 'SELECT', 'INSERT', 'UPDATE', 'DELETE', ’MERGE' 등이 존재

 

SQL 특징

-SQL은 대화식 언어

=> 명령을 즉시 실행하고 결과를 반환

-SQL은 선언적 언어

=>문제 해결과정을 생략하고 요구사항만 전달

=>DBMS가 이 요구사항에 맞는 문제 해결과정 진행(최적의 실행계획을 작성하고 최종 결과 도출 방법 등을 결정)(우린 결과만 볼 수 있고 그 과정을 알 필요도 없음)

 

데이터베이스 객체의 종류

 

+트리거: 데이터베이스에서 특정 이벤트가 발생할 때 자동으로 실행되는 작업을 정의하는 데 사용되는 데이터베이스 객체

 

 

<18:30~22:00 야간자습>