DQL(Data Query Lenguage) - 데이터 질의어, SELECT

-> 

DML (Data Manipulation Language) - 데이터 조작어, INSERT, UPDATE, DELETE


DDL 정의

DCL 컨트롤





INSERT


1. INSERT 문은 테이블에 새 행(row)을 추가하는데 이용하며, single table insert 나 multi table insert를 수행할 수 있다.


single table insert : 오직 하나의 테이블이나 뷰에 오직 하나의 행(row)의 값들을 삽입할 수 있다.

multi table insert : 하나 이상의 테이블로부터 스브쿼리로 얻은 여러 행(row)을 삽입하는 경우이다.


2.

insert into 테이블명 (컬럼명1, 컬럼명2, ...) values (값1, 값2, ...);

-> 컬럼명과 값은 1:1 매칭이 되어야 한다. 자료형, 순서, 갯수.



insert into 테이블 values (값1, 값2, ...);

-> 테이블에 있는 모든 컬럼을 대상으로 값을 입력하는 경우 컬럼명 부분을 생략할 수 있다.








자료형


1. VARCHAR2, NVARCHAR2 : 문자열형. 길이 지정. 최대 4000자.

2. NUMBER : 숫자형(정수, 실수). 길이 지정. 최대 38자리

3. DATE : 날짜형. 날짜, 시간이 저장됨.






NUMBER 자료형 자료 입력 테스트


CREATE TABLE test1 (

col1 number -- 38자리까지 입력가능

,col2 number(3) -- 3자리까지만 입력가능

,col3 number(5, 2) -- 5자리인데, 소수이하 2자리 입력가능. (소수이하 자리 포함해서 5자리)

);


insert into test1 (col1, col2, col3) values (123, 123, 123); -- 123, 123, 123

insert into test1 (col1, col2, col3) values (123.45, 123.45, 123.45); -- 123.45, 123, 123.45

insert into test1 (col1, col2, col3) values (123.456, 123.456, 123.456); -- 123.456, 123, 123.46

insert into test1 (col1, col2, col3) values (1234, 1234, 1234); -- 입력시도하는 정수가 크므로 아예 입력 불가





DATE 자료형 자료 입력 테스트


CREATE TABLE test2 (

col1 date --날짜, 시간 저장

);


insert into test1 (col1) values (SYSDATE); -- 2012-10-25 10:05:30

insert into test1 (col1) values ('20121025'); -- 2012-10-25 00:00:00

insert into test1 (col1) values ('2012-10-25'); -- 2012-10-25 00:00:00

insert into test1 (col1) values ('2012/10/25'); -- 2012-10-25 00:00:00





VARCHAR2, NVARCHAR2 자료형 자료 입력 테스트


CREATE TABLE test3 (

col1 VARCHAR2(1) -- 1글자만 허용.

,col2 VARCHAR2(10) -- 10글자까지 허용. 영어는 1글자, 한글은 한글자당 3글자 차지

,col3 NVARCHAR2(10) -- 10글자까지 허용. 영어, 한글 상관없이 한글자당 1글자 차지

);


insert into test3(col1, col2, col3) values ('A', 'B', 'C'); --A, B, C

SELECT * FROM test3;

insert into test3(col1, col2, col3) values ('TEST', 'TEST', 'TEST'); -- 허용 글자수 오버로 입력 불가.


insert into test3(col2, col3) values ('ORACLEDATA', 'ORACLEDATA'); -- 널, ORACLEDATA, ORACLEDATA

insert into test3(col2, col3) values ('ORACLEDATABASE', 'ORACLEDATABASE'); -- 허용 글자수 오버로 입력 불가.


insert into test3(col2, col3) values ('오라클', '오라클'); -- 널, 오라클, 오라클,

insert into test3(col2, col3) values ('오라클데이터베이스', '오라클데이터베이스'); -- 허용 글자수 오버로 입력 불가.


insert into test3(col3) values ('오라클데이터베이스'); -- 널, 널, 오라클데이터베이스

insert into test3(col2) values ('오라클데'); -- 한글 하나당 3자리 차지하므로 입력 불가.






테이블 객체 관리


1. 새 테이블 생성

create table 테이블명 (

컬럼명 자료형 [제약조건]

,...

);



2. 기존 테이블 구조 확인

desc 테이블명;



3. 기존 테이블 구조 복사해서 새 테이블 생성

create table 새테이블명

as

select 컬럼리스트 from 기존테이블명 where 1=0;



4. 기존 테이블 구조 및 자료 복사해서 새 테이블 생성

create table 새테이블명

as

select 컬럼리스트 from 기존테이블명 [where 조건식]; -- 조건식이있을 경우 조건식에 만족하는 행만 복사



-- insa 테이블 복사해서 test4 테이블 생성. 구조와 자료 전체 복사.

create table test4 as 

select * from insa;



5. 기존 테이블에 새 열(column) 추가

alter table 기존테이블명

add (열이름 자료형, ....);



6. 기존 테이블에 기존 열(column) 자료형 변경

alter table 기존테이블명

modify 열이름 새로운자료형;



7. 기존 테이블에 기존 열(column) 이름 변경

alter table 기존테이블명

rename column 기존열이름 to 새열이름;



8. 기존 테이블에 기존 열(column) 삭제

alter table 기존테이블명

drop column (열이름, ....);


9. 기존 테이블의 이름 변경

rename 기존테이블명 to 새로운테이블명;


