반응형

클래스


* 클래스 : 객체의 구조를 정의하는 곳 (속성(필드, 멤버변수), 생성자, 함수(메서드))
* 객체(인스턴스) : 클래스로부터 생성되며 new 생성자함수() 이용해서 생성함
* new 연산자 : 객체 생성 연산자이며, 생성자함수를 호출하고, 힙 메모리 영역에 객체를 저장함
* 사용법 : 클래스 객체변수 = new 생성자함수();* 객체변수 : 힙 메모리 주소(방번호)가 저장됨
package chap06.sec02.exam01;

/**
 * packageName : chap06.sec02.exam01
 * fileName : Car
 * author : GGG
 * date : 2023-09-19
 * description :  자동차 클래스
 * 요약 :
 *      클래스         : 객체의 구조를 정의하는 곳 (속성(필드, 멤버변수), 생성자, 함수(메서드))
 *      객체(인스턴스)  : 클래스로부터 생성되며 new 생성자함수() 이용해서 생성함
 *      new 연산자     : 객체 생성 연산자이며, 생성자함수를 호출하고, 힙 메모리 영역에 객체를 저장함
 *      사용법         : 클래스 객체변수 = new 생성자함수();
 *      객체변수       : 힙 메모리 주소(방번호)가 저장됨
 *
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class Car {
//    클래스의 3요소 : 속성, 생성자함수, 함수(메서드)
//    TODO: 속성(필드, 멤버변수)
    String compnay = "현대자동차";
    String model = "그랜저";
    String color = "검정";
    int maxSpeed = 350;
    int speed;      // 기본 초기화(0)
}
package chap06.sec02.exam01;

/**
 * packageName : chap06.sec02.exam01
 * fileName : CarApplication
 * author : GGG
 * date : 2023-09-19
 * description : 실행 클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class CarApplication {
    public static void main(String[] args) {

//        객체 생성 : 클래스명 객체변수명 = new 생성자함수();
//        생성자 함수명 == 클래스명
        Car car = new Car();
//        TODO: 클래스의 속성 출력하기
//              사용법 : 객체변수명.속성명

        System.out.println("제작회사 : "+ car.compnay);
        System.out.println("모델명 : "+ car.model);
        System.out.println("색상 : "+ car.color);
        System.out.println("최고속도 : "+ car.maxSpeed);
        System.out.println("현재속도 : "+ car.speed);       // 기본값 출력


//        car 클래스 속성값 수정 수정
//        현재속도를 수정해보기 (car.speed)
        car.speed = 60;
//        결과출력
        System.out.println("수정된 현재속도 : "+ car.speed);

    }


}

자동 속성 초기화

속성을 선언만 하고 출력할 때 기본값이 무엇인지 알아봅시다.
package chap06.sec02.exam02;

/**
 * packageName : chap06.sec02.exam02
 * fileName : FieldInit
 * author : GGG
 * date : 2023-09-20
 * description :    자동 속성 초기화
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class FieldInit {
//    TODO: 클래스의 3요소 = 속성(필드), 생성자함수, 함수(메서드)
//    정수 : byte, short, int, long
    byte bField;
    short sField;
    int iField;
    long lField;

//    실수 : float, double
    float fField;
    double dField;

//    char / boolean
    char cField;
    boolean boField;

//    String / int[]
    String strField;
    int[] arrField;




}
package chap06.sec02.exam02;

/**
 * packageName : chap06.sec02.exam02
 * fileName : FiledApplication
 * author : GGG
 * date : 2023-09-20
 * description :
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class FiledApplication {
    public static void main(String[] args) {
//        TODO: 클래스명 명명법 :  첫글자 대문자 나머지 소문자, 단어사이는 대문자(파스칼표기법)
        FieldInit fieldInit = new FieldInit();

//        정수
        System.out.println("byte : " + fieldInit.bField);
        System.out.println("short : " + fieldInit.sField);
        System.out.println("int : " + fieldInit.iField);
        System.out.println("long : " + fieldInit.lField);
//        실수
        System.out.println("float : " + fieldInit.fField);
        System.out.println("double : " + fieldInit.dField);
//        char / boolean
        System.out.println("char : " + fieldInit.cField);
        System.out.println("boolean : " + fieldInit.boField);
//        String / int[]
        System.out.println("String : " + fieldInit.strField);
        System.out.println("int[] : " + fieldInit.arrField);


    }
}

[ 출력 결과 ]

 

연습문제

/**
* Member 객체를 생성하고 속성에 아래의 값으로 저장한 후 속성의 값을 출력하세요
* 결과 :
* 이름 : 최하얀
* id : 23
*/
package chap06.sec02.verify;

/**
 * packageName : chap06.sec02.verify
 * fileName : Member
 * author : GGG
 * date : 2023-09-20
 * description :    회원 정보 클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class Member {
    String name;        // 회원명
    String id;          // 회원 아이디
    String password;    // 회원 패스워드
    int age;            // 나이


}
package chap06.sec02.verify;

/**
 * packageName : chap06.sec02.verify
 * fileName : MemberApplication
 * author : GGG
 * date : 2023-09-20
 * description :    실행클래스
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-20         GGG          최초 생성
 */
public class MemberApplication {
    public static void main(String[] args) {
        /**
         * Member 객체를 생성하고 속성에 아래의 값으로 저장한 후 속성의 값을 출력하세요
         * 결과 :
         *      이름 : 최하얀
         *      id  : 23
         */
        Member member = new Member();
        member.name = "최하얀";
        member.id = "23";
        System.out.println("이름 : " + member.name);
        System.out.println("id : " + member.id);

    }
}

반응형

'Java > Java 이론' 카테고리의 다른 글

생성자  (0) 2023.09.20
생성자 함수  (0) 2023.09.20
[JAVA 다시보기] 자바기초  (1) 2023.09.19
문자열 자료형  (1) 2023.09.08
[JAVA] 참조변수의 형변환  (0) 2023.08.11
반응형

프로젝트 계획


프로젝트 관리

프로젝트 핵심 관리대상(3P)

  • 사람(People)
  • 문제(Problem)
  • 프로세스(Process)

PMBOK(Project Management Body of Knowledge)

  • PMI(Project Management Institute)에서 제작한 프로젝트 관리 프로세스 및 지식 체계

🔶 PMBOK 5단계 프로세스 그룹

  1. 1단계 : 프로젝트 착수
  2. 2단계 : 프로젝트 계획
  3. 3단계 : 프로젝트 실행
  4. 4단계 : 프로젝트 통제
  5. 5단계 : 프로젝트 종료

 

개발 비용 산정

하향식 산정 기법(전문가 기법/델파이 기법)

1) 전문가 기법

  • 조직 내 경험이 있는 전문가에게 비용 산정을 의뢰하여 산정하는 기법

2) 델파이 기법

  • 여러 전문가의 의견을 종합하여 판단하는 방법

 

상향식 산정 기법(LOC 기법 / 단계별 인원수 기법)

1) LOC(원시코드 라인 수) 기법

  • 각 기능의 원시 코드 라인 수의 비관치(가장 많은 라인수), 낙관치(가장 적은 라인수), 중간치(기대치, 평균 라인수)를 측정 후 예측치를 구하고, 이를 이용해 비용을 산정하는 방법

2) 단계별 인원수(M/M) 기법

  • SW 개발 생명주기 각 단계별로 적용시켜 모든 단계의 비용을 산정하는 기법

 

수학적 산정 기법

1) COCOMO 기법

  • 개발할 SW의 규모를 예측한 후 SW 종류에 따라 각 비용 산정 공식에 대입하여 비용을 산정하는 방법
  • 개발 유형
개발유형 설명
조직형(Organic Mode) 5만 라인 이하의 프로젝트
반분리형(Semidetached Mode) 30만 라인 이하의 프로젝트
내장형(Embedded Mode) 30만 라인 이상의 프로젝트

2) Putnam 기법

  • 시간에 따른 함수로 표현되는 Rayleigh-Norden 곡선의 노력 분포도를 기초로 한다
  • SLIM :  Rayleigh-Norden 곡선과 Putnam 예측 모형을 기초로 개발한 자동화 추정도구

3) 기능 점수 기법(FP, Function Point)

  • S/W가 가지는 기능의 개수를 기준으로, S/W의 규모를 측정하는 기법
  • ESTIMACS : FP모형을 기초로 개발된 자동화 추정도

출처 : IT위키

  • 비용 산정에 이용되는 요소

- 자료 입력(입력 양식)

- 정보 출력(출력 보고서)

- 명령어(사용자 질의수)

- 데이터 파일

- 필요한 외부 루틴과의 인터페이스

 

개발 일정 산정

작업순서

  1. 작업분해(Work Breakdown Structure)
  2. PERT/CPM 작성
  3. 임계경로 구함
  4. 간트 차트로 표현

WBS(Work Breakdown Structure)

  • 프로젝트 목표를 달성하기 위해 필요한 활동과 업무를 세분화하는 작업

PERT/CPM

  • 작업의 선/후행 관계를 고려, 전체작업의 완료시간을 결정(PERT), 추가비용 투입을 고려하여 전체작업 완료시간을 단축하는(CPM) 네트워크 분석 기법
  • 임계경로(Critical Path) : 프로젝트를 끝내기 위해 필요한 최소 소요시간

출처 : IT위키

간트차트(Gantt chart)

  • 일정 계획의 최종산출물
  • 프로젝트 일정관리를 위한 바(Bar) 형태의 도구

출처 : IT위키

 

요구사항 분석


현행 시스템 분석

플랫폼 기능분석 - 플랫폼의 유형

유형 설명
싱글 사이드 플랫폼
(Single-Side Platform)
제휴 관계를 통해 소비자와 공급자를 연결하는 형태
투 사이드 플랫폼
(Two-Side Platform)
두 그룹을 중개하고 모두에게 개방하는 형태
멀티 사이드 플랫폼
(Mulit-Side Platform)
다양한 이해관계 그룹을 연결하여 중개하는 형태

 

CPND(Contents Platform Network Device)

  • 콘텐츠를 플랫폼에 맞게 가공하고 네트워크를 통해 사용자의 단말기로 서비스가 이루어짐을 표현하는 무선 인터넷 서비스의 가치사슬

 

미들웨어 분석 - 개념

  • 양 쪽을 연결하여 데이터를 주고받을 수 있도록 중간에서 매개 역할을 하는 S/W

종류

1) 원격 프로시저 호출(RPC, Remote Procedure Call)

  • 클라이언트가 원격에서 동작하는 프로시저를 호출하는 시스템

2) 메시지 지향 미들웨어(MOM, Message Oriented Middleware)

  • 응용 S/W 간의 데이터 통신을 위한 S/W
  • 메시지 기반의 비동기형 메시지를 전달하는 방식의 미들웨어

3) ORB(Object Request Broker)

  • 객체지향 시스템에서 객체 및 서비스를 요청하고 전송할 수 있도록 지원하는 미들웨어

4) DB 접속 미들웨어

  • 애플리케이션 - DB서버를 연결해주는 미들웨어

5) TP모니터

  • 트랜잭션이 올바르개 처리되고 있는지 데이터를 감시하고 제어

6) 웹 애플리케이션 서버(WAS, Web Application Server)

  • 동적인 콘텐츠를 처리하기 위한 미들웨어

7) 엔터프라이즈 서비스 버스(ESB, Enterprise Service Bus)

  • 메시지 기반으로 느슨한 결합 형태의 표준 인터페이스 통신을 지원하는 미들웨어

 

요구공학

1) 요구공학 내용의 종류

(1) 기능적 요구사항

  • S/W를 구성하는 기능들이 무엇인지 정의한 것

(2) 비기능적 요구사항

  • 보안, 성능, 품질, 안정성 등 S/W 기능들에 대한 조건과 제약사항들이 무엇인지 정의한 것

(3) 요구사항 개발 프로세스(도출 - 분석 - 명세 - 확인)

 

1) 도출(Elicitation)

  • S/W가 해결해야 할 문제를 이해하고 요구사항이 어디에 있고, 어떻게 수집할 것인가를 확인

2) 분석(Analysis)

  • 요구사항들 간에 상충되는 문제를 해결

3) 명세(Specification)

1) 정형 명세 기법

- 수학, 논리학

2) 비정형 명세 기법

- 자연어, 그림 중심

 

4) 확인(Validation)

  • 이해 관계자들이 문서를 검토하고, 형상관리를 수행

 

(5) 요구사항 분석도구 - 분류

1. 상위 CASE

  • 생명주기 전반부에 사용, S/W의 계획과 요구분석, 설계단계를 지원

2. 하위 CASE

  • 생명주기 후반부에 사용, 코드의 작성과 테스트, 문서화하는 과정을 지원

3. 통합 CASE

  • S/W 생명주기에 포함되는 전체 과정을 지원

(5-1) HIPO(Hierarchy Input Process Output)

  • 하향식 S/W 개발을 위한 문서화 도구

🔶 종류

