2021년 11월 20일 토요일

오라클SQL교육강좌, 오라클 동의어(Oracle Synonym)

 

동의어synonym는 테이블, 뷰, 시퀀스, 프로그램 유닛(함수, 프로시저, 패키지)에 대한 별명이며 공용(public), 전용(private) 두가지 형태로 작성 가능 합니다. 공용 동의어public synonym는 DBA 권한을 가진 사용자만이 생성 가능하고 모든 계정에서 접근 가능 하며, 전용 동의어private synonym는 동의어로 작성 될 객체에 대한 접근 권한을 얻은 사용자가 작성하는 동의어로 해당 USER에서만 사용 가능 합니다.

동의어는 단순한 별칭 이므로 데이터 딕셔너리data dictionary의 정의 외 다른 저장 공간이 필요하지는 않습니다.

동의어는 보안과 편의성 때문에 사용되는데 객체의 이름 및 소유자를 가릴 수 있습니다. 또 분산 환경에서 원격 객체에 대한 위치 투명성 제공합니다. 동의어로 만들어진 테이블의 이름을 바꾸거나 이동해야하는 경우 동의어 만 다시 정의하면되기 때문에 이 방법이 유용하며 동의어를 기반으로하는 응용 프로그램은 수정없이 계속 사용 가능 합니다.

동의어는 스키마 오브젝트를 직접 참조 합니다. 예를 들어 SCOTT 계정에서 EDU라는 계정의 STUDENT 테이블을 참조할 때 EDU.STUDENT 라고 써주어야 하는데 여러 번 사용되는 경우에는 이름이 길어서 불편 합니다. 이러한 경우 EDU.STUDENT 에 대한 동의어를 만들어서 사용하면 편리 합니다.

[기본형식]

CREATE [PUBLIC] SYNONYM [schema.] synonym_name
FOR [schema.]object;
PUBLIC : 공용 동의어를 정의하며 생략하면 전용 동의어를 정의합니다.

실제 RABBIT 사용자를 생성하고 테이블을 만들어서 SCOTT 계정에서 동의어를 만들고 이를 딕셔너리 뷰에서 확인 후 삭제해 보겠습니다.

실습

실습을 위한 RABBIT 사용자 계정을 생성합니다. 오라클12C 이후 사용자 생성시 앞에 C##을 붙여야만 하는데 이전 방식과 동일한 방식으로 사용자를 생성하기 위해 세션 레벨에서 “_ORACLE_SCRIPT”=TRUE라고 설정합니다.

현재 세션에서 오라클 12C 이전 스크립트방식을 지원하면서 사용자를 생성하기 위해 _ORACLE_SCRIPT를 TRUE로 설정하세요.

ALTER SESSION SET "_ORACLE_SCRIPT"=TRUE;

<실행결과>

Session이(가) 변경되었습니다.

새로운 사용자 계정을 생성 합니다.

ID : RABBIT, PASSWORD : RABBIT으로 사용자 계정을 생성하세요.

CREATE USER RABBIT IDENTIFIED BY RABBIT;

<실행결과>

User RABBIT이(가) 생성되었습니다.

오라클에 접속을 하기위한 롤role과 테이블 등을 생성할 수 있는 롤을 부여합니다. 롤은 권한privilege을 여러개 합쳐놓은 것 입니다.

생성한 사용자 계정에 CONNECT, RESOURCE 롤을 부여하세요.

GRANT CONNECT, RESOURCE TO RABBIT;

<실행결과>

Grant을(를) 성공했습니다.

CONNECT 롤에는 ALTER SESSION, CREATE SESSION, CREATE CLUSTER, CREATE SYNONYM, CREATE DATABASE LINK, CREATE TABLE, CREATE SEQUENCE, CREATE VIEW 권한이 포함되어 있고, RESOURCE 롤에는 CREATE CLUSTER, CREATE INDEXTYPE, CREATE OPERATOR, CREATE PROCEDURE, CREATE SEQUENCE

CREATE TABLE, CREATE TRIGGER, CREATE TYPE 권한이 포함되어 있습니다.