10. 기존 테이블 삭제 (휴지통 기능)

drop table 테이블명; -- 휴지통으로 이동한 상태


-- 휴지통에 있는 객체 확인.

select *

from recyclebin;


-- 휴지통에 있는 객체 복원.

flashback table 테이블명 to before drop;


-- 휴지통 비우기

purge recyclebin;


-- 완전 삭제(휴지통을 거치지 않고 바로 삭제)

drop table 테이블명 PURGE;







제약 조건


1. Primary Key(PK), Unique(UK), NOT NULL, Check(CK), Foreign Key(FK)


2. 무결성 유지를 위한 조건 추가. 개체 무결성, 참조 무결성, 도메인 무결성.


3. 제약조건 지정방법

- 컬럼레벨

CREATE TABLE 테이블명 (

컬럼명 자료형 [CONSTRAINT 제약명] 제약조건명  // [] 은 제약조건명이 제약명을 가진 객체로 오라클이 가지고 있게 하여, 추후 수정할때 사용함.

,...

);



- 테이블레벨 (권장)

CREATE TABLE 테이블명 (

컬럼명 자료형 

,...

,CONSTRAINT 제약명 제약조건명 (컬럼지정)

);



4. 제약조건 확인

select * from user_constraints;


-- 특정 테이블에 있는 제약조건 확인 (제약 종류만 확인)

select * from user_constraints 

where table_name = 'TEST7'; -- 테이블명 대문자로 표기



-- 특정 테이블에 있는 제약조건이 지정된 컬럼 정보 확인 (제약조건 걸린 컬럼명만 확인)

select *

from user_cons_columns

where table_name = 'TEST7';



-- 제약종류와 컬럼 정보를 동시에 확인. constraint_name 컬럼을 기준으로 join


select uc.owner, uc.table_name, column_name, constraint_type, uc.constraint_name

from user_constraints uc, user_cons_columns ucc

where uc.constraint_name = ucc.constraint_name AND uc.table_name = '테이블명';


****

-> 자주 사용하는 select 쿼리는 view 객체로 등록


create view constraint_check

as

select uc.owner, uc.table_name as table_name, column_name, constraint_type, uc.constraint_name

from user_constraints uc, user_cons_columns ucc

where uc.constraint_name = ucc.constraint_name;


-> view 객체를 이용한 제약조건 확인


select * from constraint_check

where table_name ='테이블명';



-- 특정 테이블의 NOT NULL 제약 여부 확인


DESC 테이블명;




-- DEFAULT 제약 확인 

SELECT *

FROM user_tab_columns

where table_name = '테이블명';



-- 제약 확인용 VIEW 객체 수정 (CHECK 제약 확인 추가)


create or replace view constraint_check

as

select uc.owner, uc.table_name as table_name, column_name, constraint_type, uc.constraint_name, uc.search_condition

from user_constraints uc, user_cons_columns ucc

where uc.constraint_name = ucc.constraint_name;






◆ Primary Key(PK)

 * 특성

- PK가 지정된 컬럼에는 중복된 데이터 입력 불가.

- 테이블에는 PK를 한번만 지정가능.

- PK가 지정된 컬럼에는 NULL 값을 허용하지 않는다.

- PK가 지정된 컬럼에는 UNIQUE INDEX가 자동 생성된다.

- PK가 지정된 컬럼이 두 개 이상인 경우는 묶어서 하나로 처리해야 한다.

-- 컬럼지정시 컬럼을 다중으로 기재하면 복합키 처리가 됨.


 * 형식

CREATE TABLE 테이블명 (

컬럼명 자료형 

,...

,CONSTRAINT 제약명 PRIMARY KEY (컬럼지정)

);



--PK 지정전

CREATE TABLE test6 (

col1 NUMBER

,col2 VARCHAR2(10)

);


INSERT INTO test6(col1, col2) values (1, 'hong'); -- 1, hong

INSERT INTO test6(col1, col2) values (2, 'kim'); -- 2, kim

INSERT INTO test6(col1, col2) values (2, 'park'); -- 2, park

INSERT INTO test6(col2) values ('choi'); -- NULL, choi

INSERT INTO test6(col1, col2) values (NULL, NULL); -- NULL, NULL



--PK 지정후

CREATE TABLE test7 (

col1 NUMBER

,col2 VARCHAR2(10)

,CONSTRAINT test7_col1_pk PRIMARY KEY (col1)

);


INSERT INTO test7(col1, col2) values (1, 'hong'); -- O

INSERT INTO test7(col1, col2) values (2, 'kim'); -- O

INSERT INTO test7(col1, col2) values (2, 'park'); -- X

INSERT INTO test7(col2) values ('choi'); -- X

INSERT INTO test7(col1, col2) values (NULL, NULL); -- X






◆ Unique(UK)

 * 특성

- UK가 지정된 컬럼에는 중복된 데이터 입력 불가.

- 테이블에 UK를 여러번 지정 가능.

- UK가 지정된 컬럼은 NULL 값을 허용한다.


 * 형식

CREATE TABLE 테이블명 (

컬럼명 자료형 

,...

,CONSTRAINT 제약명 UNIQUE (컬럼지정)

);


-- UK 지정전

CREATE TABLE test8 (

col1 NUMBER -- PK 지정대상

,col2 VARCHAR2(10)

,col3 VARCHAR2(20) -- UK 지정대상

);


