1. CONCAT(c1, c2)
    • || 과 똑같이 동작한다.
    • 문자열 c1과 문자열 c2를 결합해주는 함수이다.
    • c1과 c2사이에 문자를 넣어주고 싶으면 2중으로 사용을 해줘야 하는 불편함이 있다.
    • SELECT CONCAT('HELLO', 'SQL') FROM DUAL;
      //출력 : HELLOSQL
      SELECT 'HELLO'||' '||'SQL' FROM DUAL;
      //출력 : HELLO SQL
    • 위와같이 CONCAT의 경우 문자열을 결합할 때 문자열 사이에 문자를 넣어줄 수 없다는 단점이 있다.
    • 하지만 ||의 경우 문자열 사이에 문자로 연결자를 넣어주기 편함으로 CONCAT대신 ||를 추천한다.
  2. LOWER(c1), UPPER(c1), INITCAP(c1)
    • LOWER : c1에 저장된 자료를 모두 소문자로 변환
    • UPPER : c1에 저장된 자료를 모두 대문자로 변환
    • INITCAP : c1에 저장된 자료중 단어의 첫 글자만 대문자로 변환
      • 변환 시 단어의 첫 글자 확인은 공백을 구분자로 한 칸 이상의 공백이 있으면 공백 다음 단어가 첫 글자
    • SELECT LOWER('HELLO') FROM DUAL;
      //출력 : hello
      SELECT UPPER('hello') FROM DUAL;
      //출력 : HELLO
      SELECT INITCAP('HELLO SQL HELLOSQL hello sql hellosql') FROM DUAL;
      //출력 : Hello Sql Hellosql Hello Sql Hellosql
  3.  LPAD(c1, n [, c2]), RPAD(c1, n[,c2])
    • LPAD : n의 길이만큼 기억공간에 왼쪽부터 c1을 채우고 남는 공간은 c2를 채움
    • RPAD : n의 길이만큼 기억공간에 오른쪽부터 c1을 채우고 남는 공간은 c2를 채움
    • SELECT LPAD('1234567', 10, '*') FROM DUAL;
      //출력 : ***1234567
      SELECT RPAD('1234567', 10, '*') FROM DUAL;
      //출력 : 1234567***
    • 10의 길이를 만들어주고 처음 주어진 문자열을 L의 경우에는 오른쪽에 붙이고 남은 공간을 *로, R의 경우에는 왼쪽에 붙히고 남은 공간을 *로 채워준다
  4. LTRIM(c1 [,2]), RTRIM(c1 [,2]), TRIM(c1)
    • c1의 우측(RTRIM)또는 좌측(LTRIM)에서 첫 번째로 만나는 문자열이 c2와 같으면 삭제
    • c2가 삭제되면 공백은 제거된다.
    • TRIM : c1양쪽의 무효 공백 제거
      • 무효 공백 : 데이터 사이의 공백이 아닌 데이터가 나오기 전과 나온 후의 공백
      • 유효 공백 : 데이터 사이의 공백. 유효 공백은 아스키코드값으로도 나와있다(40)
        • 유효공백은 LTRIM, RTRIM, TRIM으로는 제거가 불가능하고 REPLACE로 삭제가 가능하다
    • SELECT LTRIM('APPLE', 'AP') FROM DUAL;
      //출력 : LE
      SELECT LTRIM('          APPLE') FROM DUAL;
      //출력 : APPLE
      SELECT RTRIM('APPLE', 'LE') FROM DUAL;
      //출력 : APP
      SELECT RTRIM('APPLE         ') FROM DUAL;
      //출력 : APPLE
      SELECT TRIM('          APPLE BANANA ORANGE STRAWBERRY          ') FROM DUAL;
      //출력 : APPLE BANANA ORANGE STRAWBERRY
    • c2를 생략한 경우 공백이 삭제된 것을 볼 수 있고 TRIM의 경우 양쪽 공백만 삭제된 것을 확인할 수 있다
  5. SUBSTR(c1, n1 [, n2])
    • 주어진 문자열 c1의 n1번째 인덱스부터 시작해서 n2의 개수만큼 글자를 부분 문자열로 추출하여 반환한다
    • n2가 생략되면 n1번째 인덱스부터 나머지 글자를 모두 추출하여 반환한다.
    • n1의 시작 인덱스는 1이며 0을 입력해도 1과 같이 동작한다
    • n1이 음수이면 제일 오른쪽 자리부터 처리된다
    • n2가 글자보다 많으면 c1이 가지고 있는 문자만큼만 출력한다
    • SELECT SUBSTR('무궁화 꽃이 피었습니다.', 1) FROM DUAL;
      //출력 : 무궁화 꽃이 피었습니다.
      SELECT SUBSTR('무궁화 꽃이 피었습니다.', 0, 3) FROM DUAL;
      //출력 : 무궁화
      SELECT SUBSTR('무궁화 꽃이 피었습니다.', 1, 3) FROM DUAL;
      //출력 : 무궁화
      SELECT SUBSTR('무궁화 꽃이 피었습니다.', 1, 50) FROM DUAL;
      //출력 : 무궁화 꽃이 피었습니다.
      SELECT SUBSTR('무궁화 꽃이 피었습니다.', -5, 10) FROM DUAL;
      //출력 : 었습니다.
    • 0과 1이 동일하게 동작하며, c2를 삭제하거나 문자열의 길이보다 큰 값을 입력하면 끝까지 출력되고, 마이너스 인덱스를 입력하면 오른쪽부터 숫자를 세서 출력을 해준다.
  6. REPLACE(c1, c2 [, c3])
    • 주어진 문자열 c1에서 c2를 찾아 c3로 치환한다
    • c3가 생략되면 c2를 삭제한다
    • c3를 생략하고 c2에 공백을 넣으면 c1안에 모든 공백을 삭제한다.
    • SELECT REPLACE('무궁화 꽃이 피었습니다.', '무궁화', '진달래') FROM DUAL;
      //출력 : 진달래 꽃이 피었습니다.
      SELECT REPLACE('무궁화 꽃이 피었습니다.', '무궁화') FROM DUAL;
      //출력 :  꽃이 피었습니다.
      SELECT REPLACE('    무궁화 꽃이 피었습니다.    ', ' ') FROM DUAL;
      //출력 : 무궁화꽃이피었습니다.
    • 두 번째 예제의 경우 공백은 선택이 되지 않았으므로 삭제되지 않고 앞에 남아있는 걸 볼 수 있고 세 번째 출력문의 경우 모든 유효 공백과 무효 공백이 사라진다
  7. INSTR(c1, c2 [, m [, n]]) / INDEX OF STRING
    • 주어진 문자열 c1에서 문자열 c2가 처음 나타난 위치를 반환
    • m : 검색의 시작 위치를 지정
    • n : 문자열 c1에서 찾으려는 문자열 c2가 n번째로 나오는 위치를 반환
      • 없는 경우 NULL이 아닌 0을 리턴
    • SELECT INSTR('APPLE BANANA ORANGE STRAWBERRY', 'E') FROM DUAL;
      // 출력 : 5
      SELECT INSTR('APPLE BANANA ORANGE STRAWBERRY', 'E', 6) FROM DUAL;
      // 출력 : 19
      SELECT INSTR('APPLE BANANA ORANGE STRAWBERRY', 'E', 6, 2) FROM DUAL;
      // 출력 : 27
      1. 'APPLE BANANA ORANGE STRAWBERRY'라는 문자열에서 첫 번째로 나온 E의 위치 5를 반환
      2. 위의 문자열에서 6번째 인덱스 이후로 처음 나오는 E의 위치 19를 반환
      3. 위의 문자열에서 6번째 인덱스 이후로 2번째로 나오는 E의 위치 27을 반환