오라클에 접속을 하기위한 롤role과 테이블 등을 생성할 수 있는 롤을 부여합니다. 롤은 권한privilege을 여러개 합쳐놓은 것 입니다.

생성한 사용자 계정에 CONNECT, RESOURCE 롤을 부여하세요.

GRANT CONNECT, RESOURCE TO RABBIT;

<실행결과>

Grant을(를) 성공했습니다.

오라클11g 까지는 RESOURCE 롤에 UNLIMITED TABLESPACE 권한이 있어 RESOURCE 롤을 부여후 CREATE TABLE이 가능했지만 12C 이후에는 별도로 부여해야 합니다.

생성한 사용자 계정에 UNLIMITED TABLESPACE 권한을 부여하세요.

GRANT UNLIMITED TABLESPACE TO RABBIT;

<실행결과>

Grant을(를) 성공했습니다.

RABBIT 계정으로 명령프롬프트를 이용하여 접속 후 테이블을 생성하고 데이터 2건을 입력 합니다.

생성한 사용자 계정에서 테이블 및 데이터를 생성 하세요.

SQL Developer의 SCOTT 계정에서 RABBIT 계정의 CUSTOMER 테이블을 SELECT 합니다. SCOTT 계정은 DBA 롤을 부여받은 계정이므로 SELECT 되지만 일반 다른 사용자에서는 CUSTOMER 테이블에 대한 SELECT 권한을 부여 받아야 합니다.

RABBIT 계정의 CUSTOMER 테이블을 SELECT 하세요.

SELECT * FROM RABBIT.CUSTOMER;

<실행결과>

 
ID
NAME
1
1
1길동
2
2
2길동

RABBIT.CUSTOMER에 대한 공용 동의어를 생성합니다. 공용 동의어는 모든 사용자 계정에서 접근 가능 합니다.

RABBIT.CUSTOMER에 대한 동의어 RC를 생성 합니다.

CREATE PUBLIC SYNONYM RC FOR RABBIT.CUSTOMER;

<실행결과>

SYNONYM RC이(가) 생성되었습니다.

동의어를 통해 데이터를 조회 합니다.

동의어 RC를 SELECT 합니다.

SELECT * FROM RC;

<실행결과>

 
ID
NAME
1
1
1길동
2
2
2길동

생성한 동의어를 딕셔너리 뷰에서 조회 합니다.

동의어 RC를 SELECT 합니다.

SELECT OWNER, SYNONYM_NAME, TABLE_OWNER

FROM DBA_SYNONYMS

WHERE SYNONYM_NAME = 'RC' ;


#오라클교육, #ORACLE교육, #오라클동의어, #동의어, #ORACLE, #synonym, #OracleSynonym

<실행결과>

 
OWNER
SYNONYM_NAME
TABLE_OWNER
1
PUBLIC
RC
RABBIT

2021년 11월 19일 금요일

(자바동영상/자바교육/자바강의/자바강좌)JAVA8 forEach, 람다식, 함수형인터페이스

 (자바동영상/자바교육/자바강의/자바강좌)JAVA8 forEach, 람다식, 함수형인터페이스 

 

자바8

@FunctionalInterface

public interface Consumer<T> {

void accept(T t)

}

 

void forEach(Consumer<T> action) 

 

empNames.forEach( (s) -> System.out.println(s) );

 

자바7 개선된 for문

for (String s : empNames) { 

 System.out.println(s));

   }

 

 

자바8 이전까지 Collection등을 순회할 때 Iterator(반복자)를 얻어 순회했지만 자바8 이후부터는  forEach로 가능하다.

forEach로 비즈니스 로직을 분리하여 재사용가능

 

      String[] myArr = {"오라클","자바"};

    

     List<String> list = (List)Arrays.asList(myArr);

     list.forEach(s -> System.out.println(s));  list.forEach(System.out::println);

 

[결과]

오라클

자바

------

오라클

자바

 

 

 

[예제]

package javatest;

 

import java.util.Arrays;

import java.util.Iterator;

import java.util.List;

import java.util.function.Consumer;

 

//Consumer implementation that can be reused

class OjcConsumer implements Consumer<String> {

public void accept(String s) {

System.out.println("Consumer impl :: " + s);

}

}

 

