https://youtu.be/2rXLncQD27c

class Complex
{
public:
	Complex()
	{
		real = 0;
		imag = 0;
	}

private:
	double real;
	double imag;
	
};
class Complex
{
public:
	Complex(): real(0),imag(0){}
private:
	double real;
	double imag;
	
};
class Complex
{
public:
	Complex(double real_= 0, double imag_= 0)
	{
		real = real_;
		imag = imag_;
	}
private:
	double real;
	double imag;
	
};
class Complex
{
public:
	Complex(double real_ = 0, double imag_ = 0) : real(real_),imag(imag_){}
private:
	double real;
	double imag;
	
};
class Complex
{
public:
	Complex(double real = 0, double imag = 0) : real(real), imag(imag) {}
private:
	double real;
	double imag;
	
};

https://youtu.be/YL8SgKEyRu4

main.cpp

#include <iostream>

using std::cout;
using std::cin;
using std::endl;


class Complex
{
public:
	Complex()
	{
		real = 0;
		imag = 0;
	}
	Complex(double real_, double imag_)
	{
		real = real_;
		imag = imag_;
	}

	double GetReal()
	{
		return real;
	}

	void SetReal(double real_)
	{
		real = real_;
	}

	double GetImag()
	{
		return imag;
	}

	void SetImag(double imag_)
	{
		real = imag_;
	}

	~Complex()
	{

	}

private:
	double real;
	double imag;
	

};


int main()
{
	Complex c1;
	Complex c2 = Complex(2, 3);
	Complex c3(2, 3);
	Complex c4 = { 2,3 };

	cout << "c1 = "<< c1.GetReal() << ","<< c1.GetImag()<< endl;
	cout << "c2 = "<< c2.GetReal() << ","<< c2.GetImag()<< endl;
	cout << "c3 = "<< c3.GetReal() << ","<< c3.GetImag()<< endl;
}

 

https://youtu.be/iIQXlLv_yHI

main.cpp

#include <iostream>

using namespace std;


// private: protected: public:

struct TV
{
//private:
	bool powerOn;
	int channel;
	int volume;

public:
	void on()
	{
		powerOn = true;
		cout << "TV를 켰습니다." << endl;
	}

	void off()
	{
		powerOn = false;
		cout << "TV를 껐습니다." << endl;
	}
	void setChannel(int _cnl)
	{
		if(_cnl >= 1 && _cnl <= 999)
		{
			channel = _cnl;
			cout << "채널을" << _cnl << "으(로) 바귔습니다." << endl;
		}
	}

	void setVolume(int _vol)
	{
		if (_vol >= 0 && _vol <= 100)
		{
			volume = _vol;
			cout << "볼륨을" << _vol << "으(로) 바귔습니다." << endl;
		}
	}
	TV()
		: powerOn()
		, channel(0)
		, volume(7)
	{

	}
};

int main()
{
	TV lg;
	lg.on();
	lg.setChannel(10);
	lg.setVolume(50);
}

public = 어디서든 접근이 가능.
protected = 상속관계일 때 접근이 가능
private = 해당 클래스에서만 접근이 가능

'C,C++' 카테고리의 다른 글

C,C++:생성자 위임  (0) 2023.07.26
C/C++ 초기화  (0) 2023.07.26
C,C++ : using, namespace(std::cout,std::endl)  (0) 2023.07.19
C,C++ : 클래스 템플릿 리스트 구현  (0) 2023.07.19
C,C++ 템플릿  (0) 2023.07.19

https://youtu.be/iIQXlLv_yHI

main.cpp

#include <iostream>

using namespace std;


// private: protected: public:

struct TV
{
//private:
	bool powerOn;
	int channel;
	int volume;

public:
	void on()
	{
		powerOn = true;
		cout << "TV를 켰습니다." << endl;
	}

	void off()
	{
		powerOn = false;
		cout << "TV를 껐습니다." << endl;
	}
	void setChannel(int _cnl)
	{
		if(_cnl >= 1 && _cnl <= 999)
		{
			channel = _cnl;
			cout << "채널을" << _cnl << "으(로) 바귔습니다." << endl;
		}
	}

	void setVolume(int _vol)
	{
		if (_vol >= 0 && _vol <= 100)
		{
			volume = _vol;
			cout << "볼륨을" << _vol << "으(로) 바귔습니다." << endl;
		}
	}
	TV()
		: powerOn()
		, channel(0)
		, volume(7)
	{

	}
};

int main()
{
	TV lg;
	lg.on();
	lg.setChannel(10);
	lg.setVolume(50);
}

public = 어디서든 접근이 가능.
protected = 상속관계일 때 접근이 가능
private = 해당 클래스에서만 접근이 가능

https://youtu.be/kAsnMlsB_Ks

 

#include <iostream>
class CMyOStream
{
public:
	CMyOStream& operator << (int _idata)
	{
		wprintf(L"%d", _idata);
		return *this;
	}

	CMyOStream& operator << (const wchar_t* _pString)
	{
		wprintf(L"%s", _pString);
		return *this;
	}
	
	CMyOStream& operator << (void(*_pFunc)(void))
	{
		_pFunc();
		return *this;
	}

	CMyOStream& operator >> (int& _idata)
	{
		scanf_s("%d", &_idata);
		return *this;
	}

};

CMyOStream mycout;

int main()
{
	setlocale(LC_ALL, "korean");
	_wsetlocale(LC_ALL, L"korean");

	
	mycout << 20 <<L" " <<L" " << 30 << L"한글" << MyEndL;

	return 0;
}

 

https://youtu.be/kAsnMlsB_Ks

#include <iostream>
using namespace std;

using std::cout;
using std::cin;
using std::endl;
#include <iostream>
namespace MYSPACE
{
	int g_int;
}

int main()
{
	MYSPACE::g_int = 100;
	return 0;
}

'C,C++' 카테고리의 다른 글

C/C++ 초기화  (0) 2023.07.26
C,C++: 글래스 구초체  (0) 2023.07.26
C,C++ : 클래스 템플릿 리스트 구현  (0) 2023.07.19
C,C++ 템플릿  (0) 2023.07.19
C,C++ 클래스 템플릿  (0) 2023.07.17

https://youtu.be/zwbH4ScKctA

main.cpp

#include <iostream>
#include "CList.h"


int main()
{
	CList<int> list;

	for(int i = 0; i < 100 ; ++i)
		{
			list.push_back(i);
		}

	return 0;
}

CList.h

#pragma once
template<typename T>
struct tListNode
{
	T				data;
	tListNode<T>*	pPrev;
	tListNode<T>*	pNext;

	tListNode()
		: data()
		, pPrev(nullptr)
		, pNext(nullptr)
	{
	}
	
	//기본 초기 값
	tListNode(const T& _data, tListNode<T>* _pPrev, tListNode<T>* _pNext)
		: data(_data)
		, pPrev(_pPrev)
		, pNext(_pNext)
	{

	}
};

template<typename T>
class CList
{
private:
	tListNode<T>*	m_pHead; //헤드
	tListNode<T>*	m_pTail; //총
	int				m_iCount; // 카운터
public:
	void push_back(const T& _data);
	void push_front(const T& _data);
public:
	CList();
	~CList();
};

template<typename T>
void CList<T>::push_back(const T& _data)
{
	//입력된 데이터를 저장할 노드를 동적할당 함
	tListNode<T>* pNewNode = new tListNode<T>(_data, nullptr, nullptr);

	//처음 입력된 테이터라면
	if (nullptr == m_pHead)
	{
		//처음 입력되 테이터라면
		m_pHead = pNewNode;
		m_pTail = pNewNode;
	}
	else
	{
		//데이타가 1개 이상에서 입력된 경우
		//현재 가장 마자막 테이터(tail)를 저장하고 있는 노드와
		//새로 생성된 노드가 서로 가리키게 한다.
		m_pTail->pNext = pNewNode;
		pNewNode->pPrev = m_pTail;


		//List 가 마지막 노드의 주소값을 새로 입력된 노드로 생신한다.
		m_pTail = pNewNode;
	}
	// 데이터 개수 증가
	++m_iCount;
}

template<typename T>
void CList<T>::push_front(const T& _data)
{
	//새로 생성된 노드의 다음을 현재 헤드노드의 주소값으로 채움
	tListNode<T>* pNewNode = new tListNode<T>(_data, nullptr, m_pHead);

	//현재 헤드노드의 이전노드 주소값을 새로 생성된 노드의 주소로 채움
	m_pHead->pPrev = pNewNode;

	//리스트가 새로 생성된 노드의 주소를 새로운 헤드주소로 갱신한다.
	m_pHead = pNewNode;

	//데이터 개수 증가
	++m_iCount;
}