종류 설명
가시적 도표
(Visual Table of Content)
시스템의 전체 기능과 흐름을 보여주는 트리 구조
입력, 처리, 출력이 없음
총체적 도표
(Overview Diagram)
프로그램을 구성하는 기능을 기술한 것
입력, 처리, 출력에 대한 전반적인 정보 제공
세부적 도표
(Detail Diagram)
총체적 도표에 표시된 기능을 구성하는 기본 요소들을 상세히 기술하는 도표

 

반응형
반응형

🔶 SW 공학

소프트웨어 공학

SW 위기를 극복하고 효율적으로 품질 높은 SW를 개발하기 위한 학문

 

소프트웨어 공학의 3R

역공학(Reverse Engineering)

기존 개발된 시스템을 CASE도구를 이용하여 요구 분석서, 설계서 등의 문서로 추출하는 작업
개발 단계를 역으로 올라간다고 생각!

재공학(Re-Engineering)

SW의 위기를 해결하기 위해 개발의 생산성이 아닌 유지보수의 생산성으로 해결하려는 방법
예방 유지보수 측면에서 SW 위기 해결

재공학의 과정

분석(Analysis) / 재구성(Restructuring) / 역공학(Reverse Engineering) / 이관(Migration)

재사용(Reuse)

이미 개발되어 있는 SW의 전체 또는 일부분을 다시 사용

재사용 방법

합성중심(Composition Based, 블록구성)
- 전자 칩과 같은 SW부품, 블록(모듈)을 만들어서 끼워 맞추어 SW를 완성시키는 방법

생성중심(Generation Based, 패턴 구성)
- 추상화 형태로 쓰여진 명세를 구체화하여 프로그램을 만드는 방법

SW 개발단계

계획 > 요구사항분석 > 설계 > 구현 > 테스트 > 유지보수

 

🔶 SW 개발 방법론

소프트웨어 개발 방법론 종류

구조적 방법론

절차지향 SW 개발 방법론
구성요소 : 데이터 흐름도(DFD), 자료사전(DD), 상태전이도(STD), 소단위 명세서(Minispec)

정보공학 방법론

기업의 주요 부분을 계획, 분석, 설계, 구축에 정형화된 기법들을 상호 연관성 있게 통합, 적용하는 데이터 중심 방법론

객체지향 개발 방법론

현실세계의 개체(Entity)를 속성(Attribute)과 메서드(Method) 형태로 표현
특징 : 캡슐화 / 정보은닉 / 상속 / 다형성 / 추상화

CBD(Component Based Development) 분석 방법론

재사용 가능한 컴포넌트의 개발 또는 상용 컴포넌트를 조합해 애플리케이션 개발

애자일 방법론

기존 방법론들이 절차를 중시한 나머지, 변화에 빠른 대응을 할 수 없다는 단점 개선을 위해 등장
종류 : XP, SCRUM, FDD, Crystal 방법론 등등...

 

소프트웨어 개발 모델

폭포수 모델(Waterfall Model)

  • 계획, 분석, 설계, 구현, 테스트, 운영 등 전 과정을 순차적으로 접근하는 개발 모델
  • 각 단계가 순차적으로 진행, 병행되거나 거슬러 반복 진행 불가
  • 요구사항 변경이 어렵다

 

프로토타이핑 모델(Prototyping Model)

  • 고객이 요구한 주요 기능을 프로토타입으로 구현하여 완성해가는 모델

 

나선형 모델(Spiral Model)

  • 폭포수 모델과 프로토타이핑 모델의 장점 수용, 위험 분석을 추가한 점증적 개발 모델

출처  : IT위키(https://itwiki.kr/w/%EB%82%98%EC%84%A0%ED%98%95_%EB%AA%A8%EB%8D%B8)

 

RAD(Rapid Application Development) 모델

  • 매우 짧은 개발 주기를 강조하는 점진적 SW 개발 방식
  • CASE(Computer Adied Software Engineering) 도구를 이용해 시스템을 개발

 

V 모형

  • 폭포수 모델에 시스템 검증과 테스트 작업을 강조

출처 : IT 위키

 

4세대 기법(4th Generation Techniques)

  • 요구사항 명세로부터 원시코드를 자동으로 생성할 수 있게 해주는 모델

 

애자일 방법론

개념

  • 신속한 반복 작업을 통해 실제 작동 가능한 SW를 개발하여 지속적으로 제공하기 위한 SW 개발 방식

 

종류

1) XP(eXtream Programming)

✏️ XP 5가지 핵심가치 (의사존중, 피드백, 존중, 용기, 단순성)

  1. 용기 : 고객의 요구사항 변화에 능동적인 대처
  2. 존중 : 개발자의 역량 존중, 충분한 권한과 권리 부여
  3. 의사소통 : 개발자, 관리자, 고객 간의 원할한 의사소통
  4. 피드백 : 의사소통에 따른 즉각적인 피드백
  5. 단순성 : 부가적 기능, 사용되지 않는 구조와 알고리즘 배제

2) 스크럼(Scrum)

🔶 특징

  • 개발 주기는 30일 정도로 조절, 개발 주기마다 실제 동작할 수 있는 결과를 제공
  • 항상 팀 단위로 생각, 매일 15분 정도의 회의

 

3) 그 외 애자일 방법론

🔶 크리스털(Crystal)

  • 프로젝트의 규모와 영향의 크기에 따라서 여러 종류의 방법론을 제공

🔶 FDD(Feature-Driven Development)

  • 신규 기능 단위로 하는 개발 방법론

🔶 ASD(Adaptive Software Development)

  • 합동 애플리케이션 개발을 사용하는 방법론

🔶린(Lean)

  • 도요타 린 시스템 품질기법

 

IT 서비스 관리

SLM(Service Level Management)

  • 서비스 수준을 정량적으로 측정, 실적을 평가, 미흡한 부분을 개선함으로써 서비스의 품질을 높이는 일련의 관리 및 활동
  • 사용자의 관점으로 서비스 요구사항을 파악하고, 서비스 수준 개선을 위한 우선순위를 판단하기 위한 도구이며, 사용자의 기대수준에 부합하는 서비스, 프로세스, 조직역량 및 기술을 통합적으로 관리하기 위한 체계

 

SLA(Service Level Agreement)

  • 정보시스템 수요자와 공급자 사이의 상호 동의에 의하여 서비스 수준을 명시적으로 정의하고 이를 문서화한것

 

ITSM(Information Technology Service Management)

  • 최종 사용자를 위한 IT 서비스를 구현, 전달 및 관리하기 위한 일련의 정책

 

ITIL(IT Infrastructure Library)

  • IT서비스 관리 업계의 모범사례를 집대성한 IT서비스 관리 프레임워크
  • ITSM을 실현하는 도구 또는 방법
반응형
반응형


HelloWorld 출력함수

public class Sec0101 {
    /**
     * Hello World 출력함수
     */
    public void exam01(){
        // 출력단축키 sout
        System.out.println("Hello World");
    }

    public void exam02(){
//        예제 1) x, y 정수 변수를 만들어서 덧셈결과를 화면에 출력하세요
        int x = 1;
        int y = 2;
        int result = x + y;
        System.out.println(result);
    }
}

변수

package chap02;

/**
 * packageName : chap02
 * fileName : Sec0201
 * author : GGG
 * date : 2023-09-18
 * description :
 * 요약 :
 *          변수          : 값을 저장할 수 있는 메모리 공간
 *          변수 사용 범위 : {} 안에서만 사용가능
 *                         만약에 {} 안에 {}가 있다면 변수는 안에 {} 도 사용가능함
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-18         GGG          최초 생성
 */
public class Sec0201 {
    public void exam01(){
//        변수 선언
        int value = 20;

//        변수 연산
//        예제 2) 변수 value에 값을 10 더하는 연산을 한 후 화면에 출력하세요
        int result = value + 10;

        System.out.println(result);
    }

    public void exam02(){
//        예제 3) x=3, y=5가 있습니다.
//        x와 y 값을 바꾸어서 출력하세요
//        swap 코딩
        int x = 3;
        int y = 5;
//        swap 코딩
        int temp = x; // x의 값을 임시변수에 넣어둠
        x = y;        // x의 값이 overwrite 됨
        y = temp;     // 임시변수 값을 y에 넣음
//        출력
        System.out.println("x = " + x +" , y = " + y);
    }

    /**
     * 변수의 허용범위 예제
     */
    public void exam04(){
        int v1 = 15;
        if(v1 > 10){
            int v2;
            v2 = v1 - 10;
        }
//        int v3 = v1 + v2 + 5; // v2는 변수 사용불가라서 에러 발생
    }
}

기본자료형

package chap02;

/**
 * packageName : chap02
 * fileName : Sec0202
 * author : GGG
 * date : 2023-09-18
 * description : 기본 자료형(Type)
 * 요약 :
 *         정수 : byte(1), short(2), int(4, ***), long(8, **)
 *         char : 2byte 자료형, 문자 1개를 의미, 홑따옴표('')표시
 *         (저장시 유니코드(숫자)로 저장되고 출력시는 문자로 출력됨)
 *         String(***) : 쌍따옴표("")로 감싼 문자열을 의미
 *         실수 : float(4), double(8, ***)
 *         boolean : 참/거짓 자료형, true/false
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-18         GGG          최초 생성
 */
public class Sec0202 {
    public void exam01(){
//        1bit : 최소 단위, 8bit = 1byte, 1024byte = 1KB
//        1024KB = 1MB, 1024MB = 1GB, 1024GB = 1TB, 1024TB = 1HB
//        2진수 표현 : 0b 를 붙이면 2진수(0, 1로 표현하는 수)
        int var1 = 0b1011; // 2진수(0b 붙이면 2진수)
        int var2 = 0206;   // 8진수(0 붙이면 8진수)
        int var3 = 365;    // 10진수
        int var4 = 0xB3;   // 16진수 (0x를 붙이면 16진수)

        System.out.println("var1 : " + var1);
        System.out.println("var2 : " + var2);
        System.out.println("var3 : " + var3);
        System.out.println("var4 : " + var4);

    }


    public void exam03(){
        long var1 = 10;     // 정수 8byte
        long var2 = 20L;    // L 붙이면 long 자료형

        System.out.println(var1);
        System.out.println(var2);
    }

    public void exam04(){
//        아스키코드
        char c1 = 'A';      // 문자를 직접 저장
        char c2 = 65;       // 십진수로 저장 => 'A'

        System.out.println(c1);
        System.out.println(c2);
    }

    public void exam05(){
        String name = "홍길동";
        String job = "프로그래머";

        System.out.println(name);
        System.out.println(job);

    }

    /**
     * 특수기호 : /n, /t, ", \(이스케이프문자)
     */
    public void exam06(){
        System.out.println("번호\t이름\t직업");                   // 탭 문자
        System.out.print("행 단위 출력\n");                       // 줄바꿈 문자
        System.out.println("우리는 \"개발자\" 입니다.");            // \" 사용
        System.out.println("봄\\여름\\가을\\겨울");                // \\ 사용
    }

    /**
     * 실수 : float(4), double(8, ***)
     */
     
    public void exam07(){
        float var2 = 3.14f;         // float 사용시 끝에 f 붙임
        double var3 = 3.14;         // double

        System.out.println(var2);
        System.out.println(var3);

//        e : 지수 표현식

        double var6 = 3e6;          // 3000000.0
        double var7 = 2e-3;         // 0.002

        System.out.println(var6);
        System.out.println(var7);
    }
}

형변환

package chap02;

/**
 * packageName : chap02
 * fileName : Sec0203
 * author : GGG
 * date : 2023-09-18
 * description : 자료형 변환
 * 요약 :
 *          자동 타입 변환 : 자동으로 자료형이 변환되는 것 : 작은(byte) 자료형 -> 큰 자료형
 *          강제 타입 변환 : 강제로 자료형 변환 : 사용법 : (자료형)변수명, 큰 자료형 -> 작은 자료형
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-18         GGG          최초 생성
 */

/**
 * 자동 형변환 예제
 */
public class Sec0203 {

    public void exam01(){
        byte byteValue = 10;    // 1byte 정수형
//        자동 자료형 변환
        int intValue = byteValue;
        System.out.println("intValue : " + intValue);

//        실수 자동 형변환
        float floatValue = 100.5F;
        double doubleValue = floatValue;
        System.out.println("doubleValue : " + doubleValue);
    }

    /**
     * 강제 형변환 예제
     * 참고) 아스키코드 변환 : char 변수 <- int 값 : 아스키코드 -> 문자로 변환
     *                      int 변수 <- char 값 : 아스키코드 변환 <- 문자
     */
    public void exam02(){
        int intValue = 44032;                // 4byte
//        char charValue = intValue;         // int 4byte, char 2byte 이므로 오류발생 강제형변환 필요
        char charValue = (char)intValue;     // 강제 형변환

//        TODO : char 자료형에 아스키 코드(숫자) 변환 : 아스키코드(숫자) -> 문자로 변환
        char alpha = 65;    // A
//        TODO : 정수형 자료형에 문자 -> 아스키코드로 변환
        int beta = 'A';     // 65


        System.out.println("charValue : " + charValue);

//        double(8) -> int(4) 강제 형변환
        double doubleValue = 3.14;
//        int intValue2 = doubleValue;      // 오류발생
        int intValue2 = (int)doubleValue;

        System.out.println("intValue : " + intValue2);
    }