'DataBase > Oracle' 카테고리의 다른 글

10. Function - 날짜 함수  (0) 2021.07.24
9. Function - 숫자 함수  (0) 2021.06.22
7. 연산자(Operator)  (0) 2021.06.18
7. 자료형(Data type)  (0) 2021.06.17
6. Selec  (0) 2021.06.14

-개요

여러 부품을 모아 하나의 제품을 만들듯이 소프트웨어를 개발할 때, 여러 객체(부품)를 모아서 하나의 완성된 프로그램을 만드는 것을 객체지향 프로그래밍이라고 하며 영어로는 OOP(Object Oriented Programming)라고 한다.

  • 객체
    • 물리적으로 존재하거나 추상적으로 생각할 수 있는것들 중에서 자신의 속성을 가지며 식별 가능한 것을 의미
    • 필드와 메소드로 구성된다
    • 필드
      • 값, 변수라고 볼 수 있다
    • 메서드
      • 객체의 동작을 나타낸다
    • 예를 들어 사람이라는 객체가 있다고 가정한다
      • 이 사람은 이름, 나이, 키, 몸무게, 성별 등의 여러 가지 속성을 가지고 있는데 이를 필드라고 한다
      • 이 사람이 먹고, 자고, 일어나고, 움직이는 등 수없이 많은 행위들을 하는데 이를 메서드라고 한다.
      • 이처럼 어떠한 사물, 사람 등을 객체로 생각해볼 수 있고 그 객체가 가지고 있는 속성 값들을 필드, 그 객체가 동작하는 모든 행위 들을 메서드라고 한다
  • 객체의 상호작용
    • 객체는 객체끼리 상호작용을 한다
    • 사람이 리모컨으로 tv를 조작하는 것과 같은 개념이다
      • 사람이라는 객체가 리모컨이라는 객체의 버튼을 누르면 리모컨은 tv로 전원을 키라는 동작을 전달한다.
      • tv는 리모컨이 전달한 전원을 켜라 라는 행위를 받아 전원을 켜게 되는데
      • 리모컨의 버튼이 눌러졌을 때 하는 행동, tv가 리모컨의 명령을 받았을 때 하는 행동들을 메서드 호출이라고 하며 이러한 행동들과 연관관계를 객체의 상호작용이라고 한다
  • 객체와 클래스
    • 객체
      • 앞서 말한 현실의 모든 사람, 사물 그리고 가상의 어떠한 무언가도 객체가 될 수 있다
    • 클래스
      • 위의 객체를 만들기 위해서 설계도가 필요하다
      • 물건으로 예를 들면 자동차의 경우 자동차의 설계도가 필요하다.
      • 바퀴의 사이즈, 핸들, 각종 페달, 엔진 등 여러 가지 물건(필드)이 필요하고 자동차에서 어떠한 행위가 이루어졌을 때, 액셀을 밟는다던가 시동을 켠다거나 하는 행위(메서드)를 작성한 설계도가 필요할 것이다.
      • 이러한 부분들을 클래스에 작성을 해주는 것이다.
        • 자동차 클래스
          • 필드 : 바퀴, 색상, 기어, 엔진, 페달....
          • 메서드 : 시동이 걸린다. 와이퍼가 움직인다. 앞으로 간다. 멈춘다.
          • 이렇게 클래스(설계도)를 작성할 수 있다
      • 생성
        • 클래스 파일 생성 시 주의사항
          • 이름의 첫 글자는 꼭 대문자로 작성한다
          • 첫 글자에는 숫자가 올 수 없다
          • $, _ 외에 특수문자는 사용이 불가능하다
          • 자바 예약어는 사용이 불가능하다
          • 한글 사용이 가능하지만 일반적으로 사용되지 않고, 사용 시에 인코딩 오류가 발생할 수도 있다
          • 기본적으로 변수의 선언 와 동일하다고 생각하면 된다
        • 클래스 사용법
        • public class 클래스이름 {
          	
          }
        • 위와 같이 생성한 클래스 파일에 작성을 해주면 된다
        • 클래스 이름은 파일명과 같아야 한다.
        • 앞에 붙은 public의 경우 접근제어자인데 후에 기술할 예정이다
        • 일반적으로 한 개의 클래스파일에는 한개의 클래스만 정의를 하지만 2개 이상 정의도 가능하다.
        • 클래스 내부에는 필드, 메서드, 생성자가 사용될 수 있다.
        • public class Car {
          	//필드 Feild
              String color;
             	int carNumber;
              // etc......
              
              //메소드 Method
              public String moveFront() {
              	return "전진 합니다.";
              }
              
              //생성자 Constructor
              Car() {
              	String color = white;
              }
          }
        • 위와 같은 구조인데 안의 세부적인 내용과 객체, 클래스 등 앞서 기술한 내용들을 다음 포스팅에서 차근차근 다뤄보겠다.

