CHARSET check queries :
select parameter, value from nls_database_parameters where parameter = 'NLS_CHARACTERSET'

 

CHARSET Change

 

Connect account as SYSTEM 

update sys.props$ set value$='KO16MSWIN949' where name='NLS_CHARACTERSET'; 
update sys.props$ set value$='KO16MSWIN949' where  name='NLS_NCHAR_CHARACTERSET';
update sys.props$ set value$='KOREAN_KOREA.KO16MSWIN949' where name='NLS_LANGUAGE';
commit;
 
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET INTERNAL_USE KO16MSWIN949;
SHUTDOWN IMMEDIATE;
STARTUP;

 

 

>>>references,

http://bluescor.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-CHARSET-%ED%99%95%EC%9D%B8-%EB%B3%80%EA%B2%BD

'etc' 카테고리의 다른 글

servletContext.setAttribute()  (0) 2016.10.11
Session  (0) 2016.09.29
[Freemarker] number format 설정  (0) 2016.06.29
OSI 7계층  (0) 2016.04.29
IPv4/IPv6  (0) 2016.04.29

The servletContext.setAttribute() is dynamic which can be set and reset during runtime.

Where as init-parameter specified in web.xml is static which will not change during the lifetime of application.

Example:

  • The database properties like database name configuration propety. It will be mostly configured as context init-param
  • And if you want to set property value which derives based on runtime changes, like "last user logged in" or "number of failures" should be context attributes.

'etc' 카테고리의 다른 글

oracle charset change  (0) 2016.10.21
Session  (0) 2016.09.29
[Freemarker] number format 설정  (0) 2016.06.29
OSI 7계층  (0) 2016.04.29
IPv4/IPv6  (0) 2016.04.29

Session 고정공격 방어책

1. Session ID –> URL 붙여넣기 기능 비활성화

2. 로그인 후 세션 마이그레이션(Session Migration)

 

Session 구성

<session-timeout>

단위: 초, 0이하는 세션 만료x,

tomcat: 초라고 책에서 나왔지만 테스트해보니 분인것같다.

default:30s

'etc' 카테고리의 다른 글

oracle charset change  (0) 2016.10.21
servletContext.setAttribute()  (0) 2016.10.11
[Freemarker] number format 설정  (0) 2016.06.29
OSI 7계층  (0) 2016.04.29
IPv4/IPv6  (0) 2016.04.29

5차시 데이터 조작과 트랜잭션, 데이터 무결성과 제약 조건

13. UPDATE 문은 테이블에 저장된 데이터를 수정하기 위한 DML입니다. WHERE 절을 생략하면 테이블에 있는 모든 행이 수정됩니다.

UPDATE table_name
SET column_name1 = value/, column_name2 = value2, •••
WHERE conditions;

WHERE 절로 특정 로우만 수정하기
01:update dept_copy
02:set dname=‘PROGRAMMING’
03:where dno=10;

부서명이 모두 수정되었음을 확인할 수 있습니다.
DNO    DNAME            LOC
10  PROGRAMMING    NEW YORK  //특정 로우만 수정
20  RESEARCH           DALLAS
30  SALES                 CHICAGO
40  OPERATIONS        BOSTON

14. 데이터 무결성 제약 조건(Data Integrity Constraint Rule)이란 테이블에 유효하지 않은 (부적절한) 데이터가 입력되는 것을 방지하기 위해서 테이블을 생성할 때 각 칼럼에 대해 정의하는 여러 가지 규칙을 말합니다. 이러한 제약 조건은 새로운 데이터가 삽입되거나 기존 데이터가 수정, 삭제 될 때에 적용됩니다.
테이블에 부적절한 데이터가 입력되지 않고 무결한 데이터만 유지할 수 있도록 하기 위해 오라클에서 지원되는 제약 조건은 5가지입니다.
NOT NULL - 칼럼에 NULL 값을 포함하지 못하도록 지정한다.
UNIQUE - 테이블의 모든 로우에 대해서 유일한 값을 갖도록 한다.
PRIMARY KEY - 테이블의 각 행을 식별하기 위한 것으로 NULL과 중복된 값을 모두 허용하지 않는다. 즉. NOT NULL 조건과 니NIQ니E 조건을 결합한 형태이다.
FOREIGN KEY - 참조되는 테이블에 칼럼 값이 항상 존재해야 한다.
CHECK - 저장 가능한 데이터 값의 범위나 조건을 지정하여 설정한 값만을 허용한다.

제약 조건은 일반적으로 테이블이 생성될 때 생성되지만 그 후에도 ALTER TABLE로 제약 조건을 추가할 수 있으며 삭제도 가능합니다.

15. CHECK 제약 조건은 칼럼에서 허용 가능한 데이터의 범위나 조건을 정의합니다. 입력되는 값을 체크하여 설정된 값 이외의 값이 들어오면 오류 메시지와 함께 명령이 수행되지 못하게 하는 것입니다. 조건으로 데이터 값의 범위나 특정 패턴의 숫자나 문자 값을 설정할 수 있습니다. 데이터를 입력하거나 수정할 때 실수로 부정확한 값을 입력하는 것을 막을 수 있습니다. 칼럼에 정의할 수 있는 CHECK 제약 조건의 수에는 제한이 없기 때문에 하나의 칼럼에 여러 개의 CHECK 제약 조건을 정의할 수 있습니다. CURRVAL, NEXTVAL, ROWNUM과 같은 의사 칼럼이나 SYSDATE,USER와 같은 함수에는 사용 할 수 없습니다.

6차시 뷰, 시퀀스와 인덱스

16. FORCE 옵션은 기본 테이블의 존재 유무에 상관없이 뷰를 생성해야 할 경우에 사용하며 NOFORCE 옵션은 반드시 기존 테이블이 존재할 경우에만 뷰를 생성합니다. FORCE, NOFORCE 옵션 중 하나를 지정해야 하는데 특별한 설정이 없으면 NOFORCE 옵션이 지정된 것으로 간주합니다.

17. 시퀀스의 현재 값을 알아내기 위해서 CURRVAL를 사용하고,다음 값을 알아내기 위해서 는 NEXTVAL를 사용합니다. CURRVAL에 새로운 값이 할당되기 위해서는 NEXTVAL로 새로운 값을 생성해야 합니다. 즉, NEXTVAL로 새로운 값을 생성한 다음에 이 값을 CURRVAL에 대체하게 됩니다.
NEXTVAL, CURRVAL을 사용할 수 있는 경우와 사용할 수 없는 경우를 살펴봅니다.