    /**
     * 문자열 + 숫자 = 문자열
     */
    public void exam06(){
//        결합 연산
        String str1 = 10 + 2 + "8";     // 128
        System.out.println(str1);

        String str2 = 10 + "2" + 8;     // 1028
        System.out.println(str2);

        String str3 = "10" + (2 + 8);   // 1010
        System.out.println(str3);
    }

    /**
     *  문자열 -> int 자료형 변경 : Integer.parseInt("값");
     *  int -> 문자열 변경 :
     */
    public void exam07(){
        // 문자열 -> int 자료형으로 변경
        int value1 = Integer.parseInt("10");            // 문자열 -> 정수
        double value2 = Double.parseDouble("3.14");     // 문자열 -> 실수
        boolean value3 = Boolean.parseBoolean("true");  // 문자열 -> 참/거짓

        System.out.println(value1);
        System.out.println(value2);
        System.out.println(value3);

        // int -> 문자열 자료형으로 변경
        String str1 = String.valueOf(10);           // 정수 -> 문자열로 변경 (속도 빠름)
        String str2 = "" + 10;                         // 빈문자열 + 정수 = 문자열
        String str3 = String.valueOf(3.14);         // 실수 -> 문자열
        String str4 = String.valueOf(true);         // 참/거짓 -> 문자열

        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        System.out.println(str4);
    }
}

입출력함수 및 문자열 비교함수

package chap02;

import java.util.Scanner;

/**
 * packageName : chap02
 * fileName : Sec0204
 * author : GGG
 * date : 2023-09-18
 * description :
 * 요약 :
 *          System.out.println() : 화면에 출력하고 줄바꿈 함수
 *          System.out.print() : 화면에 출력하는 함수
 *          System.out.printf("%d %s %f", 정수변수, 문자열변수, 실수변수)
 *          Scanner : 콘솔 입력을 받기 위한 클래스(객체 정의)
 *                    한라인 입력 받기 함수      : .nextLine();
 *                    공백까지 입력 받기 함수    : .next();
 *                    참고) nextInt(), nextDouble() 등...
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-18         GGG          최초 생성
 */
public class Sec0204 {

    public void exam05(){
//        입력받기 : System.in (키보드 입력)
        Scanner scanner = new Scanner(System.in);
        String inputData;   // 입력 문자열
        while(true){
            inputData = scanner.nextLine();     // 1 라인 입력받기
            System.out.println("입력된 문자열 :" + inputData);
//            TODO: 코드를 완성하세요 (입력된 문자열이 q가 들어오면 반복문 종료하게)
//            TODO: 자바에서 문자열 비교 equal 함수 사용
//                  문자열.equals("문자열2") : 같으면 true, 아니면 false
            if (inputData.equals("q")) {
                break;
            }
        }
        System.out.println("종료");

    }

}

연산자

package chap03;

import java.util.Scanner;

/**
 * packageName : chap03
 * fileName : Sec0301
 * author : GGG
 * date : 2023-09-18
 * description :
 * 요약 :
 *          산술 : +, -, *, /, %(나머지 연산자)
 *          부호 : +, -
 *          문자열 붙이기 : +
 *          대입연산자 : =, +=, -=, *=, /=, %=
 *          증감 : ++, --
 *          비교 : ==, !=, >, <, >=, <=,(1문자 비교, 숫자비교) instanaceof
 *          TODO : 문자열 비교 : 문자열.equals(문자열2)
 *          논리 : !, &, |,(비트연산자) &&(논리곱), ||(논리합)
 *          삼항 : (조건식)? A : B
 *          우선순위 필요하면 () 쓸 것
 *
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-18         GGG          최초 생성
 */
public class Sec0301 {
    public void exam01(){
        int x = -100;
        int result1 = +x;
        int result2 = -x;
        System.out.println("result1 : " + result1);
        System.out.println("result2 : " + result2);

    }

    public void exam03(){
        boolean play = true;
        System.out.println(play);
        play = !play;  // false
        System.out.println(play);
    }

    /**
     * 사칙연산 예제 : /(나눗셈) 조심
     */
    public void exam04(){
        int v1 = 5;
        int v2 = 2;

        int result = v1 + v2;
        System.out.println(result);
        System.out.println("---------------------------------");
        int result2 = v1 / v2;
        System.out.println(result2);    // 정수/정수 => 실수부분이 잘림
        System.out.println("---------------------------------");
        // TODO : 나눗셈 개선 코딩 : 강제 형변환 후 계산해야함
        double result3 = (double)v1 / (double)v2;
//        double result3 = (double)v1 / v2;     // 같은 결과
        System.out.println(result3);
    }

//    연습문제 : 정수 1개를 입력받아 그대로 출력하기
//    입력 : 5
    public void exam05(){
        Scanner sc = new Scanner(System.in);
        System.out.println(sc.next());
    }

//    연습문제2 : 문자 2개 입력받아 순서 바꿔 출력하기
    public void exam06(){
        Scanner sc = new Scanner(System.in);
        String strFirst = sc.next(); // 공백까지 입력받기
        String strSecond = sc.next(); // 공백까지 입력받기
        System.out.println(strSecond + " " + strFirst);
    }


    /**
     * char : 내부적으로 정수로 저장됨(유니코드 : 아스키코드 확장판(한글, 중국어 등을 표시))
     */
    public void exam07(){

        char c1 = 'A' + 1; // char(정수) : 'B' ('A' 아스키코드(65) 65 + 1 = 66)
        char c2 = 'A';
        System.out.println(c1);
        System.out.println(c2);
    }


    // 연습문제3 : char 이용하는 문제
    // 값이 'A' 로 주어져 있습니다. 'A' 대문자 이면 대문자이군요 라고 출력하고, 소문자이면 소문자이군요라고 출력, 숫자이면 숫자이군요 라고 출력

    public void exam08(){
        int charCode = 'A';
        if(charCode >= 65 && charCode <= 90) {
            System.out.println("대문자이군요");
        } else if (charCode >= 97 && charCode <= 122) {
            System.out.println("소문자이군요");

        } else if(charCode>=48 && charCode<=57) {
            System.out.println("숫자이군요");
        } else {
            System.out.println("다른 문자이군요");
        }
    }

    /**
     * 연습문제 : 정수 1개가 주어진다. 2와 3의 배수이면 2 또는 3의 배수이군요
     *          아니면, 2 또는 3의 배수가 아니군요
     */
    public void exam10(){
        int value = 6;

        if((value % 2 == 0) || (value % 3 == 0)){
            System.out.println("2 또는 3의 배수이군요");
        } else {
            System.out.println("2 또는 3의 배수가 아니군요");
        }
    }

}

if문과 switch문

package chap04;

/**
 * packageName : chap04
 * fileName : Sec0401
 * author : GGG
 * date : 2023-09-19
 * description : 조건문
 * 요약 :
 *          if문 - if(조건문1){실행문1} else if(조건문2){실행문2} else{실행문3};
 *          => 조건문1 true 실행문1 실행되고 조건문2 true 실행문2 실행되고 모두 아니면 실행문3 실행
 *          switch문 - switch(변수) { case 값1: 실행문1;break; case 값2: 실행문2;break;
 *                                     default: 실행문3;break;
 *          }
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class Sec0401 {
    /**
     * 예제 1 : 초기값이 90이상이면 점수가 90보다 큽니다.
     *                          등급은 A입니다. 출력
     *                90이하이면 점수가 90보다 작습니다.
     *                         등급은 B입니다. 출력
     */
    public void exam01(){
        int score = 93;     // 초기값
        if(score >= 90){
            System.out.println("점수가 90보다 큽니다.");
            System.out.println("등급은 A입니다.");
        } else {
            System.out.println("점수가 90보다 작습니다.");
            System.out.println("등급은 B입니다.");
        }
    }

    /**
     * 자바 랜덤 함수 소개하는 예제
     * 랜덤 함수 : Math.random() : 0 ~ 1 사이의 숫자(실수)를 내보내기(retrun)
     * 1 ~ 10 까지의 정수를 뽑기
     * 가공 :
     *      1 <= x < 11 의 정수 뽑기로 변환
     *      1) 0.0 <= Math.random() < 1.0
     *      2) 0.0 * 10 <=  Math.random() * 10 < 1.0 * 10                       // 10 곱하기
     *      3) (int)0.0 * 10 <=  (int)Math.random() * 10 < (int)1.0 * 10        // 강제 형변환 : 실수 -> 정수
     *         => 0 <= (int)Math.random() * 10 < 10
     *      4) 0 + 1 <= (int)Math.random() * 10 + 1 < 10 + 1
     *        => 1 <= (int)Math.random() * 10 + 1 < 11
     */

    public void exam04(){
        // 예제 : 주사위를 던져서 나오는 숫자를 화면에 출력하세요
        // 단, 1 ~ 6 까지의 랜덤하게 나오는 것
        int num = (int)(Math.random() * 6) + 1;      // 1 ~ 10 => 1 ~ 6
//        조건문
        if(num == 1){
            System.out.println("1번");
        } else if(num == 2){
            System.out.println("2번");
        } else if(num == 3){
            System.out.println("3번");
        } else if(num == 4){
            System.out.println("4번");
        } else if(num == 5){
            System.out.println("5번");
        } else {
            System.out.println("6번");
        }
    }

    /**
     * switch 문을 이용해서 코딩하기
     * 예제 : 부장이면 "700만원" 출력, 과장이면 "500만원" 출력
     *       그외 "300만원" 출력
     */

    public void exam08(){
        String position = "과장";

        switch (position){
            case "부장":
                System.out.println("700만원");
                break;
            case "과장":
                System.out.println("500만원");
                break;
            default:
                System.out.println("300만원");
        }
    }
}

반복문 for

package chap04;

/**
 * packageName : chap04
 * fileName : Sec0402
 * author : GGG
 * date : 2023-09-19
 * description : 반복문
 * 요약 :
 *          for문 : for(초기화식; 조건식; 증감식) {반복문;}
 *          => 조건식이 true 일때만 반복문이 실행됨
 *          while문 : 초기화식;
 *                    while(조건식) {
 *                        반복문;
 *                        증감식;
 *                    }
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class Sec0402 {

    /**
     * 예제1 : 1 ~ 10까지 숫자를 화면에 출력하세요
     */
    public void exam01() {
        // fori : for문 단축키
        for (int i = 1; i < 11; i++) {
            System.out.println(i);
        }
    }

    /**
     * 예제2 : 1 ~ 100 까지의 합
     */

    public void exam02() {
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        System.out.println("1~100 까지의 합 : " + sum);
    }

    /**
     * 예제 : 주사위 2 : 주사위를 던져서 나오는 숫자를 계속 화면에 출력하되 6이 나오면 반복문을 중단하고 빠져나오세요
     * 단, 빠져 나올때 프로그램 종료 라고 출력하세요
     */
    public void exam08() {

        while (true) {
            int num = (int) (Math.random() * 6) + 1;
            System.out.println(num);
            if (num == 6) {
                break;
            }
        }
        System.out.println("프로그램 종료");
    }

    /**
     * 예제 : 1 ~ 10 사이의 수 중에서 짝수만 출력하는 코드 : continue
     */
    public void exam09() {
        for (int i = 1; i <= 10; i++) {
            if (i % 2 != 0) continue;
            System.out.println(i);
        }
    }

    /**
     * (참고) 새로나온 사용법 : 반복문의 라벨
     * 활용 : 중첩 for문에서 주로 사용
     */
    public void exam10() {
        Outter:
        for (char upper = 'A'; upper <= 'Z'; upper++) {
            for (char lower = 'a'; lower <= 'z'; lower++) {
                System.out.println(upper + "-" +lower);      // 화면 출력
//                g 가 나오면(안쪽/바깥쪽 모두) 반복문 중단
                if(lower == 'g'){
                    break Outter;       // 이중 중첩 반복문 탈출
                }
            }
        }
        System.out.println("프로그램 종료");
    }
}

참조자료형과 참조변수

package chap05;