public class ForTest {

public static void main(String[] args) {

String[] myArr = {"오라클자바", "커뮤니티"};

List<String> myList = (List)Arrays.asList(myArr);

 

// 반복자를 얻어 Collection을 순회

Iterator<String> iter = myList.iterator();

while (iter.hasNext()) {

System.out.println("Iterator String  :: " + iter.next());

}

 

// 이번에는 forEach문을 이용하자. 

// Consumer는 자바에서 제공하는 추상메소드가 하나 있는 함수형 인터페이스이다.

// 파라미터를 받아서 void형 accept 메소드 구현

myList.forEach(new Consumer<String>() {

public void accept(String s) {

System.out.println("forEach s :: " + s);

}

});

 

// Consumer 인터페이스를 구현한 클래스를 new후 forEach에 사용

myList.forEach(new OjcConsumer());

 

// 이번에는 람다식으로...

// 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로

// 람다식을 '익명 함수(anonymous function)'라고 한다.

// forEach안에는 Consumer 인터페이스 타입이 들어와야 하는데

// accept 추상메소드 하나만 있으므로 람다식으로 구현한 아래 괄호안의 메소드는

// accept 추상메소드의 구현체인 익명함수인것이다.

myList.forEach(s -> System.out.println("람다식 :: " + s));

 

//이번에는 더블콜론 연산자로... 이름만으로 특정메소드 호출

        //타겟 레퍼런스는 :: 앞에 놓고 메소드명은 :: 뒤에 놓습니다.

System.out.println("----- 더블콜론 연산자 ------");

myList.forEach(System.out::println);

}

}

 

 

Iterator String  :: 오라클자바

Iterator String  :: 커뮤니티

forEach s :: 오라클자바

forEach s :: 커뮤니티

Consumer impl :: 오라클자바

Consumer impl :: 커뮤니티

람다식 :: 오라클자바

람다식 :: 커뮤니티

----- 더블콜론 연산자 ------

오라클자바

커뮤니티

 

 

  #자바forEach, #자바for, #자바람다식, #함수형인터페이스, #자바, #JAVA, #자바변수, #클래스변수, #인스턴스변수, #자바동영상, #자바동영상강의, #자바강의, #자바강좌, #JAVA, #JAVA동영상, #JAVA강의, #JAVA강좌, #자바교육, #JAVA교육, #자바소스


https://youtu.be/7TZYJHHXifQ


(자바동영상/자바강의)JAVA변수의 종류 클래스변수, 인스턴스변수, 지역변수, 매개변수

 (자바동영상/자바강의)JAVA변수의 종류  클래스변수, 인스턴스변수, 지역변수, 매개변수 


(자바교육/자바동영상/자바강의)JAVA변수의 종류  클래스변수, 인스턴스변수, 지역변수, 매개변수 


https://youtu.be/5CyNDCnruy4





 

지역변수(local variables)

매개변수(parameters)

인스턴스 변수(instance fields)

클래스 내에서 선언

클래스 변수(class fields)

클래스 필드, 정적 변수, 정적 필드

 

1. 클래스 변수

클래스의 인스턴스(객체)가 아니라 그것이 정의된 클래스와  연관되므로 Runtime Data Area의 Method Area에 한 개 존재한다. 

객체를 아무리 많이 생성하더라도 하나만 존재하며 초기화가 한번만 진행된다. (주로 전역변수, 상수로 사용 된다)

생성시기 : 최초 new 하는 경우 또는 Class가 최초로 참조되는 경우

static 한정자는 이 변수(필드, 멤버)가 클래스필드 임을 의미

상수를 정의 하는 것이 클래스 변수의 일반적인 사용이다.

    static final double PI=3.14;

    final static double PI=3.14;

같은 클래스 내부에서는 PI로 지칭되며 클래스 외부에서 해당 변수(필드)를 유일하게 지칭하기 위해서는 클래스명.PI로 인스턴스를 생성하지 않고도 직접 참조가 가능(물론 인스턴스를 만든 후 객체참조변수.PI형태의 참조도 가능하다.)

 

 

 