-열거 타입

  • 한정된 값만을 갖는 타입을 열거 타입이라고 한다.
  • 어떠한 값들을 열거한다.
  • 열거 상수를 저장하는 타입
    • 상수 : 변하지 않는 값 / 변수의 형태를 가지고 있지만, 한번 값을 저장하면 변경할 수 없음
  • public enum Week {
    	MODAY,
    	TUESDAY,
    	WEDNESDAY,
    	THURSDAY,
    	FRIDAY,
    	SATURDAY,
    	SUNDAY
    }
  • 관례적으로 상수는 대문자로 작성을 해준다.
  • ctrl + shift + x : 선택한 문자들을 대문자로 바꿔줌 / ctrl + shift + y : 선택한 문자를 소문자로 바꿔줌
  • Eclipse에서는 파일을 new탭에서 생성해 줄 때 enum으로 class혹은 package처럼 파일을 생성해 줄 수 있다.
  • 저장된 이름 자체가 값이다.

-열거 타입 메서드

  • 열거 타입의 메서드 중 위의 코드와 같은 열거 타입으로 작성된 코드가 있다.
  • 오늘이 어떤 요일인지 반환해주는 함수이며 코드를 열어 확인해보면 열거 타입인걸 확인해 볼 수 있다.
  • 예전에는 Calendar와 Date객체를 사용했지만 이 두 가지는 보안상 사용을 안 하는 것이 좋다
  • LocalDate.now().getDayOfWeek(); 이 코드를 사용하는 것을 권장한다.
  • 산술 연산자
    • 사칙 연산자
      • +, -, /, *
      • 프로그래밍 언어와 다르게 나머지를 구하는 연산자는 사용하지 못하고 위의 네 가지 연산자만 사용이 가능하다
      • 나머지를 구할때는 수식을 작성하거나 MOD함수를 사용해야 한다
    • 관계 연산자
      • 크기의 비교에 사용되며 조건절 구성에 사용된다(WHERE)
      • <, >, <=, >=, =, (!=, not=, <>)
      • 괄호로 묶인 세 가지는 동일하게 사용이 가능하다
      • 순서대로 (초과, 미만) / (이상, 이하) / (같다, 다르다)
    • 논리 연산자
      • not, and, or
      • 우선순위는 위의 작성한 순서대로 not > and > or 순이다
      • 두 개 이상의 조건을 결합하거나(and, or), 논리 부정(not) 연산을 수행한다
      • and와 or은 이항 연산
      • not은 단항 연산
    • 기타 연산자
      • in
        • 질의 탐색을 위해 상용될 둘 이상의 표현식을 지정
        • 불연속적인 값의 비교에 주로 사용
        • 서브 쿼리가 사용되는 경우 서브 쿼리의 결과가 다중행을 반환하는 경우에는 반드시 in연산자를 사용해야 한다
        • =any, =some, or로 치환 가능하다
      • any, some
        • 기능은 in연산자와 동일하다
        • 사용방법은 =any, =some으로 사용해야 한다
      • between
        • 범위 지정에 사용되며 논리 연산자 and로 대치 가능하다
      • like
        • 칼럼에 저장된 값을 제시된 패턴과 비교하여 문자열 형태가 동일한 행을 검색하는 연산자
        • % : %가 쓰인 위치에서 모든 문자열과 대응됨
          • ex1) '김%' : '김'으로 시작하는 모든 문자열 반환
          • ex2) '% 김' : '김'으로 끝나는 모든 문자열 반환
        • _ : _가 쓰인 위치에서 한 문자와 대응됨
          • _는 하나의 문자를 의미하며 여러 개를 중첩해서 사용이 가능하다
          • ex) '김__' : '김'으로 시작하는 3자리 문자열 반환