• NEXTVAL, CURRVAL을 사용할 수 있는 경우
-서브 쿼리가 아닌 SELECT 문
-INSERT 문의 SELECT 절
-INSERT 문의 VALUE 절
-UPDATE 문의 SET 절

• NEXTVAL, CURRVAL을 사용할 수 없는 경우
-VIEW의 SELECT 절
-DISTINCT 키워드가 있는 SELECT 문
-GROUP BY, HAVING, ORDER BY 절이 있는 SELECT 문
-SELECT, DELETE, UPDATE의 서브 쿼리
-CREATE TABLE, ALTER TABLE 명령의 DEFAULT 값

18. 인덱스의 종류는 유일한 값을 갖는지 여부에 따른 고유 인덱스(Unique Index)와 비 고유 인덱스(Non Unique Index), 인덱스를 구성하는 칼럼의 개수에 따라 단일 인덱스(Single Index)와 결합 인덱스(Composite Index), 함수에 인덱스를 지정하는 함수 기반 인덱스 (Function Based Index) 등이 있습니다.

(1) 고유/비 고유 인덱스
고유 인덱스는 기본 키나 유일 키처럼 유일한 값을 갖는 칼럼에 대해서 생성하는 인덱스를 말하며 비 고유 인덱스는 중복된 데이터를 갖는 칼럼에 대해서 생성하는 인덱스를 말합니다. 인덱스를 생성하면서 UNIQUE 옵션을 추가하면 고유 인덱스가 생성되며 UNIQUE 옵션을 생략하면 비 고유 인덱스가 생성됩니다.

(2) 결합 인덱스
지금까지 생성한 인덱스들처럼 한 개의 칼럼으로 구성한 인덱스는 단일 인덱스입니다. 두 개 이상의 칼럼으로 인덱스를 구성하는 것을 ‘결합 인덱스’라고 합니다.

(3) 함수 기반 인덱스
함수 기반 인덱스는 수식이나 함수를 적용하여 만든 인덱스를 말합니다.

7차시 사용자 권한과 PL/SQL

19. 롤(role)은 여러 사용자가 다양한 권한을 효과적으로 관리할 수 있도록 관련된 권한끼리 묶어 놓은 것입니다. 사용자를 생성한 후 사용하려면 여러 개의 권한들을 부여해야 하는데 롤은 사용자가 기본적으로 가져야 할 여러 종류의 권한을 일일이 부여하는 번거로움을 덜어 줍니다. 롤은 사용자에게 보다 간편하게 권한을 부여할 수 있도록 한다는 장점이 있습니다.
롤은 크게 사전 정의된 롤과 사용자가 정의한 롤로 구분됩니다. 사전 정의된 롤은 오라클 데이터베이스를 설치하면 기본적으로 제공되는 롤이고, 사용자가 정의한 롤은 사용자가 직접 롤을 정의하여 사용하는 것을 말합니다. 사전 정의된 롤의 종류는 다음과 같습니다.

DBA 롤은 시스템 자원을 무제한적으로 시용하며 시스템 관리에 필요한 모든 권한을 부여 할 수 있는 강력한 권한을 보유한 롤입니다. 그러므로 사용자들이 소유한 데이터베이스 객체를 관리하고 사용자들을 작성,변경,제거할 수 있는 모든 권한을 갖습니다.

CONNECT 롤은 사용자가 데이터베이스에 접속 가능하도록 가장 기본적인 시스템 권한 8가지를 그룹화한 것입니다.

RESOURCE 롤은 사용자가 객체(테이블,뷰, 인덱스)를 생성할 수 있도록 하기 위해서 시스템 권한을 그룹화한 것입니다.

20. LOOP 문
여러 번 반복적으로 수행되는 문장이 있을 경우 LOOP 문을 이용합니다. LOOP 문의 종류에는 BASIC LOOP, FOR LOOP, WHILE LOOP 3가지가 있습니다. BASIC LOOP 문은 조건 없이 반복 작업을 위해 시용합니다. FOR LOOP 문은 COUNTS 기본으로 한 반복 작업을 위해 사용합니다. WHILE LOOP 문은 조건을 비교하기 위한 반복 작업에 사용합니다. 반복문을 종료하기 위해서는 EXIT 문을 사용합니다.
BASIC LOOP는 가장 간단한 구조의 루프로 LOOP와 END LOOP 사이에 반복 수행할 문장을 기술합니다.

LOOP
  statenent1;
  statement2;
EXIT [WHERE condition];
END LOOP

실행 상의 흐름이 END LOOP에 도달하면 그와 짝을 이루는 LOOP 문으로 제어가 돌아 갑니다. 이러한 루프를 ‘무한 루프’라 하며,루프를 벗어나려면 EXIT 문을 시용합니다. 조건에 따라 LOOP를 종료하기 위해서는 WHEN 절을 기술합니다. WHEN 절 다음에 기술 한 조건이 참이면 EXIT 문이 수행되어 더 이상 반복하지 않고 END LOOP 다음으로 제어가 옮겨져서 LOOP를 종료합니다.

8차시 프로시저와 함수와 트리거, 데이터베이스 설계

21. SELECT 문의 수행 결과가 여러 개의 로우로 구해지는 경우에 모든 로우에 대해 처리를 하려면 커서를 사용해야 합니다. 커서는 CURSOR, OPEN, FETCH, CLOSE 4단계 명령에 의해서 사용됩니다.

DECLARE
             CURSOR cursor_name IS statement;
BEGIN
             OPEN cursor_name;
             FECTCH cur_name INTO variable_name;
             CLOSE cursor_name;
END;

22. 프로시저
PL/SQL 프로그램의 종류는 Procedure, Function, Trigger로 나뉩니다. 프로시저는 일련의 작업들을 하나로 묶어서 저장해 두었다가 호출하여 이런 작업들이 실행할 수 있게 해줍니다. 프로시저는 복잡한 SQL 문을 단순화시켜 준다는 장점이 있습니다. 또한 생성한 프로시저는 여러 번 반복하고 호출하여 사용할 수 있습니다. CREATE PROCEDURE 문으로 프로시저를 생성합니다.
CREATE [OR REPLACE] PROCEDURE procedure_name
   (argument1 [mode] data_taye,
   argument2 [mode] data_taye ...
   )