2. 인스턴스 변수

static으로 선언되지 않은 모든 멤버 변수(필드)는 인스턴스 변수이다.

   public double r;

클래스의 인스턴스인 객체와 관련이 있고 인스턴스(객체)의 현재 상태를 나타내며 생성된 모든 객체는 자신만의 복사본을 힙 메모리에 가진다. 

클래스를 N번 new 했다면 N개의 인스턴스(객체)가 메모리 힙에 존재한다.

클래스 내부에서 이름 하나만으로 지칭된다 

public double r;

    public double area() {

       return PI * r * r;

    }

클래스 외부에서 r을 가리킬 때는 클래스를 인스턴스화 한 객체참조변수명.변수 형태로 사용한다.(반드시 어떤 개체의 인스턴스 변수인지 지정해야 한다.) 인스턴스 변수의 값은 하나의 객체를 다른 객체와 구분한다

    Circle c1 = new Circle();     c1.r=3.0;

    Circle c2 = new Circle();     c2.r=9.0;

 

 

3. 로컬 변수

자바에서 메소드 내부에서 정의되어 사용되는 변수를 로컬 변수라고 한다.

다음과 같은 코드를 보자.

class A {

void a() {

boolean b;

System.out.println(b);  //b가 초기화되지 않았다고 오류

}

}

로컬 변수는 자동초기화를 하지 않는다.

- JVM에서 a() 메소드의 스택 프레임에 b라는 변수를 생성해야 하지만  로컬변수는 JVM에서 자동초기화를 하지 않아 b의 초기값이 없기에 b라는 변수는 생성되지 않는다. 이러한 상태에서 b를 사용하려 하면 실행 중에 문제가 생기므로 컴파일 에러를 발생시키는 것이다.

 

 

 

 

** 멤버변수(클래스,인스턴스변수)의 초기화 

boolean  false

char  ‘\u0000’

Byte : short : int : long  0

Float  0.0f

Double  0.0d

Object type  null

 

 

** 클래스 변수, 인스턴스 변수 예제

public class Ojc1_1 {

int kk;          //인스턴스변수

static int kkk;  //클래스변수

public static void main(String[] args) {

int i = Ojc1_1.kkk;

Ojc1_1 o1 = new Ojc1_1();

Ojc1_1 o2 = new Ojc1_1();

System.out.println(o1.kk);

System.out.println(o2.kk);

}

}

 

 

 


 

 

#자바, #JAVA, #자바변수, #클래스변수, #인스턴스변수, #자바동영상, #자바동영상강의, #자바강의, #자바강좌, #JAVA, #JAVA동영상, #JAVA강의, #JAVA강좌, #자바교육, #JAVA교육, #자바인터프리터, #자바컴파일, #자바실행, #자바소스  

 

 

(자바기초동영상,자바교육)JVM 실행 데이터 영역 (JVM Runtime Data Area), 메소드영역,힙,스택, JAVA강의동영상

 (자바기초동영상,자바교육)JVM 실행 데이터 영역 (JVM Runtime Data Area), 메소드영역,힙,스택, JAVA강의동영상


https://youtu.be/MOWjp9UUL54


JVM이 운영되면서 운영체제로 부터 부여 받은 메모리 영역


메소드 영역(Method Area) : 모든 쓰레드가 공유하는 영역이며 JVM이 시작될 때 생성된다. 클래스와 인터페이스의 메소드에 대한 바이트코드,  전역변수(클래스 변수), 런타임 상수 풀이 위치한다. 오라클의 Hot Spot VM에서는 Permanent Area, Permanent Generation(PermGen)이라고 부른다. 


힙(heap) 영역 : 객체를 저장할 때 사용하는 메모리 영역이며 성능을 생각할 때 가장 많이 고려되는 부분이다.


JVM 스택(JVM Stack) 

때 마다 할당되는 스택 프레임(Stack Frame)이라는각 쓰레드 마다 하나씩 존재하고 메소드가 실행될  구조체를 저장한다.

JVM은 오직 JVM 스택에 메소드에 대한 스택 프레임을 추가하고 제거하는 동작만 실행한다. 