INSERT INTO test8 (col1, col2, col3) VALUES (1, 'kim', 'test@nate.com'); - 입력 가능

INSERT INTO test8 (col1, col2, col3) VALUES (2, 'park', 'test@nate.com'); - 입력 가능



--UK 지정 후

CREATE TABLE test9 (

col1 NUMBER

,col2 VARCHAR2(10)

,col3 VARCHAR2(20)

,CONSTRAINT test9_col1_pk PRIMARY KEY (col1)

,CONSTRAINT test9_col2_uk UNIQUE (col2)

);


INSERT INTO test8 (col1, col2, col3) VALUES (1, 'kim', 'test@nate.com'); - 입력 가능

INSERT INTO test8 (col1, col2, col3) VALUES (2, 'park', 'test@nate.com'); - 입력 불가






◆ NOT NULL 키워드


1. 특정 컬럼이 NULL 값이 가지지 못하도록 막는다. PK가 지정된 컬럼은 자동으로 NOT NULL 특성을 가진다.


2. 형식

CREATE TABLE 테이블명 (

컬럼명 자료형 NOT NULL

,...

);



-- NOT NULL 지정


CREATE TABLE test10 (

col1 VARCHAR2(10) NOT NULL --NULL 허용안함

,col2 VARCHAR2(10) -- NULL 허용

);


INSERT INTO test10 (col1, col2) VALUES ('test', 'test'); --O

INSERT INTO test10 (col1, col2) VALUES (NULL, NULL); --X









◆ DEFAULT 키워드


1. 입력시 미리 약속된 값을 자동 삽입 하는 경우. 단, 명시적으로 값을 입력하는 경우는 무시됨.


2. 형식

CREATE TABLE 테이블명 (

컬럼명 자료형 DEFAULT 값

,...

);




CREATE TABLE test11 (

col1 NUMBER

,col2 VARCHAR2(10)

,col3 DATE DEFAULT SYSDATE

);


INSERT INTO test11 (col1, col2, col3) values (1, 'hong', '20120101'); -- DEFAULT 값 무시됨

INSERT INTO test11 (col1, col2) values (2, 'kim');

INSERT INTO test11 (col1, col2) values (3, 'park', DEFAULT); -- DEFAULT값 자동 삽입.




-- DEFAULT 제약 확인 

SELECT *

FROM user_tab_columns

where table_name = '테이블명';







 CHECK 


1. 특정 컬럼에 입력되는 데이터에 대한 허용 범위를 지정할 때 사용.


2. 형식

CREATE TABLE 테이블명 (

컬럼명 자료형

,...

,CONSTRAINT 제약명 CHECK (조건식)

);


CREATE TABLE test12 (

col1 VARCHAR2(10)

,col2 NUMBER(3) --점수 입력 컬럼(0~100)

,CONSTRAINT test12_col2_ck CHECK (col2 between 0 and 100)

);



INSERT INTO test12 (col1, col2) values ('hong', 100); --O

INSERT INTO test12 (col1, col2) values ('park', 200); --X



-- 제약 확인용 VIEW 객체 수정 (CHECK 제약 확인 추가)


create or replace view constraint_check

as

select uc.owner, uc.table_name as table_name as table_name, column_name, constraint_type, uc.constraint_name, uc.search_condition

from user_constraints uc, user_cons_columns ucc

where uc.constraint_name = ucc.constraint_name;



-- NOT NULL 지정을 CHECK 제약으로 하는 방법


CREATE TABLE test13 (

col1 VARCHAR2(10) --NULL 허용안함

,col2 VARCHAR2(10) -- NULL 허용

,CONSTRAINT test13_col1_NN CHECK (col1 IS NOT NULL)

);


INSERT INTO test10 (col1, col2) VALUES ('test', 'test'); --O

INSERT INTO test10 (col1, col2) VALUES (NULL, NULL); --X







 FOREIGN KEY


1. 관계 설정시 사용하는 제약.

- FK가 지정된 컬럼에는 자료 입력이 참조를 하고 있는 PK 또는 UK 컬럼의 값들로 제한된다.

- FK가 지정된 컬럼에 자료입력하려면 먼저 PK 또는 UK컬럼에 해당 자료가 존재해야 한다.

- FK가 지정되고 나면 참조 당하는 PK 또는 UK 컬럼의 테이블 또는 자료는 삭제가 안된다.



2. 형식

CREATE TABLE 테이블명 (

컬럼명 자료명

,...

,CONSTRAINT 제약명 FOREIGN KEY (컬럼지정)

REFERENCES 참조테이블명(참조컬럼지정)

);


-- PK 제약 지정된 테이블

CREATE TABLE test14 (

col1 NUMBER -- PK

,col2 VARCHAR2(10)

,CONSTRAINT test14_col1_PK PRIMARY KEY (col1)

);


-- FK 제약 지정된 테이블

CREATE TABLE test15 (

col3 NUMBER -- PK

,col4 VARCHAR2(10)

,col1 NUMBER -- FK

,CONSTRAINT test15_col3_PK PRIMARY KEY (col3)

,CONSTRAINT test15_col1_FK FOREIGN KEY (col1) REFERENCES test14 (col1)

);



-- PK 자료 입력

INSERT INTO test14 (col1, col2) values (1, 'kim');

INSERT INTO test14 (col1, col2) values (2, 'park');

INSERT INTO test14 (col1, col2) values (3, 'hong');


-- FK 자료 입력