IS
local_variable declaration
BEGIN
statement1;
statements2;
END;/

23. 트리거(trigger)는 연쇄 반응 • 생리 현상 • 일련의 사건 등을 유발하는 자극과 같은 사전적인 의미를 갖습니다. 오라클에서의 트리거는 어떤 이벤트가 발생했을 때 내부적으로 실행되도록 데이터베이스에 저장된 프로시저를 말합니다.
트리거 역시 프로시저나 함수와 같이 선언부,실행부, 예외부를 갖는 PL/SQL 블록 구조를 가지고 있습니다. 함수나 프로시저는 사용자가 원할 때 EXECUTE 문으로 직접 호출하지만 트리거는 이를 호출하는 명령어가 따로 존재하지 않습니다. 트리거는 실행되어야 할 이벤트가 발생하게 되면 자동으로 실행되는 프로시저입니다. 이벤트는 DML 문인 INSERT, DELETE, UPDATE에 의해서 테이블에 어떤 변화가 발생하는 것을 말합니다.
DML 트리거의 종류는 크게 AFTER 트리 거와 BEFORE 트리거로 나뉩니다.

• AFTER 트리거
테이블에 INSERT, UPDATE, DELETE 등의 작업이 일어난 후에(After) 작동합니다. 테이블에만 작동하며 뷰에는 작동하지 않습니다.

• BEFORE 트리거
테이블이나 뷰에 이벤트가 작동하기 전에 작동합니다. 테이블뿐 아니라 뷰에도 작동이 되며, 주로 뷰가 업데이트 가능하도록 사용합니다. INSERT, UPDATE, DELETE 세 가지 이벤트로 작동합니다.

24. 관계 타입은 엔티티-관계 모텔에서 엔티티 사이의 연관성을 표현하는 개념으로 두 개의 엔티티 타입 사이의 업무적인 연관성을 논리적으로 표현한 것입니다. 이러한 관계를 정의할 때 동사구로 관계를 정의하며 엔티티 집합(타입)들 사이의 대응(correspondence), 즉, 사상(mapping)을 의미합니다.
관계는 관계차수와 선택성을 나타내는 엔티티 간의 였관성을 말합니다. 하나의 관계에 실제로 참여할 수 있는 인스턴스의 수를 카디날리티 (Cardinality : 관계의 대응 엔티티 수) 라고 하는데 하나의 엔티티에 대해 다른 엔티티가 몇 개 참여하는지에 따라 관계의 유형은 일대일(1:1), 일대다(1:N). 다대다(N:M)로 나뉩니다.


두 엔티티 간의 업부적인 연관성을 나타내는 관계는 엔티티 사이의 실선으로 나타냅니다

'oracle' 카테고리의 다른 글

oracle 1개월차 심화학습  (0) 2016.05.30
datadump expdp/impdp  (0) 2016.05.09
그룹함수  (0) 2016.05.04
Transaction ACID  (0) 2016.05.03
Natural Key & Surrogate Key  (0) 2016.05.03

jsp page상단에 setting 추가

 