자바에서 예외 발생 시 printStackTrace() 등의 메서드로 보여주는 Stack Trace의 각 라인은 하나의 스택 프레임을 표현한다.

실행되는 메소드의 스택 프레임을 가지는데 각 스택 프레임에는  지역변수, 메소드의 인자, 메소드의 리턴값, 리턴 번지 등이 저장되고 스택 프레임은 메소드가 끝나면 사라진다.


PC 레지스터(Program Counter Register)

쓰레드가 시작될 때 생성되며 쓰레드 마다 하나씩 존재하여 실행 할 JVM의 명령어의 주소를 가리킨다.

실행 상수 풀(Runtime Constant Pool) : 메소드 영역으로 부터 할당 받으며 클래스와 인터페이스의 상수, 메서드, 필드에 대한 모든 레퍼런스를 저장하는 영역이다. 자바 프로그램에서 어떤 메서드나 필드를 참조할 때 JVM은 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리상 주소를 찾아서 참조하게 된다.

네이티브 메소드 스택(Native Mathod Stack) : 자바이외의 언어로 작성된 네이티브 코드를 위한 스택, JNI(Java Native Interface)를 통해 호출하는 C/C++ 등의 코드를 수행하기 위한 스택이다.


메소드 내에서 객체 참조 형으로 선언된 변수인 경우 지역변수로서 스택에 위치하며 힙에 저장되어 있는 객체에 대한 참조 값을 가지게 된다. 

객체 참조 형 변수의 값이 null 이라는 의미는 아무것도 참조하고 있지 않다는 의미이다.

new 연산자는 힙(heap) 메모리에 객체를 만들고 그 객체의 참조값을 반환한다. 

객체 참조 변수의 경우 대입, 메소드 호출시의 인자, 반환형 등으로 사용 될 때 참조 값만 전달 될 뿐, 객체 자체가 복제되어 전달되는 것은 아니다.





 

#자바, #자바메모리, #JVM메모리, #자바힙, #메소드영역, #자바객체란, #객체란,  #자바동영상, #자바동영상강의, #자바강의, #자바강좌, #JAVA, #JAVA동영상, #JAVA강의, #JAVA강좌, #자바교육, #JAVA교육, #자바인터프리터, #자바컴파일, #자바실행, #자바소스  


JAVA에서 클래스패스란?(classpath), 부트스트랩 클래스로더, 확장클래스, 환경변수클래스정의

 JAVA에서 클래스패스란?(classpath), 부트스트랩 클래스로더, 확장클래스, 환경변수클래스정의

클래스패스는 클래스를 찾는 경로이다.

클래스패스(classpath) 설정 방법

classpath는 sdk tool(java, javac)등에서 –classpath option을 줘서 클래스를 찾을 경로를 지정할 수 있다.

또는 OS에서 환경설정을 함으로서 지정 가능하다. (set classpath=~ 형태 또는 내컴퓨터고급환경변수에서 classpath 지정) 

현재 디렉토리에 있는 모든 사용자 클래스 파일들을 지칭할때는 .(dot)을 사용한다.

Java Launcher의 클래스 찾기(클래스 검색 방식)

우선 부트스트랩 클래스에서 기본 자바 플랫폼에 있는 API 클래스들을 찾아 메모리에 로딩하며 여기에서 찾지 못할 경우 확장 클래스에서 찾고 여기서도 찾지 못한다면 사용자가 정의한 클래스패스에서 클래스를 찾아 메모리에 로딩한다.(없다면 ClassNotFound 오류발생!)

Bootstrap classes(부트스트랩 클래스) 찾기

- 자바 플랫폼을 구성하는 클래스들이며 rt.jar(Object.class, String.class)에 포함되어 있는 클래스 이다.

- jar 압축 파일들은 bootstrap class path에 의해 sun.boot.class.path 시스템 프로퍼티에 저장된다.

 

Java Launcher의 클래스 찾기(클래스 검색 방식)

extension classes(확장 클래스) 찾기

- 자바 플랫폼을 확장한 클래스들 이다.

- jre/lib/ext 확장 디렉토리에서 모든 jar 파일들을 자바2 확장 클래스로 가정한다.