insert into test15 (col3, con4, col1) values (1, 'kim', 1);

insert into test15 (col3, con4, col1) values (2, 'park', 3);

insert into test15 (col3, con4, col1) values (3, 'hong', 4);



-- PK 자료 삭제 테스트

delete from test14

where col1 = 1;  --X



delete fron test14

where col1 = 3; --O








제약 조건 관리


1. 테이블 생성 후 제약 조건 추가

ALTER TABLE 테이블명

ADD (CONSTRAINT 제약명 제약조건 (컬럼지정)

, ...);


2. 제약 조건 삭제

ALTER TABLE 테이블명

DROP CONSTRAINT 제약명;


3. 제약 조건 확인

SELECT uc.owner                         --소유자

, uc.constraint_name            --제약명

, uc.table_name AS table_name   --테이블명

, uc.constraint_type            --제약조건 종류(P, R, U, C)

, uc.search_condition           --CHECK 제약 조건식

, ucc.column_name               --지정된 컬럼

, (SELECT table_name 

FROM user_constraints 

WHERE constraint_name=uc.r_constraint_name) 

AS r_table_name --참조하는 테이블

, (SELECT column_name 

FROM user_constraints 

WHERE constraint_name=uc.r_constraint_name) 

AS r_conlumn_name --참조하는 컬럼

FROM user_constraints uc, user_cons_columns ucc

WHERE uc.constraint_name = ucc.constraint_name


4. NOT NULL, DEFAULT 지정은 별도 확인

--NOT NULL 확인

DESC 테이블명;


--DEFAULT 확인

SELECT *

FROM user_tab_columns

WHERE table_name='테이블명';







문제) emp, city, buseo, jikwi 테이블에서 제약 조건 추가할 것.

아래 형태의 테이블 생성이 된 후에 제약 조건 추가 명령을 내린다고 가정함.


--city 테이블 생성

CREATE TABLE city (

city_id NUMBER --PK

, city VARCHAR2(10) --CK. 서울,충남,인천,부산,제주,전북,강원,경북,전남,경기 한정

);


--buseo 테이블 생성

CREATE TABLE buseo (

buseo_id NUMBER --PK

, buseo VARCHAR2(15) --CK. 총무부,개발부,영업부,기획부,인사부,자재부,홍보부 한정

);


--jikwi 테이블 생성

CREATE TABLE jikwi (

jikwi_id NUMBER --PK

, jikwi VARCHAR2(15) --CK. 과장,대리,부장,사원,사장,이사 한정

);


--emp 테이블 생성

CREATE TABLE emp (

num NUMBER --PK

, name VARCHAR2(20) -- NOT NULL

, ssn  VARCHAR2(14) -- NOT NULL

, ibsaDate DATE

, city_id NUMBER --FK

, tel   VARCHAR2(15)

, buseo_id NUMBER --FK

, jikwi_id NUMBER --FK

, basicPay NUMBER(10) --CK. 0 이상

, sudang NUMBER(10) --CK. 0 이상

);



WRITTEN BY
빨강꼬마

,

8. 논리 연산자 && || !
-> 결과가 true, false로 리턴.


조건1 && 조건2 -> AND 연산자. 조건1과 조건2의 true, false에 따라서 최종적인 true, false를 리턴
                          동시에 true일때만 최종 true가 됨. false가 하나 있으면 무조건 false를 리턴


조건1 || 조건2 -> OR 연산자. 조건1과 조건2의 true, false에 따라서 최종적인 true, false를 리턴
                          동시에 false일때만 최종 false가 됨. true가 하나 있으면 무조건 true를 리턴.


(! (조건) ) -> NOT 연산자. 조건의 true, false를 반대로 리턴







자료형


1. 정수형


byte -> 1바이트, 표현범위: -128 ~ 127

short -> 2바이트, -32768 ~ 32767

int -> 4바이트(32비트), -2,147,483,648 ∼ 2,147,483,647.  (암기)

long -> 8바이트. 접미사 L표기 필요.


10진수 -> 0 ~ 9 조합

2진수 -> 0, 1 조합

16진수 -> 0 ~ 9 ~ A ~ F 조합



Wrapper 클래스 (기본자료형에 대한 클래스 표현)

byte -> Byte

short -> Short

int -> Integer

long -> Long


Integer.parseInt() -> 형 변환 메소드

Integer.MAX_VALUE -> int 자료형의 최대값을 돌려주는 상수

Integer.MIN_VALUE -> int 자료형의 최소값을 돌려주는 상수






문제)) 임의의 수를 입력 받아서 2진수, 10진수, 16진수 표현을 출력.
실행예)
10진수 입력(0~2147483647)?
2진수: xxxxxxxx
10진수: xxxxxxxx
16진수: xxxxxxxx






2. 문자형과 문자열형


char -> 문자형. 기본자료형. 'A'. ASCII코드로 저장됨.
String -> 문자열형. 참조형. "ABCD". 


char ch1 = 'AB'; // 오류
char ch2 = 'A';  // 성공


String st1 = "AB"; // 성공


ASCII코드중에서 문자 0은 48, 9는 57
ASCII코드중에서 문자 A는 65, Z는 90
ASCII코드중에서 문자 a는 97, z는 122


char과 int 자료형은 서로 호환이 가능한 범위를 가진다.


char ch3 = 65; //성공. 'A'가 입력됨.


System.out.printf("%d %n", 65); // 65
System.out.printf("%c %n", 65); // A


