'C#' 카테고리의 다른 글
[C++] 격주간 공부내용 - 9장.객체지향 설계 원칙, 10장 템플릿 (0) | 2024.06.09 |
---|---|
[C++] Task Manager - Day 1 (0) | 2024.05.26 |
[C#] C++과 C#의 차이점은 (2) | 2024.01.02 |
[C#] 어디에 사용할 수 있는지? (0) | 2023.12.24 |
[C++] 격주간 공부내용 - 9장.객체지향 설계 원칙, 10장 템플릿 (0) | 2024.06.09 |
---|---|
[C++] Task Manager - Day 1 (0) | 2024.05.26 |
[C#] C++과 C#의 차이점은 (2) | 2024.01.02 |
[C#] 어디에 사용할 수 있는지? (0) | 2023.12.24 |
XAML 은 C#에서 화면을 설계하는데 도움을 주는 역할을 한다.
레이아웃이라하면, 화면에서 내가 배치하고 싶은 것들을 어떻게 배치할 것인지에 대한 방식을 말한다.
레이아웃의 종류는 굉장히 다양하다.
Grid, Canvas, DockPanel, StackPanel, WrapPanel 등이 존재한다.
하나씩 확인을 해보도록 하자.
말 그대로, 빈 캔바스를 의미한다.
WPF 를 아직은 많이 짜본것은 아니지만, 그래도 지금까지 사용하면서 이 DockPanel 을 가장 많이 사용했던 것 같다.
참고자료 :
https://learn.microsoft.com/ko-kr/dotnet/desktop/wpf/controls/dockpanel?view=netframeworkdesktop-4.8
DockPanel - WPF .NET Framework
레이아웃 컨테이너의 가장자리를 따라 자식 콘텐츠를 배치하는 데 사용되는 DockPanel 요소에 대해 알아봅니다.
learn.microsoft.com
https://docs.devexpress.com/WindowsForms/DevExpress.XtraBars.Docking.DockPanel._properties
DockPanel Properties | WinForms Controls | DevExpress Documentation
Thanks for your feedback! Close
docs.devexpress.com
https://just-my-blog.tistory.com/18
[XAML] 레이아웃 종류 알아보기 + 예제 정리
레이아웃이란? 화면에 구성요소를 배치하는 방식이다. XAML에는 여러 방식의 레이아웃이 있다. Canvas 모눈종이. Canvas의 자식 요소는 크기가 조정되지 않고 지정된 좌표에 배치된다. Canvas 크기가
just-my-blog.tistory.com
https://blog.naver.com/lakingdamus/150188911424
[WPF] U.I Panel(Dock Pannel) #3
[그림 1] 3. Dock Pannel(학습 문서) WPF에서 제공되는 DockPanel 클래스는 도킹에 대...
blog.naver.com
6/10 월요일 학습조직 발표할 내용 :
8장 일부 (객체지향 기능들) p300~333, 9장 객체지향 설계원칙 p352~375, 10장 템플릿 p377~399
9장
09-1. 단일 책임 원칙 (SRP)
Single Responsibility
클래스는 한 가지 기능만 수행해야 하고, 한가지 이유로만 변경해야 한다.
즉, 클래스를 설계할 때 역할을 복잡하지 않게 해야한다는 의미.
한가지 기능을 수정할 때, 여러개의 클래스를 수정해야하마면 유지보수성이 떨어진다.
-> 산탄총 수술 (shotgun surgery) : 탄흔이 여러개 남는 샷건을 수리하는 것과 같다.
기능을 수정할 때, 여러 클래스가 변경도지 않아야 하는 것.
변경된 클래스가 다른 클래스에 영향을 주지 않아야 하는 것.
설계 측면에서, 상속관계 보다는 컴포지션이나 어그리게이션을 적극 활용하는 방법
------------------------------
컴포지션? : Composition, 컴포지션은 분리한 클래스를 포함(part-of)하는 개념
어그리게이션? : Aggregation, 어그리게이션은 분리한 클래스를 사용(has-a)하는 개념
이 두 기능은 다중상속의 대안으로 사용된다.
컴포지션
클래스가 가져야할 특징을 다른 클래스로부터 상속받는 것이 아니라, 멤버 변수로 포함하는 개념.
즉, 재사용할 속성과 기능을 별도의 클래스로 분리하고, 이 클래스의 객체를 멤버 변수로 포함
분리한 클래스의 객체는 이를 멤버 변수로 포함한 클래스에서 생명주기를 직접 관리하기 때문에, 논리적으로도 완전히 포함관계.
두 클래스의 생명주기는 같다.
어그리게이션
컴포지션처럼 재사용할 속성과 기능을 별도의 클래스를 분리하고 객체를 멤버 변수로 포함하는 것은 동일.
어그리게이션은 분리된 클래스의 객체를 포인터나 레퍼런스 변수로 포함.
09-2. 개방/폐쇄 원칙 (OCP)
Open-Closed
확장에는 개방되어 있고, 수정에는 닫혀 있어야 한다.
동적 바인딩이 가장 잘 설명해준다. 동적 바인딩을 이용하면 새로운 기능을 추가할 수 있는 방법이 생기며, 다른 코드에 파급 효과가 없어 추가되는 기능 외에는 수정이 필요 없다.
예시) 카페에서 주문을 받고 커피를 만드는 과정을 생각해보자.
점원은 고객으로부터 주문을 받고, 커피를 내리고, 다 만들어지면 고객을 호출하는 일련의 과정.
카페에서 새로운 메뉴를 추가(기능 확장에 개방)한다고 해서 주문하는 방식이 바뀌지는 않는다(수정에 폐쇄적). 점원이 새로운 메뉴를 만드는 방법만 배우면 된다.
09-3. 리스코프 치환 원칙 (LSP)
Liskov Substitution
하위 클래스는 상위 클래스를 대체할 수 있어야 한다.
바바라 리스코프가 OOPSLA '87 기조연설로 발표한 'Data abstraction and hierarchy'에서 소개한 개념, 다형성의 동작 원리를 설명.
09-4. 인터페이스 분리 원칙 (ISP)
Interface Segregation
C++ 표준 명세에는 인터페이스에 대한 공식 정의가 없음. 인터페이스라 하면 순수 가상 함수만으로 구성된 추상클래스를 떠올리면 된다.
단일책임원칙(SRP)를 인터페이스에 적용한 것.
인터페이스를 상속받은 클래스는 인터페이스를 구현해야 한다. 인터페이스를 구현하다 보면, 여러가지 역할을 수행하는 인터페이스를 구현하게 된다.
인터페이스는 작고 섬세해야 하고, 클래스는 필요한 인터페이스만 구현해야 한다.
09-5. 의존성 역전 원칙 (DIP)
Dependency Inversion
상위 수준 모듈은 하위 수준의 모듈에 의존해서는 안 되며, 상위/하위 수준 모두 추상레이어(인터페이스)에 의존해야 한다.
------------------------------
Factory Method 패턴? : 객체를 만들기 위한 인터페이스를 정의하나, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 하위 클래스가 결정하도록 하는 패턴.
즉, 객체 생성 처리를 서브클래스로 분리하여 처리하도록 캡슐화 하는 패턴.
장점 :
객체의 자료형이 자식 클래스에서 결정되므로 확장에 용이하다. 서브클래스에서 상위 클래스의 정확한 타입을 몰라도 되기 때문.
DIP 적용
단점 :
새로 생성할 객체의 종류가 늘어날 때 마다 서브클래스 재정의로 인한 불필요한 클래스 생성 가능성이 있다.
10장 템플릿
템플릿을 이용하면 함수 하나로 다양한 형식의 데이터를 같은 알고리즘으로 처리할 수 있음.
중복된 코드를 줄이고 함수가 변경될 때 대응하기 편리.
템플릿을 선언할 때 template keyword 사용
#include <iostream>
#include <string>
using namespace std;
// 함수 템플릿 선언과 정의
template <typename T> // 템플릿 선언
T data_sum(T operand1, T operand2) { // 함수 템플릿 정의
return operand1 + operand2;
}
int main() {
int data1 = 3, data2 = 5;
double data3 = 4.5, data4 = 8.9;
string data5 = "Hello, ", data6 = "World!";
char data7[] = "Hello, ", data8[] = "New World!";
cout << "정수형 데이터 합: " << data_sum(data1, data2) << endl;
cout << "실수형 데이터 합: " << data_sum(data3, data4) << endl;
cout << "문자열 데이터 합: " << data_sum(data5, data6) << endl;
// 사용할 수 없는 인자 예제
//cout << "문자데이터 배열의 합" << data_sum(data7, data8) << endl;
cout << "문자데이터 배열의 합: " << data_sum<string>(data7, data8) << endl;
return 0;
}
QUIZ ::
1. 객체지향 설계원칙 SOLID란?
C# 을 이용한 UDP 소켓 통신 (0) | 2024.08.12 |
---|---|
[C++] Task Manager - Day 1 (0) | 2024.05.26 |
[C#] C++과 C#의 차이점은 (2) | 2024.01.02 |
[C#] 어디에 사용할 수 있는지? (0) | 2023.12.24 |
//
// main.cpp
// TaskManager
//
// Created by 이강훈 on 2024/05/26.
//
#include <iostream>
#include <chrono>
#include <thread>
#include <vector>
#include <algorithm>
using namespace std::chrono;
int main(int argc, const char * argv[]) {
std::cout << "Hello, World!\n" << std::endl << std::endl;
// std::chrono::seconds five_seconds = std::chrono::seconds(5);
auto five_seconds = 5s;
// auto 키워드 잘 기억해둘것.
auto custom_five_seconds = duration<double, std::ratio<5/1>>(1);
// 실행시키면 5초동안 기다렸다가 프로그램이 종료된다
std::this_thread::sleep_for(five_seconds);
/*
auto day = 24h;
auto my_seconds = seconds(day);
std::cout << my_seconds.count();
*/
auto time_point = system_clock::now();
std::cout << duration_cast<days>(time_point.time_since_epoch()).count() << std::endl;
auto old = steady_clock::now();
std::vector<int> v(1000000);
std::cout << std::count_if(v.begin(), v.end(), [](int i){return i==0;} ) << std::endl;
auto dur = steady_clock::now() - old;
std::cout << duration_cast<microseconds>(dur).count() << std::endl;
return 0;
}
회사에서 공부하는 조직을 만들어서 운영을 하고 있는데, 미니 프로젝트 주제를 각자 하나씩 잡아서 구현을 하는걸 목표로 삼았다.
내가 잡은 목표는, C++로 Task Manager를 만들어서 그날 그날의 업무를 관리할 수 있는 프로그램을 만드는 것이다.
필요한 기능은 다음과 같다.
① 그날 그날의 업무 기록
② 목표로 설정한 타이머
③ 현재 시간
+ 기본적인 기능은 이렇고, 더 추가가 될 수 있는 부분은 천천히 추가하는걸로.
맥북을 사용하지만, C++를 맥북으로 개발해본적이 없어서, 창피하게도 Xcode를 처음으로 사용해보았다.
chrono library 를 사용해서,
auto 키워드를 사용할 경우, 어떻게 되는지 살펴보자.
auto 키워드 : C++ 표준에 기록되어 있는 auto라는 키워드는 원래 의미와 수정된 의미가 정의되어 있다. C++11전에는 auto는 자동 저장소 클래스에 있는 변수, 지역변수를 선언하는 역할을 했었다. 그러나 C++11부터 auto라는 키워드는 선언의 초기화 식에서 형식이 추론되는 변수를 선언하는 역할을 하고 있다. 이러한 차이 때문에 C++버전에 따라 auto라는 키워드는 다르게 동작 할 수 있다.
위에가 endl
아래가 개행문자 ("\n")
개행문자가 더 빠르다?
//
// main.cpp
// TaskManager
//
// Created by 이강훈 on 2024/05/26.
//
#include <iostream>
#include <chrono>
#include <thread>
#include <vector>
#include <algorithm>
using namespace std;
using namespace std::chrono;
int main(int argc, const char * argv[]) {
auto old = steady_clock::now();
for (int i = 0; i < 1'000'000; i++) {
cout << i << " test" << endl;
}
auto test1 = steady_clock::now() - old;
old = steady_clock::now();
for (int i = 0; i < 1'000'000; i++) {
cout << i << " test" << "\n";
}
auto test2 = steady_clock::now() - old;
cout << duration_cast<microseconds>(test1).count() << endl;
cout << duration_cast<microseconds>(test2).count() << endl;
}
C# 을 이용한 UDP 소켓 통신 (0) | 2024.08.12 |
---|---|
[C++] 격주간 공부내용 - 9장.객체지향 설계 원칙, 10장 템플릿 (0) | 2024.06.09 |
[C#] C++과 C#의 차이점은 (2) | 2024.01.02 |
[C#] 어디에 사용할 수 있는지? (0) | 2023.12.24 |
C# C++
C# | C++ |
Delegate | Pointe |
군용 항공전자
C# 을 이용한 UDP 소켓 통신 (0) | 2024.08.12 |
---|---|
[C++] 격주간 공부내용 - 9장.객체지향 설계 원칙, 10장 템플릿 (0) | 2024.06.09 |
[C++] Task Manager - Day 1 (0) | 2024.05.26 |
[C#] 어디에 사용할 수 있는지? (0) | 2023.12.24 |
C#을 공부를 시작하긴 했지만, 어떤 언어든지 간에 항상 제일 먼저 드는 생각은, 도대체 이걸 배워서 어디에 써먹을 수 있을지에 대한 궁금증인 것 같다.
대학에 처음 들어와서 C언어를 배우기는 했었지만 학습속도가 떨어졌던 이유는, 당최 그 언어를 배워서 무엇에 활용할 수 있는지에 대한 갈증이 해소가 되지 않은채 계속 시험만 보고 과제를 하다보니 학습 동기부여가 확실하게 떨어졌던 기억이 난다.
프로그래밍 언어는, 그 용도가 확실하다. 내가 무엇이 하고 싶은지, 혹은 무엇을 만들고 싶은지에 따라서 해당 언어를 골라서 학습하면 된다. 다음은 C#을 이용하여 할 수 있는 것들이다.
1. 윈도우 프로그램
Windonws 운영체제에서 동작하는 환경의 프로그램을 개발할 때에 C# 을 활용할 수 있다. 예제로 쉽게 만들 수 있는 것 중에 하나가 계산기 프로그램이나 메모장 프로그램이다. 워드나 파워포인트 역시 C#을 이용하여 만들 수 있다. 내가 이번에 C# 공부를 시작하게 된 이유 중 하나도 바로 이것이다.
2. 유니티 Application
유니티는 게임을 제작하는데 사용하는 엔진이다. 이전에 방학을 이용해서 유니티를 이용한 메타버스 환경 구축 수업을 들은 적이 있었는데, 그때는 나와 참 맞지 않는다고 생각을 했었고, 지금도 그 생각에는 변함이 없다. 아무튼 C# 을 이용해서 게임 내의 사물들(각각의 사물이나 행위들 일체를 객체라고 부른다)을 조작할 수 있다.
3. Web App
웹 개발 역시 C# 을 이용해서 할 수 있다. 잠깐 C# 실습을 해보았는데, WPF 프로그램을 만들때 HTML 만큼 쉽고 직관적으로 XAML을 이용하여 프로그램 UI를 설계할 수 있다는 점이 아주 인상적이었다.
C# 을 이용한 UDP 소켓 통신 (0) | 2024.08.12 |
---|---|
[C++] 격주간 공부내용 - 9장.객체지향 설계 원칙, 10장 템플릿 (0) | 2024.06.09 |
[C++] Task Manager - Day 1 (0) | 2024.05.26 |
[C#] C++과 C#의 차이점은 (2) | 2024.01.02 |