[#setting number_format="##0"]

 

참조

 

http://hyowong-textcube.blogspot.kr/2009/09/freemaker%EB%A5%BC-%EC%93%B0%EB%8B%A4%EA%B0%80-%EC%9E%98-%EC%83%9D%EA%B8%B0%EB%8A%94-%EC%98%A4%EB%A5%98%ED%8E%8C%EA%B8%80.html

http://freemarker.org/docs/dgui_quickstart_template.html

http://freemarker.org/docs/ref_builtins_number.html

http://freemarker.org/docs/ref_builtins_number.html#ref_builtin_c

 

# long 타입 comma 문제

1. 신규로 넣을때 cntntsNo를 콤마없이 넣어서 edit view에서 가져올때 콤마를 제거해서 가져오거나

2. 콤마 있게 가져와서 수정시에 edit view에서 form post로 날릴때 제거해서 처리하거나

'etc' 카테고리의 다른 글

oracle charset change  (0) 2016.10.21
servletContext.setAttribute()  (0) 2016.10.11
Session  (0) 2016.09.29
OSI 7계층  (0) 2016.04.29
IPv4/IPv6  (0) 2016.04.29

1차시 데이터베이스와 데이터 조회

1. 오라클에서 지원하는 데이터 타입의 종류

데이터 타입

의미

CHAR(size)

Size 크기의 고정 길이 문자 데이터 타입

최대크기: 2,000 바이트

최소크기: 1 바이트

VARCHAR2(size)

Size 크기의 가변 길이 문자 데이터 타입

최대크기: 4,000 바이트

최소크기: 1 바이트

NVARCHAR2(size)

국가별 문자 집합에 따른 size

크기의 문자 또는 바이트의 가변 길이 문자 데이터 타입

최대크기: 4,000 바이트

최소크기: 1 바이트

NUMBER(p,s)

정밀도(p)와 스케일(s)로 표현되는 숫자 데이터 타입

P : 1 ~ 38

S : -84 ~ 127

DATE

날짜 형식을 저장하기 위한 데이터 타입

ROWID

테이블 내 행의 고유 주소를 가지는 64진수 문자 타입

해당 6 바이트(제한된 ROWID) 또는 10 바이트(확장된 ROWID)

BLOB

대용량의 바이너리 데이터를 저장하기 위한 데이터 타입

최대크기: 4GB

CLOB

대용량의 텍스트 데이터를 저장하기 위한 데이터 타입

최대크기: 4GB

BFILE

대용량의 바이너리 데이터를 파일 형태로 저장하기 위한 데이터 타입

최대크기: 4GB

TIMESTAMP(n)

DATE 데이터 타입의 확장된 형태

n은 mile second 자리수로 최대 9자리까지 표현 가능

INTERVAL YEAR TO MONTH

년과 월을 이용하여 기간을 저장

INTERVAL DAY TO SECOND

일, 시, 분, 초를 이용하여 기간을 저장

두 날짜값의 정확한 차이를 표현하는데 유용

2. 오라클 데이터베이스를 설치하였으면 이를 사용하기 위해서 오라클에 접속을 시도해야 합니다. 데이터베이스 접속을 시도하면 오라클 데이터베이스를 사용할 수 있는 사용자인지를 검증하기 위해서 사용자 계정과 암호를 묻게 됩니다. 오라클을 설치하면 기본적으로 생성되는 계정이 있다고 하였습니다. 제공되는 계정은 시스템 권한을 가진 사용자인 DBA용 계정(SYS, SYSTEM)과 교육용 계정(HR) 두 가지로 나뉩니다.
데이터베이스 사용자는 오라클 계정(Account)이라는 용어와 같은 의미로 사용됩니다. 오라클을 설치하면 한 개 이상의 데이터베이스 권한을 갖는 디폴트(기본적인) 사용자가 존재합니다. 오라클에서 제공되는 사용자 계정은 다음과 같습니다.

SYS : 오라클 Super 사용자 계정이며 데이터베이스에서 발생하는 모든 문제들을 처리할 수 있는 권한을 가지고 있다.
SYSTEM : 오라클 데이터베이스를 유지보수 관리할 때 사용하는 사용자 계정이며, SYS 사용자와
차이점은 데이터베이스를 생성할 수 있는 권한이 없으면 불완전 복구를 할 수 없다.
HR : 처음 오라클을 사용하는 사용자의 실습을 위해 만들어 놓은 교육용 계정이다.

디폴트 사용자 중에서 SYS와 SYSTEM은 DBA 권한을 가진 사용자로서 다른 모든 시용 자에 대한 정보를 조회할 수 있습니다. DBA 권한을 가진 관리자는 사용자를 생성하거나 삭제,변경 등의 시스템 권한을 가지고 있습니다. DBA 관리자인 SYS 혹은 SYSTEM은 오라클을 처음 설치하자마자 디폴트로 생성되고 활성화 되어 있는 사용자 계정입니다.

3. IN 연산자
IN 연산자는 특정 칼럼의 값이 A, B, C 중에 하나라도 일치하면 참이 되는 연산자입니다.

column_name IN(A, B, C)

다음은 커미션이 300이거나 500이거나 1400인 사원을 검색하기 위해서 IN 연산자를 사용한 예입니다.

01:select * from employee
02: where commission in(300, 500, 1400);

EN0   ENAME     JOB        MANAGER HIREDATE  SALARY COMMISSION
7499  ALLEN  SALESMAN      7698       81/02/20      1600         300
7521  WARD   SALESMAN      7698       81/02/22      1250         500
7654  MARTIN SALESMAN     7698       81/09/28      1250         1400

2차시 SQL/PLUS와 다양한 함수

4. SQL*Plus 명령어를 SQL 문과 혼동하는 경우가 많은데, SQL 문은 데이터베이스에서 자료를 검색하고 수정하고 삭제하는 처리 등을 위한 데이터베이스 언어인 반면, SQL*Plus 명령어는 SQL 문을 실행시키고 그 결과를 볼 수 있도록 오라클에서 제공하는 툴입니다.

• SQL*PLUS : SQL 문을 대호(식으로 실행하기 위해서 사용자가 데이터베이스에 입력하고 SQL 문을 처리하여 그 결과를 받을 수 있도록 만든 툴입니다.
• SQL(Structured Query Language) : 테이블을 저장 단위로 생각하는 관계형 데이터베이스 (Relational DataBase: RDB)를 처리(저장, 수정. 삭제. 추출)하기 위해 미국표준협회(ANSI)에서 표준으로 채택한 언어입니다.

SQL*Plus 명령어의 실행은 한 줄을 기본으로 합니다. 그래서 문장의 끝을 알리는 종결문자가 필요 없습니다. 한 줄을 입력한 후에 [Enter] 키를 누르면 명령어 입력의 끝난 것으로 인식해서 실행됩니다. 만일 명령어가 길어져서 다음 줄까지 이어져야 하는 경우에는 연결문자인 ‘-’를 사용한 후에 엔터키를 눌러야만 이전 줄과 다음 줄이 이어집니다.
SQL 문은 종결문자인 세미콜론을 입력한 후 [Enter] 키를 눌려야만 실행합니다. 여러 줄에 명령어를 이어서 입력할 경우 따로 연결 문자가 필요 없습니다. [Enter] 키를 눌러도 명령어가 실행되지 않기 때문에 절 단위로 끊어서 여러 줄에 걸쳐서 명령어를 입력하다가 문장이 끝나는 시점에서 세미콜론을 입력합니다.
또한 SQL 문은 마지막 문장 한 개가 SQL 버퍼라 불리는 공간에 저장이 되지만 SQL*Plus 명령어는 버퍼에 저장이 되지 않는 차이가 있습니다.
SQL*Plus 명령어 중에서 자주 시용하는 명령어들은 다음과 같습니다.

명령어

기능

LIST

버퍼에 저장된 SQL 문의 편집 명령

RUN, @, /

SQL 문 또는 PL/SQL을 실행하는 명령

SAVE, GET, EDIT, SPOOL

스크립트 파일을 저장하는 명령

HOST, EXIT

데이터베이스 접속 및 종료

LINE, PAGE

검색 결과에 대한 보고서 형태의 출력 형식 설정

5. SPOOL
SPOOL 명령어는 SQL 문과 실행된 쿼리 결과를 파일로 기록하는 명령어로서 화면에 보이는 내용 전체를 갈무리해서 하나의 파일로 만듭니다.

SPOOL filename

SAVE 명령어가 SQL 문만을 저장하는데 비해 SPOOL 명령은 SQL 문의 실행 결과 화면이 갈무리되어 저장됩니다. SAVE 명령어의 기본 확장자는 .sql이지만 SPOOL 명령어의 기본 확장자는.LST 입니다.
SPOOL OFF는 SPOOL를 해제하기 위한 명령어입니다. SPOOL OFF 명령어는 화면 갈무리 작업을 중단하며 해제하기 전까지의 여러 SQL 문을 모두 저장합니다.

SPOOL OFF

SPOOL OFF를 하지 않고 오라클을 종료하게 되면 지금까지 갈무리한 내용이 저장되지 않고 사라지기 때문에 화면 갈무리 내용을 저장하기 위해서는 SPOOL OFF를 해주어야 합니다.

6. 문자 조작 함수의 종류
구분                                                           설명
CONCAT                                    문자의 값을 연결한다.
SUBSTR                              문자를 잘라 추출한다(한글 1Byte).
SUBSTRB                            문자를 잘라 추출한다{한글 2Byte).
INSTR                           특정 문자의 위치 값을 반환한다(한글 1Byte).
NSTRB                          특정 문자의 위치 값을 반환한다(한글 2Byte).
LPAD, RPAD       입력 받은 문자열과 기호를 정렬하여 특정 길이의 문자열로 반환한다.
TRIM                                     잘라내고 남은 문자를 표시한다.

3차시 그룹함수와 테이블 조인

7. 그룹함수
그룹함수는 테이블의 전체 데이터에서 통계적인 결과를 구하기 위해서 행 집합에 적용하여 하나의 결과를 생산합니다. 그룹함수는 하나 이상의 행을 그룹으로 묶어 연산하여 총합,평균 등 하나의 결과를 구합니다.
구분                                           설명
SUM                      그룹의 누적 합계를 반환합니다.
AVG                           그룹의 평균을 반환합니다.
COUNT                     그룹의 총 개수를 반환합니다.
MAX                          그룹의 최대값을 반환합니다.
MIN                           그룹의 최소값을 반환합니다.

8. NON-EQUI JOIN은 조인 조건에 특정 범위 내에 있는지를 조사하기 위해서 사용합니다. WHERE 절에 ‘<’,BETWEEN a AND b와 같이 조건이 아닌 연산자를 사용합니다.
사원 테이블과 급여 등급 테이블을 NON-EQUI JOIN하여 사원별로 급여 등급을 출력하는 예제를 작성해 보겠습니다.

우선 급여 등급 테이블(salgrade)을 살펴보면 다음과 같습니다.
01:select * from salgrade;

GRADE LOSAL   HISAL
    1        700       1200
    2        1201      1400
    3        1401      2000
    4        2001      3000
    5        3001      9999
급여 등급 테이블(salgrade)은 급여에 대한 등급을 총 5등급으로 나누어 놓았습니다. 1등급은 급여가 700부터 1200,2등급은 12이부터 1400,3등급은 14이부터 2000,4등급은 2001부터 3000,5등급이면 30이부터 9999 사이입니다.

다음은 등급(salgrade) 테이블의 급여 등급을 기준으로 사원의 급여가 몇 등급인지 살펴보는 예제입니다.
01 : select ename, salary, grade
02 : from employee, salgrade
03 : where salary between losal and hisal;

위의 WHERE 절의 ‘salary between losal and hisal’을 ‘where salary 〉= losal and salary <= hisal’와 같이 표현해도 동일한 결과를 얻을 수 있습니다.

다음은 3개의 테이블을 조인하는 방법을 학습합니다.
사원의 이름과 소속된 부서의 이름과 급여가 몇 등급인지를 출력하려고 합니다. 이를 위해서는 총 3개의 테이블 즉,사원 테이블과 부서 테이블과 급여 등급 테이블을 조인해야 합니다.

3개의 테이블 조인하기
01:select e.ename, d.dname, e.salary, s.grade
02:from employee e, department d, salgrade s
03:where e.dno = d.dno
04:and salary between losal and hisal;

ENAME          DNAME          SALARY         GRADE
KING          ACCOUNTING       5000                5
FORD          RESEARCH         3000                4
SCOTT        RESEARCH         3000                4
ALLEN            SALES            1600                3
MILLER       ACCOUNTING      1300                2
SMITH         RESEARCH          800                 1

9. SELF JOIN은 하나의 테이블에 있는 칼럼끼리 연결해야 하는 조인이 필요한 경우 사용합니다. SELF JOIN이란 말 그대로 자기 자신과 조인을 맺는 것을 말합니다. 조인 대상 테이블이 자신 하나라는 것 외에는 EQUI JOIN과 동일합니다.
사원 테이블에는 manager 칼럼이 존재하는데 이 칼럼에는 각 사원의 담당 매니저의 사원 번호가 저장되어 있습니다. ‘SCOTT’란 사원의 매니저 이름을 검색하려면 ‘SCOTT’의 매니저 사원번호가 필요하고 사원번호로 사원이름을 조회해야 합니다. 그런데 ‘SCOTTY 매니저 사원번호와 사원번호로 사원이름을 조회하려는 테이블이 동일한 테이블이기 때문에 테이블의 별칭을 사용하여 SELF JOIN을 해야 합니다.
WHERE 절을 사용한 SELF JOIN
01: select employees.ename as “사원이름”, manager.ename as “직속상관이름”
02: from employee employees, employee manager
03: where employees.manager = manager.eno;
4차시 서브 쿼리와 테이블 생성/수정/제거

10. 다중 행 서브 쿼리
IN - 메인 쿼리의 비교 조건(‘=’ 연산자로 비교할 경우)이 서브 쿼리의 결과 중에서 하나라 도 일치하면 참입니다.
ANY, SOME - 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 하나 이상이 일치하면 참입니다.
ALL - 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 모든 값이 일치하면 참입니다.
EXIST - 메인 쿼리의 비교 조건이 서브 쿼리의 결과 중에서 만족하는 값이 하나라도 존재하면 참입니다.

11. 오라클에서는 DDL(데이터 정의어)을 제공합니다. DDL은 테이블의 구조 자체를 생성,수정, 제거하도록 하는 명령문 집합입니다. CREATE TABLE 문을 사용하여 데이터를 저장할 테이블을 생성합니다. 이 명령문 하나로 테이블에 대한 구조를 정의하고,데이터를 저장하기 위한 공간을 할당합니다.
테이블을 생성하기 위해서는 테이블명을 정의하고 테이블을 구성하는 칼럼의 데이터 타입과 무결성 제약 조건을 정의해야 합니다.

테이블명 및 칼럼명을 정의하기 위한 규칙은 다음과 같습니다.
(1) 문자(A-Z, a-z)로 시작해야 하며 30자 이내로 작성합니다.
(2) 문자(A-Z, a-z), 숫자(0-9), 특수문자 ($, #)만 사용 가능합니다.
(3) 대소문자 구별이 없습니다. 소문자로 저장하려면 작은따옴표로 묶어 주어야 합니다.
(4) 동일 사용자가 소유한 다른 객체의 이름과 중복되지 않아야 합니다.

테이블을 생성하기 위한 기본 형식은 다음과 같습니다.
CREATE TABLE [schema.] table
(column datatype [DEFAULT expression][column_constraint clause][•••]);

schema는 소유자의 이름으로,데이터베이스 사용자 계정과 같은 의미이고 table은 생성하고자 하는 테이블명이며 column은 테이블에 포함되는 칼럼명입니다. datatype은 칼럼에 대한 데이터 타입과 길이를 지정하고 DEFAULT expression은 데이터 입력시 값이 생략된 경우에 입력되는 기본 값입니다. column_constraint_clause은 칼럼에 대해 정의되는 무결성 제약 조건입니다.

12. TRUNCATE TABLE 문은 기존에 사용하던 테이블의 모든 로우를 제거합니다. 테이블의 구조는 그대로 유지하고,테이블의 데이터와 할당된 공간만 해제됩니다. 테이블에 생성된 제약 조건과 연관된 인덱스,뷰,동의어는 유지됩니다.
TRUNCATE TABLE table_name

테이블의 모든 데이터 제거하기
01 : truncate table dept_second;

'oracle' 카테고리의 다른 글

Oracle 2개월차 심화학습  (0) 2016.06.29
datadump expdp/impdp  (0) 2016.05.09
그룹함수  (0) 2016.05.04
Transaction ACID  (0) 2016.05.03
Natural Key & Surrogate Key  (0) 2016.05.03

vpn

Virtual private network,  가상 사설망

공중 네트워크를 통해 한 회사나 몇몇 단체가 내용을 바깥 사람에게 드러내지 않고 통신할 목적으로 쓰이는 사설 통신망

가상 사설망에서 메시지는 인터넷과 같은 공공망 위에서 표준 프로토콜을 써서 전달되거나, 가상 사설망 서비스 제공자와 고객이 서비스 수준 계약을 맺은 후 서비스 제공자의 사설망을 통해 전달된다.

 

soa

Service Oriented Architecture, 서비스 지향 아키텍처

대규모 컴퓨터 시스템을 구축할 때의 개념으로 업무상에 일 처리에 해당하는 소프트웨어 기능을 서비스로 판단하여 그 서비스를 네트워크상에 연동하여 시스템 전체를 구축해 나가는 방법론

SOA는 과거 플랫폼의 진화물로서, 전통적인 아키텍처의 특징들을 고스란히 가지고 있으며, 명확한 원칙을 가지고 SOE를 지원하며 서비스 지향을 촉진

애플리케이션 프론트엔드, 서비스, 서비스 리포지토리, 서비스 버스의 주요 개념에 바탕을 둔 소프트웨어 아키텍처이다. 서비스는 계약, 하나 이상의 인터페이스, 그에 대한 구현으로 이루어진다.

  • 서비스 사용자(Service Consumer): '서비스 제공자'에 의해 제공되고 있는 하나 이상의 서비스를 사용.
  • 서비스 제공자(Service Provider): '서비스 사용자'가 호출 시 입력하는 값을 가공하여, 그게 해당되는 결과를 제공.
    경우에 따라 '서비스 제공자'는 또 다른 '서비스 제공자'의 서비스를 사용하는 '서비스 사용자'가 될수 있음.
  • 서비스 레지스트리(Service Registry): 서비스에 대한 설명정보(description)를 저장. '서비스 제공자'는 자신이 제공하고 있는 서비스를 등록하고, '서비스 사용자'는 자신의 원하는 서비스를 발견하여 사용함
  • 서비스
    명확한 기능적인 의미를 지닌 소프트웨어 컴포넌트로, 고차원의 비즈니스 개념을 캡슐화 하고 있는 것
    인터페이스를 통해 자신이 가진 비즈니스 프로세스를 처리할 수 있는 컴포넌트
  • 서비스특징 3가지
    • 서비스의 인터페이스는 플랫폼에 독립적이다.
    • 서비스는 동적으로 검색될 수 있으며, 호출될 수 있다.
    • 서비스는 self-contained하다. 즉, 자신의 상태를 스스로 유지한다.
  • 메시지
    서비스 제공자와 서비스 사용자는 메시지를 통해 서로 통신
    • 서비스 제공자는 서비스 명세를 통해 자신이 가진 서비스의 인터페이스를 공개하는데, 이 명세 내에는 서비스가 제공하는 기능과 이를 이용하기 위해 사용자와 주고 받아야 하는 메시지의 형식이 정의

SOA 관점에서 서비스는 플랫폼 독립적이어야 하므로, SOA에서 정의되는 메시지는 특정 기술에 독립적

 

roa

Resource-oriented architecture, 리소스 기반 아키텍처

a style of software architecture and programming paradigm for designing and developing software in the form of resources with "RESTful" interfaces

These resources are software components which can be reused for different purpose.

 

 

A class,B class, C class

IPv4에서 IP 분배 Level

 

사설 IP 주소로 이용할 수 있는 IP주소
10.0.0.0 ~ 10.255.255.255 : 매우 큰 규모의 네트워크용
172.16.0.0 ~ 172.31.255.255 : 중간 규모의 네트워크용
192.168.0.0 ~ 192.168.255.255 : 작은 규모의 네트워크용

 

DHCP : IPtime에서 동적으로 사설 IP를 할당해주는 프로토콜 (Dynamic Host Configuration Protocol)

 

URL Redirection

similarly, also called URL Forwarding, domain redirection, domain forwarding

URL redirection is done for various reasons: for URL shortening; to prevent broken links when web pages are moved; to allow multiple domain names belonging to the same owner to refer to a single web site; to guide navigation into and out of a website; for privacy protection; and for less innocuous purposes such as phishingattacks.

 

JPA

Java Persistence API, 관계형 데이터베이스에 접근하기 위한 표준 ORM기술을 제공하며, 기존에 EJB에서 제공되던 entity bean을 대체하는 기술

JSR 220에서 정의된 EJB 3.0스펙의 일부로 정의가 되어 있지만 JPA는 EJB컨테이너에 의존하지 않으며 EJB,웹모듈 및 JAVA SE 클라이언트에서 모두 사용이 가능하다, 또한 사용자가 원하는 Persistance Provider 구현체를 선택해서 사용할 수 있다.

 

1. URL Encoding

Percent-encoding, used more generally within the main Uniform Resource Identifier (URI) set

is often used in the submission of HTML form data in HTTP requests.

When a character from the reserved set (a "reserved character") has special meaning (a "reserved purpose") in a certain context, and a URI scheme says that it is necessary to use that character for some other purpose, then the character must be percent-encoded. Percent-encoding a reserved character involves converting the character to its corresponding byte value in ASCII and then representing that value as a pair ofhexadecimal digits.

URI producers are discouraged from percent-encoding unreserved characters.

 

 

2. HTML escape()/unescape() Javascript

escape 함수로 encoding한  String 개체를 decoding

URI는 encoding하지 못하므로 encodeURI와 decodeURI를 이용

: / ; ? 문자들은 encoding 하지 못하므로 encodeURIComponent, decodeURIComponent 이용

 

CDN

접속자가 인터넷상에서 가장 가까운 곳의 서버로 컨텐츠를 전송받아 트래픽이 특정 서버에 집중되지 않고 각 서버로 분산되도록 하는 기술. 여러곳의 IDC에 동일한 컨텐츠를 올려놓고, 접속자가 사용하는 인터넷전용회선의 종류에 따라 가장 가까운 곳에서 콘텐츠를 불러들일 수 있도록 지원하는 서비스 콘텐츠(HTML, 이미지, 동영상, 기타파일)를 사용자들이 빠르게 받을 수 있도록 전 세계 곳곳에 위치한 캐시 서버에 복제해주는 서비스

 

class diagram

 

UML

 

자동화툴

DOMAIN NAME

네트워크 상에서 컴퓨터를 식별하는 호스트명

도메인 레지스트리에게서 등록된 이름을 의미

 

 

URI

Uniform Resource Identifier

인터넷에 있는 자원을 나타내는 유일한 주소

인터넷에서 요구되는 기본조건으로서 인터넷 프로토콜에 항상 붙어다님

 

프로토콜(HTTP 혹은 FTP) : // 호스트 이름 주소

 

URL

Uniform Resource Locator

파일식별자, 유일자원지시기

네트워크상에서 자원이 어디 있는 지를 알려주기 위한 규약

웹사이트 주소+ 컴퓨터 네트워크상의 자원을 모두 나타낼 수 있음

그 주소에 접속하려면 해당 URL에 맞는 프로토콜(gopher, telnet, ftp, http, usenet…)을 알아야 하고 그와 동일한 프로토콜로 접속해야 함

 

프로토콜 이름 : // 프로토콜에 특화된 정보

 

: –>프로토콜 이름 구분자

// –> IP 혹은 Domain name 정보가 필요한 프로토콜의 경우

 

 

urn

Uniform Resource Name

urn:scheme를 사용하는 URI를 위한 이름

영속적이고 위치에 독립적인 자원을 위한 지시자로 사용

<URN> ::= "urn:" <NID> ":" <NSS>

실제 사용시  urn:<NID>:<NSS>

생성자가 여러 차례 호출되더라로 실제로 생성되는 객체는 하나이고 최초 생성이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.

 

1) Story

 

1. YGEnt는 하나뿐이므로 YGEnt가 여러번 new로 생성시킬 수 없다

2. getInstance()가 처음 호출될때 YGEnt의 객체를 new로 생성하고

    멤버변수와 getInstance()를 static으로 설정하여 class에 부속시킨다.

    생성자는 private으로 해 외부에서 new로 생성할 수 없게한다.

 

2) UML Class Diagram

 

                                    image

 

3) Code