user classes(사용자 클래스) 찾기

- 사용자가 환경 변수에서 지정한 경로에서 클래스를 찾는다.

- -cp 또는 –classpath 명령행 옵션은 기본 환경 설정과 클래스 패스 환경변수 설정을 재정의 한다.

 

주의 : 환경변수에서 클래스패스(classpath)를 별도로 지정하지 않았다면 현재 디렉토리에 있는 클래스는 찾는다. 하지만 c:\classes등으로 지정했다면 기본적으로 현재 디렉토리에 참조할 클래스가 있어도 찾지 못한다. 별도로 클래스패스를 지정하는 경우에는 반드시 쩜(.)도 포함을 해야한다.

 

 

#자바, #클래스패스, #classpath, #클래스패스란, #부트스트랩클래스로더, #자바동영상, #자바동영상강의, #자바강의, #자바강좌, #JAVA, #JAVA동영상, #JAVA강의, #JAVA강좌, #자바교육, #JAVA교육, #자바인터프리터, #자바컴파일, #자바실행, #자바소스

https://youtu.be/ZlrsnSlTdQs




(JAVA동영상강의)자바소스파일 구조 실행을 위한 main() 메소드

 (JAVA동영상강의)자바소스파일 구조 실행을 위한 main() 메소드

 

 

자바 소스 파일의 확장자는 .java이다.

하나의 자바 파일 안에 여러 클래스가 있는 경우 접근 지정자가 public인 Top Level Class가 있다면 파일명은 그 클래스 이름으로 되어야 한다. 만약 public 클래스가 없다면 파일명은 어떤 class명으로도 관계없다.

만약 public 클래스가 있고 public이 아닌 다른 클래스가 main 메소드를 가지고 있다면 public 클래스를 파일명으로 하고 main 메소드를 가진 클래스를 호출해야 한다. 대체적으로 public 클래스가 main 메소드를 가진다.

자바파일에 package 구가 있다면, 해당 자바파일은 반드시 패키지명의 폴더에 존재해야 한다.

자바 소스 파일에서 나타나는 순서는 아래와 같다.

 

package 문

import 문

class 정의

 

 

package javatest;

 

import java.util.ArrayList;

 

class Emp {

String ename;

public String getEname() {

return ename;

}

public void setEname(String ename) {

this.ename = ename;

}

}

public class Hello {

public static void main(String[] args) {

Emp e = new Emp();

e.setEname("홍길동");

System.out.println(e.getEname());

ArrayList arrayList = new ArrayList();

}

}

 

•자바 인터프리터에 의해 독립적으로 실행

 

// HelloWorld.java

 

class HelloWorld

{

public static void main(String[] args)

{

System.out.println(“오라클자바커뮤니티”);

}

}

 

•컴파일

•javac HelloWorld.java à HelloWorld.class 파일 생성, 파일 확장자까지 기술해야 한다.

•실행

•java HelloWorld

•main 함수를 가진 주 클래스의 이름을 지정해야 한다. 파일 확장자는 생략해야 한다.

 

[main() 메소드]

public : 클래스 외부에 있는 JVM의 자바인터프리터가 main 메소드를 처음 시작해야 하므로 접근을 허용하기 위해 public으로 선언한다.

static : 객체 생성 없이 main을 실행 하기 위해, 프로그램 시작 시 먼저 메모리에 올라가게 해서 main 함수를 실행하기 위해서이다.

void : main 메소드는 return 값이 없다.

String[] args : main 메소드를 실행 시키면서 인자(매개변수)를 넣어줄 때 이용, 매개변수는 문자열 배열로 main 메소드에 전달된다.

 

위에서 개발자가 바꿀 수 있는 부분은 args 뿐이다.

 

#자바, #자바동영상, #자바동영상강의, #자바강의, #자바강좌, #JAVA, #JAVA동영상, #JAVA강의, #JAVA강좌, #자바교육, #JAVA교육, #자바인터프리터, #자바Interpreter, #자바컴파일, #자바실행, #자바main, #자바메인, #자바소스

https://youtu.be/ZkeRldv4VgQ




(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...