/**
 * packageName : chap05
 * fileName : Sec0501
 * author : GGG
 * date : 2023-09-19
 * description : 참조 자료형과 참조 변수
 * 요약 :
 *          기본 자료형 : int(4), long(8), float(4), double, boolean 자료형
 *          => 스택 메모리 영역에 그대로 저장됨
 *          참조 자료형 : String(문자열), 배열, 객체
 *          => 힙 메모리 영역에 값이 저장되고 , 스택 메모리 영역에 주소값이 저장됨
 *          JVM(Java Virtual Machine) : 자바 가상 머신 : jdk(자바가상머신)
 *          역할 : linux / windows(운영체제) 모든 곳에서 실행할 수 있게 만드는 프로그램
 *          비교연산자(==) : 기본자료형에서는 값을 비교하고,
 *                         참조자료형에서는 주소값을 비교하게 됨
 *                         (스택 메모리 영역의 저장된 값을 비교함)
 *          null 포인트 에러(예외) : 프로그램을 강제 비정상 중단함
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class Sec0501 {
    /**
     * 비교연산자(==) 와 equals 함수 예제
     */
    public void stringEqualExam(){
//        참조 자료형
//        참조자료형 객체변수 = new 생성자함수();
//        메모리에 랜덤한 주소(방번호)값으로 생성됨
        String strVar1 = new String("신민철");
        String strVar2 = new String("신민철");

//        주소값(방번호)비교 : 개발자 입장에서는 의미 없음
        if(strVar1 == strVar2){
            System.out.println("두개의 주소가 같음");
        } else {
            System.out.println("두개의 주소가 다름");
        }
        
//        equals() 함수 사용 : 값을 비교하는 함수
        if(strVar1.equals(strVar2) == true){
            System.out.println("두개의 값이 같음");
        } else {
            System.out.println("두개의 값이 다름");
        }

//        null 포인터 예외(에러)
//        배열에서 null 에러
        int[] intArray = null;  // 없음(공간 없음)
        intArray[0] = 10;   // 0번지 방에 10번을 넣으니 null 에러가 발생

//        객체에서 null 에러
        String str = null;      // 권장코딩 : String str = "";  빈 문자열로 초기화
//        문자열의 길이를 가져오는 함수 : 문자열.length()
        System.out.println("총 문자 수는 : " + str.length());    // null 에러 발생
    }
}

배열

package chap05;

import java.util.Arrays;

/**
 * packageName : chap05
 * fileName : Sec0502
 * author : GGG
 * date : 2023-09-19
 * description : 배열
 * 요약 :
 *       배열 : 같은 자료형의 데이터를 연속된 공간에 나열하고 인덱스를 부여해 놓은 자료구조
 *       인덱스 : 배열 항목에 붙인 번호 , 0 ~ n 까지의 범위
 *       배열 선언(정의) : 자료형[] 변수;
 *       배열 생성 : 1) 자료형[] 변수 = {값1, ..., 값n};
 *                 2) 자료형[] 변수 = new 자료형[길이];
 *                 3) 자료형[] 변수 = new 자료형[길이] {값1, ... , 값n};
 *       배열 길이 : 배열의 값의 개수, 배열변수.lenght (읽기전용)
 *       다차원 배열 : 배열 안에 또 다른 배열이 있음
 *              자료형[][] 변수 = new 자료형[크기][크기];
 *              자료형[][] 변수 = {{값1...},{값1...}};
 *              => for문 코딩 (2개사용)
 *              => int[][] arr = {{1,2,3}, {4,5,6}}
 *              => 팁 ! : for(int i = 1; i<=2; i++){
 *                          for(int j = 1; j <=3; j++){
 *                       }
 *                      }
 *       향상된 for 문 : for(자료형 변수 : 배열) {} => 자동으로 인덱스 증가
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class Sec0502 {
    /**
     * 예제 : 학생 10명의 성적을 저장하고 평균값 구하기
     */
    public void getStudent(){
//        배열의 초기값
        int[] score = {83, 84, 85, 86, 87, 88, 89, 90, 91, 92};
        int sum = 0;    // 합계 변수
        for (int i = 0; i < score.length ; i++) {
            sum += score[i];        // 배열의 값 모두 더하기(누적합)
        }
//        평균구하기
        double avg = (double)sum / 10; // 평균
        System.out.println("sum = " + sum + " , avg = " + avg);
    }

    /**
     * 예제 2 : 배열에서 함수의 매개변수로 전달시 주의점
     */

    public void arrayFunc(){

        int[] scores = {84, 91, 88};

        int sum2 = add(scores);     // ok 가능
//        이렇게 하면 안됨
//        int sum3 = add({84, 91, 88});   // 에러 발생
//        참고)
        int sum4 = add(new int[]{84, 91, 88});  // 가능

        System.out.println(sum2);
        System.out.println(sum4);
    }


    // 더하기 함수 생성해서 호출해서 쓰기
    public int add(int[] scores) {
        int sum = 0;
        for (int i = 0; i < 3; i++) {
            sum += scores[i];
        }
        return sum;
    }

    /**
     * 배열의 2번째 정의 방법
     */

    public void arrayTwo(){
        int[] arr1 = new int[3];    // 배열의 정의(선언) : 빈방을 만들기(메모리에)
//        정수 : 기본값(0), 문자열 : null, 실수 : 0.0 등
//        배열의 3가지 방에 값넣기
        arr1[0] = 10;
        arr1[1] = 20;
        arr1[2] = 30;
//        배열 출력
        for (int i = 0; i < 3; i++) {
            System.out.println(arr1[i]);    // 배열 값 출력
        }

//        TODO: 배열의 안에 값을 간단히 확인하기
//        참고
//        사용법 : Arrays.toString(배열변수)
        System.out.println(Arrays.toString(arr1));
    }

    /**
     * 얇은 복사(shallow copy) vs 깊은 복사(depp copy)
     */
    public void copyArray(){
//        TODO: 얇은 복사
        int[] oldArray = {1, 2, 3};
        int[] copyArray = oldArray;     // 얇은 복사(주소값)을 복사
        int[] newArray = new int[3];    // 깊은 복사용 변수
//        스택방         |                        힙
//        oldArray      | 100       <------>    100 : {1, 2, 3}
//        copyArray     | 100
//        TODO : 얇은 복사 특징 : oldArray 값을 변경하면 copyArray 값도 같이 변경됨
//             : copyArray 값을 변경해도 원본인 oldArray 도 변경됨

//        위의 현상을 피하고자 깊은 복사를 함
//        TODO : 깊은 복사 : 반복문 이용
        for (int i = 0; i < newArray.length ; i++) {
            newArray[i] = oldArray[i];      // 깊은 복사(원본값 바뀌어도 복사본이 바뀌지 않음)
        }


    }

    /**
     * 향상된 for문 : for(자료형 변수 : 배열) {반복문};
     * 아래 점수 총합을 출력하세요
     */
    public void AdvancedExam(){
        int[] scores = {95, 71, 84};        // 국영수 점수 배열
        int sum = 0;
        for (int s : scores) {
            sum += s;
        }
        double avg = (double)sum / scores.length;
        System.out.println("점수의 총합 : " + sum + ", 점수의 평균 : " + avg);

    }
}

열거형

package chap05;

import java.util.Calendar;

/**
 * packageName : chap05
 * fileName : Sec0503
 * author : GGG
 * date : 2023-09-19
 * description :    열거형 사용
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class Sec0503 {
    /**
     * 열거형 사용 예제
     */
    public void EnumWeek(){
        Week today = null;
//        달력 객체 : Calendar
        Calendar calendar = Calendar.getInstance(); // 객체 가져오기
        int week = calendar.get(Calendar.DAY_OF_WEEK);  // 현재 요일(1 ~ 7 숫자)
//        조건식
        switch (week){
            case 1:
                today = Week.SUNDAY; break;
            case 2:
                today = Week.MONDAY; break;
            case 3:
                today = Week.TUESDAY; break;
            case 4:
                today = Week.WEDNESDAY; break;
            case 5:
                today = Week.THURSDAY; break;
            case 6:
                today = Week.FRIDAY; break;
            case 7:
                today = Week.SATURDAY; break;
        }
        System.out.println("오늘 요일 :" + today);
    }
}
package chap05;

/**
 * packageName : chap05
 * fileName : Week
 * author : GGG
 * date : 2023-09-19
 * description : 열거형 클래스
 * 요약 :
 *      열거 자료형 : 몇 가지로 제한된 상수를 가지는 자료형
 *      사용법(정의) : enum 변수명 { 상수1, 상수2, ... 상수n }
 *      클래스 내에서 사용
 *          변수명.상수명 ex) Week.MONDAY
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public enum Week {
    //    월,화,수,목,금,토,일 정의(상수)
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}
package chap05;

import java.util.Arrays;

/**
 * packageName : chap05
 * fileName : Verify05
 * author : GGG
 * date : 2023-09-19
 * description :   배열 / 열거형 연습문제
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-19         GGG          최초 생성
 */
public class Verify05 {
    /**
     * 주어진 배열에서 최대값을 구해보세요
     */
    public void exam04() {
        int[] array = {1, 5, 3, 8, 2};
        int max = array[0];
        for (int i = 0; i < array.length; i++) {
            if (max < array[i]) {
                max = array[i];
            }
        }
        System.out.println(max);
    }

    /**
     * 2) 중첩 for문을 이용해서 주어진 배열의 전체 항목의 합과 평균을 구해보세요.
     */
    public void exam05() {
        int[][] array = { { 95, 86 }, { 83, 92, 96 }, { 78, 83, 93, 87, 88 } };

        int sum = 0;
        int count = 0;

        for(int i = 0; i < array.length; i++){
            for(int j = 0; j < array[i].length; j++){
                sum += array[i][j];
                count += 1;
            }
        }
        double avg = (double) sum / count;



        System.out.println(sum);
        System.out.println(avg);
    }

}
반응형

'Java > Java 이론' 카테고리의 다른 글

생성자 함수  (0) 2023.09.20
클래스  (0) 2023.09.20
문자열 자료형  (1) 2023.09.08
[JAVA] 참조변수의 형변환  (0) 2023.08.11
[JAVA] 인터페이스(interface)  (0) 2023.08.11
반응형

procedure

-- 19_Procedure
-- pl/sql : 프로시저/펑션, DB 프로그래밍 분야(SQL 숙련자들)
-- 난이도가 높음
-- 소스 : Oracle DB에 저장됨
-- 장점 : 1) 성능향상
-- 자바/JS 처럼 코딩하는 것을 말함
-- 코딩 특징 : 1) 제어문 (조건문/반복문), 변수/상수
-- 예제1) 
-- 화면 출력 모드 변경 : ON (출력 켜기)
SET SERVEROUTPUT ON;
-- 입력 : 대화상자 입력값이 변수명에 입력됨
-- 사용법 ) ACCEPT 변수명 prompt '문자열'
-- p_변수명 : 입력용 변수
-- v_변수명 : 단순 변수
ACCEPT p_num1 prompt '첫번째 숫자를 입력하세요'
ACCEPT p_num2 prompt '두번째 숫자를 입력하세요'

-- 1) 선언부 : DECLARE
DECLARE
-- 변수초기화, 변수 정의 : 숫자(NUMBER), 문자(VARCHAR2), 날짜(DATE) [자료형]
    v_sum NUMBER(10);
BEGIN
-- 2) 실행부 : BEGIN
-- 프로시저 코딩 : 업무 코딩(비지니스 로직 코딩 : 실무용어)
-- 사용법) 입력값(p_num) 변수 : &변수명 사용
--        대입연산자 - :=
--        v_sum      : 선언부에서 정의한 변수
    v_sum := &p_num1 + &p_num2; -- 입력값 2개를 더하기
    
-- 문자열 붙이기 : 문자열 || 문자열2 ...
    dbms_output.put_line('총합은 : ' || v_sum); -- 화면에 1줄씩 출력하는 함수
END;
/

결과 =======================
신규:DECLARE
    v_sum NUMBER(10);
BEGIN
    v_sum := 10 + 20;

    dbms_output.put_line('총합은 : ' || v_sum);
END;
총합은 : 30


PL/SQL 프로시저가 성공적으로 완료되었습니다.
=======================


-- 예제 2) 입력받은 사원번호에 해당하는 월급 출력하기 : EMPLOYEE
-- 입력값 : 7788 (SCOTT)
ACCEPT p_empno prompt '사원번호를 입력하세요'

-- 프로시저 코딩
DECLARE
    -- 1) 선언부 : 변수 정의
    v_sal NUMBER(10); -- 10자리 숫자
BEGIN
    -- 2) 실행부
    -- 사용법) SELECT 컬럼명 INTO 변수명 FROM 테이블명 : 컬럼의 값이 변수에 저장됨
    SELECT SALARY INTO v_sal
    FROM EMPLOYEE
    WHERE ENO = &p_empno;
    
    -- 3) 결과 출력 : v_sal
    dbms_output.put_line('해당 사원의 월급은 : ' || v_sal);
END;
/

=== 결과
해당 사원의 월급은 : 3000
===

-- 예제 3) 조건문 : IF/ELSIF/ELSE/END IF
-- 입력값 변수 : p_num
ACCEPT p_num PROMPT '숫자를 입력하세요.'
-- DECLARE(선언부) 생략 : 변수 정의할것이 없으면 생략가능
BEGIN
-- 실행부
-- 사용법) IF 조건식 THEN
--           실행문;
--        ELSE
--           실행문2;
--        END IF
-- MOD(값, 나눌값) : 나머지 연산하는 함수
-- 비교연산자 : =
    IF MOD(&p_num, 2) = 0 THEN
        DBMS_OUTPUT.PUT_LINE('짝수입니다.'); -- 화면출력
    ELSE 
        DBMS_OUTPUT.PUT_LINE('홀수입니다.');
    END IF;