1.YGEnt를 new로 여러번 객체생성한다.

public class Main {

    public static void main(String[] args) {
        
        Entertainment entertainment1=new YGEnt();
        Entertainment entertainment2=new YGEnt();

        entertainment1.debut("위너");
        List<Singer> list = entertainment1.debut("빅뱅");
        
        System.out.println(entertainment1);
        System.out.println(entertainment2);
        System.out.println(list);
    }
}

entertainment1과 entertainment2의 hashcode 출력결과이다.

 

         factory.YGEnt@5c647e05
factory.YGEnt@33909752

 

2. YGEnt를 getInstance()로 객체 생성하여 호출한다.

public class YGEnt extends AbstractEnt {

    private static YGEnt yGEnt;
    
    private YGEnt(){}
    
    @Override
    public int recruit() {
        int cnt=(int)(Math.random()*10+1);
        return cnt;
    }

    @Override
    public Singer train(String name, int memberCnt) {
        Singer singer;
        
        int cnt=(int)(Math.random()*2);
        if(cnt==0){
            singer=new BoyGroup(name,memberCnt);
        }else{
            singer=new GirlGroup(name, memberCnt);
        }
        
        return singer;
    }
    
    public static YGEnt getInstance(){
        if (yGEnt==null) {yGEnt=new YGEnt();}
        return yGEnt;
    }
}

 