String str = "TEST";
System.out.printf("%c %n", str.charAt(0)); //문자열이 저장된 변수명.charAt(문자열위치값) 즉, 여기서는 T 리턴
System.out.printf("%c %n", str.charAt(1));
System.out.printf("%c %n", str.charAt(2));
System.out.printf("%c %n", str.charAt(3));








문제) 대문자로 구성된 4글자짜리 문자열을 입력받고 나서, 소문자로 변경한 다음 출력.
실행 예)
문자열 입력(4자, 대문자)?TEST
입력된 문자열 : TEST
소문자로 변환 : test






자료의 형 변환


1. 자료의 형이 일치하지 않는 경우 원하는 자료형으로 변환할 수 있어야 한다.

2. 묵시적 형변환, 명시적 형 변환
묵시적 형 변환 -> 자동으로 변환시켜 주는 것. 데이터가 원래의 값을 유지하는 것이 가능. 작은 데이터를 큰 자료형에 넣는 경우에 주로 발생.
명시적 형 변환 -> 특정 명령 수행을 통해서 강제적으로 변환을 시키는 것. 데이터가 원래의 값을 유지하지 못하는 경우도 발생.





형 변환의 대표적인 예

문자열형 -> 숫자형, 숫자형 -> 문자열형


int 변수 = Integer.parseInt(문자열형);
double 변수 = Double.parseDouble(문자열형);


String 변수 = String.valueof(정수형);
String 변수 = String.valueof(실수형);


String 변수 = Integer.toString(정수형);
String 변수 = Integer.toBinaryString(정수형);
String 변수 = Integer.toHexString(정수형);


String 변수 = String.format("%d", 정수형);
String 변수 = String.format("%f", 실수형);


char 변수 = 문자열형변수명.charAt(인덱스);






if문


1. 주어진 조건에 따라 분기 방향을 정하기 위하여 사용하는 제어문
2. 기본형식


//조건이 만족되는 경우(true인 경우)만 실행문 실행

if (조건) {

// 실행문;

}


//조건이 만족되는 경우(true인 경우)는 실행문1 실행

//조건이 만족되는 않는 경우(true인 경우)는 실행문2 실행

if (조건) {

// 실행문1;

} else {

// 실행문2;

}


사용 가능 방법

if (조건) {

//실행문1;

} else if (조건2) {

//실행문2;

} else {

//실행문3;

}

-> 다른방법으로 표기하면

if (조건) {

//실행문1;

} else {

if (조건2) {

//실행문2;

} else {

//실행문3;

}




//if, else 구문은 한번만 표기, else if (조건)은 추가 가능.

if (조건) {

//실행문1;

} else if (조건2) {

//실행문2;

} else if (조건3) {

//실행문3;

} else {

//실행문4;

}

-> 위와 같은 상황은 다른 표현으로 사용하기도 합니다. 다만, else 즉 실행문4가 없음.

if (조건1) {

// 실행문1;

}

if (조건2) {

// 실행문2;

}

if (조건3) {

// 실행문3;

}




문제) 세 개의 숫자 중에서 가장 큰 숫자 구하기. 단, if문 사용.
실행 예)
숫자1?XX
숫자2?YY
숫자3?ZZ
입력 받은 숫자 : XX, YY, ZZ
가장 큰 숫자 :  ZZ



문제) 임의의 수를 입력 받아서 짝수, 홀수로 구분해서 출력.
실행 예)
임의의 정수(0 이상)? 
입력받은 숫자 :
구분 : 






문제) 임의의 수 를 입력 받아서 3의 배수, 4의 배수로 구분해서 출력.
실행 예)
임의의 정수(3 또는 4의 배수)?
입력받은 숫자 :
구분 : 3의 배수

혹은

임의의 정수(3 또는 4의 배수)?
입력받은 숫자 :
구분 : 4의 배수

혹은

임의의 정수(3 또는 4의 배수)?
입력받은 숫자 :
구분 : 3의 배수 또는 4의 배수


WRITTEN BY
빨강꼬마

,

변수



1. 변수는 기억공간에 대한 별칭. 자료형 지정 필수.

-> 별수는 데이터를 저장하기 위한 공간이므로 사전에 미리 준비되어 있어야 한다.


2. 변수명은 식별자 작성 규칙에 맞춰서 작성.

자료형 변수 = 데이터;

자료형 변수 = 구문;


3. 지역 변수와 멤버 변수로 구분. 자동 초기화 지원 여부가 다르다.

지역 변수는 메소드 내부에 선언된 변수.

멤버 변수는 클래스 차원에 선언된 변수.



//자료형의 초기값 예제

//클래스

public class Test10 {

    

    int a; //멤버변수(클래스 안에서 선언하며, 자동초기화 지원)

    int kor, eng, mat; // int 초기값은 0

    double d;  // double 초기값은 0.000000

    char c;    // char 초기값은 '' 즉, 아무것도 없는 빈값

    boolean l; // boolean 초기값은 false

    String str; // 스트링 초기값은 null (참조형 변수 초기값은 null)

    

    //메소드(클래스 선언 후 선언하는 하위개념)

    public void test() {

        int b = 0; //지역변수(메소드 안에서 선언하며, 사용자가 직접 초기화해야함)

        int tot = 0;

        

        System.out.printf("a=%d %n", a);

        System.out.printf("kor=%d %n", kor);

        System.out.printf("b=%d %n", b);

        System.out.printf("tot=%d %n", tot);

        System.out.printf("double=%f %n", d);

        System.out.printf("char=%c %n", c);

        System.out.printf("boolean=%b %n", l);

        System.out.printf("String=%s %n", str);

    }

      