'DataBase > Oracle' 카테고리의 다른 글

9. Function - 숫자 함수  (0) 2021.06.22
8. Function - 문자열 함수  (0) 2021.06.22
7. 자료형(Data type)  (0) 2021.06.17
6. Selec  (0) 2021.06.14
5. DDL(Data Definition Language) - Drop  (0) 2021.06.14

-2차원 배열(+ 다차원)

앞서 포스팅한 배열은 1차원 배열로 1행 + n열을 가지는 배열이다.

2차원 배열은 n행 + n열을 생각하면 된다. 흔히 생각하는 표 모양을 떠올리면 될 것이다.

2차원 이상의 3차원부터는 x, y, z로 3차원(3D) 이렇게 생각을 하면 되는 데 사용할 일이 없을 것이고 혹시나 사용이 필요하다면 다른 블로그의 포스팅을 찾아보자...

*아직 저의 역량 밖입니다...

 

-사용 방법

    • int[][] num1 = new int[10][10];
      int[][] num2 = {{1, 2, 3}, {4, 5, 6}};
    • 위의 방식으로 선언과 초기화가 가능하다 
    • [10][10]으로 만들면 10행 10열이 생성이 되고
    • 첫 번째 방법에서 첫번째 오는 대괄호에는 꼭 길이를 설정해줘야 하지만 두 번째[]부터는 값을 따로따로 초기화해줄 수 있다.
    • 만약 num1 [1][8] 이렇게 호출을 한다면 2번째 행 9번째 칸의 값이 출력이 될 것이다.
    • 행과 열의 개념만 이해를 한다면 사용을 하는 것은 1차원 배열과 동일하다
    • 단 주의할 점은 num1의 길이는 첫 번째 []의 길이가 나오고 두 번째[]의 길이 값을 추출하고 싶다면 먼저 행을 선택하고 그 행의 길이를 찾으면 된다
      • 예를 들어 2행의 길이를 알고 싶다면
      • num1 [1]. length라고 해야 한다.
      • 첫 번째 방법으로 초기화를 한다면 모든 행의 길이가 같겠지만 두 번째 방법으로 초기화를 할 경우 각 행의 길이가 달라질 수 있다.

 