public class Main2 {

    public static void main(String[] args) {
        
        Entertainment entertainment1=YGEnt.getInstance();
        Entertainment entertainment2=YGEnt.getInstance();
        
        System.out.println(entertainment1);
        System.out.println(entertainment2);
        
        List<Singer> list=entertainment1.debut("2NE1");
        System.out.println(list);
        
    }
}

entertainment1과 entertainment2의 hashcode 출력결과이다.

          singletone.YGEnt@70dea4e
singletone.YGEnt@70dea4e

 

#Singletone Pattern은 캐시에 사용된다.

캐시는 캐시의 접근시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다. 캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간없이 더 빠른 속도로 데이터에 접근할 수 있다.

 

#CPU캐시

대용량의 메인 메모리 접근을 빠르게 하기 위해 CPU 칩 내부나 바로 옆에 탑재하는 작은 메모리이다. 1980년대 이후 대부분의 CPU는 하나, 많게는 5-6개까지의 서로 다른 기능을 가진 CPU 캐시를 장착하고 있다. 메모리 접근 속도가 늘어나는 것에 비해 CPU의 처리 속도가 훨씬 빠르게 늘어나고 있기 때문에, 용량은 작지만 속도가 빠른 CPU 캐시는 현대 마이크로프로세서의 성능에 직접적인 영향을 미친다.

 