END;
/

-- 예제 4) 조건문 계속 : IF/ELSIF/ELSE/END IF;
--   사원테이블에 사원명을 입력받아 급여가 3000 이상이면 고소득자입니다. 출력
--                                   2000 이상이면 중간 소득자입니다. 출력
--                                   모두 아니면 저소득자입니다. 출력
-- 입력값 변수 : p_ename
ACCEPT p_ename PROMPT '사원 이름를 입력하세요.'
-- 선언부(정의부)
DECLARE
    -- 변수 2개 : 
    -- 대문자 변환 함수 : UPPER(문자열)
    -- 대상 테이블의 컬럼의 자료형을 참조해서 변수의 자료형으로 정의함
    -- 사용법) 변수명 테이블명.컬럼명%TYPE
    v_ename EMPLOYEE.ENAME%TYPE := UPPER('&p_ename');
    v_sal   EMPLOYEE.SALARY%TYPE;
-- 실행부
BEGIN
    -- 사원명을 입력받아 조회하는 SQL문 : 결과는 v_sal 변수에 저장
    SELECT SALARY INTO v_sal
    FROM EMPLOYEE
    WHERE ENAME = v_ename;
    
    -- 조건문
    IF v_sal >= 3000 THEN
        DBMS_OUTPUT.PUT_LINE('고소득자입니다.');
    ELSIF v_sal >= 2000 THEN
        DBMS_OUTPUT.PUT_LINE('중간 소득자입니다.');
    ELSE
        DBMS_OUTPUT.PUT_LINE('저소득자입니다.');
    END IF;
END;
/

-- 예제 5) 반복문 : 커서
-- 입력값 변수 : p_dno
ACCEPT p_dno PROMPT '부서번호를 입력하세요.'
-- 선언부(정의부)
DECLARE
    -- 커서(2차원배열) : 여러 데이터를 가지고 있는 SELECT 조회문
    -- 커서 정의하는 부분
    -- 사용법)
--           CURSOR 커서변수명 IS
--           SELECT 컬럼명, 컬럼명2, 컬럼명2, ...
--           FROM 테이블명
--           WHERE 조건절;
    CURSOR emp_cursor IS
        SELECT ENAME, SALARY, DNO
        FROM EMPLOYEE
        WHERE DNO = &p_dno;
-- 실행부
BEGIN
    -- FOR문(반복문) == 자바/JS 향상된 FOR문과 비슷
    -- 증감식 없고, 데이터의 끝에 도달하면 반복문 종료
    -- 사용법) FOR 변수명(객체) IN 커서변수명(배열) LOOP
    --              반복문(변수명.컬럼명);
    --        END LOOP;
    FOR emp_record IN emp_cursor LOOP
        -- 차례로 화면에 출력하기
        DBMS_OUTPUT.PUT_LINE(emp_record.ename || ' ' || emp_record.salary
                            || ' ' || emp_record.dno);
    END LOOP;
END;
/

-- (참고) 실무에서 사용하는 이름있는 프로시저 형태
-- 사용법) 
--          CREATE OR REPLACE PROCEDURE 프로시저명
--              (매개변수 in 자료형
--               내보내기변수 out 자료형  -- js return 값과 비슷
--               )
--          IS
--              선언부(정의부)
--          BEGIN
--              실행문;
--          END;
--          /
-- 프로시저 정의 : DB에 소스가 저장됨
CREATE OR REPLACE PROCEDURE pro_ename_sal
(p_ename in employee.ename%type)
IS
-- 선언부
    v_sal employee.salary%type; -- 사원테이블의 급여 자료형을 참조
-- 실행부
BEGIN
    -- 사원명을 받아서 급여 조회 sql
    SELECT SALARY INTO v_sal
    FROM EMPLOYEE
    WHERE ENAME = p_ename;
    -- 화면 출력
    DBMS_OUTPUT.PUT_LINE(v_sal || ' 입니다.');
END;
/
-- 프로시저 실행 (2가지)
-- 사용법) CALL 프로시저명(입력값);
--        EXEC 프로시저명(입력값);
CALL pro_ename_sal('SCOTT');
EXEC pro_ename_sal('SCOTT');

-- 예제 7) 평션 만들기
-- 예제) 부서번호를 매개변수로 받아서 위치를 출력하는 함수 정의
-- 함수(FUNCTION) 특징 : 무조건 RETURN 값이 있음(결과 내보내기가 있음)
-- 사용법)
--          CREATE OR REPLACE FUNCTION 펑션이름
--          (매개변수 in 자료형)
--          RETURN department.loc%type
--          IS
--              선언부(정의)
--          BEGIN
--              실행문;
--              RETURN 결과변수;
--          END;
--          /
CREATE OR REPLACE FUNCTION fn_ename_sal
(p_dno in department.dno%type)
RETURN department.loc%type
IS
-- 선언부
   v_loc department.loc%type; -- 부서테이블의 위치 자료형 참조
-- 실행부
BEGIN
--  부서번호를 매개변수로 받아 위치를 조회하는 SQL문
    SELECT LOC INTO v_loc
    FROM DEPARTMENT
    WHERE DNO = p_dno;
    
    RETURN v_loc;
END;
/

-- 함수 실행 : SELECT 문으로 조회
SELECT fn_ename_sal(10) FROM DUAL;
반응형

'SQL > SQL_이론' 카테고리의 다른 글

SELECT 문  (0) 2024.06.25
WHERE 절  (0) 2024.06.25
VIEW  (0) 2023.09.15
SYSTEM_ROLE  (0) 2023.09.14
시퀀스와 인덱스  (0) 2023.09.14
반응형

VIEW

-- 18_View
-- 뷰(View) : 하나 이상의 테이블이나 다른 뷰를 이용해서 생성하는 가상의 테이블
-- 활용) 1) 보안을 유지하기 위해 사용함 : 사원테이블 - 급여컬럼(비밀로 유지 : 대외비)
--      2) SQL 문을 미리 만들어 놓고 재활용 : 코딩 생산성 향상

VIEW 생성

-- 예제1) 부서테이블과(DEPARTMENT) 사원테이블을(EMPLOYEE) 
--        조인한 결과를 뷰로 만들어서 출력하세요
--  뷰이름 : VW_EMP_COMPLEX
-- 열명은 중복이 안되게 지정

-- 조인
SELECT EMP.*, DEP.DNAME, DEP.LOC
FROM EMPLOYEE EMP, DEPARTMENT DEP
WHERE EMP.DNO = DEP.DNO;

-- 뷰 생성
CREATE OR REPLACE VIEW VM_EMP_COMPLEX
AS
SELECT EMP.*, DEP.DNAME, DEP.LOC
FROM EMPLOYEE EMP, DEPARTMENT DEP
WHERE EMP.DNO = DEP.DNO;

-- 뷰 사용
SELECT * FROM VM_EMP_COMPLEX;

-- 뷰 정보 확인 : 데이터사전(시스템테이블:관리용(미리생성되어 있음) : USER_VIEWS
SELECT * FROM USER_VIEWS;

-- 뷰에 INSERT 가능한가? => 가능
-- 예제 2) VW_EMP_JOB 에 INSERT 하기
-- 뷰 컬럼 :  사번, 사원이름, 부서번호, 담당업무
INSERT INTO VW_EMP_JOB
VALUES(8000, '윤정화', 30, 'SALESMAN');
COMMIT;
SELECT * FROM VW_EMP_JOB;

-- 예제3) 뷰에 그룹함수 써서 만들기
-- 그룹함수 : SUM, AVG, COUNT, MAX, MIN 등
-- 부서별(DNO) 급여합계(SUM(SALARY)), 급여평균(AVG(SALARY))을 
-- 출력하는 SQL문을 뷰로 만드세요
-- 출력 : DNO, SUM(SALARY), AVG(SALARY)
-- 뷰이름 : VW_EMP_SALARY
-- 대상테이블 : EMPLOYEE
-- 힌트 : 컬럼에 별칭을 부여하세요.
--      급여합계 : SAL_SUM
--      급여평균 : SAL_AVG
-- 뷰 생성시 그룹함수는 별명이 필요함
CREATE OR REPLACE VIEW VW_EMP_SALARY
AS
SELECT DNO, SUM(SALARY) AS SAL_SUM, ROUND(AVG(SALARY), 1) AS SAL_AVG
FROM EMPLOYEE
GROUP BY DNO;

SELECT * FROM VW_EMP_SALARY;


-- 그룹함수로 만든 뷰에 INSERT? 불가!
-- 뷰 컬럼 : DNO, SAL_SUM, SAL_AVG
INSERT INTO VW_EMP_SALARY
VALUES(30, 1000, 3000);     -- 에러발생

-- 뷰 삭제(DROP ~)
DROP VIEW VW_EMP_SALARY;

참고사항

-- (참고) 뷰 INSERT 기본 가능(그룹함수가 없을 때)
-- 뷰에 INSERT 기능 제한 : 옵션 추가 => WITH READ ONLY
-- 예제 4) WITH READ ONLY 옵션을 붙여서 뷰 만들기
-- SQL : 직위가 MANAGER 인 사원을 출력하는 뷰 만들기
CREATE OR REPLACE VIEW VW_EMP_JOB_READONLY
AS
SELECT ENO, ENAME, DNO, JOB
FROM EMPLOYEE
WHERE JOB LIKE '%MANAGER%' WITH READ ONLY;

SELECT * FROM VW_EMP_JOB_READONLY;
-- INSERT 테스트
INSERT INTO VW_EMP_JOB_READONLY
VALUES(9000, '김주현', 30, 'MANAGER');

// 오류발생
SQL 오류: ORA-42399: 읽기 전용 뷰에서는 DML 작업을 수행할 수 없습니다.
42399.0000 - "cannot perform a DML operation on a read-only view"

연습문제

-- 19_View_Exam
-- 뷰 연습문제

--— 1) 20번 부서에(DNO) 소속된 사원의 사원번호와(ENO) 
--     이름과(ENAME) 부서번호를(DNO) 출력하는 
--—    VIEW를 정의하시오.(VW_EMP_DNO)
--    대상테이블 : EMPLOYEE
-- 뷰 : SQL 문을 특정 이름으로 정해놓은 가상 테이블
CREATE OR REPLACE VIEW VW_EMP_DNO
AS
SELECT ENO, ENAME, DNO
FROM EMPLOYEE
WHERE DNO = 20;

SELECT * FROM VW_EMP_DNO;

--— 2) 이미 생성되어 있는 상기 뷰에(1번뷰) 대해 급여(SALARY) 
--     역시 출력하도록 수정해서 재생성하세요
-- (VW_EMP_DNO)
--    대상테이블 : EMPLOYEE

CREATE OR REPLACE VIEW VW_EMP_DNO
AS
SELECT ENO, ENAME, DNO, SALARY
FROM EMPLOYEE
WHERE DNO = 20;

SELECT * FROM VW_EMP_DNO;

--— 3) 생성된 뷰를 제거하세요(VW_EMP_DNO)

DROP VIEW VW_EMP_DNO;
반응형

'SQL > SQL_이론' 카테고리의 다른 글

WHERE 절  (0) 2024.06.25
프로시저  (0) 2023.09.15
SYSTEM_ROLE  (0) 2023.09.14
시퀀스와 인덱스  (0) 2023.09.14
TABLE_CONSTRAINT  (0) 2023.09.14
반응형

SYSTEM 계정으로 변경

SYSTEM 계정이 없는 경우

 

-- 16_System_Role
-- 유저만들기(계정생성), 권한주기
-- 1) 유저만들기
-- Oracle DB 생성 : 기본관리자 => SYSYEM 계정(SYS(최고관리자) 등)
-- 예제 1) USERTEST01 유저를 만들고 암호를 pass1 라고 지정하세요.
-- 사용법) CREATE USER 계정명 IDENTIFIED BY 암호;
CREATE USER USERTEST01 IDENTIFIED BY pass1; -- User USERTEST01이(가) 생성되었습니다.

-- 예제 2) 위에서 만든 USERTEST01 유저에 접속 권한을 부여하기
-- 사용법) GRANT CREATE SESSION TO 계정명;
GRANT CREATE SESSION TO USERTEST01; -- Grant을(를) 성공했습니다.

-- 테이블 생성 권한 부여하기
-- 사용법) GRANT CREATE TABLE TO 계정명;
GRANT CREATE TABLE TO USERTEST01; -- Grant을(를) 성공했습니다.

-- 공간에 대한 권한 부여하기(무한) : 테이블(논리공간) -> 물리공간 배정(할당)
-- 사용법) GRANT UNLIMITED TABLESPACE TO 계정명;
GRANT UNLIMITED TABLESPACE TO USERTEST01; -- Grant을(를) 성공했습니다.

 

ROLE