-배열 복사

만약 배열의 크기를 더 키우기 위해 크기가 더 큰 배열을 만들고 그 배열에 복사를 해서 값을 넣어줄 때 사용하는 방법이 두 가지 있다.

int[] arr1 = new int[5];
int[] arr2 = new int[10];

for(int i = 0; i < arr1.length; i++) {
	arr2[i] = arr1[i];
}

위와 같이 코드를 작성해주면 arr1의 배열이 arr2의 배열에 0번 index부터 저장이 되며 남은 자리는 타입에 맞게 초기화가 되어 위의 코드 같은 경우 0으로 4번 index~9번 index까지 저장이 된다.

 

하지만 항상 for문을 작성해주고 길이를 구하고.... 귀찮다

프로그래머는 귀찮은걸 싫어하고 코드는 더 간결하고 보기 쉬워야 한다

그렇기 때문에 사용할 수 있는 다른 방법이 있다.

 

int[] arr1 = new int[5];
int[] arr2 = new int[10];

System.arraycopy(arr1, 0, arr2, 0, arr.length);

이름 그대로 배열을 복사해주는 함수다

첫 번째, 두 번째 인자로 원본 배열과, 시작할 위치

세 번째, 네 번째 인자로 새로운 배열과, 시작할 위치

다섯 번째 인자로 복사를 할 개수를 입력해주면 간편하게 복사가 가능하다

 

그렇다면 복사가 잘 되었는지 확인을 해보자

for(int i = 0; i < arr2.length; i++) {
	System.out.print(arr2[i]);
}

실행해 보면 배열 안의 코드가 잘 나오는 걸 확인할 수 있다.

 

-향상된 for문

for문을 작성할 때면 항상 써줘야 할 것들이 너무 많다.

조건, 초기화 변수, 증감식... 배열을 단순히 순서대로 출력을 하기 위해서 많은 코드를 써주는 건 힘들다