template<typename T>
CList<T>::CList()
	: m_pHead(nullptr)
	, m_pTail(nullptr)
	, m_iCount(0)
{
}

template<typename T>
 CList<T>::~CList()
{
	 tListNode<T>* pDeletNode = m_pHead;

	 while (pDeletNode)
	 {
		 tListNode<T>* pNext = pDeletNode->pNext;
		 delete(pDeletNode);
		 pDeletNode = pNext;
	 }
}

'C,C++' 카테고리의 다른 글

C,C++: 글래스 구초체  (0) 2023.07.26
C,C++ : using, namespace(std::cout,std::endl)  (0) 2023.07.19
C,C++ 템플릿  (0) 2023.07.19
C,C++ 클래스 템플릿  (0) 2023.07.17
C,C++ 포인터와 레퍼런스의 차이점  (0) 2023.07.17

https://youtu.be/Pg-3Fzp5G7k

#include <iostream>

template<typename T>
T getArraySum(const T arr[], int n);

int main()
{
	float faee[] = {1.12,2.121,3.2};
	float i = getArraySum<float>(faee, sizeof(faee) / sizeof(float));
	printf("%f", i);
	return 0;
}

template<typename T>
T getArraySum(const T arr[], int n)
{
	T sum = 0;
	for (int i = 0; i < n; i++) {
		sum += arr[i];
	}
	return sum;
}
더보기

6.441000

'C,C++' 카테고리의 다른 글

C,C++ : using, namespace(std::cout,std::endl)  (0) 2023.07.19
C,C++ : 클래스 템플릿 리스트 구현  (0) 2023.07.19
C,C++ 클래스 템플릿  (0) 2023.07.17
C,C++ 포인터와 레퍼런스의 차이점  (0) 2023.07.17
C,C++ 템플릿  (0) 2023.07.17

 

https://youtu.be/LfFQ0ezVuZM

 

main.cpp

#include <iostream>

#include "Arr.h"
#include "CArr.h"

class CTest // 기본 private:
{
private://비공개
	int a;

public://공개
	CTest()
		:a(10)
	{

	}
public://공개

};

int main()
{
	{
		CTest* pTest = new CTest;
		delete pTest;

		tArr arr = {};
		InitArr(&arr);

		PushBack(&arr, 10);
		PushBack(&arr, 20);
		PushBack(&arr, 30);

		ReleaseArr(&arr);


		CArr<int> carr;
		carr.push_back(10);
		carr.push_back(20);
		carr.push_back(30);


		CArr<float> carr1;
		carr1.push_back(10.1232);
		carr1.push_back(22.310);
		carr1.push_back(32.3330);

		float iData = carr1[2];
		printf("%0.2f", iData);
	}

	return 0;
 }

 

CArr.h

#pragma once

#include <assert.h>

template<typename T>
class CArr
{
private:
	T*		m_pData;
	int		m_iCount;
	int		m_iMaxCount;

public:
	void push_back(const T& _Data);
	void resize(int _iResizeCount);

	T& operator[](int idx);

public:
	CArr();
	~CArr();
};

template<typename T>
void CArr<T>::push_back(const T& _Data)
{
	int i = 0;

	// 힙 영역에 할당한 공간이 다 참 확인
	if (m_iMaxCount <= m_iCount)
	{
		//재할당
		resize(_Data);
	}

	// 데이터 추가
	m_pData[m_iCount++] = _Data;
}

template<typename T>
void CArr<T>::resize(int _iResizeCount)
{
	// 현재 최대 수용량 보다 더 적은 수치로 확정하려는 경우
	if (m_iMaxCount >= _iResizeCount)
	{
		assert(nullptr);
	}


	//1. 리사이즈 시킬 개수만큼 동적할당 한다
	T* pNew = new T[_iResizeCount];

	//2. 기존 공간에 있던 데이터들을 새로 할당한 공간으로 복사시킨다.
	for (int i = 0; i < m_iCount; ++i)
	{
		pNew[i] = m_pData[i];
	}
	//3. 기존 공간은 메모리 해제
	delete[] m_pData;

	//4. 배열이 새로 할당된 공간을 가리키게 하다.
	m_pData = pNew;

	//5. MaxCount 변경점 적용
	m_iMaxCount = _iResizeCount;
}
template<typename T>
T& CArr<T>::operator[](int idx)
{
	return m_pData[idx];
}

template<typename T>
CArr<T>::CArr()
	:m_pData(nullptr)
	, m_iCount(0)
	, m_iMaxCount(2)
{
	m_pData = new T[2];
}

template<typename T>
CArr<T>::~CArr()
{
	delete[] m_pData;

}

 

Arr.h

#pragma once

//ints
typedef struct _tagArr
{
	int*		pInt; // 포인터
	int			iCount; // 카운터
	int			iMaxCount; // 최대 카운터
}tArr;

// 배열 초기화 함수
void InitArr(tArr* _pArr);

//데이터 추가 함수
void PushBack(tArr* _pArr, int _iData);

//공간 추가 확장
void Reallocate(tArr* _pArr);

//배열 메모리 해제 함수
void ReleaseArr(tArr* _pArr);

//데이터 정렬 함수
void Sort(tArr* _pArr,void(*SortFunc)(int*, int));

 

Arr.cpp

#include "Arr.h"
#include <iostream>

//초기화
void InitArr(tArr* _pArr)
{
	_pArr->pInt = (int*)malloc(sizeof(int) * 2);
	//(*_pArr).iCount = 0;
	_pArr->iCount = 0;
	_pArr->iMaxCount = 2;
}

void Reallocate(tArr* _pArr)
{
	//1. 2배 더 큰 공간을 동적할당한다.
	int* pNew = (int*)malloc(_pArr->iMaxCount * 2 * sizeof(int));

	//2. 기존 공간에 있던 데이터들을 새로 할당한 공간으로 복사시킨다.
	for (int i = 0; i < _pArr->iCount; ++i)
	{
		pNew[i] = _pArr->pInt[i];
	}
	//3. 기존 공간은 메모리 해제
	free(_pArr->pInt);

	//4. 배열이 새로 할당된 공간을 가리키게 하다.
	_pArr->pInt = pNew;

	//5. MaxCount 변경점 적용
	_pArr->iMaxCount *= 2;
	
}

void PushBack(tArr* _pArr, int _iData)
{
	// 힙 영역에 할당한 공간이 다 참 확인
	if (_pArr->iMaxCount <= _pArr->iCount)
	{
		//재할당
		Reallocate(_pArr);
	}

	// 데이터 추가
	_pArr->pInt[_pArr->iCount++] = _iData;
	
}

// 힙 영역 할당 제거
void ReleaseArr(tArr* _pArr)
{
	free(_pArr->pInt);
	_pArr->iCount = 0;
	_pArr->iMaxCount = 0;
}

void Sort(tArr* _pArr, void(*SortFunc)(int*, int))
{
	_pArr;
	SortFunc(_pArr->pInt, _pArr->iCount);

}

'C,C++' 카테고리의 다른 글

C,C++ : 클래스 템플릿 리스트 구현  (0) 2023.07.19
C,C++ 템플릿  (0) 2023.07.19
C,C++ 포인터와 레퍼런스의 차이점  (0) 2023.07.17
C,C++ 템플릿  (0) 2023.07.17
C,C++ 기초 CLASS / STRUCT  (0) 2023.07.16

1. 포인터 (pointer)

메모리의 주소

#include <iostream>

int main() {
	{

		int a = 10;
		int* p;
		p = &a;
		printf("%d",*p);
	}
}

 

 

#include <iostream>
#include <setjmp.h>
#include <string>
using namespace std;

class TestFunc
{
public:

};


int main()
{
int i = -20;
    int* ptr = &i;
    cout << "i = " << i << endl;
    cout << "&i = " << &i << endl;
    cout << "ptr = " << ptr << endl;
    cout << "*ptr = " << *ptr << endl;
    cout << "&ptr = " << &ptr << endl;
    cout << "*&ptr = " << *&ptr << endl;
    cout << "**&ptr = " << **&ptr << endl;
    return 0;
}
더보기

i = -20

&i = 0x580b7ffa8c

ptr = 0x580b7ffa8c

*ptr = -20

&ptr = 0x580b7ffa80

*&ptr = 0x580b7ffa8c

**&ptr = -20

 

 

2. 레퍼런스 (reference)

별명 / 바로가기 / 참조한 변수와 동일한 변수

