๐ŸšจC# ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค๋ฅ˜ 7๊ฐœ๐ŸŽ(์„ ๋ฌผ)

10870 ๋‹จ์–ด
๊ฐœ๋ฐœ์ž๋Š” ํ•ญ์ƒ ์‹ค์ˆ˜๋ฅผ ํ•œ๋‹ค. ์™„๋ฒฝํ•œ ์‚ฌ๋žŒ์€ ์—†๋‹ค.๊ทธ๋“ค ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค, ํŠนํžˆ C# ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ฐ˜๋ณต์ ์ธ ์‹คํ—˜์„ ํ†ตํ•ด ํ•™์Šต๊ณผ ๊ฐœ์„ ์„ ํ•œ๋‹ค.๋‚˜๋Š” ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž์—์„œ ๊ณ ๊ธ‰ ๊ฐœ๋ฐœ์ž๋กœ์˜ ๊ณผ๋„๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค.
๋น„๋ก ์ด๋Ÿฐ ์‹œํ–‰์ฐฉ์˜ค '์ „๋žต' ์€ ํšจ๊ณผ๊ฐ€ ์žˆ์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•˜๋ฉด, ๊ทธ๋“ค์€ ๊ฐœ๋ฐœ๋œ ์†Œํ”„ํŠธ์›จ์–ด์—์„œ ๋งŽ์€ ํšจ์œจ๊ณผ ํ’ˆ์งˆ ๋ฌธ์ œ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ณธ๋ฌธ์—์„œ ๋‚˜๋Š” ๋งŽ์€ C# ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐ€์žฅ ํ”ํ•˜๊ณ  ํ”ํ•˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ง‘ํ–ˆ๋‹ค.

โŒ 1. ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ์‚ฌ์šฉ


๋ฌธ์ž์—ด ์ง๋ ฌ ํ•จ์ˆ˜์˜ ์ž‘์—… ๋ฐฉ์‹์€ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค๐Ÿ‘‡
๋ฌธ์ž์—ด์— ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ์— ์ž๋™์œผ๋กœ ์ƒˆ ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.์ด์ „ ๋ฌธ์ž์—ด์€ ๋ณ€๊ฒฝ๋œ ์œ„์น˜๊ฐ€ ์žˆ๋Š” ์ƒˆ ๋ถ€ํ’ˆ์— ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. (์ด๊ฒƒ์€ ๊ทผ๋ณธ์ ์œผ๋กœ ํšจ์œจ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)ย 
AspireSys์˜ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.๐Ÿ‘‡
List dotnetsaferTools = new List(){"Shield","Secrets","Linker"};
string tools = string.Empty;
foreach (var tool in dotnetsaferTools)
{   
  tools += tool; // Creates a copy of the string in memory
}

โœ… ์†”๋ฃจ์…˜


์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ์ง‘ํ•ฉ์ด ์•„๋‹Œ StringBuilder ๋Œ€์ƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ™์€ ์œ„์น˜๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๋ณต์‚ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ๊ณผ์ •์„ ๋”์šฑ ๊ฐ„๋‹จํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ํ•„์š”ํ•œ ๋ชจ๋“  ์กฐ์ž‘์„ ๋นˆํ‹ˆ์—†์ด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๊ฒŒ ์–˜์˜ ๋ชจ์Šต์ด์—์š”.๐Ÿ‘‡
StringBuilder toolsBuilder = new StringBuilder();
foreach (var tool in dotnetsaferTools)
{
  toolsBuilder.Append(tool);
}

โŒ 2. LINQ ๋Œ€์‹  ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜๋ณต


๋ชฉ๋ก์„ ๋ฐ˜๋ณตํ•ด์„œ ๊ธฐ๋กํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ๋•Œ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ตœ์„ ์ด ์•„๋‹™๋‹ˆ๋‹ค.
foreach (Customer customer in CustomerList) {
  if (customer.State == "ES") {
    tax += customer.Balance;
  }
}