그때 향상된 for문은 사용해서 행복해질 수 있다.

for(int i : arr2) {
	System.out.print(i);
}

복사에서 봤던 for문과 정확하게 일치하는 결과를 얻을 수 있다.

  • 사용법
    • 소괄호 안에 배열과 같은 타입의 변수를 하나 선언해준다.
    • 그 뒤 콜론(:)을 입력하고 출력하고자 하는 배열을 넣어준다
    • 실행을 하면 우측에 입력해준 배열의 0번 index부터 끝까지 for문이 한번 돌 때마다 차례대로 i에 들어가고 실행문에서 i를 출력하면 순서대로 나오는 것을 볼 수 있다.
    • 배열의 값을 sum에 모두 더할 때, 배열을 순서대로 출력해야 할 때 사용하면 좋다.
    • 하지만 index를 사용해서 조건을 주고 출력을 해야 한다면 기본 for문을 사용하는 것이 좋다.

-개요

  • 많은 양의 데이터를 처리하기 위해서 사용
  • 데이터를 연속된 공간에 나열하고 각 데이터에 Index를 부여한 자료구조
  • 같은 타입의 데이터만 저장이 가능하다
  • 처음 선언한 데이터의 길이 값이 고정되어 늘리거나 줄일 수 없다
  • 현재는 거의 사용하지 않고 arrayList라는 클래스를 사용한다

 

