본문 바로가기

전체 글

캡슐화, 상속, 다형성 그리고 OCP 원칙 1. Intro (목적) 객체지향 프로그래밍(OOP)의 기본 원칙인 캡슐화, 상속, 다형성, 그리고 추가적으로 객체지향 설계 원칙 중 하나인 개방-폐쇄 원칙(Open-Closed Principle, OCP)에 대해 살펴보고자 한다. 해당 원칙들을 코드의 재사용성, 유지보수성, 확장성을 높이는 데 중요한 역할을 한다. 하지만 이렇게 말로만 들으면 추상적이고 와닿지 않으니 해당 원칙들을 직접 체감하기 위해 온라인 패션 스타일링 서비스라는 상황을 설정하여 구현해보고자 한다. 2. 상황 설정 : 온라인 패션 스타일링 서비스 개요 : 사용자의 취향과 요구에 맞춰 개인화된 패션 스타일링을 제공하는 온라인 서비스가 있다고 가정하자. 개선 전 : 스타일링 제안(예: 캐주얼 룩, 비즈니스 룩, 이브닝 룩)마다 클래스를 .. 더보기
서브 쿼리(SUBQUERY) 1. 서브 쿼리란? 서브쿼리란 SQL 문장 내에서 다른 SQL 문장을 내포하는 쿼리를 말한다. 한 SQL 문장이 실행될 때, 내부적으로 다른 SQL 문장이 먼저 실행되고, 그 결과를 바탕으로 외부 SQL 문장이 실행되는 방식으로 작동한다. 2. 서브 쿼리와 성능의 상관관계 서브쿼리는 데이터를 필터링, 정렬, 집계하는데 유용하고 복잡한 데이터 관계 해결에도 쓰이는 강력한 도구이지만, 성능에 상당한 영향을 미칠 수 있음에 유의해야 한다. 서브쿼리로 인한 성능 저하를 개선하는 방법으로는 무엇이 있을까? 조인으로 대체 : 조인으로 대체가 가능한 경우라면 서브쿼리 대신 조인을 사용하는 것이 좋다. 조인은 데이터베이스가 더 효율적으로 처리할 수 있는 보다 최적화된 방법이 될 수 있다. 인덱스 활용 : 서브쿼리와 메.. 더보기
외래 키(Foreign Key) 1. '외래 키(Foreign Key)' 란 무엇인가? 외래 키는 하나의 테이블에 있는 필드(또는 필드 집합)로 다른 테이블의 기본 키(Primary Key)를 참조한다. 두 테이블간의 관계, 논리적인 연결을 생성하는데 사용된다. 데이터베이스에서 데이터 간의 관계를 명확히 하고, 데이터의 정확성과 무결성을 유지하는 역할을 한다. 외래 키 제약 조건을 설정하여 참조 무결이 위반되는 데이터의 추가, 수정, 삭제를 방지할 수 있다. 예시 1. 고객과 주문 상황 : 고객이 온라인 쇼핑몰에서 주문을 한다. DB 설계 : 'Customers' 테이블에는 고객 정보가 저장되며 'Orders' 테이블에는 주문 정보가 저장된다. 외래 키의 사용 : Orders 테이블의 CustomerID(외래 키) ... Custome.. 더보기
엑셀 업로드 기능 구현 엑셀 파일을 업로드해서 해당 파일 안의 데이터를 데이터베이스에 넣는 기능을 구현했다. poi 라이브러리를 활용했으며 엑셀 업로드 기능을 구현한 소스를 공유하고자 한다. 구글링해서 나온 소스와 일부 내용을 수정하여 정리했다. 1. pom.xml에 Dependency 추가하기 org.apache.poi poi 3.11 org.apache.poi poi-ooxml 3.11 2. ExcelFileType.java : 엑셀 파일 확장자 비교 -> Workbook 객체에 초기화 package com.ctit.helper; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import org... 더보기
MySQL 메모 및 Tip 1. 데이터베이스(스키마) 데이터베이스 : 데이터를 저장하는 공간 = 스키마 : MySQL안의 데이터베이스. 데이터베이스와 동일한 용어라고 생각해도 된다. 데이터베이스 만들기(선) -> 테이블 만들기(후) 데이터베이스를 먼저 만들어야 그 안에 테이블을 생성할 수 있고 그 테이블 안에서 데이터의 입력/수정/삭제/조회 등이 가능하다. SHOW DATABASES; USE mydata; SHOW TABLES; DESC customer_db; 2. 테이블 구조 변경하기 1. 테이블에 새로운 컬럼 추가 ALTER TABLE mytable ADD COLUMN model_type varchar(10) NOT NULL; 2. 테이블 컬럼 타입 변경 ALTER TABLE mytable MODIFY COLUMN name v.. 더보기
포인터 대상의 const 선언 const 선언의 핵심 : 값을 변경하는 방법에 제한을 둔다. 이것은 엄밀히 말해 무엇인가를 상수로 만드는 것과는 다르다. 1. const int* ptr=# 포인터 변수가 참조하는 대상의 변경을 허용하지 않는 const 선언 해당 const 선언의 위치는 맨 앞부분이다. 의미 : 포인터 변수 ptr을 이용해서 ptr이 가리키는 변수에 저장된 값을 변경하는 것을 허용하지 않는다. 2. int* const ptr=# 포인터 변수의 상수화 포인터 변수 ptr은 상수가 된다. 이는 한번 주소값이 저장되면 그 값의 변경이 불가능하다. 즉, 한번 가리키기 시작한 변수를 끝까지 가리켜야 한다. 물론 ptr이 상수일 뿐이니 *ptr=40;과 같이 ptr이 가리키는 대상에 저장된 값을 변경하는 연산은 문.. 더보기
포인터와 배열, 포인터 연산 [1] 배열의 이름 배열의 이름은 포인터이다. 단, 그 값을 바꿀 수 없는 '상수 형태의 포인터'이다. 배열의 이름은 배열의 시작 주소 값을 의미하며, 그 형태는 값의 저장이 불가능한 상수이다. 배열의 이름도 포인터이므로 배열의 이름을 피연산자로 하는 * 연산이 가능하다. 위의 말들이 무슨 뜻인지 부연설명하면, 배열의 이름이 "상수 형태의 포인터"라는 개념은 C 언어에서의 배열과 포인터 사이의 관계를 설명하기 위한 개념이다. 이것은 배열과 포인터 간의 유사성을 강조하는 방식으로 설명할 수 있다. 1. 배열의 이름은 포인터 상수(constant pointer)이다. 배열을 선언하면 배열의 이름은 해당 배열의 첫 번째 요소를 가리키는 포인터 상수로 간주된다. 이 포인터는 상수이기 때문에 다른 메모리 주소로 .. 더보기
배열 기반의 문자열 표현 [배열기반의 문자열 표현] #define _CRT_SECURE_NO_WARNINGS #include int main(void) { char str[50]; int idx = 0; printf("문자열 입력 : "); scanf("%s", str); printf("입력 받은 문자열 : %s\n", str); printf("문자 단위 출력 : "); while (str[idx] != '\0') { printf("%c", str[idx]); idx++; } printf("\n"); return 0; } 위의 코드를 실행할 때 문자열 Hello World!를 입력하면 위와 같이 Hello까지만 입력받을 수 있다. 왜 공백 문자 뒤에 있는 World!는 입력받지 못하는 것일까? Hello 바로 뒤에는 공백문자(널.. 더보기