  //main 메소드 -> 프로그램의 진입점

        public static void main(String[] args) {


        Test10 obj = new Test10();

        obj.test(); // 사용자가 지정한 메소드에 실행 명령 호출 부분

}

}




//결과

a=0 

kor=0 

b=0 

tot=0 

double=0.000000 

char=

boolean=false 

String=null 





연산자

◆ 연산자의 종류 ◆

 산술 연산자

 + - * / %

 부호 연산자

 + -

 대입 연산자 (주로 많이 쓰이는 연산자)

 = 복합대입연산자 (+= -= *= /= %=)

 관계 연산자 (주로 많이 쓰이는 연산자)

 > >= < <= instanceof

 등가 연산자

 == != 

 증감 연산자

 ++ --

 논리 연산자

 && || !

 조건 연산자

 ? :

 비트 연산자 (잘 안쓰임)

 & | ^ ~ << >> >>>




1. 산술 연산자 + * * / %


* 곱하기 연산자

/ 나누기 연산자 (몫 연산 가능)

% 나머지 연산자


"예를 들어, 990원에서 500원의 갯수는?" 을 구하려면,

몫 연산을 수행해야 되는데 이때는 나누기 연산에서 정수 나누기 정수 연산을 수행하면 몫으로 정수가 나오는 것을 이용하여 몫을 구할 수 있음.
나누기 연산에서 정수 나누기 실수는 실수임. 즉,

990 / 500 -> 1 (몫)

990 / 500.0 -> 1.98 (나누기)


500원을 뺀 나머지 금액은 아래와 같이 구할 수 있다.

990 % 500 -> 490 (나머지)


정수 값이 저장된 변수 / 정수 값이 저장된 변수 -> 정수 결과 (몫)

정수 값이 저장된 변수 / (double)정수 값이 저장된 변수 -> 실수 결과 (나누기) //(double)은 캐스트 연산자라고 부름




문제) 거스름돈을 환폐단위로 구분해서 출력.
실행예)
금액(10~1000)? 990
총액 : 990원
오백원 1개, 백원 4개, 오십원 1개, 십원 4개





3. 증감 연산자 ++ --


데이터++ -> 데이터는 상수이므로 연산자 사용 불가


변수++ -> 변수는 현재 저장된 값에 대해서 +1 연산을 수행한 후 기존의 값을 덮어쓰기함

변수1++ -> 변수 = 변수1 + 1 과 같은 연산. 변수값을 먼저 사용하고, 더하기 연산은 나중에 함.

++변수1 -> 변수1 = 변수 + 1 과 같은 연산. 더하기 연산을 먼저 수행하고, 변수값을 나중에 사용함.



증감연산자 예

// 클래스

public class Test12 {

    

    //main 메소드. 프로그램 시작점.

    public static void main (String [] args){

        

        //지역 변수. 사용자 직접 초기화필수

        int a = 0;

        

//증감 연산자는 변수의 값을 1씩 증가시킨다.

        System.out.printf("%d %n", a++);

        System.out.printf("%d %n", a);

        System.out.printf("%d %n", ++a);

        System.out.printf("%d %n", (++a + ++a));

        System.out.printf("%d %n", (a++ + a++));

System.out.printf("%d %n", a);

    }

}


//결과

6





4.대입 연산자 = 복합대입연산자


자료형 변수 = 데이터; // 데이터를 변수에 대입시킨다.

자료형 변수 = 구문;   // 구문의 결과 값인 데이터를 변수에 대입시킨다.


자료형 변수 += 데이터;  //-> 자료형 변수 = 변수 + 데이터 를 의미함.

자료형 변수 -= 데이터;  //-> 자료형 변수 = 변수 - 데이터 를 의미함.

자료형 변수 *= 데이터;

자료형 변수 /= 데이터;

자료형 변수 %= 데이터;




5. 관계 연산자 > >= < <= instanceof

-> 결과값은 true, false만 리턴.


a > b     a의 값이 b보다 큰지 확인해주는 연산자. 

a >= b    a의 값이 b보다 크거나 같은지 확인해주는 연산자. 


예제는 조건 연산자 문제와 함께 확인가능.



6. 조건 연산자(삼항연산자) ? :


자료형 변수 = (조건)? 값1 : 값2;

-> 조건의 결과가 true이면 값1, false이면 값2를 리턴.




문제) 두 개의 숫자 중에서 가장 큰 숫자 구하기.

실행 예)

숫자1? X

숫자2? Y

입력 받은 숫자: X, Y

가장 큰 숫자: X



문제) 세 개의 숫자 중에서 가장 큰 숫자 구하기.

실행예문)

숫자1? X

숫자2? Y

숫자3? Z

입력 받은 숫자: X, Y, Z

가장 큰 숫자: X




문제) 세 개의 숫자 중에서 가장 작은 숫자 구하기.

숫자1? X

숫자2? Y

숫자3? Z

입력 받은 숫자: X, Y, Z

가장 작은 숫자: X






7. 등가 연산자 == !=

-> 결과값은 true, false를 리턴.
-> 기본자료형인 경우에만 정상적으로 결과출력가능.