#include <iostream>

int main() {
	{

		int a = 10;
		int& r = a ;
		printf("%d",r);
	}
}

 

'C,C++' 카테고리의 다른 글

C,C++ 템플릿  (0) 2023.07.19
C,C++ 클래스 템플릿  (0) 2023.07.17
C,C++ 템플릿  (0) 2023.07.17
C,C++ 기초 CLASS / STRUCT  (0) 2023.07.16
C,C++기초 리스트  (0) 2023.07.15
int Add(int a, int b)
{
	return a + b;
}

int Add(float f, float f1)
{
	return f + f1;
}

템플릿이라는 용어는 워드 프로세싱 소프트웨어의 맥락에서 사용될 때, 이미 일부 세부 정보가 있는 샘플 문서를 나타냅니다. 이러한 작업은 손으로 수행하거나 소프트웨어 지원과 같은 자동화된 반복 프로세스를 통해 수행할 수 있습니다.

template<typename T>
T Add(T a, T b)
{
	return a + b;
}

template<typename T>template<class T>

 

template<typename T, typename T1>
T Add(T a, T1 b)
{
	return a + b;
}

int main()
{
	float i = Add<float, int>(10.22, 200.23); // Add<float, int> 자동 생성
	printf("%0.2f", i);
	printf("\n");

	i = Add<int, float>(10.22, 200.23);
	printf("%0.2f", i);


	return 0;
}
더보기

210.22
210.00
C:\Users\kchah\source\repos\230712_CPP\x64\Debug\230712_CPP.exe(프로세스 170704개)이(가) 종료되었습니다(코드: 0개).
디버깅이 중지될 때 콘솔을 자동으로 닫으려면 [도구] -> [옵션] -> [디버깅] > [디버깅이 중지되면 자동으로 콘솔 닫기]를 사용하도록 설정합니다.
이 창을 닫으려면 아무 키나 누르세요...

 

'C,C++' 카테고리의 다른 글

C,C++ 클래스 템플릿  (0) 2023.07.17
C,C++ 포인터와 레퍼런스의 차이점  (0) 2023.07.17
C,C++ 기초 CLASS / STRUCT  (0) 2023.07.16
C,C++기초 리스트  (0) 2023.07.15
C,C++기초 함수 포인터  (0) 2023.07.15

https://youtu.be/W0sSAdUKhKE

https://youtu.be/xpdNpukDrbw

https://youtu.be/pYTaO0paOfI

https://youtu.be/v4Nn_EeCVKA

main.cpp

#include <iostream>

#include "Arr.h"
#include "CArr.h"

class CTest // 기본 private:
{
private://비공개
	int a;

public://공개
	CTest()
		:a(10)
	{

	}
public://공개

};



int main()
{
	CTest* pTest = new CTest;
	delete pTest;



	tArr arr = {};
	InitArr(&arr);

	PushBack(&arr, 10);
	PushBack(&arr, 20);
	PushBack(&arr, 30);

	ReleaseArr(&arr);


	CArr carr;
	carr.push_back(10);
	carr.push_back(20);
	carr.push_back(30);

	int iData = carr[1];
	carr[1] = 100;

	return 0;
 }

CArr.h

#pragma once
class CArr
{
private:
	int*	m_pInt;
	int		m_iCount;
	int		m_iMaxCount;

public:
	void push_back(int _Data);
	void resize(int _iResizeCount);


	int& operator[](int idx);
public:
	CArr();
	~CArr();


};

CArr.cpp

#include "CArr.h"

#include <assert.h>

void CArr::push_back(int _Data)
{
	int i = 0;

	// 힙 영역에 할당한 공간이 다 참 확인
	if (m_iMaxCount <= m_iCount)
	{
		//재할당
		resize(_Data);
	}

	// 데이터 추가
	m_pInt[m_iCount++] = _Data;
}

void CArr::resize(int _iResizeCount)
{
	// 현재 최대 수용량 보다 더 적은 수치로 확정하려는 경우
	if (m_iMaxCount >= _iResizeCount)
	{
		assert(nullptr);
	}


	//1. 리사이즈 시킬 개수만큼 동적할당 한다
	int* pNew = (int*) new int[_iResizeCount];

	//2. 기존 공간에 있던 데이터들을 새로 할당한 공간으로 복사시킨다.
	for (int i = 0; i < m_iCount; ++i)
	{
		pNew[i] = m_pInt[i];
	}
	//3. 기존 공간은 메모리 해제
	delete[] m_pInt;

	//4. 배열이 새로 할당된 공간을 가리키게 하다.
	m_pInt = pNew;

	//5. MaxCount 변경점 적용
	m_iMaxCount = _iResizeCount;
}

int& CArr::operator[](int idx)
{
	return m_pInt[idx];
}

CArr::CArr()
	:m_pInt(nullptr)
	, m_iCount(0)
	, m_iMaxCount(2)
{
	m_pInt = new int[2];

}

CArr::~CArr()
{
	delete[] m_pInt;

}

C++ 클래스 특징

접근제한 지정자

클래스 내의 맴버변수 or  맴버함수 의 접근 레벨

 

생성자, 소별자

객체 생성, 소멸 시 자동으로 호출

직접 만들지 않으면 기본 생성자, 기본 소멸자가 만들어짐

 

맴버함수

해당 클래스가 사용하는 전용 함수

해당 클래스의 개체가 필요함.

맴버함수를 객체를 통해서 호출하며, 해당 객제의 주소가  this 포인터로 전달

'C,C++' 카테고리의 다른 글

C,C++ 포인터와 레퍼런스의 차이점  (0) 2023.07.17
C,C++ 템플릿  (0) 2023.07.17
C,C++기초 리스트  (0) 2023.07.15
C,C++기초 함수 포인터  (0) 2023.07.15
C 기초 가변 배열  (0) 2023.07.14

https://youtu.be/8HVfEul9nqk

https://youtu.be/rbB3xbJN4qE

https://youtu.be/V9mByvOuCac

main.cpp

#include <iostream>

#include "LinkedList.h"

int main()
{
	tLinkedList	list = {};
	InitList(&list);

	PushBack(&list, 100);
	PushBack(&list, 200);
	PushBack(&list, 300);


	ReleaseList(&list);

	return 0;
}

LinkedList.h

#pragma once


typedef struct _tagNode
{
	int		iData;
	struct _tagNode*	pHeadNode;

}tNode;


typedef struct _tagList
{
	tNode*	pHeadNode;
	int		iCount; // 카운터
}tLinkedList;

//연결형 리스트 초기화
void InitList(tLinkedList* _pList);


//연결형 리스트 테이터 추가
void PushBack(tLinkedList* _pList, int _iData);


//연결형 리스트 메모리 해제
void ReleaseList(tLinkedList* _pList);

LinkedList.cpp

#include <iostream>
#include "LinkedList.h"

void InitList(tLinkedList* _pList)
{
	_pList->pHeadNode = nullptr;
	_pList->iCount = 0;
}

void PushBack(tLinkedList* _pList, int _iData)
{
	//데이터를 저장할 노드 생성
	//데이터 복사
	tNode* pNode = (tNode*)malloc(sizeof(tNode));
	(*pNode).iData = _iData;
	(*pNode).pHeadNode = nullptr;

	//추가한 데이터가 처음인지 아닌지
	if (0 == _pList->iCount)
	{
		_pList->pHeadNode = pNode;
	}

	else
	{
		//현재 가장 마지막 노드를 찾아서
		//해당 노드의 pNext를 생성시킨 노드의 주소로 채움
		tNode* pCurFinalNode = _pList->pHeadNode;
		while (pCurFinalNode->pHeadNode)
		{
			pCurFinalNode = pCurFinalNode->pHeadNode;
		}
		pCurFinalNode->pHeadNode = pNode;
	}

	++_pList->iCount;
}

void Release(tNode* _pNode)
{
	if (nullptr == _pNode)
		return;

	Release(_pNode->pHeadNode);
	free(_pNode);
}

// 힙 영역 할당 제거
void ReleaseList(tLinkedList* _pList)
{
	//Release(_pList->pHeadNode);

	tNode* pDeletNode = _pList->pHeadNode;

	while (pDeletNode)
	{
		tNode* pNext = pDeletNode->pHeadNode;
		free(pDeletNode);
		pDeletNode = pNext;
	}
}

'C,C++' 카테고리의 다른 글

C,C++ 템플릿  (0) 2023.07.17
C,C++ 기초 CLASS / STRUCT  (0) 2023.07.16
C,C++기초 함수 포인터  (0) 2023.07.15
C 기초 가변 배열  (0) 2023.07.14
C언어의 기초 문법  (0) 2023.07.12