-- 예제 3) 권한들의 집합 == ROLE(롤)
-- 접속 권한들의 모임 == CONNECT 롤
-- 테이블, 인덱스, 함수 등을 사용하는 권한 모임 == RESOURCE 롤
-- VIEW 생성권한이 없음
GRANT CONNECT, RESOURCE, CREATE VIEW TO USERTEST01;
-- 유저 삭제(DROP ~)
-- 사용법) DROP USER 유저명;
DROP USER USERTEST01;

 

계정 테스트

테스트시 상태 : 성공이 나오면 됨!

 

동의어(SYNONYM)

-- 2) 동의어(SYNONYM)
-- 다른 데이터베이스나 다른 계정의 테이블, 인덱스 등의 별명을 붙이는것
-- 예제)
-- 샘플테이블(SYSTEM 계정) : SAMPLETBL
-- 컬럼 : MEMO VARCHAR2(50)
CREATE TABLE SAMPLETBL(
        MEMO VARCHAR2(50)
);

-- 데이터 2건 생성
INSERT INTO SAMPLETBL VALUES('오월은 푸르구나');
INSERT INTO SAMPLETBL VALUES('최선을 다합시다');
COMMIT;
SELECT * FROM SAMPLETBL;

-- SYSTEM 계정의 테이블 -> 권한 부여 : SELECT (조회권한)
-- SELECT 권한 주기
-- 사용법) GRANT SELECT ON 테이블명 TO 계정명;
GRANT SELECT ON SAMPLETBL TO SCOTT;

-- 동의어 생성 권한 : SCOTT
-- 사용법) GRANT CREATE SYNONYM TO 계정명;
GRANT CREATE SYNONYM TO SCOTT;
-----------------------------------------------------------------------------
-- 동의어 실습
-----------------------------------------------------------------------------
-- SCOTT 계정으로 접속
-- SAMPLETBL : SYSTEM 계정이 소유하고 있는 테이블
-- 사용법) SELECT * FROM 계정명.테이블명;
SELECT * FROM SAMPLETBL; -- 에러발생
SELECT * FROM SYSTEM.SAMPLETBL;
-- 위의 경우와 같이 다른 유저의 테이블 조회시 테이블명이 길어짐
-- 동의어(테이블별명) 생성
-- 사용법) CREATE SYNOYM 테이블별명 FOR 계정명.테이블명;
CREATE SYNONYM SAMPLETBL FOR SYSTEM.SAMPLETBL;
-- 조회
SELECT * FROM SAMPLETBL; -- 동의어로 조회됨

-- 동의어 삭제(DROP ~)
DROP SYNONYM SAMPLETBL;

 

반응형

'SQL > SQL_이론' 카테고리의 다른 글

프로시저  (0) 2023.09.15
VIEW  (0) 2023.09.15
시퀀스와 인덱스  (0) 2023.09.14
TABLE_CONSTRAINT  (0) 2023.09.14
TABLE_ALTER  (0) 2023.09.14
반응형

시퀀스

-- 14_Sequence_Index
-- 1. 시퀀스(Sequence) : 호출(실행)할때마다 자동적으로 숫자를 증가시키는것(객체)
-- 목적) 기본키 용도로 사용(중복이 없음, null 없음)
-- 활용 예) 자유게시판 : NO(1 ~ n), 고객: 고객No(1 ~ n)
-- 실무용어 => 채번 : 자동적으로 1씩 증가시키는 값(1 ~ n : 시퀀스 대상)
-- 예제 1) SAMPLE_SEQ 시퀀스를 1부터 시작해서 10씩 증가시키는 시퀀스를 만드세요

-- 사용법 )
--          CREATE SEQUENCE 시퀀스명
--          INCREMENT BY    증가값
--          START WITH      시작값
--          MINVALUE        최소값
--          MAXVALUE        최대값

CREATE SEQUENCE SAMPLE_SEQ
INCREMENT BY 10
START WITH 1;

-- 사용법) 
-- 1) 시퀀스명.NEXTVAL : 시퀀스가 증가함
SELECT SAMPLE_SEQ.NEXTVAL FROM DUAL;

-- 현재 증가된 시퀀스의 값을 확인 : 최초 1번은 시퀀스명.NEXTVAL 실행 후 확인가능
-- 사용법)
-- SAMPLE_SEQ.CURRVAL
SELECT SAMPLE_SEQ.CURRVAL FROM DUAL;

-- 시스템 테이블들 : 시퀀스 확인용 테이블(뷰) : 데이터사전(DICTIONARY VIEW)
SELECT SEQUENCE_NAME
        ,MIN_VALUE
        ,MAX_VALUE
        ,INCREMENT_BY
FROM USER_SEQUENCES;

-- 예제 2) 임시테이블에 시퀀스 INSERT 하기
-- 임시테이블(구조만 복사): 부서(DEPARTMENT) -> (복사) DEPT_TEMP
CREATE TABLE DEPT_TEMP
AS
SELECT * FROM DEPARTMENT
WHERE 1=2;
-- 조회
SELECT * FROM DEPT_TEMP;
-- 시퀀스 INSERT : 대상 컬럼 : 시퀀스명.NEXTVAL (DNO: 부서번호)

-- 시퀀스 삭제
-- 사용법 ) DROP SEQUENCE 시퀀스명
DROP SEQUENCE SAMPLE_SEQ;

-- 시퀀스 생성
CREATE SEQUENCE SAMPLE_SEQ
INCREMENT BY 10
START WITH 1; -- 생성(10씩 증가)

-- INSERT 문 정의
INSERT INTO DEPT_TEMP
VALUES(SAMPLE_SEQ.NEXTVAL, 'ACCOUNTING', 'NEW YORK');

SELECT * FROM DEPT_TEMP;

-- 영구반영
COMMIT;

 

인덱스

-- 2. 인덱스( INDEX )
-- 사용) 컬럼에 인덱스를 지정하여 사용함
-- 목적) 조회속도 향상을 위해 조건에 해당하는 컬럼에 인덱스를 생성(지정)함
-- 기본키(PK) : 중복방지 + NULL값 방지 + 자동인덱스 생성

-- 예제3) 사이트에서 조회시 이름검색(ENAME)이 많은데, 속도가 느리다고 한다. (EMPLOYEE)
-- 해결) ENAME 컬럼에 인덱스 생성 -> 조회속도 향상
-- 명명법) IX_테이블명_컬럼명, IDX_테이블명_컬럼명 
-- 사용법) CREATE INDEX 인덱스이름 ON 테이블명(컬럼명);
CREATE INDEX IX_EMPLOYEE_ENAME ON EMPLOYEE(ENAME);

-- 속도 느린 대상 SQL문
SELECT * FROM EMPLOYEE
WHERE ENAME LIKE 'SCOTT%'; -- 이 부분이 INDEX 를 만들 곳

-- 데이터 사전 : USER_IND_COLUMNS 뷰에서 확인
SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME
FROM USER_IND_COLUMNS
WHERE TABLE_NAME IN ('EMPLOYEE','DEPARTMENT');

툴에서 확인가능

-- 인덱스 삭제하기(DROP ~)
-- 사용법) DROP INDEX 인덱스명;
DROP INDEX IX_EMPLOYEE_ENAME;

-- *인덱스를 만들어야 하는 기준
-- 1) 테이블의 행의 개수가 많을 경우(데이터 건수가 많을경우)
--    : 10만건 이상
-- 2) WHERE(조건절)에 해당 컬림이 많이 등장할 경우
-- 3) 테이블 조인의 공통컬럼으로 사용될 경우

 

-- 특수 인덱스
-- 1) 결합 인덱스 : 컬럼 여러개를 묶어서 한번에 인덱스로 지정
-- 예) 아래 쿼리문 조회속도가 느릴 때
SELECT * FROM DEPARTMENT
WHERE DNAME = 'SALES'
AND   LOC   = 'NEW YORK';

-- 결합 인덱스 만들기
-- 사용법) CREATE INDEX 인덱스명 ON 테이블명(컬럼1, 컬럼2, ...);
CREATE INDEX IX_DEPT_COM ON DEPARTMENT(DNAME, LOC);

-- 2) 함수 인덱스 : 함수에 인덱스 걸기
SELECT * FROM EMPLOYEE
WHERE SALARY = SALARY * 12;
-- 함수 인덱스(수식인덱스)
-- 사용법) CREATE INDEX 인덱스명 ON 테이블명(수식);
CREATE INDEX IX_EMP_ANNSAL ON EMPLOYEE(SALARY * 12);

 

반응형

'SQL > SQL_이론' 카테고리의 다른 글

VIEW  (0) 2023.09.15
SYSTEM_ROLE  (0) 2023.09.14
TABLE_CONSTRAINT  (0) 2023.09.14
TABLE_ALTER  (0) 2023.09.14
TABLE_CUD  (0) 2023.09.14
반응형

✔ 테이블 제약조건

테이블에 입력될 값을 제한하는 것 제약조건은 컬럼별로 각각 지정할 수 있음

UNIQUE 제약조건 유일한 값만 입력될 수 있음(데이터 중복 금지), NULL 값은 허용
CREATE TABLE 테이블명(컬럼명 자료형(크기) 제약조건이름);

 

-- 1) UNIQUE 제약조건 : 유일한 값만 입력될 수 있음(데이터 중복 금지), NULL 값은 허용
-- 추가) NOT NULL 제약조건(*) : NULL 값이 입력될 수 없음
-- 예제 1) CUSTOMER 테이블을 정의하고 ID 컬럼에 UNIQUE 제약조건을 지정하세요
-- (ID          VARCHAR2(20) --> UNIQUE 제약조건 지정
-- (PWD         VARCHAR2(20)
-- (NAME        VARCHAR2(20)
-- (PHONE       VARCHAR2(30)
-- (ADDRESS     VARCHAR2(1000)

CREATE TABLE CUSTOMER(
    ID          VARCHAR2(20) UNIQUE,
    PWD         VARCHAR2(20) NOT NULL,
    NAME        VARCHAR2(20) NOT NULL,
    PHONE       VARCHAR2(30),
    ADDRESS     VARCHAR2(1000)
);

 

✔ 기본키 제약조건

CREATE TABLE 테이블명(컬럼명 자료형(크기), CONSTRAINT 제약조건이름 PRIMARY KEY (컬럼명));
-- 기본키의 특징 : 유일한 값만 입력되고(중복방지) + NOT NULL 제약조건포함 + (참고 : INDEX 자동생성)
-- 특징) 주로 테이블 설계시 1개의 테이블당 거의 1개는 기본키가 존재함
-- 기본키 제약조건에 이름을 부여 : CONSTRAINT 제약조건이름 제약조건
-- 제약조건이름 붙이기 약속(명명법) : PK_테이블명_컬럼명
-- 사용법) CREATE TABLE 테이블명(컬럼명 자료형(크기), CONSTRAINT 제약조건이름 PRIMARY KEY(컬럼명));

CREATE TABLE CUSTOMER2(
    ID          VARCHAR2(20),
    PWD         VARCHAR2(20) NOT NULL,
    NAME        VARCHAR2(20) NOT NULL,
    PHONE       VARCHAR2(30),
    ADDRESS     VARCHAR2(1000),
    CONSTRAINT PK_CUSTOMER2_ID PRIMARY KEY(ID) -- ID컬럼에 기본키 제약조건을 건다 제약조건이름은 PK_CUSTOMER_ID

SELECT * FROM CUSTOMER2; -- 조회
-- INSERT 테스트 : 기본키(유일성 + NOT NULL 지정)
INSERT INTO CUSTOMER2 VALUES(NULL, NULL, NULL, '010-123-4567', 'SEOUL'); -- 기본키로 인해 에러발생

 

✔ 외래키 제약조건

CONSTRAINT FK_테이블명_컬럼명 REFERENCES 부모테이블
-- 3) 외래키(참조키) 제약조건 : FOREIGN KEY(FK)
-- 무결성 제약조건 : 기본키 / 외래키(참조키) 
-- 무결성 의미 : 데이터에 결점이 없는 것
-- 기본키 : 회원의 ID (중복되면 안됨 + NULL 입력되어도 안됨)
-- 참조키 : 부서테이블의 부서번호(DNO : 10 ~ 40), 사원테이블의 부서번호(DNO : 10 ~ 30) 있을때
--         부서테이블의 부서번호 값만 사원테이블의 부서번호에 INSERT 할 수 있음(참조 무결성)
--         만약 부서번호에 50번이 들어간다면 참조 무결성이 깨진 것
-- 사용법) CREATE TABLE 테이블명 (
--                    컬럼명 자료형(크기) CONSTRAINT 제약조건이름 PRIMARY KEY
--                    컬럼명 자료형(크기) CONSTRAINT 제약조건이름 REFERENCES 부모테이블명);
-- 예제3) EMP_SECOND 테이블을 만들고, 
--        ENO NUMBER(4) (기본키)
--        ENAME VARCHAR2(10)
--        JOB VARCHAR2(9)
--        DNO NUMBER(2) (참조키)
-- 지정하세요

CREATE TABLE EMP_SECOND(
    ENO NUMBER(4) CONSTRAINT PK_EMP_SECOND_ENO PRIMARY KEY      -- 기본키 지정
    ,ENAME VARCHAR2(10)
    ,JOB VARCHAR2(9)
    ,DNO NUMBER(2) CONSTRAINT FK_EMP_SECOND_DNO REFERENCES DEPARTMENT   -- 참조키 지정
);

 

✔  CHECK 제약조건

CONSTRAINT CK_EMP_SECOND_SALARY CHECK (조건)
-- 예제 4) EMP_SECOND 테이블에 CHECK 제약조건을 지정하세요 (SALARY>0 값만 INSERT 될 수 있도록)
CREATE TABLE EMP_SECOND(
    ENO NUMBER(4) CONSTRAINT PK_EMP_SECOND_ENO PRIMARY KEY
    ,ENAME VARCHAR2(10)
    ,SALARY NUMBER(7,2) CONSTRAINT CK_EMP_SECOND_SALARY CHECK(SALARY > 0)
);