변수 == 데이터 -> 변수의 값이 데이터와 같은지 확인.

변수 != 데이터 -> 변수의 값이 데이터와 같지 않은지 확인.



참조형(String..)인 경우는 == 연산으로 비교 불가. equals() 메소드를 이용했을때만 참조형의 값 비교가 가능함.
참조형은 기본 자료형과는 달리 메모리 내부적으로 참조주소값을 사용하기 때문에 등가 연산자가 사용이 되지 않는 것임.
(equals()는 참조주소값이 아닌 실제 진짜 데이터를 비교하는 메소드)


잠깐!!!    if 구문에 대해


if (조건) {

//조건이 참인 경우 실행할 부분

}else{

//조건이 거짓인 경우 실행할 부분

}




등가연산자의 사용방법 예

import java.io.*;


public class Test16 {

    public static void main (String [] args) throws IOException{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        

        System.out.print("비밀번호(숫자만 입력 가능)?");

        String password = br.readLine();

        

        /*

        //비교연산을 수행하기 위해서 양쪽의 데이터 타입(자료형)을 일치시켜야 한다.

        if(Integer.parseInt(password) == 1234){

            System.out.println("암호가 맞습니다.");

        }else{

            System.out.println("암호가 틀렸습니다.");

        }

        */

        

        //문자열 자료형을 비교하는 올바른 방법.

        if(password.equals("1234")){

            System.out.println("암호가 맞습니다.");

        }else{

            System.out.println("암호가 틀렸습니다.");

        }

    }

    

}


//결과

비밀번호(숫자만 입력 가능)?1234

암호가 맞습니다.





tips. 메소드에 대한 짧은 설명


Integer 클래스에서 Integer.parseInt(**)에서 parseInt(**)는 클래스의 하위 멤버중 하나인 메소드



WRITTEN BY
빨강꼬마

,

CMD HERE 레지스트리 등록 

 - 가고자 하는 폴더에서 우클릭메뉴를 통해 CMD 디렉토리 바로 이동


cmdhere.reg





참고


- 넷빈에서 한 프로젝트내에 두개 이상의 main이 있을 때 특정 .java파일을 실행하기 위해서는 shift + F6 단축키를 사용한다.

- 넷빈에서는 import를 자동으로 하려면 Alt+Enter키를 이용함.

- 키보드에서 받는 데이터는 무조건 String 일수밖에 없음

- 실수형을 계산할때는

int + int = int

int + double = double

형으로 출력되는 것을 기억하여 예를 들어 3을 나누어 주어야 하고 결과값이 실수가 나올수도 있을 경우라고 가정하면

3을 3.0으로 표기하여 코딩하면 올바른 값이 출력될 수 있다.




넷빈 다운로드 및 설치


1. http://www.oracle.com에서 넷빈(NetBeans IDE)다운로드

2. 넷빈에서는 자바 소스코드 작성을 위해서 프로젝트 단위로 생성.

1. New project > Categories: Java > Projects: Java Application
2. Project Name: 프로젝트 이름 입력 > Project Location: 위치지정
3. Create Main Class: 클래스 이름 입력
4. 끝!
5. 편집창에서 자바 소스 코드 입력
6. Run > Run Project (F6)





자바 기본 입출력


1. 표준 출력

프로그램 목적: 외부 데이터 입력 -> 내부적인 가공(연산) -> 결과 출력


표준 출력 스트림인 System.out 필드 -> PrintStream 자료형 반환

PrintStream 클래스의 하위 메소드인 println() 메소드 이용해서 데이터 출력.


예를 들어서,

System.out.println("메세지");

System.out.println(123);


-- 첫글자가 대문자인 단어는 클래스

-- 모든글자가 소문자인 단어는 키워드

-- 데이터 타입형은 클래스도 있고, 키워드도 있고....



println()과 printf()메소드를 자주 사용.

-- ln은 자동줄바꿈.

-- f는 포맷의 의미로 결과 출력시 서식과 함께 출력하고 줄바꿈을 자동으로 하지 않음.


System.out.printf("%s %n","메세지"); -- %s 는 문자 %d 는 숫자 라는 데이터의 서식을 지정

System.out.printf("%d %n",123);      -- %n 은 줄내림



//서식 지정의 예

public class Test05 {


    public static void main(String[] args) {

        System.out.println("hello, java world!");

        

        System.out.printf("%s %n","Hello, Java World!");

        System.out.printf("%s %s %s %n", "Kim", "Hyun", "Wook"); // 서식수에 맞추어 데이터수도 동일하게 

        

        System.out.printf("%d + %d = %d %n", 10, 20, (10+20)); // (x, ....) 안에 x에서는 데이터타입과 함께 화면에

                                                                                     // 그대로 출력할 내용도 함께 직접 쓸수 있음.

        System.out.printf("%d - %d = %d %n", 10, 20, (10-20));

        System.out.printf("%d * %d = %d %n", 10, 20, (10*20));

        System.out.printf("%d / %d = %d %n", 10, 20, (10/20)); // 연산결과가 0이 나오게 됨

        System.out.printf("%d / %.1f = %.1f %n", 10, 20.0, (10/20.0)); // 연산결과가 0.5가 나오게 됨.

    }

}


//결과

hello, java world!

Hello, Java World! 

Kim Hyun Wook 

10 + 20 = 30 

10 - 20 = -10 

10 * 20 = 200 

10 / 20 = 0 

10 / 20.0 = 0.5 