https://youtu.be/MzsOdFqtK7M

maim.cpp

#include <iostream>
#include <time.h>

#include "Arr.h"
#include "LinkedList.h"

void BubblsSort(int* _pData, int _iCount )
{
	//데이타가 1개 이하인
	if (_iCount <= 1)
		return;

	//오름차순 정렬

	while (true)
	{
		bool bFinish = true;
		int iLoop = _iCount - 1;
		for (int i = 0; i < iLoop; ++i)
		{
			if (_pData[i] > _pData[i + 1])
			{
				int iTemp = _pData[i];
				_pData[i] = _pData[i + 1];
				_pData[i + 1] = iTemp;
				bFinish = false;
			}
		}

		if (bFinish)
			break;
	}
}

//void Test()
//{
//
//}


int main()
{
	//함수 포인트
	//void(*pFunc)(void);
	//pFunc = Test;
	//pFunc();

	int iArrp[10] = {123,145,13,46,231,885};
	BubblsSort(iArrp, 10);
	for (int i = 0; i < 10; ++i)
	{
		printf("%d\n", iArrp[i]);
	}

	printf("정렬\n");


	tArr s1 = {};

	InitArr(&s1);
	
	//난수(렌덤)
	srand(time(nullptr));
	printf("난수\n");
	for (int i = 0; i < 10; ++i)
	{
		int iRand = rand() % 100 + 1;

		PushBack(&s1, iRand);
	}

	for (int i = 0; i < s1.iCount; ++i)
	{
		printf("%d\n",s1.pInt[i]);
	}

	printf("정렬\n");
	Sort(&s1, &BubblsSort);

	for (int i = 0; i < s1.iCount; ++i)
	{
		printf("%d\n", s1.pInt[i]);
	}

	ReleaseArr(&s1);

	// 연결형 리스트

	return 0;
}

Arr.h

#pragma once

//ints
typedef struct _tagArr
{
	int*		pInt; // 포인터
	int			iCount; // 카운터
	int			iMaxCount; // 최대 카운터
}tArr;

// 배열 초기화 함수
void InitArr(tArr* _pArr);

//데이터 추가 함수
void PushBack(tArr* _pArr, int _iData);

//공간 추가 확장
void Reallocate(tArr* _pArr);

//배열 메모리 해제 함수
void ReleaseArr(tArr* _pArr);

//데이터 정렬 함수
void Sort(tArr* _pArr,void(*SortFunc)(int*, int));

Arr.cpp

#include "Arr.h"
#include <iostream>

//초기화
void InitArr(tArr* _pArr)
{
	_pArr->pInt = (int*)malloc(sizeof(int) * 2);
	//(*_pArr).iCount = 0;
	_pArr->iCount = 0;
	_pArr->iMaxCount = 2;
}

void Reallocate(tArr* _pArr)
{
	//1. 2배 더 큰 공간을 동적할당한다.
	int* pNew = (int*)malloc(_pArr->iMaxCount * 2 * sizeof(int));

	//2. 기존 공간에 있던 데이터들을 새로 할당한 공간으로 복사시킨다.
	for (int i = 0; i < _pArr->iCount; ++i)
	{
		pNew[i] = _pArr->pInt[i];
	}
	//3. 기존 공간은 메모리 해제
	free(_pArr->pInt);

	//4. 배열이 새로 할당된 공간을 가리키게 하다.
	_pArr->pInt = pNew;

	//5. MaxCount 변경점 적용
	_pArr->iMaxCount *= 2;
	
}

void PushBack(tArr* _pArr, int _iData)
{
	// 힙 영역에 할당한 공간이 다 참 확인
	if (_pArr->iMaxCount <= _pArr->iCount)
	{
		//재할당
		Reallocate(_pArr);
	}

	// 데이터 추가
	_pArr->pInt[_pArr->iCount++] = _iData;
	
}

// 힙 영역 할당 제거
void ReleaseArr(tArr* _pArr)
{
	free(_pArr->pInt);
	_pArr->iCount = 0;
	_pArr->iMaxCount = 0;
}

void Sort(tArr* _pArr, void(*SortFunc)(int*, int))
{
	_pArr;
	SortFunc(_pArr->pInt, _pArr->iCount);

}

[요약]

void Test()
{

}

int main()
{
	//함수 포인트
	void(*pFunc)(void) = nullptr;
	pFunc = Test;
	pFunc();
    
    return 0;
 }

'C,C++' 카테고리의 다른 글

C,C++ 템플릿  (0) 2023.07.17
C,C++ 기초 CLASS / STRUCT  (0) 2023.07.16
C,C++기초 리스트  (0) 2023.07.15
C 기초 가변 배열  (0) 2023.07.14
C언어의 기초 문법  (0) 2023.07.12

https://youtu.be/osL_ngXRmA4

https://youtu.be/UV30FZqQsAM

https://youtu.be/DH_sIesP0zs

main.cpp

#include <iostream>
#include "Arr.h"

int main()
{
	tArr s1 = {};

	InitArr(&s1);

	for (int i = 0; i < 10; ++i)
	{
		PushBack(&s1, i);
	}

	for (int i = 0; i < s1.iCount; ++i)
	{
		printf("%d\n",s1.pInt[i]);
	}
	ReleaseArr(&s1);

	return 0;
}

Arr.h

#pragma once

//ints
typedef struct _tagArr
{
	int*		pInt; // 포인터
	int			iCount; // 카운터
	int			iMaxCount; // 최대 카운터
}tArr;

// 배열 초기화 함수
void InitArr(tArr* _pArr);


//데이터 추가 함수
void PushBack(tArr* _pArr, int _iData);

//공간 추가 확장
void Reallocate(tArr* _pArr);

//배열 메모리 해제 함수
void ReleaseArr(tArr* _pArr);

Arr.cpp

#include "Arr.h"
#include <iostream>

//초기화
void InitArr(tArr* _pArr)
{
	_pArr->pInt = (int*)malloc(sizeof(int) * 2);
	_pArr->iCount = 0;
	_pArr->iMaxCount = 2;
}

void Reallocate(tArr* _pArr)
{
	//1. 2배 더 큰 공간을 동적할당한다.
	int* pNew = (int*)malloc(_pArr->iMaxCount * 2 * sizeof(int));

	//2. 기존 공간에 있던 데이터들을 새로 할당한 공간으로 복사시킨다.
	for (int i = 0; i < _pArr->iCount; ++i)
	{
		pNew[i] = _pArr->pInt[i];
	}
	//3. 기존 공간은 메모리 해제
	free(_pArr->pInt);

	//4. 배열이 새로 할당된 공간을 가리키게 하다.
	_pArr->pInt = pNew;

	//5. MaxCount 변경점 적용
	_pArr->iMaxCount *= 2;
	
}

void PushBack(tArr* _pArr, int _iData)
{
	// 힙 영역에 할당한 공간이 다 참 확인
	if (_pArr->iMaxCount <= _pArr->iCount)
	{
		//재할당
		Reallocate(_pArr);
	}

	// 데이터 추가
	_pArr->pInt[_pArr->iCount++] = _iData;
	
}

// 힙 영역 할당 제거
void ReleaseArr(tArr* _pArr)
{
	free(_pArr->pInt);
	_pArr->iCount = 0;
	_pArr->iMaxCount = 0;

}

 

 

두가지 방법은 동일합니다.  포인트를 선택 할 수 있습니다.

_pArr->iCount = 0;
(*_pArr).iCount = 0;

구조체 포인트 선택

 

 

Arr.cpp (정렬) 추가

https://youtu.be/FiqrUZHpAOQ

#include "Arr.h"
#include <iostream>

//초기화
void InitArr(tArr* _pArr)
{
	_pArr->pInt = (int*)malloc(sizeof(int) * 2);
	//(*_pArr).iCount = 0;
	_pArr->iCount = 0;
	_pArr->iMaxCount = 2;
}

void Reallocate(tArr* _pArr)
{
	//1. 2배 더 큰 공간을 동적할당한다.
	int* pNew = (int*)malloc(_pArr->iMaxCount * 2 * sizeof(int));

	//2. 기존 공간에 있던 데이터들을 새로 할당한 공간으로 복사시킨다.
	for (int i = 0; i < _pArr->iCount; ++i)
	{
		pNew[i] = _pArr->pInt[i];
	}
	//3. 기존 공간은 메모리 해제
	free(_pArr->pInt);

	//4. 배열이 새로 할당된 공간을 가리키게 하다.
	_pArr->pInt = pNew;

	//5. MaxCount 변경점 적용
	_pArr->iMaxCount *= 2;
	
}