-- CHECK 제약조건 테스트
INSERT INTO EMP_SECOND VALUES(8000, '윤정화', -200);

 

✔  DEFAULT 제약조건

-- 예제 5)
CREATE TABLE EMP_SECOND(
    ENO NUMBER(4) CONSTRAINT PK_EMP_SECOND_ENO PRIMARY KEY
    ,ENAME VARCHAR2(10)
    ,SALARY NUMBER(7,2) DEFAULT 1000
);


INSERT INTO EMP_SECOND(ENO, ENAME) VALUES(8000, '윤정화'); -- SALARY 값 미지정
COMMIT;
SELECT * FROM EMP_SECOND;

 

✔  기타 제약조건

-- 기타사항 : 제약조건
-- 테이블 복사 : CREATE TABLE ~ AS SELECT ~
-- 제약조건 복사안됨(제약조건 추가 생성작업 : 기본키/참조키)

-- 참고) 시스템용 테이블 또는 뷰(VIEW): DB 관리용 테이블
-- 용도) 현재 생성된 테이블의 정보, 제약조건, 크기 등을 확인하는 용도
-- 테이블 정보(제약조건) : USER_CONSTRAINTS
-- 원본테이블 제약조건 확인
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME IN ('EMPLOYEE', 'DEPARTMENT')
ORDER BY TABLE_NAME;
-- 복사본테이블 제약조건 확인
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME IN ('EMP_COPY', 'DEPT_COPY')
ORDER BY TABLE_NAME;

 

✔  테이블 생성 후 제약조건 추가/변경/제거하기

-- 예제 1) 사원복사본 테이블(EMP_COPY)에 기본키(PRIMARY KEY) 추가하기
-- 사용법) ALTER TABLE 테이블명
--        ADD CONSTRAINT PK_테이블명_컬럼명 PRIMARY KEY(컬럼명);
-- ENO : 사원번호에 기본키 추가
ALTER TABLE EMP_COPY
ADD CONSTRAINT PK_EMP_COPY_ENO PRIMARY KEY(ENO);

-- 예제2) 부서복사본(DEPT_COPY) 테이블에 기본키(PK) 추가하기
-- 기본키 : DNO(부서번호),(테이블의 데이터 중에서 유일한 값을 가져야 되는것)
ALTER TABLE DEPT_COPY
ADD CONSTRAINT PK_DEPT_COPY_DNO PRIMARY KEY(DNO);

-- 예제3) 테이블 생성 후에 외래키(참조키:FK) 추가하기 : EMP_COPY
-- 자식테이블에 추가 (부서테이블(부모): DEPT_COPY, 사원테이블(자식): EMP_COPY )
ALTER TABLE EMP_COPY
ADD CONSTRAINT FK_EMP_COPY_DNO
FOREIGN KEY(DNO) REFERENCES DEPT_COPY(DNO);

 

-- 예제4) 테이블 생성 후에 제약조건 삭제하기
-- 부모테이블(부서: 부서번호)의 기본키 <-> 자식테이블의 참조키(사원: 부서번호)
-- 부모테이블의 기본키 삭제하기 : 강제삭제하기 옵션(CASCADE)
-- CASCADE : 자식테이블에 있는 외래키도 같이 삭제됨
ALTER TABLE DEPT_COPY
DROP PRIMARY KEY; -- 자식테이블에 참조키가 걸려있으면 오류발생

ALTER TABLE DEPT_COPY
DROP PRIMARY KEY CASCADE;

 

-- 예제5) 제약조건 변경하기
-- EMP_COPY(사원) : ENAME (NULL 허용) -> ENAME NOT NULL 제약조건으로 변경

ALTER TABLE EMP_COPY
MODIFY ENAME CONSTRAINT NN_EMP_COPY_ENAME NOT NULL;

-- 제약조건이름으로 제약조건 삭제하기
ALTER TABLE EMP_COPY
DROP CONSTRAINT NN_EMP_COPY_ENAME;

 

✔  연습문제

-- 13_Table_Constraint_Exam
-- 제약조건 연습문제
--— 1) EMPLOYEE 테이블의 구조를 복사하여 EMP_SAMPLE 란 
--     이름의 테이블을 만드시오.
--—   사원 테이블의 사원번호 컬럼(ENO)에 
--     테이블 레벨로 PRIMARY KEY 제약조건을 지정하되,
--—   제약 조건 이름은 PK_MY_EMP 하시오.
-- 1) 복사본 : 제약조건 복사 안됨(기본키,외래키 직접 생성해야 함)

-- 테이블 구조복사
CREATE TABLE EMP_SAMPLE
AS
SELECT * FROM EMPLOYEE
WHERE 1=2;

-- ENO에 PRIMARY KEY 제약조건 지정
ALTER TABLE EMP_SAMPLE
ADD CONSTRAINT PK_MY_EMP PRIMARY KEY(ENO);

--— 2) DEPARTMENT 테이블의 구조를 복사하여 
--     DEPT_SAMPLE란 이름의 테이블을 만드시오.
--—   부서번호 컬럼(DNO)에 PRIMARY KEY 제약조건을 지정하되,
--—   제약 조건 이름은 PK_MY_DEPT 하시오.

-- 테이블 구조복사
CREATE TABLE DEPT_SAMPLE
AS
SELECT * FROM DEPARTMENT
WHERE 1=2;

-- DNO에 PRIMARY KEY 제약조건 지정
ALTER TABLE DEPT_SAMPLE
ADD CONSTRAINT PK_MY_DEPT PRIMARY KEY(DNO);

--— 3) 사원 테이블의(EMP_SAMPLE) 부서번호 컬럼에 존재하지 않는 
--      부서의 사원이 배정되지 않도록
--—    외래 키(FOREIGN KEY:FK) 제약조건을 지정하되, 
--   FK_MY_DEPT_EMP 로 하시오.
--— 참조테이블 : DEPARTMENT (데이터가 있음)
--— 참조키,외래키(FOREIGN KEY:FK)


-- DNO 컬럼에 외래키 지정

ALTER TABLE EMP_SAMPLE
ADD CONSTRAINT FK_MY_DEPT_EMP
FOREIGN KEY(DNO) REFERENCES DEPARTMENT(DNO);


SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME IN ('EMP_SAMPLE', 'DEPT_SAMPLE')
ORDER BY TABLE_NAME;
반응형

'SQL > SQL_이론' 카테고리의 다른 글

SYSTEM_ROLE  (0) 2023.09.14
시퀀스와 인덱스  (0) 2023.09.14
TABLE_ALTER  (0) 2023.09.14
TABLE_CUD  (0) 2023.09.14
SUBQUERY  (0) 2023.09.14
반응형

✔ 테이블에 컬럼 추가하기

 

-- 11_Table_Alter
-- 테이블 구조(설계)변경하기 : DBA(Database Administrator : DB 관리자)
-- 실습 테이블 : DEP20 (구조만 복사)
CREATE TABLE DEPT20
AS
SELECT * FROM DEPARTMENT
WHERE 1=2;

-- 결과보기
SELECT * FROM DEPT20;

-- 예제 1) 부서 테이블에 날짜 자료형(DATE)을 가지는 BIRTH 컬럼 추가하기
-- 날짜 자료형 : DATE 사용(크기 없음)
-- 테이블에 새로운 컬럼 추가하기
ALTER TABLE DEPT20
ADD(BIRTH DATE);

-- 결과보기
SELECT * FROM DEPT20;

 

✔ 컬럼의 크기 변경하기

-- 예제 2) 부서 테이블에(DEPT20) 부서명(DNAME)의 크기를 변경하기-- 예제 2) 부서 테이블에(DEPT20) 부서명(DNAME)의 크기를 변경하기
-- 테이블의 컬럼 변경(크기변경, 자료형 변경 등)
ALTER TABLE DEPT20 MODIFY DNAME VARCHAR2(30);
-- 테이블 구조보기 : DESC 테이블명
DESC DEPT20;

 

✔ 테이블의 컬럼 삭제하기

-- 예제 3) 부서테이블(DEPT20) BIRTH 컬럼 삭제하기
ALTER TABLE DEPT20 DROP COLUMN BIRTH;
SELECT * FROM DEPT20;

 

✔ 테이블 이름 변경하기

-- 예제 4) 테이블 이름 변경하기 : DEPT20 -> DEPT30
RENAME DEPT20 TO DEPT30;
DESC DEPT30; -- DEPT20에서 DEPT30으로 변경확인

 

✔ 연습문제

-- 12_Table_Alter_Exam
-- 테이블 구조(설계) 연습문제

-- 1) DEPT 테이블을 생성하세요.
-- 단 , DEPT 이 있으면 삭제하고(DROP TABLE ~) 재생성하세요.
-- 컬럼명 : DNO   NUMBER(2)
--         DNAME VARCHAR2(14)
--         LOC   VARCHAR2(13)
DROP TABLE DEPT;

CREATE TABLE DEPT(
    DNO NUMBER(2),
    DNAME VARCHAR2(14),
    LOC VARCHAR2(13)
);

-- 2) EMP 테이블을 생성하세요.
-- 단, EMP 테이블이 있으면 삭제하고(DROP TABLE ~) 재생성하세요.
-- 컬럼명 : ENO   NUMBER(4)
--         ENAME VARCHAR2(10)
--         DNO   NUMBER(2)
DROP TABLE EMP;

CREATE TABLE EMP(
    ENO NUMBER(4),
    ENAME VARCHAR2(10),
    DNO NUMBER(2)
);

-- 3) EMP 테이블을 수정하세요.(ENAME 컬럼 크기)
-- 컬럼명 : ENO   NUMBER(4)
--         ENAME VARCHAR2(25)
--         DNO   NUMBER(2)

ALTER TABLE EMP MODIFY ENAME VARCHAR2(25);
DESC EMP;

-- 4) EMPLOYEE 테이블을 복사해서 EMPLOYEE2 테이블을 생성하되
--    사원번호, 이름, 급여, 부서번호 컬럼만 복사하고,
--    새로 생성된 테이블의 컬럼명은 각각 
--    EMP_ID, NAME, SAL, DEPT_ID로 지정하세요.
--   (데이터도 복사)
-- 힌트) CREATE TABLE 복사테이블명(변경될컬럼명, 변경될컬럼명2 ...)
--      AS 
--      SELECT 원본컬러명, 원본컬럼명2,... FROM 테이블명
-- 참고 사용법) ALTER TABLE 테이블명 RENAME COLUMN 원본컬럼명 TO 변경될컬럼명;


CREATE TABLE EMPLOYEE2(EMP_ID, NAME, SAL, DEPT_ID)
AS
SELECT ENO, ENAME, SALARY, DNO FROM EMPLOYEE;


-- 5) EMP 테이블을 삭제하세요.

DROP TABLE EMP;

-- 6) EMPLOYEE2란 이름을 EMP로 변경하세요.

RENAME EMPLOYEE2 TO EMP;

-- 7) DEPT 테이블에서 DNAME 컬럼을 제거하세요.

ALTER TABLE DEPT DROP COLUMN DNAME;
반응형

'SQL > SQL_이론' 카테고리의 다른 글

시퀀스와 인덱스  (0) 2023.09.14
TABLE_CONSTRAINT  (0) 2023.09.14
TABLE_CUD  (0) 2023.09.14
SUBQUERY  (0) 2023.09.14
그룹함수  (0) 2023.09.14
반응형
-- 08_Table_CUD
-- 테이블 생성
-- CRUD : 약어, DB 또는 실무 프로젝트에서 많이 사용
-- C(CREATE문, 생성), R(READ, SELECT문, 조회), U(UPDATE문, 수정), D(DELETE문, 삭제)
-- 테이블 의미 : DB(데이터베이스)에서 자료를 저장하는 곳(논리적 공간)
-- 프로젝트 : 개발자 계정으로 접속해서 테이블 등을 생성함 (SCOTT 계정)

