본문 바로가기

분류 전체보기

(102)
[Database] JOIN 비교 (INNER JOIN, OUTER JOIN, FULL JOIN) 일하면서 DB를 써본 적이 없어서.. 기억이 잘 나지않아 정리해보았다. Join (조인) - 두 개의 테이블의 데이터를 묶어 한번에 조회할 때 사용한다. 두 테이블을 어떻게 결합하느냐에 따라 조회 결과가 달라진다. INNER JOIN (이너 조인) STUDENT 테이블과 GRADE 테이블의 교집합이다. 쿼리 SELECT * FROM STUDENT INNER JOIN GRADE ON STUDENT.ID = GRADE.ID 두 테이블에 모두 공통으로 존재하는 ID들만 조인되어 다음과 같은 결과가 나온다. OUTER JOIN (아우터 조인) 특정 테이블을 기준으로 조회한다. LEFT OUTER JOIN은 왼쪽 테이블 (STUDENT) 기준, RIGHT OUTER JOIN은 오른쪽 테이블 (GRADE) 기준, ..
[디자인패턴] Chapter 07. 어댑터 패턴과 퍼사드 패턴 어댑터 패턴 (Adapter Pattern) 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환한다. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와준다. 객체지향 어댑터 - 예) 어떤 소프트웨어 시스템에 새로운 업체에서 제공한 클래스 라이브러리를 사용해야 하는데, 그 업체에서 사용하는 인터페이스가 기존에 사용하던 인터페이스와 다른 경우 사용 가능한 인터페이스로 한번 감싸서 사용한다. 오리 어댑터 1. 어댑터 적용 전 IDuck 인터페이스를 구현하는 MallardDuck ITurkey 인터페이스를 구현하는 WildTurkey // 오리 인터페이스 internal interface IDuck { public void Quack(); public void Fl..
BLS 일반인 심화과정 수강 후기 평소에 CPR을 배워두면 좋겠다고 생각만 하다가 이태원 사건을 보고 난 후 이왕 배울거 하루 빨리 배워두는 게 좋을 것 같아 수강신청을 하였다. 신청 방법 1. 대한심폐소생협회 사이트 접속 https://www.kacpr.org/ 2. 일반인 교육과정 > 교육과정 신청하기 3. 지역 선택 > 일반인 심화 클릭 * 일반인 기초는 성인 대상, 일반인 심화는 성인과 소인 대상으로 강의를 진행하며 기도폐쇄 처치도 추가로 진행된다고 해서 심화과정으로 신청했다. 원하는 장소와 시간대를 선택한 후 교육 신청 버튼을 눌러 신청한 후 입금한다. 교육기관마다 방식이 달라 글을 잘 읽어보는 것이 좋다. (한 곳은 교육 신청 후 선정문자를 받아야 입금이 가능했고, 다른 한 곳은 교육신청 후 바로 입금하였다. 입금했는데 선정이..
[디자인패턴] Chapter 05. 싱글톤 패턴 싱글톤 패턴 (Singleton Pattern) 생성자를 여러차례 호출하여도 무조건 하나의 객체만 생성하도록 하고, 그 객체로의 전역 접근을 제공 public sealed class Singleton { private static Singleton? uniqueInsance = null; /// /// private 생성자 => Singleton 클래스 내에서만 객체 생성 가능 /// private Singleton() { } public static Singleton GetInstance() { // null인 경우에만 객체를 새로 생성 if (uniqueInsance is null) uniqueInsance = new Singleton(); // null이 아니면 기존 객체 리턴 return uniq..
[디자인패턴] Chapter 03. 데코레이터 패턴 데코레이터 패턴 (Decorator Pattern) 기존 클래스 코드를 바꾸지 않고도 객체에 추가 요소를 동적으로 더할 수 있다. 기능의 유연한 확장을 위해 상속대신 객체를 장식(decorator)한다. 디자인 원칙 OCP (Open-Closed Principle) : 클래스는 확장에는 열려 있어야 하지만 변경에는 닫혀 있어야 한다. => 기존 코드는 건드리지 않고(Closed), 새로운 기능을 추가(Open)할 수 있어야 한다. ※ 무조건 OCP를 적용한다면 시간을 낭비할 수 있으며, 추상화를 하다 보면 필요 이상으로 복잡하고 이해하기 힘든 코드를 만들게 될 수 있다. 가장 바뀔 가능성이 높은 부분을 중점적으로 살펴보고 OCP를 적용하는 것이 좋다. 초대형 커피 전문점, 스타버즈 - 다양한 음료를 모두..
[Revit API] 버튼 생성 Revit이 실행될 때 처음 호출되는 OnStartup에서 원하는 곳에 버튼을 생성하여 붙여주면 된다. 1. OnStartup() 2. PushButtonData 생성 버튼 명칭, dll 위치, 버튼을 클릭했을 때 실행될 클래스 패스(네임스페이스.클래스명) 를 입력해주면 된다. (클래스는 하단 4번 항목 참고) 3. RibbonPanel 생성하여 Panel에 2번에서 생성한 버튼 추가 RibbonPanel을 panel 이름만 주어 생성하게 되면 기본적으로 애드인 탭에 생성된다. RibbonTab을 별도로 생성하여 이곳에 붙이고 싶은 경우, RibbonTab도 생성하면 된다. 4. 버튼을 클릭했을 때 실행될 클래스 생성 버튼 클래스는 IExternalCommand 인터페이스를 상속받도록 한다. 버튼을 클릭..
[Revit API] 프로젝트 생성 1. Visual Studio 프로젝트 생성 2. 파일 삭제 아래 세 파일은 필요하지 않으므로 삭제한다. 3. cs 파일 추가 4. IExternalApplication 인터페이스 상속 Revit에 애드인을 추가하려면 위 인터페이스를 상속받아야 한다. 추가하면 위와 같이 오류가 나는데 아래와 같이 dll 파일들을 참조하면 된다. 5. 참조 추가 6. 찾아보기 7. Revit 설치 폴더 선택 (C:\Program Files\Autodesk\Revit 버전) 8. RevitAPI.dll, RevitAPIUI.dll 선택 - 확인 9. 참조에 두 dll 파일이 추가된 것을 확인 10. using Autodesk.Revit.UI; 추가 11. IExternalApplication 인터페이스를 상속받으면 OnSt..
[JavaScript / ES6] 화살표 함수 화살표 함수는 ES6에 추가된, 함수를 정의할 수 있는 또 다른 방법이다. function order(name, menu) { return `${name}님이 ${menu}를 주문하셨습니다.`) } console.log(order('manzoo', 'pizza')) 화살표 함수를 사용하면 간단하게 함수를 만들 수 있다. function 키워드를 쓰지 않아도 되며, return도 생략 가능하다. (아래와 같이 한 줄로 값을 반환할 때만 생략할 수 있다.) const order = (name, menu) => `${name}님이 ${menu}를 주문하셨습니다.` console.log(order('manzoo', 'pizza')) 파라미터가 없는 경우에는 빈 괄호를 표시하며, 하나일 때는 괄호를 생략할 수 있..