대덕 240903-자바:변수/DB:데이터베이스 개념
<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 야간자습>