โœ… ์†”๋ฃจ์…˜


์šฐ๋ฆฌ๋Š” ์ด๋ ‡๊ฒŒ ํ•˜์ง€ ๋ง๊ณ  LINQ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. LINQ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‰ฝ๊ฒŒ ๋Œ€์ƒ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.
tax = CustomerList.Where(customer => customer.State.Equals("ES")).Sum(c=>c.Balance);

๐Ÿ“š This is more efficient than a foreach loop.


โŒ 3. ์ˆ˜์ต๋ฅ ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค


์ด๊ฒƒ์€ ๋‹ค๋ฅธ ํ˜ธ์ถœ์ž๋ฅผ ์œ„ํ•œ ๋Œ€์ƒ ๋งค๊ฑฐ์ง„์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

โœ… ์†”๋ฃจ์…˜


์ด ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ, ๋ฐ˜ํ’ˆ ์œ„ํƒ์ˆ˜๋ น์„ ์‹œ๋„ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.์‚ฌ์šฉ ์ˆ˜์ต๋ฅ  ์ˆ˜์ต์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ์ „์ฒด ์ง‘ํ•ฉ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์ด๊ฒƒ์€ ๋งค๋ฒˆ ๊ต์ฒด๋œ ํ›„์— ์ œ์–ด๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ณ  ํ•„์š”ํ•œ ๊ฒฐ๊ณผ๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โŒ 4. LINQ ์‹คํ–‰ ์ง€์—ฐ


LINQ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š”foreach ์ˆœํ™˜์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ดif ๋ธ”๋ก์„ ๋ผ์›Œ ๋„ฃ๋Š” ๊ฒƒ์ด๋‹ค.ํด๋ผ์ด์–ธํŠธ ๋ชฉ๋ก์„ ๋ณด๋ ค๋ฉด LINQ To SQL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
public IEnumerable GetCustomers()
{
  using(var context = new DBContext())
  {
    return from c in context.Customers
      where c.Balance > 2000
      select c;
  }
}
๋ณด์•„ํ•˜๋‹ˆ ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค ์ข‹์€ ๊ฒƒ ๊ฐ™์ง€ ์•Š๋‹ˆ?์šฐ๋ฆฌ๊ฐ€ ๋งค๊ฑฐ ์ง‘ํ•ฉ์„ ์‹œ๋„ํ•  ๋•Œ๊นŒ์ง€ (์ด์ƒ์œผ๋กœ ๋˜๋Œ์•„๊ฐˆ ๊ฒƒ์ด๋‹ค.)
๊ฒฐ๊ณผ์ ์œผ๋กœ LINQ๋Š” ๋งค๊ฑฐ์ง„ ๊ฒฐ๊ณผ๋ฅผ ์‹œ๋„ํ•˜๊ธฐ ์ „์— ์–ด๋– ํ•œ ์งˆ์˜๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

โœ… ์†”๋ฃจ์…˜


๋ชจ๋“  LINQ ์งˆ์˜๋ฅผ ToArray()๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.์ด๋ ‡๊ฒŒ ํ•˜๋ฉด LINQ๋Š” ๋จผ์ € ์กฐํšŒ๋ฅผ ํ‰๊ฐ€ํ•œ ๋‹ค์Œ์— ๋‹ค๋ฅธ ์ผ์„ ํ•ด์•ผ ํ•œ๋‹ค.

โŒ 5. ๊ตฌ์กฐ ํ•จ์ˆ˜์— ์ ‘๊ทผํ•œ ๊ฐ€์ƒ ๊ตฌ์„ฑ์›