-사용

  • 선언
    • type[] 변수명;
      type 변수명[];
    • 대괄호를 type뒤에 붙여도 되고 변수명 뒤에 붙여줘도 작동이 되지만 자바에서는 일반적으로 type뒤에 작성해준다
    • type에는 기본타입뿐 아니라 참조 타입도 넣어줄 수 있다
      • int [] num;이라고 선언 시 num이라는 배열에는 int타입의 리터럴만 저장이 가능
      • String [] str;이라고 선언 시 str이라는 배열에는 String타입의 리터럴만 저장이 가능
  • 초기화
    • type[] 변수명 = new int[배열의 길이];
      type[] 변수명 = {리터럴 값1, 리터럴 값2, 리터럴 값3...};
    • 두 가지 방법으로 초기화가 가능하다
    • 첫 번째 방법에서 배열의 길이 부분에 5를 넣어준다면 5칸의 배열이 생성된다
      • int[] num = new int[5];
        num[0] = 1;
        num[1] = 2;
        num[2] = 3;
        num[3] = 4;
        num[4] = 5;
      • 위와 같이 길이를 5로 정해주면 int타입의 5칸짜리 배열 num이 생성된다.
      • 그 뒤 배열의 index번호에 값을 입력해 주면 된다.
      • index는 0부터 시작하므로 꼭 기억하도록 하자 
      • 만약 어떤 위치의 값을 출력해주고 싶다면 -1을 해주면 된다
        • 5칸 배열의 3번째 값을 출력하고 싶다면 3 - 1을 해주면 2이기 때문에 세 번째 칸의 배열 값이 나온다
    • 두 번째 방법은 리터럴 값을 넣어준 만큼 길이가 설정된다
    • new로 초기화를 진행한 경우 기본적으로 들어가는 값들이 있다
      • 정수
        • byte : 0
        • char : '\u0000'
        • short : 0
        • int : 0
        • long : 0L
      • 실수
        • float : 0.0F
        • double : 0.0
      • 논리
        • boolean : false
      • 참조
        • Class : null
        • Interface : null
    • 초기화를 했을 때 아무 값도 넣지 않을 경우 위와 같이 타입별로 초기화가 된다.
  • 값 입력
    • int[] num = new int[5];
      for(int i = 0; i < 5; i++) {
      	num[i] = i + 1;
      }
    • 이런 식으로 값을 넣어주는 방법이 있다
    • 선언과 초기화를 동시에 한다면 중괄호 안에 리터럴을 직접 입력해주면 되지만 배열의 생성만 했다면 위와 같이 자료를 삽입해 줘야 한다
    • 숫자의 경우 index를 순차적으로 올려가면서 위의 코드와 같이 1~5까지의 숫자를 0~4까지의 index값에 삽입이 가능하다
    • 반복문을 사용해주지 않을 경우 num [0]~num [4]를 하나하나 사용해주면서 각각 값을 넣어줘야 한다.
  • 배열 길이
    • 배열은 길이를 구하는 일이 많을 것이다 이때마다 배열의 길이를 직접 써주는 것보다는 Length함수를 사용하면 간편하게 길이를 구할 수 있다
    • int[] num = {1, 8, 9, 2, 3, 4, 9, 5, 0, 3, 4};
      
      System.out.println(num.length);
    • 11이 출력될 것이다.
    • 위의 코드와 같이 배열에 리터럴을 입력해 초기화를 해준 경우 길이를 구하려면(몇 칸인지 구하려면) 일일이 세줘야 하지만 length를 사용하면 컴퓨터가 알아서 해준다.
  • 사용
    • 배열 내부의 값 중 특정 칸에 어떤 값이 들어있는지 확인을 하려면 아래 코드를 참고하자
    • System.out.println(num[2]);
    • 배열 길이의 코드와 이어서 본다면 9가 출력이 될 것이다.
    • 앞서 말했듯 index는 0부터 시작한다.
    • 그렇기 때문에 2를 입력해주면 3번째 칸의 값이 출력이 된다.
  1. 문자열 자료형
    • char(n [byte|char])
      • 고정길이 문자열 저장
      • 2000byte까지 저장 가능
        • 한글 한 글자는 3byte 666글자 저장 가능, 영어 한 글자는 1byte 2000글자 저장 가능
      • 기억공간이 남으면 왼쪽에 공백 삽입
      • [byte|char]
        • n은 기억공간의 크기를 나타냄
        • byte는 nbyte를 의미하며 아무것도 작성하지 않을 시 기본으로 byte가 설정된다
          • char(20) == char(20 byte)
        • char는 n글자를 의미하며 1 글자당 2byte로 설정된다.
          • char(5 char) =>10byte의 저장 공간이 생김
        • char는 사용하지 않는 것을 추천
    • varchar(n [byte|char]), varchar2(n [byte|char])
      • 가변 길이 문자열 저장
      • 4000byte까지 저장 가능
      • 정의된 데이터가 확보된 기억공간 보다 적으면 남은 공간은 시스템이 반납
        • 사이즈가 입력된 데이터의 사이즈에 맞게 수정됨(설정한 n값 안에서)
      • varchar와 varchar2는 기능적으로 동일하지만 오라클에서는 varchar2 사용을 권장
    • long
      • 가변 길이 문자열 저장
      • 한 테이블에 하나만 사용 가능
      • clob로 대체
      • 사용 영역의 제한
        • Selec문의 Selec절, Update문의 Set절, Insert문의 Values절에만 사용 가능
    • clob
      • Charactor Large Object의 준말
      • 대용량 문자 자료형
      • 한 칼럼이 4GB
      • 문자열에 관련된 함수의 제약이 있다
      • 가변 기억 공간
      • long과 다르게 한 테이블에 사용할 수 있는 칼럼 개수는 제한이 없다
      • 일부 기능은 DBMS_LOB API의 지원을 받아야 한다
    • nchar
      • 오라클은 기본적으로 아스키코드로 인코딩을 하는데 한글 등 UTF-8, 16을 사용해야 할 때 사용
      • 그냥 char를 사용해도 된다.
  2. 숫자 자료형
    • number[(정밀도)|*[, 스케일]]
      • 숫자의 크기를 입력해줄 필요가 없다
      • 정밀도 : 전체 자릿수(1~38)
      • 스케일 : 소수점 이하의 자릿수
        • number(5, 2) => 전체 5자리 중 소수점 이하가 2자리이고 이곳에는 소수점 3자리에서 반올림된 값이 저장. 정수 부분의 자리는 3자리
      • 정밀도 > 스케일 => 일반적인 케이스
      • 정밀도 < 스케일 => 매우 희귀한 케이스
  3. 날짜 자료형
    • date
      • 년, 월, 일, 시, 분, 초 자료를 저장하기 위한 자료형
      • 년월일과 시분초로 나누어지며 시분초를 안 쓰면 0시 0분 0초가 됨
      • +와 -연산의 대상
      • 정수를 더하거나 뺄 때는 day가 변함
      • day - day를 하면 두 일자의 차이가 나옴
      • sysdate = 시스템에서 제공하는 날짜 정보(우측 하단의 시간과 동일)
    • timestamp
      • 시간 대역(time zone) 정보를 포함한 날짜 정보를 저장
      • 10억 분의 1초 단위 사용
      • 종류
        • timestamp : 시간대 정보 없음
        • timestamp with local time zone : 서버가 설치된 시간대 정보로 보통 timestamp와 동일
        • timestamp with time zone : 시간대 정보(대륙명/도시명) 제공
  4. 기타 자료형
    • 2진 자료형 : 2진 데이터를 저장하기 위한 자료형 / 아래 자료형이 거의 비슷하다
    • raw
      • 상대적으로 작은 2진 자료 저장
      • 인덱스 처리 가능
      • 최대 2000byte까지 저장 가능
      • 16진수, 2진수 저장 가능
      • raw(size)
    • bfile(가장 많이 사용됨)
      • 대상이 되는 2진 자료는 데이터베이스 밖에 저장하고 DB에는 경로와 파일명만 저장
      • 4GB까지 저장 가능
      • 파일명은 영어 권장
      • 디렉터리(폴더)의 별칭은 30byte, 파일명은 256byte까지 사용 가능하다
      • 디렉터리 객체를 생성해 줘야 하며 위치 값은 절대 경로로 입력해 준다.
    • blob
      • 대상이 되는 2진 자료가 테이블 내부에 저장된다
      • 4GB까지 저장 가능
      • 일반적인 방법으로는 저장이 불가능하고(Insert 사용 불가), declare > begin > end를 사용해서 데이터를 저장해준다.

