[디자인패턴] 싱글톤(Singleton) 패턴이란?
·
공부/소프트웨어공학
싱글톤 패턴은 Creational Design Pattern이다.무엇인가?- 단 하나의 클래스 객체(instance)가 생기도록하는 패턴이다. 어디서나 접근 가능하다.​왜 사용하나?- 어디에서 접근 가능한 객체가 필요한 경우가 생기기 때문이다.최초로 객체를 생성하고 난 뒤에 추가로 객체를 생성할 필요가 없으니 메모리, 속도 면에서 이점이 있다. public static Logger getInstance() { if (instance == null) instance = new Logger(); return instance; }이렇게 ​instance가 null이라면 새로운 instance를 생성하고, instance가 이미 있다면 기존 instance를 사용하는 방식이다. 싱글 스레드에서는 아무 문..
[C] 0xC0000005: 0x0000000000000003 위치를 읽는 동안 액세스 위반이 발생했습니다.
·
언어/C
scanf("%d %d", &N, &M); scanf를 하려는데 오류가 발생했다. 엑세스 위반이라는 뜻이다. 프로세스가 접근할 권한이 없는 메모리 영역에 접근하려고 할 때 발생한다. ✅ 동적 메모리를 할당하기 ✅ 할당한 메모리 내에서 메모리를 사용하기
[Coding] 하드코딩이란?
·
공부
코드 내부에 직접 일정 값을 입력해주는 형식을 하드코딩이라고 한다. 단어에서 풍겨오는 느낌 그대로 프로그램에 필요한 값을 직접 때려박는 형식(상수 등). 지금까지 내가 해온 대부분의 코드는 하드코딩으로 작성됐다. ​ 하드코딩은 코드를 작성하기 쉽고, 가독성이 좋지만 보안에 매우 취약하고, 프로그램의 유지보수가 어렵다는 단점이 있다.
[C#] Dictionary란
·
언어/C#
Dictionary란 Key값과 Value를 사용해 값들을 지정해놓을 수 있는 유용한 클래스를 말한다. 정말 사전처럼 미리 지정해놓은 Key값에 해당하는 Value를 손쉽게 찾아볼 수 있다. Key값은 중복되어서는 안된다. using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Dictionary dic = new Dictionary(); // Dictionary 이름 = new Dictionary(); dic.Add(3, "봄"); dic.Add(1, "겨울"); dic.Add(10, "가을"); dic.Add(8, "여름"); foreach(KeyValuePair n in dic) Console.Wr..
[C#] virtual과 abstract (추상 클래스)
·
언어/C#
·virtual 상속 받는 클래스에서 virtual에 있는 내용 중 필요한 것만 골라서 구현해주면 된다. ​ ·abstract (추상 클래스) 상속 받는 클래스에서 abstract에 있는 내용을 반드시 구현해주어야한다. abstract는 추상 클래스다. 추상 클래스에 있는 멤버는 구현할 수 없고 상속받는 곳에서 구현해주어야 한다. using System; namespace ConsoleApp1 { class Program { public abstract class Essential { public virtual void Breath() { Console.WriteLine("숨쉬기"); } public abstract void Fly(); public abstract void Swim(); } public..
[C#] Queue과 Stack
·
언어/C#
Queue와 Stack은 선형자료구조를 사용할 때 유용한 두 구조이다. ​ ·Queue 가장 먼저 들어온 값이 가장 먼저 빠진다. using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Queue q = new Queue(); q.Enqueue("첫 번째"); q.Enqueue("두 번째"); q.Enqueue("세 번째"); foreach (string s in q) Console.WriteLine($"{s}", s); Console.WriteLine(); q.Dequeue(); foreach (string s in q) Console.WriteLine($"{s}", s); } } } q.Dequeue..
[C#] 함수, 클래스, 객체, 인스턴스, 생성자
·
언어/C#
· 함수(Method) 함수란 어떤 일을 실행하는 코드를 묶어놓은 코드 블럭을 말한다. ​ · 클래스(Class) 객체를 생성하기 위해 변수와 메소드를 정의하는 틀이다. ​ · 객체(Object) 클래스에 정의된 내용이 메모리에 생성되면 객체라고 말한다. ​ · 인스턴스(Instance) 클래스로부터 만들어진 객체를 그 객체의 인스턴스라고 한다. 클래스로부터 객체를 만드는 과정을 인스턴스화라고 한다. ​ · 생성자 클래스와 같은 이름을 가진 인스턴스 초기화 메서드이다. 반환값이 없고 오버로딩이 가능하다. using System; namespace Test { class Food // 클래스 { public Food() // 생성자 { // 초기화가 필요한 내용 } public void Rice() // ..
[C#] Generic Type 사용하기
·
언어/C#
동일한 내용이지만 데이터 타입만 다른 메소드를 사용할 때, 원래대로라면 매번 데이터 타입만 다르고 내용은 같은 메소드를 만들어주어야 한다. 이때 Generic Type을 사용하면 메소드를 한 번만 호출하고도 원하는 기능을 모두 사용할 수 있다. void Swap (ref T a,ref T b) { var temp = a; a = b; b = temp; } a와 b의 자리를 바꿔주는 간단한 예시문이다. 이름 뒤에 를 붙여 모든 데이터 타입을 아우를 수 있게 됐다. class Program { void Swap (ref T a,ref T b) { var temp = a; a = b; b = temp; } void IntProcess() { int a = 1; int b = 2; Swap (ref a, ref..
[C#] temp를 사용한 자리 바꿔치기
·
언어/C#
static void Main(string[] args) { int[] arr = { 1, 2, 3, 4, 5, }; for (int i = 0; i < arr.Length; i++) Console.Write($"{arr[i]} "); } 여기서 5와 1의 위치를 바꾸고 싶다. static void Main(string[] args) { int[] arr = { 1, 2, 3, 4, 5, }; arr[0] = arr[4]; arr[4] = arr[0]; for (int i = 0; i < arr.Length; i++) Console.WriteLine(arr[i]); } 단순하게 위치를 바꾸어 봤지만 1이 사라지고 5만 두 개로 늘어난 모습을 볼 수 있다. 이럴 때는 임시값인 temp를 사용하면 된다. s..
[C#] CS0122 보호 수준 때문에 액세스할 수 없습니다
·
언어/C#
monster = new Slime();​ class Knight : Player { Knight() : base(PlayerType.Knight) { SetInfo(100, 10); } } 오류가 발생했다. 보호 수준 때문에 엑세스할 수 없다는 내용. class Knight : Player { public Knight() : base(PlayerType.Knight) { SetInfo(100, 10); } } monster = new Slime(); 해결됐다. 한정자를 설정해주지 않아서 발생한 문제였다. public으로 설정해주고 나니 말끔.
[C#] overloading과 overriding
·
언어/C#
· overloading은 같은 이름의 함수를 여러번 호출하면서 다른 방식으로 사용하는 것이다. (정의는 아님. 내 맘대로 정리한 문장) static void Function(int a) { Console.WriteLine(a); } static void Function(int a, int b) { Console.WriteLine(a + b); } static void Main(string[] args) { Function(1); // 1 Function(4, 3); // 7 } Function(int a)와 Function(int a, int b)는 같은 이름을 갖고 있지만 각자 원하는 인자가 다르다. 인자를 넣어주면 알아서 다른 결과값을 출력해준다. 이게 오버로딩이다. ​ · overriding은 부..
[C#] Shallow Copy와 Deep Copy
·
언어/C#
갑자기 드는 생각인데 영어권 사람들은 코딩 배우기가 정말정말정말 쉽겠다. 문서 찾을 때도 그냥 보고 읽으면 되니까... 부럽다. · 얕은 복사 (Shallow Copy) 객체의 참조를 복사하는 것. class MyClass { public int name; public int age; } static void Main(string[] args) { MyClass myClass = new MyClass(); myClass.name= 1; myClass.age= 2; MyClass yourClass = myClass; yourClass.name= 100; Console.WriteLine($"{myClass.name} {myClass.age}"); Console.WriteLine($"{yourClass.nam..
[C#] ReadLine 문자열 입력 받기
·
언어/C#
C#에서 문자열을 입력받기 위해서는 ReadLine이라는 것이 필요하다. static void Main(string[] args) { string input = Console.ReadLine(); Console.WriteLine(input); } 입력한 값은 string 문자열이기 때문에 정수를 입력받고 싶다면 string을 int로 변환해주어야 한다. static void Main(string[] args) { int input = Convert.ToInt32(Console.ReadLine()); Console.WriteLine(input); } Convert.ToInt() 또는 int.Parse()를 사용해준다. static void Main(string[] args) { int input = int..
[C#] 상수, 열거 - 가위바위보 개선
·
언어/C#
using System; namespace CSharp { class Program { enum Choice { Rock = 1, Paper = 2, Scissors = 0 } static void Main(string[] args) { // 0 -> 가위 1-> 바위 2-> 보 Random rand = new Random(); int aiChoice = rand.Next(0, 3); // 0~2 사이의 랜덤 값 int choice = Convert.ToInt32(Console.ReadLine()); switch(choice) { case (int)Choice.Scissors: Console.WriteLine("당신의 선택은 가위입니다."); break; case (int)Choice.Rock: Cons..
[C] 햄버거 쌓기 게임
·
언어/C
#include #include #include int level; char patty; char cheese; char cabbage; char tomato; char mushroom; int ingredient[5] = { 0,0,0,0,0 }; int answer[6] = { 0,0,0,0,0,0 }; int myAnswer[6] = { 0,0,0,0,0,0 }; void burgerData(); void printHamburger(int inside); int main(void) { srand(time(NULL)); long startTime = 0; long prevTime = 0; long totalTime = 0; int num; burgerData(); startTime = clock();..