대덕240904-자바:타입 변환/DB:테이블
<자바1~4교시>
타입 변환
데이터 타입을 다른 데이터 타입으로 변환하는 것을 말한다
자동 타입 변환
값의 허용 범위가 작은 타입이 큰 타입으로 저장될 경우 자동으로 형변환이 된다
char 타입의 경우 int 타입으로 자동변환되면 유니코드 타입이 int 타입에 저장된다.
그러나 char 타입은 2비트인데 반해 1비트인 byte 타입의 자동 타입 변환이 이루어지지 않는데,
이는 char타입은 유니코드 형식으로 데이터를 저장하는데 byte타입의 음수 영역은 저장하지 않기 때문에
후술될 강제 타입변환으로 변환이 가능하다
강제 타입변환
큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나누어 한 조각만 저장.
필연적으로 데이터의 손실이 발생
작은 허용 범위 타입 = (작은 허용 범위 타입)큰 허용 범위 타입
정수 연산에서의 자동 타입 변환
정수 타입 변수가 산술 연산식에서 피연산자로 사용되는 경우
byte,char,short 타입 변수는 int 타입으로 자동 변환
*특별한 경우 아니라면 정수 연산에 사용되는 변수는 int타입으로 선언하는 것이 효과적
*피연산자 중 하나가 long 타입이면 다른 피연산자는 long 타입으로 자동 변환
실수 타입에서의 자동 타입 변환
피연산자 중 하나가 double 타입일 경우 다른 피연산자도 double 타입으로 자동변환
다른 타입 연산이 필요할 경우 먼저 강제 변환한 뒤 연산 수행
*실수 리터럴 연산시 플로트 연산이 필요하다면 숫자 뒤에 f 또는F를 붙이는 것을 잊지 말자
정수 연산의 결과는 항상 정수로 나오기 때문에 실수값까지 계산하고 싶다면
둘 중 하나가 실수이거나 둘 다 실수가 되어야 하므로
정수와의 연산에서 실수값을 나타내고 싶으면 다음과 같은 실수 연산으로의 변환이 필요하다
+연산에서의 문자열 자동 타입 변환
피연산자가 모두 숫자일 경우 덧셈 연산
피연산자 중 하나가 문자열일 경우 나머지 피연산자도 문자열로 자동 변환되고 문자열 결합 연산
+연산은 앞에서부터 순차적으로 수행
먼저 수행된 연산이 결합 연산일 경우 이후 모든 연산이 결합 연산이 됨
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
public class TypeChangeTest01 {
public static void main(String[] args) {
// 자동 형 변환 automatic type conversion
//작은 범위 ==> 큰 범위 small range ==> large range
int i1 = 10;
long l1 = i1;
System.out.println("l1 = " + l1);
//forced type conversion
// large range ==> small range
// data type variable = (data type)value;
long l2 = 1000;
int i2 = (int)l2;
System.out.println("int type i2 = " + i2);
//double ==> type conversion to int
double d3 = 10.456;
int i3 = (int)d3;
System.out.println("double --> int type conversion : " + i3);
//int ==> type conversion to double
int i4 = 200;
double d4 = i4;
System.out.println("int --> type conversion to double : " +d4);
//char --> type conversion to int
char ch5 = 'a';
int i5 = ch5;
System.out.println("char --> type conversion to int : " + i5);
//int --> type conversion to char
int i6 = 99;
char ch6 = (char)i6;
System.out.println("int --> type conversion to char : " + ch6);
//Convert lowercase a to uppercase A
//The difference in code value between uppercase letter A and lowercase letter a is 32.
char ch7 = 'a';
int ch7_1 = (char)(ch7 -32);
System.out.println("lowercase to uppercase : " + ch7_1);
//convert uppercase D to lowercase d
char ch8 = 'D';
int ch8_1 = (char)(ch8 + 32);
System.out.println("uppercase to lowecase : " +ch8_1);
//numeric --> String converting
int i9 = 100;
double d9 = 3.14;
String s9 = i9 + "";
String s9_1 = "" + i9;
System.out.println("s9 = " + s9);
String s10 = i9 + d9 + ""; // 100 + 3.14 + "" ==> 103.14 + "" ==> "103.14"
System.out.println("s10 = " + s10);
String s11 = "" + i9 + d9; // "" + 100 + 3.14 ==> "100" + 3.14 ==> "1003.14"
System.out.println("s11 = " + s11);
String s12 = String.valueOf(i9) + String.valueOf(d9);
// ==> "100" + "3.14" ==> "1003.14"
System.out.println("s12 = " + s12);
}
}
l1 = 10
int type i2 = 1000 double --> int type conversion : 10 int --> type conversion to double : 200.0 char --> type conversion to int : 97 int --> type conversion to char : c lowercase to uppercase : 65 uppercase to lowecase : 100 s9 = 100 s10 = 103.14 s11 = 1003.14 s12 = 1003.14 |
cs |
문자열을 기본 타입으로 강제 변환
문자열->숫자
기본 자료형을 객체화할 필요가 있을때 사용하는 변환
래퍼 클래스라고도 한다
- 기본 자료형을 클래스 타입으로 포장해 놓은 클래스
- 기본 자료형보다 객체로 저장하기 때문에 좀 더 다양한 기능을 제공하기 위해 사용함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class WrapperClassTest {
public static void main(String[] args) {
//Wrapper Class ==> A class that instantiates basic data types
//boxing (basic data type -> wrapper)
int i1 = 10;
Integer num1 = new Integer(i1); //Method before Java 1.9(Run enable but unrecommanded)
Integer num2 = Integer.valueOf(i1); //Method above Java1.9
Integer num3 = i1; //autoboxing
//unboxing (wrapper -> basic data type)
Integer num5 = 20;
int i2 = num5; //auto unboxing
}
}
|
cs |
- 기본 타입의 값을 내부에 두고 포장을 하기 때문에 포장(wrapper) 클래스라고도 함
*문자열이 숫자 외 요소를 포함할 경우 숫자 타입 변환 시도할 경우 숫자 형식 예외 발생(에러 발생)
*String.valueOf() 메소드를 사용하여 기본 타입(숫자)을 문자열로 변환 가능하다
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
|
public class TypeChangeTest02 {
public static void main(String[] args) {
/*
* basic data type name ==> wrapper class name
* byte ==> Byte
* short ==> short
* int ==> Integer
* long ==> Long
*
* float ==> Float
* double` ==> Double
*
* char ==> Character
*/
// String ==> basic data type
// Wrapper Class name.parse data type name (String)
String s1 = "10";
int i1 = Integer.parseInt(s1);
byte b1 = Byte.parseByte(s1);
short sh1 = Short.parseShort(s1);
long l1 = Long.parseLong(s1);
String s2 = "123.45";
float f1 = Float.parseFloat(s2);
double d1 = Double.parseDouble(s2);
String s3 = "false";
boolean bool1 = Boolean.parseBoolean(s3);
}
}
|
cs |
변수와 타입_변수와 시스템 입출력
1.모니터로 변수값 출력하기
println() 메소드
괄호 안에 리터럴 넣으면 그대로 출력/ 변수 넣으면 저장된 값 출력
printf() 메소드
-개발자가 원하는 형식화된 문자열(formal string) 출력 (전체 출력 자리수 및 소수 자릿수 제한)
-형식 문자열에서는 %와 conversion 외에는 모두 생략 가능
-conversion에는 제공되는 값의 타입에 따라 d(정수), f(실수), s(문자열) 입력
형식 문자열에 포함될 값 2개 이상인 경우 값의 순번(argument_index$)을 표시해야 한다
2. 키보드에서 입력된내용을 변수에저장하기
키코드
-키보드에서 키를 입력할 때 프로그램에서 인식하는 코드
-System.in의 read() 사용
-얻은 키코드는 대입 연산자를 이용하여 int 변수에 저장
-여러 번의 문자를 입력하기에는 어려움(두 개 이상의 글자가 조합된 한글을 인식하기 힘들다)
(= 키보드로 입력된 내용을 통문자열로 읽을 수 없음)
-자바가 제공하는 Scanner 클래스를 이용하면 입력된 통문자열을 읽을 수 있음
기본 타입의 값 비교와 문자열 비교
<기본 타입의 값 비교는 == 를 사용>
- int x =5;
- boolean result = (x == 5); //true
<문자열의 비교는 equals()메소드 사용>
- String str1 = "java";
- boolean result1 = str1.equals( "java" ); //true
- boolean result2 = str1.equals( "Java" ); //false
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
import java.util.Scanner;
public class PrintTest {
Scanner scan = new Scanner(System.in); //Scanner 객체 생성
public static void main(String[] args) {
PrintTest test = new PrintTest(); //Create object
test.printTest(); //method call
test.printlnTest();
test.printfTest();
test.printfTest2();
test.testMethod1();
test.testMethod2();
}
public void testMethod2() {
//난수 만들기 ==> Math.random()메서드 이용
// 0<= Math.random() <1
System.out.println(Math.random());
// 최소값 ~ 최대값 사이의 정수형 난수 만들기
// (int)(Math.random() * (최대값-최소값+1) + 최소값);
// 11~20 사이의 난수 만들기
int ran = (int)(Math.random() * (20-11+1) + 11);
System.out.println("ran = " + ran);
//----------------------------------------------------------
int num1 = 20;
int num2 = 6;
// num1을 num2로 나눴을 때 몫과 나머지 구하기
// 몫은 정수형끼리 나눗셈을 하면 자동으로 소수점 이하가 없어진다
//나머지는 %연산자를 사용한다
int re1 = num1 / num2; // 몫
int re2 = num1 % num2; // 나머지
System.out.println(re1);
System.out.println(re2);
}
public void testMethod1() {
//국어점수, 영어점수, 수학점수를 입력 받은 후 총점과 평균을 구해서 출력하시오
//입력은 Scannerd의 next()메서드 이용
System.out.print("국어 점수 입력 >>");
String word= scan.next();
System.out.print("영어 점수 입력 >>");
String english= scan.next();
System.out.print("수학 점수 입력 >>");
String math= scan.next();
System.out.println("국어: " + word + "\t영어 : " + english + "\t수학 : " + math);
int iWor = Integer.parseInt(word);
int iEng = Integer.parseInt(english);
int iMat = Integer.parseInt(math);
int total = iWor + iEng + iMat; //총점
double avg = total / 3.0; //방법1
// double avg = (double)total / 3; //방법2
System.out.printf("총점 : %d, 평균 : %.2f\n", total, avg );
}
public void printfTest2() {
//나이와 이름을 입력받아서 출력하기
System.out.print("이름 입력 >> ");
String name= scan.next();
System.out.print("나이 입력 >> ");
String age= scan.next();
int iAge = Integer.parseInt(age);
System.out.printf("이름 : %s, 나이 : %d\n", name, iAge);
System.out.printf("이름 : %d, 나이 : %s\n", iAge, name);
System.out.printf("이름 : %2$d, 나이 : %1$s\n", name, iAge);
}
//printf() practice method to output by specifying the output format
public void printfTest() {
// System.out.printf("형식지정문자열", 데이터리스트);
// - 형식문자열
// ==> &d(정수)
// ==> %f(실수)
// ==> %s(문자열)
System.out.println("12345678901234567890");
System.out.printf("%d\n", 123);
System.out.printf("%6d\n", 123); // 전체 6자리에 출력(기본:오른쪽 정렬)
System.out.printf("%-6d\n", 123); // 전체 6자리 왼쪽 정렬
System.out.printf("%06d\n", 123); // 빈자리 0으로 채우기
System.out.printf("%10.3f\n", 123.4567); //전체 10자리 공간에 소수점 이하 3자리까지 출력
System.out.printf("%10.3f", 123.4562); //전체 10자리 공간에 소수점 이하 3자리까지 출력
System.out.println();
}
//println() practice method with line break function
public void printlnTest() {
System.out.println("홍길동");
System.out.println("34061");
System.out.println("대전 중구 계룡로");
}
//print() practice method without line breaks
public void printTest() {
System.out.print("홍길동");
System.out.print(" 34061 ");
System.out.print(" 대전 중구 계룡로\n");
//console
홍길동 34061 대전 중구 계룡로
홍길동 34061 대전 중구 계룡로 12345678901234567890 123 123 123 000123 123.457 123.456 이름 입력 >> 국어 점수 입력>> }
}
|
cs |
<DB 5~8 교시>
2.3 테이블 생성, 수정, 삭제
테이블 생성)
-DBMS상 가장 기본적인 객체
-ROW와 COLUMN으로 구성된 2차원 배열 형태의 객체
-테이블이 저장되는 공간:테이블 스페이스
-보통은 별도로 테이블 스페이스를 지정하지 않아도 기본 테이블 스페이스를 사용하게 됨
-이름이 같은 테이블은 존재할 수가 없다
*컬럼은 중복되어야만 한다. 테이블과 테이블 사이에 관계를 맺어야 되기 때문에 서로 다른 테이블에서는 같은 이름을 공유할 수 있는 것이다(테이블마다 이름이 다를 수도 있다)
-SQL을 이용하여 데이터의 CRUD(Create,Read,Update,Delete) 할 대상이며, 그 결과를 담고있는 객체 역시 테이블
테이블 생성 방법)
-테이블 생성 명령 코드 입력
-마우스 그래픽 툴
-ERD 포워드 엔지니어링 일괄생성 툴
*테이블 생성을 하기까지는 못하더라도 수정이 필요할때 읽을 정도는 되어야 한다
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
|
2024-0904-01) 테이블 생성
구문형식)
CREATE TABLE 테이블명(
컬럼명 데이터타입[(크기)][NOT NULL] [DEFAULT 값]
[, 컬럼명 데이터타입[(크기)][NOT NULL] [DEFAULT 값]
:
[, 컬럼명 데이터타입[(크기)][NOT NULL] [DEFAULT 값])]
[CONSTRAINT 기본키설정명 PRIMARY KEY(컬럼명 [,컬럼명,...])][,]
[CONSTRAINT 외래키설정명 FOREIGN KEY(컬럼명) REFERENCES 테이블명(컬럼명)][,]
:
[CONSTRAINT 외래키설정명 FOREIGN KEY(컬럼명) REFERENCES 테이블명(컬럼명)]);
사용예)고객, 상품, 주문, 주문_상품 테이블을 생성하시오
1)고객테이블 생성
CREATE TABLE CUST(
CUST_ID CHAR(4),
CUST_NAME VARCHAR2(50),
CUST_ADDR VARCHAR2(255),
CONSTRAINT pk_cust PRIMARY KEY(CUST_ID));
2)상품테이블
CREATE TABLE GOODS(
G_ID VARCHAR2(5),
G_NAME VARCHAR2(60),
G_PRICE NUMBER(7),
CONSTRAINT pk_goods PRIMARY KEY(G_ID));
3)주문테이블
CREATE TABLE ORDERS(
ORDER_ID VARCHAR2(13),
CUST_ID CHAR(4),
ORDER_DATE DATE,
CONSTRAINT pk_orders PRIMARY KEY(ORDER_ID),
CONSTRAINT fk_orders_cust FOREIGN KEY(CUST_ID) REFERENCES CUST(CUST_ID));
4)주문상품테이블
CREATE TABLE ORDER_GOODS(
ORDER_ID VARCHAR2(13),
G_ID VARCHAR2(5),
ORDER_QTY NUMBER(3) DEFAULT 0,
CONSTRAINT pk_ord_goods PRIMARY KEY(ORDER_ID,G_ID),
CONSTRAINT fk_ord_goods_order FOREIGN KEY(ORDER_ID)REFERENCES ORDERS(ORDER_ID),
CONSTRAINT fk_ord_goods_goods FOREIGN KEY(G_ID) REFERENCES GOODS(G_ID));
|
cs |
물건이 있으면 주문하는 고객이 있다(이 둘이 부모 테이블)
고객(네모=Entity)의 가장 기본이 되는 속성(Atteibute)은 고객번호, 고객명, 주소 등(식별자)이 있다
물건에는 상품코드, 상품명, 판매단가 등(식별자)이 있다
고객과 물건을 잇는 주문(마름모=Relationship)에는 주문일자, 수량 등(합쳐서 식별자)이 있다
*직선:부모의 기본키가 자식의 기본키가 된다
*점선:부모의 기본키가 자식의 컬럼이 된다
요구사항을 분석해서 필요한 요소를 정리하는 것은 Entity Relationship Diagram이다
개념 모델을 정립하면 논리 모델로(식별자 분류), 논리 모델을 정립(키,칼럼 분류) 하면 물리 모델로(엔터티->관계->속성)
*UML 다이어그램 중 하나인 유스케이스로 쉽게 정리할 수 있을 정도로
SQL 사용명령어 :문자열(고정길이,가변길이),숫자(NUMBER),날짜(DATE,TIMESTAMP),이진 데이터(비엘로비,비파일)