2. 자료형

-> 컴퓨터 내부에서 자료를 취급하는 방법.

-> 기본자료형과 참조형으로 나눈다.


▶ 기본 자료형은 크기가 고정적이고, stack 메모리에서 관리된다. 또한, 요청시 바로 데이터를 받을 수 있다.

- 기본자료형 - 정수형: byte, short, int, long (대표는 int)

                - 실수형: float, double (대표는 double)

- 논리형: boolean

- 문자형: char


-> 문자열은 String 클래스 자료형이다. 문자열은 "ABC"



▶ 참조형은 크기가 가변적이고, heap 메모리에서 관리된다. 또한, 요청시 데이터를 바로 받는 것이 아니라 참조값을 받게된다. 참조값은 실제 데이터를 찾을 수 있는 주소값이다.

- 참조형(가변형) - 배열 참조형

- 클래스 참조형: System, Object, String

- 인터페이스 참조형


메모리형식

Stack: 데이터를 바로 가져올수 있음.(복사의 개념. 원본은 남음). 기본자료형이 저장되는 공간

Heap: 데이터를 바로 가져올수 없으나, 가상의 값(참조값)을 가져올수 있다.(복사의 개념. 원본은 남음) 참조형이 저장되는 공간




3. 표준 입력

-> 키보드로부터 문자열(String 클래스 자료형)(enter를 입력할때까지 입력되는 문자들)을 입력 받을 때 사용

// String strData;    ->   strData로 선언된 변수에 대한 자료형 정의 구문

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String strData = br.readLine();  // 최상단 String strData; 구문을 없애고 strData 변수 앞에 String으로 써줘도 오케이


즉, 자료형 변수 = 데이터;

자료형 변수 = 외부 데이터 입력 구문;

자료형 변수;

변수 = 데이터;

동일하다는 의미임.


-> 변수의 자료형과 데이터의 자료형은 정확하게 일치하는 것이 권장하는 방법.

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader; // import java.io.*; 로 세줄을 하나로 처리할 수 있다.

클래스 선언{

public static void main (String [] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String 변수명 = br.readline();

프로그램 코딩소스~~~ 

.....

}

}


◆ 형광색 부분의 의미 

입력데이터를 받기위해(readline()) 항상 같이 사용해야는 부분으로, 

반드시 import와 throws 구문이 필요함.




//입력부터 처리, 출력 과정을 같이 실행하는 예   //Test06.java

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;


public class Test06 {

    public static void main(String [] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        System.out.print("이름:");

        String strData = br.readLine();

        

        //처리

        String message = String.format("당신의 이름은 %s입니다.", strData);

        

        //출력

        System.out.println(message);

                

    }

}



//결과

이름:kimhw

당신의 이름은 kimhw입니다.






잘못된 산술연산의 예

import java.io.*;


public class Test07 {

    public static void main(String [] args) throws IOException {

       

        //입력

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        System.out.print("국어:");

        String kor = br.readLine();

        

        System.out.print("영어:");

        String eng = br.readLine();

        

        System.out.print("수학:");

        String mat = br.readLine();

                

        //처리

        //총점=국어+영어+수학;

        String tot = kor + eng + mat ;

        

        //출력

        System.out.printf("입력된 데이터는 %s, %s, %s입니다.%n", kor, eng, mat);

        System.out.printf("총점은 %s 입니다.%n", tot);        

        

        

    }

}



//결과

국어:100

영어:90

수학:80

입력된 데이터는 100, 90, 80입니다.

총점은 1009080 입니다.


원인.

변수인 kor, eng, mat의 자료형은 String인 상대에서 + 산술이 이루어 졌기 때문에 "100", "90", "80"으로 컴퓨터가 인식하여

위와 같은 결과가 출력된 것이므로, Integer.parseInt(변수명) 을 통해 int 형으로 변환하여 처리해야 한다.



Integer.parseInt("숫자모양");

>> 스트링형인 것을 숫자로 형변환 시킬수 있음





입력된 숫자 데이터를 형변환하여 숫자로 바꾸는 과정(올바른 산술연산의 예)

-> 외부에서 입력된 데이터는 모두 자료형이 문자열형(String)이므로 필요시 숫자(int)로 변환하려면 Integer.parseInt()메소드를 이용해야 한다.


import java.io.*;


public class Test08 {

    public static void main(String [] args) throws IOException {

                        

        //입력

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        System.out.print("국어:");

        String kor = br.readLine();

        

        System.out.print("영어:");

        String eng = br.readLine();

        

        System.out.print("수학:");

        String mat = br.readLine();

                

        //처리

        //총점=국어+영어+수학;

        

        int tot = Integer.parseInt(kor) + Integer.parseInt(eng) + Integer.parseInt(mat);      

        

        

        //출력

        System.out.printf("입력된 데이터는 %s, %s, %s입니다.%n", kor, eng, mat);

        System.out.printf("총점은 %d 입니다.%n", tot);

                

    }

}




//결과

국어:100

영어:90

수학:80

입력된 데이터는 100, 90, 80입니다.

총점은 270 입니다.






문제) Test08 소스에서 평균 계산해서 출력하는 과정 추가






문제) 현재 원-달러 환율은 1달러에 1119원입니다.

특정 달러 금액을 입력하면 원화금액을 출력하는 프로그램 작성


실행 예)

달러 금액? 10

10 달러 -> 11190원





WRITTEN BY
빨강꼬마

,