본문 바로가기

전체 글

(7)
SQL 성능/관리 이슈 비 표준 구문 사용 SARG 위반 ex) where 절에 index를 가지고 있는 col에 함수를 사용해서(컬럼을 가공) 인덱스를 사용하지 못한 경우 불필요한 I/O 유발 불필요한 임세테이블/변수 사용 불필요한 Cursor / Loop 사용 부적절한 함수 / 뷰 사용 부적합한 프로시저 내부 코드 구성 부적절한 만능 조회
function - 포인터 인자, 배열 인자 포인터를 배우면서 포인터가 어디에 쓰이는지에 대한 의문이 많이 들었다. 그래서 이번엔 함수에서 포인터를 어떻게 사용하는지에 대해서 공부할 것이다. 먼저, 단순한 형태의 함수의 예를 들어보자. #include void val_test_f(int i) { i = 20; } int main() { int i = 10; val_test_f(i); printf("함수 호출 후 i값 : %d ", i); return 0; } 위의 예와 같이 return을 사용하지 않고 main 함수에서 정의한 i의 값을 피호출 된 함수(val_test_f)에서 바꿀 수 없다. 조금 더 구체적으로 C언어의 메모리 구조를 통해서 이해해보자. 메모리 구조 프로그램을 실행시키기 위해서 메모리 공간이 필요한데 스택(Stack), 힙(Hea..
포인터의 이해(3) - 포인터와 1차원, 2차원 배열 / 더블포인터 / 배열의 포인터 / 포인터 배열 1차원 배열과 포인터 배열 arr를 출력하면 arr[0]의 주소값이 출력된다고 했다. 또한, [] 연산자는 * (arr + i) 로 바뀌어서 []안에 있는 숫자에 해당하는 위치의 값을 출력한다고 배웠다. 다른 int* 포인터가 이 배열을 가리킬 수 있는지 확인해보자. #include int main() { int arr[] = { 1,2,3,4,5 }; int* p ; p = &arr[2]; printf("arr : %d \n", arr[1]); printf("arr2 : %d ", p[1]); return 0; } int 형을 가리키는 포인트 변수 p를 정의하고, p = &arr[2]; 를 통하여 p에 arr[2]의 주소값을 대입하였다. 그리고 p[1]를 실행하면 *(p + 1) 로 바뀌어서 arr[3..
포인터의 이해(2) - 상수 포인터, 포인터의 덧셈과 뺄셈, 배열과 포인터의 관계, [] 연산자 상수포인터 const 키워드를 붙여 데이터를 상수(바뀌지 않은 값)로 만들 수 있다. 포인터 또한, const 키워드를 붙여 상수로 만들 수 있다. 예를 들어보며 이해해보자 #include int main() { int a; int b; const int* p = &a; p = &b; //올바른 문장 *p = 3; //올바르지 않은 문장 return 0; } 다음 예시는 컴파일을 했을 경우 에러가 난다. const int* 의 의미는 const int 형 변수를 가리킨다는 의미가 아니고, int 형 변수를 가리키는데 그 값을 절대로 바꾸지 말라는 의미이다. 즉, p는 int형 변수를 가리키고 있고 const가 붙어있어서 p가 가리키는 변수의 값이 바뀌면 안되는 것이다. 여기서 변수 a는 값이 자유롭게 바..
포인터의 이해(1) - *, & 연산자의 의미 C언어를 공부하게 되면서 C언어의 꽃인 포인터를 정리해보았다. 먼저, 포인터를 정리하기 전에 메모리의 주소에 대해서 이해해보자. 메모리 주소 데이터들은 특정 메모리 공간에 저장되어 있는데 공간 하나당 보통 1 바이트이다. 예를 들어, int형 변수를 정의하면 4바이트의 크기를 가지고 있어 4칸을 차지하게 된다. int a = 1234; 이처럼 int 변수 a를 정의하면 해당 데이터가 저장되는 방의 주소(0x134232)가 붙여진다. 이 주소를 통해서 데이터를 가져오게 된다. 다시 말해서, 변수는 운영체제로부터 자신의 크기만큼 각 메모리를 할당 받는다. 그리고 그 영역에 값을 저장하여 사용한다. 그리고 각 메모리는 바이트 단위마다 주소를 가지고 있고, 그 주소를 통하여 해당 변수의 값을 가져올 수 있다. ..
입출력 스트림(InputStream, OutputStream), 버퍼(Buffer)의 개념 백준의 알고리즘에서 입출력 관련 문제를 풀 때 항상 Scanner 사용법만 외워서 입력받아 문제를 풀면서 Buffer와 Stream의 정확한 개념에 대해 공부할 필요성을 느꼈다. Scanner의 경우에 스페이스와 개행 문자를 통하여 입력 값을 인식하므로 따로 가공할 필요가 없지만, BufferedReader의 경우에는 엔터만 경계로 인식하고 받은 데이터가 String으로 고정되기 때문에 데이터를 따로 가공해야 한다. 그러나 Scanner에 비하면 상대적으로 빠르기 때문에 많은 데이터를 입력받아야 하는 상황에서는 BufferedReader를 이용하는 것이 더 효율적이다. 모든 것을 한 번에 알기엔 많은 내용이라 차근차근 정리해가며 공부해보자 스트림(Stream)이란? FIFO구조 단방향 지연(Blockin..
자바 표준 입력 스캐너(Scanner) 클래스의 사용 방법과 주의할 점 ✓ Scanner Class란?자바의 입력 방식 중에 가장 대중적인 것이 자바 기존 입력 클래스인 스캐너(Scanner) 이다.기본적인 데이터 타입(정수, 실수, 문자열 등)을 Scanner 클래스를 사용하여 입력받을 수 있다. Scanner를 사용하기 위해서 util 패키지에 있는 Scanner 클래스를 import 해야한다. 또한, 입력 메소드 대부분은 공백과 개행(' ', '\n, \t, \r 등')을 기준으로 읽어 들인다. 공백과 개행을 기준으로 구분되는 요소를 토큰(token)이라고 한다. Scanner 클래스는 입력 값을 대부분 토큰 단위로 읽고(nextLine()은 Enter 단위로 읽음), 이 토큰을 반환하는 데이터 형태에 따라 몇가지 메서드가 Scanner 클..