#버퍼

버퍼(buffer,완충기억기)는 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역이다. 버퍼링(buffering)이란 버퍼를 활용하는 방식 또는 버퍼를 채우는 동작을 말한다. 다른 말로 '큐(Queue)'라고도 표현한다.

버퍼는 컴퓨터 안의 프로세스 사이에서 데이터를 이동시킬 때 사용된다. 보통 데이터는 키보드와 같은 입력 장치로부터 받거나 프린터와 같은 출력 장치로 내보낼 때 버퍼 안에 저장된다. 이는 전자 통신의 버퍼와 비유할 수 있다. 버퍼는 하드웨어나 소프트웨어에 추가될 수 있지만 버퍼는 상당수가 소프트웨어에 추가된다. 버퍼는 보통 속도가 계속 바뀔 수 있으므로 데이터 수신, 처리 속도에 차이가 있다. (예: 프린터 스풀러)

버퍼는 네트워크 상에서 자료를 주고 받을 때나 스피커에 소리를 재생할 때, 또는 디스크 드라이브와 같은 하드웨어의 입출력을 결합하는 데에 자주 이용된다. 버퍼는 또한 순서대로 데이터를 출력하는 FIFO 방식에서 보통 사용된다.

 

#버퍼 캐시(buffer cache)는 최근 사용된 디스크 블록메모리캐시하는 것을 말한다.