๋น„๋ก ์ด๊ฒƒ์€ ์ฒซ ๋ฒˆ์งธ ์‹ค์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ, ๊ทธ๊ฒƒ์€ ๊ฐ€์žฅ ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์‹ค์ˆ˜ ์ค‘์˜ ํ•˜๋‚˜์ด๋‹ค. ๋น„๋ก ๋ณด๊ธฐ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ.ย 
๋‹ค์‹œ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์ด ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ ํ•จ์ˆ˜์—์„œ ์ง์ ‘ ํ˜ธ์ถœ๋  ๋•Œ, ์ด ์˜ค๋ฅ˜๋Š” ๋ฏธ๋ฆฌ ์‹คํ–‰๋œ ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
public class Parent
{
  public Parent()
  {
    Console.WriteLine("Parent Ctor");
    Method();
  }

  public virtual void Method()
  {
    Console.WriteLine("Parent method");
  }
}

public class Child : Parent
{
  public Child()
  {
    Console.WriteLine("Child Ctor");
  }

  public override void Method()
  {
    Console.WriteLine("Child method");
  }
}

โœ… ์†”๋ฃจ์…˜


๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ ์‚ฌ์‹ค์€ ๊ฐ„๋‹จํ•ด์š”.์šฐ๋ฆฌ๋Š” ๋‹จ์ง€ ์ด ์ข…๋ฅ˜๋ฅผ ๋ฐ€๋ด‰์œผ๋กœ ํ‘œ์‹œํ•  ๋ฟ์ด๋‹ค.

What does this do? ๐Ÿค”


์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ, ์šฐ๋ฆฌ๋Š” ๊ฐ€์ƒ ๋ฐฉ๋ฒ•์„ ํ˜ธ์ถœํ•  ๋•Œ ์–ด๋– ํ•œ ๊ฒฝ๊ณ ๋„ ๋ฐ›์ง€ ์•Š๋„๋ก ํ™•๋ณดํ•œ๋‹ค.

โŒ 6. ๋ฌผํ’ˆ ์ฒ˜๋ฆฌ์— ์ค‘์š”์„ฑ ๋ชฐ๋ผ


ํŒŒ์ฒดํฌ๋กœ์„œnl์€ ๋งŽ์€ C# ๊ฐœ๋ฐœ์ž๋“ค์ด ์ด๋Ÿฌํ•œ ๊ฐœ๋…, ์ฆ‰ using ํ‚ค์›Œ๋“œ๋ฅผ ๋ช…์นญ ๊ณต๊ฐ„์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ง€๋ น์œผ๋กœ ์‚ฌ์šฉํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋Œ€์ƒ ์‚ญ์ œ์—๋„ ๋งค์šฐ ์œ ์ตํ•˜๋‹ค๊ณ  ๋งํ•œ๋‹ค.

โœ… ์†”๋ฃจ์…˜


์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋Œ€์ƒ์„ ์‚ญ์ œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•œ๋‹ค๋ฉด, ๊ทธ ๋Œ€์ƒ์ด ์ •ํ™•ํ•˜๊ฒŒ ์‚ญ์ œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด using ๋ฌธ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
์˜ˆ๋ฅผ ํ•˜๋‚˜ ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.๐Ÿ‘‡
using(DisposableClass DisposableObject = new DisposableClass())
{
  DisposableObject.DoTheJob();
}
// Does the same as:
DisposableClass DisposableObject = new DisposableClass();
try
{
  DisposableObject.DoTheJob();
}
finally
{
  DisposableObject.Dispose();
}

โŒ 7. ์•ฝํ•œ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ


์—ฌ๊ธฐ์„œ, ์šฐ๋ฆฌ๋Š” Stackify์˜ ๊ด€์ ์— ๋™์˜ํ•œ๋‹ค. ์ด ์˜ค๋ฅ˜๋Š” ๋‹จ์ง€ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์œ ํ–‰์ด ์ง€๋‚ฌ๊ฑฐ๋‚˜ ๊ณต๊ฒฉ๋ฐ›๊ธฐ ์‰ฌ์šด ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (์ด๊ฒƒ์€ ํ”ผํ•˜๊ธฐ ์‰ฝ๋‹ค.)
์ด ์˜ˆ์—์„œ SHA1์ด๋‚˜ RIPEMD160๊ณผ ๊ฐ™์€ ๊ฒƒ์€ ํ˜„์žฌ์˜ ๋งค์šฐ ์ข‹์€ ์•ˆ์ „ ์ˆ˜์ค€์„ ์ œ๊ณตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
using System.Security.Cryptography;   
...   
var hashAlg = SHA1.Create();