-- 1) 테이블 생성 : DDL ( DATA DEFINITION LANGUAGE : 데이터 정의어)
-- NUMBER(크기) : 숫자 자료형 (실수, 정수 등등)
-- 예) NUMBER(2) : 두 자리수 정수, NUMBER(2, 3) : 두 자리수 정수 + 세 자리수 소수점
--     NUMBER : 실수, 정수 무한 크기로 지정가능
-- 단, 크기가 지정되면 그 크기 이하로만 값을 넣을 수 있음
-- VARCHAR2(크기) : 문자형 자료형 , 가변 자료형 (VS CHAR(크기): 고정 자료형)
-- 예) VARCHAR2(4000) : 최대 크기, VARCHAR2 : 잘 안씀(1글자만 들어감)
-- 사용법) CREATE TABLE 테이블명(
--        컬럼명   NUMBER(2),        // 2자리수 숫자
--        컬럼명2  VARCHAR2(14),     // 14자리 문자
--        ...
--          );

CREATE TABLE DEPT(
        DNO NUMBER(2),
        DNAME VARCHAR2(14),
        LOC   VARCHAR2(13)
);

-- 예제 1) 사원테이블 : EMP
--        컬럼명 : ENO(사원번호, 숫자(4,0)
--                ENAME (사원명, 문자형(10)
--                JOB(직위, 문자형(9)
--                MANAGER(관리자) 숫자(4,0)
--                HIREDATE 입사일, 날짜형 (DATE)
--                SALARY 월급, 숫자형(7,2)
--                COMMISSION 상여금, 숫자형(7,2)
--                DNO  부서번호,  숫자형(2,0)  

CREATE TABLE EMP (
        ENO NUMBER(4, 0),
        ENAME VARCHAR2(10),
        JOB VARCHAR2(9),
        MANAGER NUMBER(4, 0),
        HIREDATE DATE,
        SALARY NUMBER(7, 2),
        COMMISSION NUMBER(7, 2),
        DNO NUMBER(2, 0)
);

-- 실무 예 : 테이블 만들기 : 테이블 복사(카피)
-- 예제 2) DEPARTMENT 테이블 복사하기 : DEPT_COPY 테이블을 만드세요
-- 1) 데이터까지 포함해서 복사
-- 사용법 )  CREATE TABLE 복사할 테이블명
--          AS
--          SELECT * FROM 원본테이블;
CREATE TABLE DEPT_COPY
AS
SELECT * FROM DEPARTMENT;


-- 2) 데이터빼고 테이블 설계(디자인)만 복사
--  CREATE TABLE 복사할 테이블명
--  AS
--  SELECT * FROM 원본테이블
--  WHERE 거짓조건;
CREATE TABLE DEPT_COPY2
AS
SELECT * FROM DEPARTMENT
WHERE 1=2; -- 거짓 조건 아무거나 붙이면 데이터 빼고 복사됨


-- 컬럼/테이블 주석 : 테이블이나 컬럼에 상세 설명을 붙일 수 있음
-- 예제 3) DEPT 테이블에 컬럼 주석 달기
-- 1) 테이블 주석달기
-- 사용법 ) COMMENT ON TABLE 테이블명 IS '테이블주석';
COMMENT ON TABLE DEPT IS '부서정보';

-- 2) 컬럼 주석달기
-- 사용법 ) COMMENT ON COULUMN 테이블명.컬럼명 IS '컬럼주석';
COMMENT ON COLUMN DEPT.DNO IS '부서번호';
COMMENT ON COLUMN DEPT.DNAME IS '부서명';
COMMENT ON COLUMN DEPT.LOC IS '부서위치';

-- 예제 3) 사원테이블의 EMP 의 테이블 주석/컬럼주석을 작성해서
--      만들어 주세요
--    보기 : EMP ( 테이블주석 : 사원정보 )
--       컬럼주석 : ENO(사원번호), 
--                 ENAME(사원명), 
--                 JOB(직위), 
--                 MANAGER(관리자), 
--                 HIREDATE(입사일), 
--                 SALARY(월급), 
--                 COMMISSION(상여금), 
--                 DNO(부서번호) 

COMMENT ON TABLE EMP IS '사원정보';

COMMENT ON COLUMN EMP.ENO IS '사원번호';
COMMENT ON COLUMN EMP.ENAME IS '사원명';
COMMENT ON COLUMN EMP.JOB IS '직위';
COMMENT ON COLUMN EMP.MANAGER IS '관리자';
COMMENT ON COLUMN EMP.HIREDATE IS '입사일';
COMMENT ON COLUMN EMP.SALARY IS '월급';
COMMENT ON COLUMN EMP.COMMISSION IS '상여금';
COMMENT ON COLUMN EMP.DNO IS '부서번호';

-- 2) 테이블 삭제
-- 사용법 ) DROP TABLE 삭제할테이블명
DROP TABLE DEPT_COPY;

-- 예제 5) DEPT_COPY2 를 삭제
DROP TABLE DEPT_COPY2;

-- 3) 데이터 추가(INSERT(CREATE)/삭제(DELECT)/수정(UPDATE) 명령어 : CUD
-- DML문(DATA MANIPULATION LANGUAGE): 데이터 조작어
-- 특징 : 명령문 실행 후 취소(ROLLBACK)
-- 1) 테이블 복사 : DEPT_COPY

CREATE TABLE DEPT_COPY
AS
SELECT * FROM DEPARTMENT
WHERE 1=2;


-- 예제 6) DEPT_COPY 테이블에 데이터 INSERT
-- 컬럼 : DNO(NUMBER(2,0)), DNAME(VARCHAR2(14)), LOC(VARCHAR2(13))
-- 사용법 :  INSERT INTO 테이블명(컬럼명, 컬럼명2, ...)
--          VALUES(값, 값2, ...);

INSERT INTO DEPT_COPY(DNO, DNAME, LOC)
VALUES(10, 'ACCOUNTING', 'NEW YORK'); -- 데이터 추가

SELECT * FROM DEPT_COPY; -- 데이터 확인

-- 취소
ROLLBACK;

-- 영구반영 : 취소불가상태
-- 의미 : 영구반영하면 다른 유저가 현재 생성/수정/삭제한 데이터를 볼 수 있음
COMMIT;


-- 예제 7) 임시적으로 NULL 값을 입력해서 INSERT 하기ㅣ
-- 1) 암묵적으로(눈에 안보이지만) NULL 값 INSERT 하기
INSERT INTO DEPT_COPY(DNO, DNAME)
VALUES(30, 'SALES');

SELECT * FROM DEPT_COPY; -- 데이터 확인

-- 영구반영
COMMIT;

-- 2) 명시적으로 NULL 값 넣기
INSERT INTO DEPT_COPY(DNO, DNAME, LOC)
VALUES(40, 'OPERATIONS', NULL);

SELECT * FROM DEPT_COPY;

COMMIT;

-- 연습 2) DEPT_COPY 테이블에 50부서 'COMPUTING' 만들고 LOC는 ' ' 공백으로 INSERT 하세요

INSERT INTO DEPT_COPY(DNO, DNAME, LOC)
VALUES(50, 'COMPUTING', ' ');

SELECT * FROM DEPT_COPY;

COMMIT;

-- 연습용 테이블 복사
CREATE TABLE EMP_COPY
AS
SELECT * FROM EMPLOYEE
WHERE 1=2;

-- 연습 2)
INSERT INTO EMP_COPY(ENO, ENAME, JOB, HIREDATE, DNO)
VALUES (7000, 'CANDY', 'MANAGER', '2012/05/01', 10);

SELECT * FROM EMP_COPY;

COMMIT;

-- 예제 8) 명시적으로 날짜형으로 변환해서 INSERT하기
-- 날짜함수: TO_DATE(문자열, '날짜포맷')
-- 날짜포맷 : 'YYYY-MM-DD HH24:MI:SS'
INSERT INTO EMP_COPY (ENO, ENAME, JOB, HIREDATE, DNO)
VALUES(7010, 'CANDY2', 'MANAGER', TO_DATE('2012/05/01', 'YYYY-MM-DD HH24:MI:SS'), 10);

SELECT * FROM EMP_COPY;
COMMIT;

-- 예제 9) INSERT 할때 현재날짜(시간) 데이터 넣기 : SYSDATE(현재날짜)
INSERT INTO EMP_COPY (ENO, ENAME, JOB, HIREDATE, DNO)
VALUES(7020, 'CANDY3', 'MANAGER', SYSDATE, 10);

SELECT * FROM EMP_COPY;
COMMIT;

-- 예제 10) 다른 테이블의 데이터만 복사하기
SELECT * FROM DEPT_COPY;
-- 빠른 삭제 : DELETE 문 보다 속도 빠름 전체 삭제만 됨, 취소불가(ROLLBACK)
-- 사용법) TRUNCATE TABLE 테이블 명
TRUNCATE TABLE DEPT_COPY;

-- 다른 테이블의 데이터 복사(원본데이터 : DEPARTMENT(부서), 구조가 같아야함)
-- 사용법 ) INSERT INTO 복사될 테이블명
--         SELECT * FROM 원본 테이블명;
INSERT INTO DEPT_COPY
SELECT * FROM DEPARTMENT;
-- 결과 확인
SELECT * FROM DEPT_COPY;
-- 영구반영
COMMIT;
반응형

'SQL > SQL_이론' 카테고리의 다른 글

TABLE_CONSTRAINT  (0) 2023.09.14
TABLE_ALTER  (0) 2023.09.14
SUBQUERY  (0) 2023.09.14
그룹함수  (0) 2023.09.14
오라클 내장함수  (0) 2023.09.08
반응형
-- 07_Subquery
-- 서브쿼리 : 단일행 서브쿼리(1건만 나옴)
-- 부등호나 등호를 사용하여 비교함
-- 예제 1) SCOTT 사원보다 급여를 많이 받는 사원을 찾기위한 SQL문을 작성하세요
-- 해결 1-1) 사원테이블에서 SCOTT 사원의 급여를 찾은 후에 (1번)
-- 해결 1-2) 그 급여를 비교해서 많이 받는 사원을 추가로 찾아야함 (2번)
-- 1번
SELECT SALARY
FROM EMPLOYEE
WHERE ENAME = 'SCOTT'; -- 3000(급여)

-- 2번
SELECT ENAME, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000;

-- 문제점 : 성능저하 : 여러번 쿼리로 인해
-- WHERE 절의 컬럼과 서브쿼리의 SELECT 컬럼이 동일해야함
-- 사용법
-- SELECT 컬럼명 FROM 테이블명
-- WHERE 비교컬럼 > (SELECT 비교컬럼 FROM 테이블명);              
SELECT ENAME, SALARY
FROM EMPLOYEE
WHERE SALARY > (SELECT SALARY
                FROM EMPLOYEE
                WHERE ENAME = 'SCOTT');
                
-- 예제1 : SCOTT 사원과 동일한 부서에서 DNO 근무하는 사원 구하기
SELECT ENAME
FROM EMPLOYEE
WHERE DNO = (SELECT DNO 
            FROM EMPLOYEE 
            WHERE ENAME = 'SCOTT');

-- 예제2 : 30번 부서에서 최소급여를 구한후 그 최소 급여보다 부서별 최소 급여가 큰 부서만 출력하세요
SELECT MIN(SALARY)
FROM EMPLOYEE
WHERE DNO = 30;

SELECT DNO, MIN(SALARY)
FROM EMPLOYEE
GROUP BY DNO
HAVING MIN(SALARY) > (SELECT MIN(SALARY)
                      FROM EMPLOYEE
                      WHERE DNO = 30);
                      
-- 3) 특수한 경우 아래처럼 사용도 가능함
-- SELECT 문 안에도 들어감
SELECT 2*3, (SELECT 4*3 FROM DUAL)
FROM DUAL;

-- FROM 문 안에도 들어감
SELECT EMP.ENAME, EMP.ENO
FROM (SELECT ENAME, ENO FROM EMPLOYEE) EMP;

-- 2) 다중 행 서브쿼리(자식쿼리) : 여러 건이 나옴
-- 예제 4) (1) 부서별 최소급여를 받는 사원 중에서 (2) 사원번호와 이름을 출력하세요
-- (1) 부서별 최소급여 받는 사원 출력
SELECT MIN(SALARY)
FROM EMPLOYEE
GROUP BY DNO;

-- (2) 950, 1300, 800 급여를 받는 사원번호와 이름 출력
SELECT ENO, ENAME
FROM EMPLOYEE
WHERE SALARY IN (950, 1300, 800);

-- 최종쿼리
SELECT ENO, ENAME
FROM EMPLOYEE
WHERE SALARY IN (SELECT MIN(SALARY)
                    FROM EMPLOYEE
                    GROUP BY DNO);
반응형

'SQL > SQL_이론' 카테고리의 다른 글

TABLE_ALTER  (0) 2023.09.14
TABLE_CUD  (0) 2023.09.14
그룹함수  (0) 2023.09.14
오라클 내장함수  (0) 2023.09.08
SQL 기본(2)  (0) 2023.09.08

+ Recent posts