void PushBack(tArr* _pArr, int _iData)
{
	// 힙 영역에 할당한 공간이 다 참 확인
	if (_pArr->iMaxCount <= _pArr->iCount)
	{
		//재할당
		Reallocate(_pArr);
	}

	// 데이터 추가
	_pArr->pInt[_pArr->iCount++] = _iData;
	
}

// 힙 영역 할당 제거
void ReleaseArr(tArr* _pArr)
{
	free(_pArr->pInt);
	_pArr->iCount = 0;
	_pArr->iMaxCount = 0;
}

void Sort(tArr* _pArr)
{
	//데이타가 1개 이하인
	if (_pArr->iCount <= 1)
		return;

	//오름차순 정렬

	while (true)
	{
		bool bFinish = true;
		int iLoop = _pArr->iCount - 1;
		for (int i = 0; i < iLoop; ++i)
		{
			if (_pArr->pInt[i] > _pArr->pInt[i + 1])
			{
				int iTemp = _pArr->pInt[i];
				_pArr->pInt[i] = _pArr->pInt[i + 1];
				_pArr->pInt[i + 1] = iTemp;
				bFinish = false;
			}
		}

		if (bFinish)
			break;
	}

}

 

'C,C++' 카테고리의 다른 글

C,C++ 템플릿  (0) 2023.07.17
C,C++ 기초 CLASS / STRUCT  (0) 2023.07.16
C,C++기초 리스트  (0) 2023.07.15
C,C++기초 함수 포인터  (0) 2023.07.15
C언어의 기초 문법  (0) 2023.07.12

Arduino IDE 2.x.x  또는 마이크로 5핀 케이블 문제 시리얼 모니터에 반목 문자 출력됨.
Arduino IDE 2.x.x  또는 마이크로 5핀 케이블 문제 시리얼 모니터에 반목 문자 출력됨.
마이크로 5핀 케이블 문제 시리얼 모니터에 반목 문자 출력됨.

1. Arduino IDE 2.x.x 버전에서 시리얼 모니터에 오류 및 반복적은 문자 출력이 된다면 버전을 Arduino IDE 1.8.x으로 변경 합니다.

 

2. Arduino IDE 1.8.x 변경후에도 계속적인 문제가 발생한다면 케이블을 교체해주세요.

-Micro 5pin(USB-B Micro)전압 저하 호환성 문제로 보입니다.

Error: “Brownout detector was triggered”
When you open your Arduino IDE Serial monitor and the error message “Brownout detector was triggered” is constantly being printed over and over again. It means that there’s some sort of hardware problem.

It’s often related to one of the following issues:

Poor quality USB cable;
USB cable is too long;
Board with some defect (bad solder joints);
Bad computer USB port;
Or not enough power provided by the computer USB port.
Solution: try a different shorter USB cable (with data wires), try a different computer USB port or use a USB hub with an external power supply.

 

ESP32 기타 오류들 해결 방법 입니다.

https://randomnerdtutorials.com/esp32-troubleshooting-guide/

'Arduino(아두이노)' 카테고리의 다른 글

ESP32 VS ESP8266  (0) 2023.07.27
ESP32 제품 시리즈 비교  (0) 2023.07.27
ESP32 CAM  (0) 2023.07.01
ESP32 Apple homekit  (0) 2023.06.30
LED 배치 / bmp badge led / 미니 디스플레이의 LED(다기능)v9.34  (0) 2023.06.29

구조체의 뜻과 종류; struct와 typedef struct

 

 구조체는 직접 변수의 형태를 만들 수 있는 문법을 말합니다. 구조체는 2가지 종류가 있는데 그것은 struct와 typedef struct입니다.

struct student_info{
    int number;
    char name[20];
    int age;
}
 
int main(){
    struct student_info s = {1, "Hong gill dong", 12};
    s.number = 10;
}
 

이건 struct 구문의 예시입니다. struct는 조금 불편하게 main함수에서 변수를 선언할 때 struct를 써줘야 합니다. struct 구문 안에 보시면 변수들이 있습니다. 그러니까 student_info 형태의 변수는 이 3개의 변수를 한 번에 내장하고 있다는 것입니다. 그래서 이 변수의 값을 바꿀 때도 전체 변수 s 안에 있는 변수 중 number이 10이라고 정하려면 s.number = 10;이라고 써줘야 합니다.


자 이제 typedef struct를 알아보겠습니다.

typedef struct {
    int num;
    char grade;
}student;
 
int main(){
    student s = {1, 'A'};
}​

여기에서 typedef struct와 struct 구문의 차이점이 나옵니다. typedef struct는 struct를 쓰지 않고 그냥 형태만 쓰면 되거든요. 대신 typedef struct는 조금 다른 점이 형태가 중괄호 마지막 부분에 나옵니다. 이 점 꼭 아셔야 합니다^^

출처 : https://opentutorials.org/module/5371/30564

 