โœ… ์†”๋ฃจ์…˜


์†”๋ฃจ์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ•๋ ฅํ•œ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • SHA256 SHA1 ์•„๋‹˜

  • RIPEMD160์ด ์•„๋‹Œ SHA512

  • AES๊ฐ€ 3๋ฐฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ
  • ๐ŸŽ ์„ ๋ฌผ์„ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ?


    ๋งŒ์•ฝ ๋„ค๊ฐ€ ์ด ๊ธ€์„ ์ฝ๊ณ  ์žˆ๋‹ค๋ฉด, ์ด๊ฒƒ์€ ๋„ค๊ฐ€ ๊ธ€์„ ์ฝ๋Š” ๋งˆ์ง€๋ง‰ 1%์— ์†ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋„ˆ๋Š” ์„ ๋ฌผ์„ ๋ฐ›์•˜๋‹ค๐ŸŽ!!!! ์šฐ์„  ๋”ฑ์ •๋ฒŒ๋ ˆ ํ•œ ๋งˆ๋ฆฌ๋ฅผ๐Ÿฆ„ (์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‚˜๋Š” ๋ˆ„๊ฐ€ ์ „์ฒด ๋ฌธ์žฅ์„ ์ฝ์€ ์ถฉ์‹คํ•œ ๋…์ž์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค๐Ÿ’œ).
    ๋‹จ์ง€ ์ด ๋ฌธ์žฅ์— ๋“ค์–ด๊ฐ€์„œ ์ด ๋ฌธ์žฅ์„ ์—ฌ๊ธฐ๊นŒ์ง€ ์˜ค๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ, ๋‚˜๋Š” ๋„ˆ์—๊ฒŒ ์„ ๋ฌผ์„ ํ•˜๋‚˜ ์ฃผ๊ณ , ์ง€์นจ์„ ํ•˜๋‚˜ ์ฃผ์–ด ๋„ˆ์˜ ๊ฑด๊ฐ•์„ ์œ ์ง€ํ•˜๊ฒŒ ํ•  ๊ฒƒ์ด๋‹ค.NET ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ๐ŸŽ.

    ๋„ค๊ฐ€ ์œ ์ผํ•˜๊ฒŒ ํ•ด์•ผ ํ•  ์ผ์€ ๋„ค ์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•ด์„œ ๋ฌด๋ฃŒ๋กœ ๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค๐Ÿค‘.
    ๐Ÿšจ ์ด๊ฒƒ์€ ์˜์›ํžˆ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.
    ๋ฐฐํƒ€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ, ๋‚˜๋Š” ๊ณง ์ด ๋ฌธ์žฅ์„ ํŽธ์ง‘ํ•  ๊ฒƒ์ด๋ฉฐ, ๋” ์ด์ƒ ์„ ๋ฌผ์ด ์—†์„ ๊ฒƒ์ด๋‹ค.๊ทธ๋Ÿฌ๋‹ˆ ์–ด์„œ ๋‹น์‹ ์˜ ์•ˆ๋‚ด์„œ๋ฅผ ์ฐพ์•„๊ฐ€์„œ ํ›Œ๋ฅญํ•œ ๊ต์‚ฌ๊ฐ€ ๋˜๋„๋ก ํ•˜์„ธ์š”.๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€!๐Ÿ‘‡๐Ÿ‘‡๐Ÿ‘‡
    Download FREE guide ๐ŸŽ

    ์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