'DataBase > Oracle' 카테고리의 다른 글

8. Function - 문자열 함수  (0) 2021.06.22
7. 연산자(Operator)  (0) 2021.06.18
6. Selec  (0) 2021.06.14
5. DDL(Data Definition Language) - Drop  (0) 2021.06.14
4. DML(Data Manipulation Language) - insert  (0) 2021.06.14

-개요

JAVA는 문자열을 저장할 수 있는 기본 타입이 없다.

char를 생각했을 수도 있지만 char의 경우 한 글자씩만 표현이 가능하고 문자열은 저장을 할 수 없다.

그래서 문자열을 저장하기 위해 String의 참조타입이 나왔다.

 

-사용

String str1 = "안녕";
String str2 = new String("안녕");

두가지 방법으로 사용이 가능하다. 보통의 경우 str1의 방법으로 많이 사용을 하며 꼭 "(큰따옴표)로 묶어줘야 한다.

앞의 포스팅에서 기술 했듯이 str들의 문자가 같아도 참조하는 주소 값이, 실제로 저장되는 공간은 서로 다르기 때문에 ==같은 연산자를 사용했을 때 결괏값이 원하지 않는 방향으로 나온다.

 

new String으로 문자열을 선언하는 방식은 별로 좋지 않다.

스트링의 경우 스트링만 관리를 하는 String Pool이(Heap Area안에) 있다.

"안녕"이라고 선언후 또 "안녕"을 선언했을 때 String Pool안에 "안녕"이 있는지 확인을 하고 있다면 같은 주소 값을 참고한다.

이 경우 == 사용이 가능하다.

 

하지만 new를 사용했을때는  String Pool에 만들어지는 게 아니라 Heap Area에 따로 생성이 된다.

 

두 문자열이 같은지 확인을 하려면

String str1 = "안녕";
String str2 = "안녕";

System.out.println(str1.equals(str2));

//[문자열 변수].equals([같은지 비교할 변수 또는 "문자열"])

이렇게 .equals()를 사용해주면 된다.

위의 코드는 String Pool에 의해 관리되어 같은 주소 값을 갖고 있어 ==이 가능하지만 equals를 사용해보기 위해 간단하게 작성했다.

+ Recent posts