구조체의 뜻과 종류; struct와 typedef struct - C언어의 기초 문법

 구조체는 직접 변수의 형태를 만들 수 있는 문법을 말합니다. 구조체는 2가지 종류가 있는데 그것은 struct와 typedef struct입니다. struct student_info{ int number; char name[20]; int age; } int main(){ struct student_

opentutorials.org

 

struct

구조체란? 구조체(structure type)란 사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입입니다. 구조체는 기본 타입만으로는 나타낼 수 없는 복잡한 데이터를 표현할 수 있습니다.

 

typedef

typedef는 기존의 존재하는 자료형에(구조체) 새 이름(별명)을 부여하는 것입니다. 정수 자료형 int를 다른 이름으로 설정할 수 있다는 뜻입니다. typedef int InT; int의 또 다른 이름 InT가 됩니다.

 

static
모든 객체가 한 메모리를 공유하는 멤버 변수. 객체 별로 각각 할당되는 멤버가 아니라 모든 객체가 공유하는 멤버다.

 

https://www.youtube.com/watch?v=Nrtg_YSqwu4&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&index=22&ab_channel=%EC%96%B4%EC%86%8C%ED%8A%B8%EB%9D%BD%EA%B2%8C%EC%9E%84%EC%95%84%EC%B9%B4%EB%8D%B0%EB%AF%B8 

sizeof

 

'C,C++' 카테고리의 다른 글

C,C++ 템플릿  (0) 2023.07.17
C,C++ 기초 CLASS / STRUCT  (0) 2023.07.16
C,C++기초 리스트  (0) 2023.07.15
C,C++기초 함수 포인터  (0) 2023.07.15
C 기초 가변 배열  (0) 2023.07.14

https://docs.unrealengine.com/5.1/ko/project-settings-in-unreal-engine/

 

프로젝트 세팅

언리얼 엔진의 프로젝트 세팅 개요입니다.

docs.unrealengine.com

언리얼엔진 초기화 방법

폴더 Config / Saved 삭제하고 재실행 설정 기본값(초기)

'unreal engine(언리얼 엔진 UE)' 카테고리의 다른 글

언리얼엔진 5 C++ 클랙스 삭제  (0) 2024.04.03
언리얼엔진 5 C++  (0) 2024.04.03

https://youtu.be/k_PJLkfqDuI

https://randomnerdtutorials.com/esp32-cam-troubleshooting-guide/

 

ESP32-CAM Troubleshooting Guide: Most Common Problems Fixed | Random Nerd Tutorials

This guide is a compilation with the most common errors when using the ESP32-CAM and how to fix them. The ESP32-CAM can be a bit tricky to setup, follow this guide.

randomnerdtutorials.com

 

https://youtu.be/K1xrCyN9T98

https://github.com/galbraithmedia1/ESP32-HomeSpan

 

GitHub - galbraithmedia1/ESP32-HomeSpan

Contribute to galbraithmedia1/ESP32-HomeSpan development by creating an account on GitHub.

github.com

 

 

https://youtu.be/i2doZomr9V0

 

 

led-badge.zip
3.09MB
led-badge.z01
19.53MB

 

https://lesun-led.com/software/led-badge.rar

https://www.youtube.com/watch?v=MRTxTx8bgYg&ab_channel=upir 

https://www.piskelapp.com/p/create/sprite

 

LED 배치 활용

https://community.element14.com/members-area/f/forum/52624/led-badge

 

LED Badge

 

community.element14.com

Arduino를 사용하여 Cinema 4D에서 서보 제어하기

https://pyserial.readthedocs.io/en/latest/index.html

 

Welcome to pySerial’s documentation — pySerial 3.4 documentation

© Copyright 2001-2020, Chris Liechti Revision 31fa4807.

pyserial.readthedocs.io

 

TouchDesigner & Cinema4D | Control LED strips with MoGraph

https://www.youtube.com/watch?v=rsFiu22E5LQ&ab_channel=AlexanderGluschenko 

 

Servo Motor Control - Arduino, C4D, Touchdesigner

https://www.youtube.com/watch?v=DHmmQdfyi_s&ab_channel=YoungwooMoon 

 

Motion Capture / Mocap Sensor to Unreal (UE4 / UE5) using BNO055 and ESP32 Feather with perfection

 

https://github.com/getnamo/UDP-Unreal

 

GitHub - getnamo/UDP-Unreal: Convenience UDP wrapper for the Unreal Engine.

Convenience UDP wrapper for the Unreal Engine. Contribute to getnamo/UDP-Unreal development by creating an account on GitHub.

github.com

UDP-UE5.1-v2.1.0.7z
2.15MB

UDP UE5.1 빠른 설치 및 설정

1. 새 프로젝트를 만들거나 프로젝트를 선택합니다.
2. 프로젝트 폴더를 찾습니다(일반적으로 Documents/Unreal Project/{프로젝트 루트}
3. 플러그인 폴더를 프로젝트 루트에 복사합니다

 

 

Serial Communication Plugin for Unreal Engine

https://github.com/videofeedback/Unreal_Engine_SerialCOM_Plugin

 

GitHub - videofeedback/Unreal_Engine_SerialCOM_Plugin: Serial Com Port Library for Unreal Engine 4 and Unreal Engine 5

Serial Com Port Library for Unreal Engine 4 and Unreal Engine 5 - GitHub - videofeedback/Unreal_Engine_SerialCOM_Plugin: Serial Com Port Library for Unreal Engine 4 and Unreal Engine 5

github.com

SerialCOM_4_UE511.zip
13.91MB

https://forums.unrealengine.com/t/new-free-arduino-serial-communication-plugin-serial-com-v3-fork-from-ue4duino/265486

 

[NEW-Free] Arduino Serial Communication Plugin "Serial COM v3"-(Fork from UE4Duino)

An Arduino compatible plugin that allows connecting any Arduino to Unreal Engine, but most important, it allows any Serial Communication device to interact directly to and from Unreal Engine. (Fork and extension of UE4Duino). - For Unreal Engine 5.0 / 4.27

forums.unrealengine.com

 

 

 

https://github.com/getnamo/SocketIOClient-Unreal

 

GitHub - getnamo/SocketIOClient-Unreal: Socket.IO client plugin for the Unreal Engine.

Socket.IO client plugin for the Unreal Engine. Contribute to getnamo/SocketIOClient-Unreal development by creating an account on GitHub.

github.com

SocketIOClient-v2.5.8-UE5.1.7z
2.12MB

 

플러그인 설치후 언리얼 엔진에서 빌드 오류 발생 :  플러그인의 Binaries폴더 삭제하고 다시 빌드함.

 

https://forums.unrealengine.com/t/including-third-party-and-windows-header-files/264939

 

Including Third-Party and Windows Header Files

Article written by Branden T. During the course of development, you may need to use some third-party or Windows functionality in order to fulfill the needs of your project. However, when including these header files, you may run into some strange compilati

forums.unrealengine.com

https://docs.unrealengine.com/5.1/ko/integrating-third-party-libraries-into-unreal-engine/

 

타사 라이브러리

타사 라이브러리를 언리얼 엔진에 통합하기

docs.unrealengine.com

 

https://youtu.be/pInYuj7VPQY

 

https://fontsup.com/ko/full-search.html

 

Fontsup.com에서 고급 글꼴 검색

 

fontsup.com

Fontsup.com은 130934개 이상의 무료 글꼴이 포함된 아카이브입니다. 매일 글꼴이 업데이트됩니다. Windows, Mac 또는 Linux용으로 완벽한 무료 글꼴을 찾아보세요. Photoshop, 로고, 디자인 프로젝트 등을 위한 글꼴을 모아놓았습니다. 모든 글꼴은 TrueType 형식입니다.

 

1. https://fonts.adobe.com/fonts 사이트에서 이미지로 폰트를 검색 가능합니다.

- 이미지로 검색에서 정확하게 확인 가능하도록 작업이 필요합니다.

https://fonts.google.com/noto#/family/noto-sans-kore

 

Google Fonts

Making the web more beautiful, fast, and open through great typography

fonts.google.com

 

www.smlease.com/entries/product-design/what-is-concurrent-engineering/www.smlease.com/entries/plastic-design/how-to-design-snap-fit-joints-in-plastic-parts/

'구조 디자인' 카테고리의 다른 글

O-링 설계 및 조립 방법  (0) 2021.02.09
초음파 조인트 설계  (0) 2021.01.31
플라스틱의 종류와 특성  (0) 2020.06.17
신속한 조립 : 스냅파트(Hook 구조) 6가지  (0) 2019.05.01

youtu.be/aweDWuNkPw0

'구조 디자인' 카테고리의 다른 글

조인트 설계 방법  (0) 2021.05.06
초음파 조인트 설계  (0) 2021.01.31
플라스틱의 종류와 특성  (0) 2020.06.17
신속한 조립 : 스냅파트(Hook 구조) 6가지  (0) 2019.05.01

초음파 조인트 설계의 기본 요구 사항은 작고 균일 한 초기 접촉 영역입니다. 설계는 각 응용 분야에 따라 다르며 접합 할 플라스틱 수지의 유형, 부품 형상 및 용접 요구 사항과 같은 요소에 따라 달라집니다.

에너지 디렉터

일반적으로 관절의 삼각형 부분은 초음파 에너지를 집중시키고 접합 표면의 용융을 빠르게 시작합니다. 에너지 디렉터의 사용을 통합하는 일반적인 관절에는 맞대기 관절, 계단 관절, 혀 및 홈 관절이 포함됩니다.

 

전단 조인트

이 유형의 조인트는 밀폐 밀봉이 필요한 부품이나 매우 좁은 온도 범위에서 고체 상태에서 용융 상태로 빠르게 변화하는 플라스틱에 선호됩니다.

참조 : www.forwardtech.com/ultrasonic-welders/ultrasonic-joint-designs

'구조 디자인' 카테고리의 다른 글

조인트 설계 방법  (0) 2021.05.06
O-링 설계 및 조립 방법  (0) 2021.02.09
플라스틱의 종류와 특성  (0) 2020.06.17
신속한 조립 : 스냅파트(Hook 구조) 6가지  (0) 2019.05.01

사출 성형 부품 부품은 유사한 요소를 갖는 경향이 있습니다.   특정 두께의 벽이 있으며 일반적으로 다음 중 하나 이상이 있습니다.

  • 개방 된 내부 공간

  • 힘을 더하는 갈비뼈

  • 표면이 교차하는 반경

  • 부착 지점으로서의 보스

비용과 품질을 위해 사출 성형 부품을 설계하는 데는 몇 가지 기본 규칙이 있습니다.

  • 전체적으로 균일 한 벽 두께 사용

  • 공정, 재료 및 제품 요구 사항을 충족하는 최소 벽 두께를 사용합니다.

  • 두꺼운 벽 부분을 대체하기 위해 리브 사용

  • 반지름! 반지름! 반지름!

  • 평평한 지역을 피하십시오

  • 언더컷 방지

  • 보스를 부착 지점으로 사용

  • 성형 부품을 쉽게 제거 할 수 있도록 적절한 초안 제공

  • 분할 선, 게이트 및 녹아웃 핀을 적절하게 찾습니다.

전체적으로 균일 한 벽 두께 사용

플라스틱 부품의 설계에서 균일 한 벽 두께를 목표로하는 것이 중요합니다.   동일한 부품에서 벽 두께가 다르면 부품 강성에 따라 수축이 달라 심각한 뒤틀림 및 치수 정확도 문제가 발생할 수 있습니다.

균일 한 벽 두께를 얻는 한 가지 방법은 두꺼운 벽 영역에 코어를 사용하는 것입니다. 이는 사출 성형 부품에 일반적으로 내부 공간이 열린 이유를 설명합니다. 두꺼운 벽 영역을 제거하면 보이드 형성의 위험이 방지되고 내부 응력이 감소합니다. 부품의 공극과 미세 다공성은 단면 좁아짐, 높은 내부 응력 및 경우에 따라 노치 효과로 인해 기계적 특성을 크게 감소시킵니다. 또한 휘는 경향을 최소화합니다.


그림 1.   코어를 사용하여 균일 한 벽 두께 만들기


그림 2.   두꺼운 벽에서 얇은 벽으로의 전환으로 인해 뒤틀림이 발생할 수 있음

모든 디자인이 균일 한 벽 두께로 만족할 수있는 것은 아닙니다.   벽 두께는 10 – 25 %를 넘지 않아야합니다.   더 큰 변화가 불가피한 경우, 전환은 점진적으로 이루어져야하며 폴리머는 얇은 부분으로 흘러 가야 두꺼운 부분이 잘 채워지고 응력이 최소화됩니다.

재료 축적은 균일하지 않은 벽 두께의 또 다른 예입니다.   예를 들어, 늑골 바닥에서 발생할 수 있으며 싱크 마크를 형성하는 경향이 있습니다.   이것은 재료 축적이 적은 영역이 냉각되고 굳을 때 발생합니다.    응고 중에 재료가 수축되고 재료 축적이 많은 영역에서 당겨집니다.   이것은 딤플 또는 싱크 마크를 형성하여 표면 결함으로 인해 품질이 낮은 부품을 제공합니다.   재료 축적을 방지하는 것은 허브 캡과 같이 고품질 표면 마감이 필요한 리브 구성품의 경우 특히 중요합니다. 

재료 축적 영역은 또한 공극과 미세 다공성으로 이어질 수 있습니다.   다시 말하지만, 이는 재료가 적은 주변 영역이 더 빨리 냉각되고 재료 축적이 많은 영역에서 여전히 용융 된 재료를 끌어 올 때 발생합니다.   부품의 공극과 미세 다공성은 단면 좁아짐, 높은 내부 응력 및 경우에 따라 노치 효과로 인해 기계적 특성을 크게 감소시킵니다.   또한 뒤틀리는 경향이 있습니다.

다음 그림은 리브 구성 요소 설계에서 재료 축적을 제한하기위한 지침을 보여줍니다.


그림 3.    재료 축적이 제한된 리브 디자인

공정, 재료 및 제품 요구 사항을 충족하는 최소 벽 두께 사용

벽 두께 설계는 다음과 같은 중요한 구성 요소 기능 및 비용에 영향을 미칩니다.

  • 주기 시간 및 재료 비용을 통해 구성 요소 비용에 영향을 미치는 구성 요소 무게
  • 금형에서 달성 가능한 유동 길이
  • 성형 부품의 강성
  • 공차
  • 표면 마감, 뒤틀림 및 보이드 측면에서 부품 품질

벽은 부품 비용을 최소화하기 위해 기계적 무결성을 희생하지 않고 가능한 한 얇아 야합니다.   리브 및 거셋과 같은 기능을 사용하여 얇은 벽 영역의 강성을 높일 수 있습니다 (다음 섹션 참조).

설계 단계 초기에 제안 된 벽 두께가 원하는 재료와 공정으로 달성 될 수 있는지 평가하는 것이 중요합니다.   사출 성형을위한 설계를 평가할 때 벽 두께에 대한 유동 경로의 비율은 금형 채우기에 중요한 영향을 미칩니다.   긴 유동 경로가 낮은 벽 두께와 결합되는 경우 상대적으로 용융 점도가 낮은 폴리머를 사용해야합니다.   사출 성형 부품의 일반적인 벽 두께는 일반적으로 0.030 인치 ~ 0.190 인치입니다.   이것은 재료 선택에 크게 의존합니다.

표 1.   다양한 열가소성 수지의 일반적인 공칭 두께

아크릴로 니트릴-부타디엔-스티렌 (ABS)

0.045 – 0.140

아세탈

0.030 – 0.120

아크릴

0.025 – 0.150

액정 폴리머

0.008 – 0.120

장 섬유 강화 플라스틱

0.075 – 1.000

나일론

0.010 – 0.115

폴리 카보네이트

0.040 – 0.150

폴리 에스터

0.025 – 0.125

폴리에틸렌

0.030 ~ 0.200

폴리 페닐 렌 설파이드

0.020 – 0.180

폴리 프로필렌

0.025 – 0.150

폴리스티렌

0.035 – 0.150

폴리 우레탄

0.080 – 0.750

폴리 염화 비닐

0.040 – 0.150

리브를 사용하여 두꺼운 벽 섹션 대체
종종 금속 구성 요소 설계에서 벽 두께를 증가시켜 비용에 대한 영향을 제한하면서 강성을 개선합니다.   이는 금속 부품 비용의 주요 동인이 될 수있는 가공 비용이 재료 비용이 일정하게 유지되는 동안 크게 변하지 않기 때문에 사실입니다. 

높은 강성이 필요한 플라스틱 설계의 경우 더 나은 접근 방식은 단면의 관성 모멘트를 높이기 위해 리브 또는 기타 단면 형상을 사용하는 것입니다.   이는 보이드 및 미세 다공성의 위험을 최소화하여 부품의 품질을 향상시킬뿐만 아니라 재료 함량과 사이클 시간을 줄여 부품 비용을 낮 춥니 다. 

여러 개의 균일 한 간격의 리브는 일반적으로 하나의 큰 리브보다 하중을 더 잘 분산시킵니다.   베이스에서 리브의 두께는 일반적으로 인접한 벽의 절반이지만 구조적 무결성이 외관보다 중요하거나 수지에 수축이 거의없는 경우 벽의 두께와 같을 수 있습니다.   리브 높이는   일반적으로 벽 두께의 2.5 ~ 3 배입니다.


그림 4.   리브 디자인 예

그림 5.   재료 축적을 최소화하기위한 리브 디자인

 갈비뼈가 힘을 추가하는 가장 일반적인 방법이지만 힘을 추가 할 수있는 다른 기능도 있습니다.   거싯 (작은 삼각형 갈비뼈), 주름 및 크라운입니다.


그림 6.   구성 요소 강성을 높이는 기능

반지름! 반지름! 반지름!

성형 후 플라스틱이 수축됨에 따라 날카로운 모서리에 축적되는 응력은 높은 하중이나 충격으로 인해 고장을 일으킬 수 있습니다.   이를 방지하려면 리브, 보스, 측벽 및 기타 기능이 연결되는 모서리에 넉넉한 반경을 사용하십시오.   내부 코너 반경은 응력에 따라 달라집니다.   응력이없는 영역에서 반경은 0.005 인치만큼 작을 수 있지만 부하가 높은 영역은 0.020 인치 이상의 반경을 가져야합니다.   외부 모서리의 반경은 일정한 단면을 보장하기 위해 내부 모서리의 반경에 벽 두께를 더한 값과 같아야합니다.


그림 7a.   갈비뼈의 날카로운 모서리에서 응력 집중 형성


그림 7b.   코너 반경으로 응력 집중 감소

평평한 지역을 피하십시오

넓고 평평한 영역은 뒤 틀리기 쉽습니다.   설계에 평평한 영역이 필요한 경우 가능하면 강성을 추가하기 위해 밑면에 리브를 추가하는 것이 좋습니다.   강성을 높이기위한 다른 옵션으로는 거셋 (작은 삼각형 리브), 주름 및 크라우 닝이 있습니다.   평평한 영역이 필요한 경우 수축이 적은 다른 재료를 평가하여 뒤틀림 수준을 줄일 수 있습니다.

언더컷 방지

언더컷은 금형의 복잡성과 비용 증가를 통해 부품 비용을 증가시킵니다.   언더컷은 일반적으로 부품을 몰드에서 제거 할 수 없기 때문에 피쳐를 생성하기 위해 별도의 코어 및 캠 동작이 필요합니다.   가능하면 언더컷을 제거하거나 아래 표시된 것과 같은 저렴한 금형 설계를 사용하십시오.

그림 8.   저비용 Snap-Fit 금형 설계

부착 지점에 보스 사용

이제 구성 요소가 최소 벽 두께로 설계되었으므로 나사와 같은 패스너를 지원하기 위해 추가 재료를 추가해야합니다.   보스는 공칭 벽보다 두껍지 않아야하며 횡력에 대응하기 위해 거싯으로 강화할 수 있습니다.


그림 9.   권장 보스 디자인

성형 부품을 쉽게 제거 할 수 있도록 적절한 초안 제공

금형 도구가 부품을 쉽게 열고 배출 할 수 있도록 부품을 설계해야합니다. 이것은 대부분 테이퍼링 리브, 보스 및 기타 요소에 의해 수행됩니다. 테이퍼 (또는 드래프트)는 측면 당 최소 0.5도 여야하지만 측면 당 1.5 ~ 3 도가 더 일반적입니다. 구배는 또한 몰드 표면 핀에 따라 달라지며 0.001 인치의 텍스처 깊이마다 측면 당 최소 1 도씩 증가합니다. 1도 드래프트는 길이 인치당 0.017 인치 테이퍼를 생성합니다.

초안 설계가 정확하지 않으면 부품이 인출 중 손상되어 불량률이 증가 할 수 있습니다.   분할 스프레이 또는 몰드 코팅 사용과 같은 특수 처리 단계를 사용해야 할 수도 있습니다.   제품 수율이 감소하고 추가 처리 단계 및 재료를 사용하면 프로세스 비용이 증가합니다.

일반적인 초안 값은 다음 그림에 설명되어 있습니다.

 

그림 10.   일반적인 초안 값

 분할 선, 게이트 및 녹아웃 핀을 적절하게 찾습니다.

파팅 라인, 게이트 및 노하우 핀의 위치는 툴링 비용과 부품의 품질 수준에 큰 영향을 미칩니다.

분할 선은 도구 절반이 함께 모이는 구성 요소의 선입니다. 중요한면을 가로 지르는 파팅 라인은 플래시를 제거하기 위해 2 차 작업이 필요할 수 있습니다. 공차가 엄격한 형상을 교차하는 분할 선은 금형 불일치로 인해 수율이 감소 할 수 있습니다. 파팅 라인은 부품 표면의 돌출부로 눈에 띄기 때문에 슬라이딩 표면에 위치해서는 안됩니다. 마찬가지로, "범프"또는 불일치로 인해 씰 형태가 완전히 접촉하지 못하도록하는 씰링 표면에 분할 선을 배치해서는 안됩니다.

게이트 위치는 부품 품질에 중요한 역할을합니다.   충전 동작, 최종 부품 치수, 수축, 뒤틀림, 기계적 특성 수준 및 표면 품질에 영향을줍니다. 


그림 11.    부적절한 게이팅으로 인해 재료 공백이 발생할 수 있음

웰드 라인은 둘 이상의 용융 스트림이 금형에 모일 때 형성됩니다.   예를 들어 용융물이 코어 주위로 흐르거나 구성 요소가 여러 영역에서 게이트되는 경우에 발생합니다.   웰드 라인은 종종 표면 결함으로 보입니다.   분할 선 및 녹아웃 핀과 같은 게이트는 부품 표면에 눈에 띄는 자국을 남깁니다.   따라서 게이팅은 표면 품질이 중요한 영역에서 시각적 결함이 형성되는 것을 방지하도록 설계되어야합니다.


그림 12.   웰드 라인 결함

 기본 게이팅 설계 원칙은 다음과 같습니다.

  • 스트레스가 심한 영역에서 부품을 게이트하지 마십시오.
  • 웰드 라인 방지 또는 최소화
  • 스트레스를 많이받는 영역에 웰드 라인을 남기지 마십시오.
  • 강화 플라스틱으로 게이트 위치에 따라 부품 뒤틀림 결정
  • 적절한 통풍구를 제공하여 공기가 갇히지 않도록하십시오.

대부분의 사출 성형 부품에는 유사한 기능 (벽, 리브, 반경, 보스)이 있기 때문에 여기에 제시된 설계 지침을 대부분의 사출 성형 부품에 사용할 수 있습니다.   그러나 특정 애플리케이션에 필요한 품질 수준은 다를 수 있으며 이러한 일반 지침을 무시해야합니다.   적절한 금형 설계와 함께 적절한 부품 설계는 비용을 낮추고 부품 품질을 높이며 나중에 개발 단계에서 비용이 많이 드는 설계 변경을 최소화 할 수 있습니다.

 

원본 : www.mem50212.com/MDME/MEMmods/MEM09011B-Design-Concepts/7757C-Eng-Des-Concepts/Plastic%20Part%20Design/Design%20Guidelines%20For%20Quality%20Injection%20Molded%20Components.htm?epik=dj0yJnU9ZVRvVFEtdUJWbllGd0NrOTVhdEw4Y28yRWp2NFV0NVImcD0wJm49RzE4UXVhYnZCSUV3RGM0bnlHWW05dyZ0PUFBQUFBR0FXVHNB

'구조 디자인 > 사출 금형' 카테고리의 다른 글

The use of ribs(리브 설계)  (1) 2024.07.24
Living Hinge(리빙힌지)  (1) 2024.07.24
성형 플라스틱 부품의 설계 고려사항  (0) 2019.09.12
Mold technology  (0) 2019.09.12
플라스틱 사출 성형  (0) 2019.05.23

플라스틱의 종류와 특성.pdf
3.01MB

참조 : http://pds27.egloos.com/pds/201605/23/37/02.pdf

'구조 디자인' 카테고리의 다른 글

조인트 설계 방법  (0) 2021.05.06
O-링 설계 및 조립 방법  (0) 2021.02.09
초음파 조인트 설계  (0) 2021.01.31
신속한 조립 : 스냅파트(Hook 구조) 6가지  (0) 2019.05.01

 

 



① 하이텍엔지니어링 

경기도 수원시 영통구 신원로 88, 031-695-6198 
설립한 지 20년이 넘은 목업업체로 중·대형 워킹 목업에 관한 전문적인 노하우가 풍부하다. 
 
② 자인아트 
서울시 금천구 가산디지털1로 128, 02-811-3135 
중소형의 디자인 목업 제품을 전문적으로 다루며 디테일한 후가공 노하우를 보유하고 있다. 

③ 유니트산업 
서울시 금천구 가산동 459-40 디지털산전협동화공장 A동 5층, unitinc.co.kr 
모토로라, 중국의 UT 스타콤 등 전자·정보통신 분야의 클라이언트와의 프로젝트로 관련 기술 지식이 풍부하다. 

④ 탑 모델 스튜디오 
서울시 금천구 두산로13길 28, 대성빌딩 3층, www.topmodelstudio.co.kr 
디자인 목업과 워킹 목업 모두 진행하며 LG전자, 코웨이, 지멘스 헬스케어 등의 클라이언트와의 경험으로 중·대형 가전제품과 의료 기기 개발 경험이 풍부하다. 

⑤ 제일모델 
서울시 금천구 독산1동 295-19, 02-861-6400
제품 후가공 단계인 도장과 인쇄에 관한 노하우가 많으며 다양한 소재의 목업 제작이 가능하다.  

⑥ 명성클레멘타인
서울시 금천구 벚꽃로24길 24, A동 1층,
각 분야의 젊은 목업 전문가들이 최근에 설립한 신생 목업업체로 직접 핸드폰 액세서리 사업을 하고 있어 양산 노하우까지 제공받을 수 있다.

⑦ 아이디솔루션 
서울시 금천구 가산디지털1로 142(A동 201호), www.id-s.co.kr 
삼성테크원, 신도리코, 르노삼성자동차 등을 클라이언트로 두고 있으며 자동차, 의료 용기, 전자 기기 등 설계가 중요한 산업 디자인 목업에 전문성이 뛰어나다. 

⑧ 프라스퍼 디자인
서울시 금천구 가산디지털1로 70, 호서대벤처타워 606호, 02-864-6617
중국과 일본 기업의 목업 제작 경험이 많다. 대표적인 클라이언트로는 위니아, 중국 회사 하이얼(HAIER)과 쿨패드(COOLPAD)가 있으며 가전제품과 모바일 디바이스 분야의 노하우가 풍부하다.

⑨ 엔프로토
경기도 광명시 소하1동 1345 광명테크노파크 A동 701-704호, www.nproto.com
디자인 목업 및 워킹 목업, 주형품, 실리콘 진공 주형, 도장 등의 모든 공정을 한 공장에서 진행한다.

⑩ 앤츠스튜디오
서울시 금천구 디지털로9길 47, 한신IT타워 2차 301호, www.antstudio.co.kr
자체적으로 목업 샘플을 개발하여 보유하고 있으며 최근 해외 기업과의 협업 프로젝트를 다수 진행했다.

⑪ 모델 솔루션 
서울시 금천구 벚꽃로20길 24, www.model-solution.com 
8층짜리 건물 전체에서 목업 공정이 원스톱으로 이뤄진다. ‘7일 원칙’을 지키고자 클라이언트가 의뢰한 후 7일 만에 목업 제품을 받아볼 수 있도록 정확하고 빠르게 제작하는 것이 장점. 
 

http://mdesign.designhouse.co.kr/article/article_view/102/72904

+ Recent posts