디스크 입출력 시간이 메모리 접근 시간보다 크고, 디스크 블록의 접근 패턴에 지역성이 있기 때문에 디스크 블록의 정보를 메모리 공간에 저장해두면 읽기/쓰기 등의 작업시 응답시간을 줄일 수 있다.

가상 메모리MMU와 같은 하드웨어의 지원을 받는 반면, 버퍼 캐시는 그렇지 않다. 읽기쓰기 동작의 수행 결과가 실제 디스크의 내용과 비동기적이다.

'design patterns' 카테고리의 다른 글

Factory Method Pattern  (0) 2016.05.15
Software Design Pattern  (0) 2016.05.15

Factory Method Pattern

Define an interface for creating a single object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.

factory는 객체를 찍어낸다. 객체 생성과 객체 관리를 해주기 때문에 factory를 사용하는 부분에서 new로 객체를 생성할 필요가 없다.

modifier를 강제할 수 있다.

 

1) Story

  1. YGEnt가 아이돌 그룹을 만든다: debut().
    아이돌 그룹은 profile()로 프로필을 확인할 수 있는 메서드를 가진다.
    YGEnt는 아이돌 그룹의 목록을 뽑아내는 list()메서드를 가진다.
  2. Entertainment(interface)-AbstractEnt(abstract)-YGEnt순으로 class를 구현한다.
    boygroup과 girlgroup은 Singer interface를 구현한다.
  3. debut()안에 다른 메서드들(recruit(),train())을 포함시켜 메서드의 외부노출이 불가능하다.

 

2) UML class diagram

 

image

 

 

3) Code

story1)

public class BoyGroup {
	int memberCnt;
	String name;
	
	BoyGroup(int memberCnt,String name) {
		this.memberCnt=memberCnt;
		this.name=name;
	}
	
	public int getMemberCnt() {
		return memberCnt;
	}
	public void setMemberCnt(int memberCnt) {
		this.memberCnt = memberCnt;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		return "{\"memberCnt\":" + memberCnt + ", \"Name\":\"" + name + "\"}";
	}
	
	public void profile(){
		System.out.println("memberCnt="+memberCnt+", name="+name);
	}
}
public class YGEnt {

	List list=new ArrayList();
	
	public BoyGroup debut(String name, int memberCnt){
		BoyGroup boyGroup=new BoyGroup(memberCnt,name);
		list.add(boyGroup);
		return boyGroup;
	}
	
	public List list(){
		return list;
	}
}
public class Main1 {

	public static void main(String[] args) {
		
		YGEnt yGEnt =new YGEnt();
		
		//BoyGroup boyGroupA = new BoyGroup(5,"빅뱅");
		BoyGroup boyGroupA = yGEnt.debut("빅뱅",5);
		BoyGroup boyGroupB = yGEnt.debut("위너",5);
		
		boyGroupA.profile();
		boyGroupB.profile();
		
		System.out.println(boyGroupA);
		System.out.println(boyGroupB);
		
		List list = yGEnt.list();
		System.out.println(list);
		
	}
}

story2)

public interface Entertainment {
	
	List debut(String name);
	int recruit();
	Singer train(String name, int memberCnt);
	List enlist(Singer singer);

}
public abstract class AbstractEnt implements Entertainment{

	List list=new ArrayList();
	
	@Override
	public List debut(String name) {
		
		int memberCnt=recruit();
		Singer singer=train(name,memberCnt);
		list.add(singer);
		
		return list;
	}
	
	public abstract int recruit();
	public abstract Singer train(String name, int memberCnt);

	@Override
	public List enlist(Singer singer) {
		return list;
	}

}
public class YGEnt extends AbstractEnt {

	@Override
	public int recruit() {
		int rand=(int)(Math.random()*10+1);
		return rand;
	}

	@Override
	public Singer train(String name, int memberCnt) {
		
		Singer singer=null;
		
		int rand=(int)(Math.random()*2);
		
		if(rand==0){
			singer=new BoyGroup(memberCnt, name);
		}else{
			singer=new GirlGroup(memberCnt, name);
		}
		
		return singer;
	}
}
public interface Singer {
	public void profile();
}
public class BoyGroup implements Singer {
	int memberCnt;
	String name;
	final String gender="boy";
	
	BoyGroup(int memberCnt,String name) {
		this.memberCnt=memberCnt;
		this.name=name;
	}
	
	public int getMemberCnt() {
		return memberCnt;
	}
	public void setMemberCnt(int memberCnt) {
		this.memberCnt = memberCnt;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		return "{\"memberCnt\":" + memberCnt + ", \"Name\":\"" + name +"\", \"gender\":\""+gender+ "\"}";
	}
	
	public void profile(){
		System.out.println("memberCnt="+memberCnt+", name="+name);
	}
}
public class GirlGroup implements Singer{
	int memberCnt;
	String name;
	final String gender="girl";
	
	GirlGroup(int memberCnt,String name) {
		this.memberCnt=memberCnt;
		this.name=name;
	}
	
	public int getMemberCnt() {
		return memberCnt;
	}
	public void setMemberCnt(int memberCnt) {
		this.memberCnt = memberCnt;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		return "{\"memberCnt\":" + memberCnt + ", \"Name\":\"" + name +"\", \"gender\":\""+gender+ "\"}";
	}
	
	public void profile(){
		System.out.println("memberCnt="+memberCnt+", name="+name);
	}
}
public class Main2 {

	public static void main(String[] args) {
		
		YGEnt yGEnt =new YGEnt();
		
		yGEnt.debut("빅뱅");
		yGEnt.debut("2NE1");
		yGEnt.debut("위너");
		yGEnt.debut("이하이");
		Listlist=yGEnt.debut("아이콘");
		
		System.out.println(list);
		
	}
}

'design patterns' 카테고리의 다른 글

Singletone pattern  (0) 2016.05.16
Software Design Pattern  (0) 2016.05.15

+ Recent posts