수업을 들으며 노트에 정리한 것 (문자열, 함수)
split
- 구분자를 기준으로 문자열을 잘라 배열로 만든다.
- 구분자가 연달아 있으면 빈조각이 생긴다. (실수하기 쉬운 지점)
- 구분자 여러개 지정 가능하다.
join
- split의 반대로 배열의 조각들을 구분자로 이어 하나의 문자로 만든다.
- 숫자 배열도 가능하다.
- 반복문으로 이어 붙이면 구분자가 끝에 하나 남지만 join은 그걸 알아서 해결해준다.
split과 joing을 이어쓰면 구분자를 변경할 수 있다.
concat
- 여러 문자열을 그냥 이어 붙인다. (구분자가 없는 join과 같다)
문자 배열과 문자열 사이
ToCharArray는 문자열을char배열로 만들고,new string(배열)은 그 반대로 동작한다.- 문자열은 글자를 바꿀 수 없지만,
char배열로 바꾸면 각 칸을 수정할 수 있다.
글자 단위로 손을 대야 할 때 쓰는 방법이다. - 같은 문자를 원하는 개수만큼 만드는 생성 방법도 존재한다.
using System;
Console.WriteLine(new string('=', 20));
Console.WriteLine(new string('-', 10));
Console.WriteLine($"[{new string(' ', 5)}]");
====================
----------
[ ]
StringBuilder
- 문자열은 내용이 바뀌지 않으므로, += 로 이어 붙일 때마다
앞의 것을 모두 복사한 새 문자열이 만들어짐. 붙일수록 복사하는 양이 커짐. StringBuilder는 내용을 바꿀 수 있는 문자열 담개다. 붙일 때 새로 만들지 않고 담긴 내용을 늘린다.
쓰는 방법
System.Text안에 있음 만들고,Append로 붙이고, 다 붙인 뒤ToString으로 문자열을 꺼낸다.
📝 메모:
StringBuilder 를 사용하는 독립 실행 예제에는 using System.Text; 를 직접 적음.
Console 을 사용하는 예제에는 using System; 도 필요함.
주요 메서드
| 메서드 | 하는 일 |
|---|---|
Append(값) | 끝에 붙임 |
AppendLine(값) | 붙이고 줄바꿈까지 넣음 |
AppendFormat(서식, 값들) | 서식을 적용해 붙임 |
Insert(위치, 값) | 지정한 자리에 끼워 넣음 |
Remove(위치, 개수) | 지정한 범위를 지움 |
Replace(찾을 것, 바꿀 것) | 전부 바꿈 |
Clear() | 담긴 내용을 모두 비움 |
ToString() | 문자열로 꺼냄 |
using System;
using System.Text;
StringBuilder sb = new StringBuilder();
sb.Append("Hello");
sb.Append(' ');
sb.Append("World");
sb.AppendLine("!");
sb.AppendFormat("숫자: {0:N0}", 1234567);
sb.AppendLine();
sb.Insert(0, ">>> ");
sb.Replace("World", "C#");
Console.Write(sb.ToString());
>>> Hello C#!
숫자: 1,234,567
Append는 문자열만이 아니라 숫자·문자·논릿값도 받는다. 알아서 문자열로 바꿔 붙인다.- Clear로 비우면 같은 담개를 다시 쓸 수 있다.
메서드를 이어 부르기
Append계열은 자기 자신을 돌려주므로 점을 이어 붙여 계속 호출할 수 있다.
using System;
using System.Text;
string message = new StringBuilder()
.Append("이어 부르기로 ")
.Append("한 문장을 ")
.Append("만듦")
.ToString();
Console.WriteLine(message);
이어 부르기로 한 문장을 만듦
- 반복문 안에서 쓰는 것이 본래 용도이다.
- 여러 줄을 쌓을 때는
AppendLine을 쓴다.
얼마나 차이가 나는
- +=로 한 글자씩 붙일 때 복사되는 글자 수를 세어 보면 차이가 눈에 보인다.
n번째로 붙일 때는 이미 쌓인 n - 1 글자를 복사한 뒤 한 글자를 더하므로, 회차마다 복사량이 늘어난다. - 붙이는 횟수가 10배가 되면 복사량은 약 100배가 된다.
StringBuilder 는 담긴 내용을 늘리기만 하므로 붙이는 횟수에 비례해서만 늘어남 — 10배면 10배임.
⚠️ 주의: 세 번 붙이는 것과 만 번 붙이는 것을 같은 기준으로 볼 필요는 없음. 문제가 되는 것은 반복문 안에서 붙이는 경우임. 반복 횟수가 실행 중에 정해지면 그 안에서 몇 번 붙게 될지 알 수 없으므로 StringBuilder 를 쓰는 편이 안전함.
어느 쪽을 쓸 것인가
| 상황 | 알맞은 것 |
|---|---|
| 정해진 개수의 값을 한 번 합침 | 보간 문자열 · + |
| 배열의 조각들을 구분자로 잇기 | string.Join |
| 반복문 안에서 계속 붙임 | StringBuilder |
| 붙이는 횟수가 실행 중에 정해짐 | StringBuilder |
| 중간에 끼워 넣고 지우기를 반복함 | StringBuilder |
함수
개요
지금까지 쓴 프로그램은 첫 줄에서 마지막 줄까지 한 방향으로 흘렀음. 코드가 길어지면 두 가지가 걸림돌이 된다.
- 같은 일을 하는 코드가 여러 곳에 복사된다. 고칠 일이 생기면 복사한 곳을 빠짐없이 찾아 고쳐야 한다.
- 전체가 한 덩어리라 어느 부분이 무슨 일을 하는지 읽어 내기 어렵다.
함수(function) 는 특정 작업을 하는 코드에 이름을 붙여 묶은 것이다.. 이름을 부르면 묶어 둔 코드가 실행되고, 필요하면 값을 받아 처리한 뒤 결과를 돌려준다.
| 용어 | 뜻 |
|---|---|
| 함수 | 이름을 붙여 묶은 코드 덩어리 |
| 호출(call) | 함수 이름을 불러 그 코드를 실행시키는 것 |
| 매개변수(parameter) | 함수가 받기로 정해 둔 입력값. 함수 정의에 적음 |
| 인수(argument) | 호출할 때 실제로 넘기는 값. 함수 호출에 적음 |
| 반환값(return value) | 함수가 호출한 쪽으로 돌려주는 결과 |
함수와 메서드: 클래스에 속한 함수를 메서드(method) 라고 부름. 이 장에서는 클래스 틀 없이 함수를 만들어 쓰므로 함수로 부르고, 두 낱말을 구분하지 않음
사실 함수는 이미 여러 번 써 왔음.
Console.WriteLine,int.Parse,Math.Max가 모두 누군가 미리 만들어 둔 함수임. 지금부터는 직접 만드는 쪽을 다룸.
함수가 필요한 이유
같은 코드가 반복될 때
- 구분선의 길이를 바꾸거나 안내 문구를 고치려면 여섯 곳을 모두 찾아 고쳐야 한다. 한 곳을 빠뜨리면 출력이 어긋나는데, 컴파일러는 그것을 오류로 알려 주지 않는다.
- 함수로 묶어서 얻는 것
| 얻는 것 | 내용 |
|---|---|
| 재사용 | 한 번 정의하고 필요한 만큼 호출함 |
| 한 곳 수정 | 고칠 자리가 함수 안 한 곳으로 모임 |
| 읽기 쉬움 | PrintHeader() 한 줄이 세 줄보다 의도를 잘 드러냄 |
세 번째가 가장 중요함. 함수 이름이 곧 그 코드가 무슨 일을 하는지에 대한 설명이 되기 때문임.
함수 정의와 호출
가장 단순한 함수 (void)
- 받는 값도 없고 돌려주는 값도 없는 함수
- 정의만 하고 호출하지 않으면 함수 안의 코드는 한 번 도 실행되지 않는다.
using System;
ShowTitle();
void ShowTitle()
{
Console.WriteLine("=== 던전 탐험 ===");
}
실행 결과 > === 던전 탐험 ===
여러 번 호출하기
- 한 번 정의한 함수는 원하는 만큼 부를 수 있다.
using System;
Beep();
Beep();
Beep();
void Beep()
{
Console.WriteLine("삐-");
}
실행결과 > 삐-
삐-
삐-
- 반복문과 섞어 사용이 가능하다.
using System;
for (int i = 0; i < 3; i++)
{
Beep();
}
void Beep()
{
Console.WriteLine("삐-");
}
실행결과 > 삐-
삐-
삐-
이름 짓는 규칙
-
함수 이름은 파스칼 표기법으로 쓴다. 첫 글자를 포함해 각 낱말의 첫 글자를 대문자로 적는 방식
표기 판정 PrintHeader권장 GetTotalPrice권장 printHeader변수 표기법이라 함수에 쓰지 않음 print_headerC# 표기법이 아님
정의 위치
- 함수 정의는 실행문 사이 어디에 놓아도 된다. 정의보다 앞에서 호출해도 문제없다.
using System;
Console.WriteLine("프로그램 시작");
Greet();
void Greet()
{
Console.WriteLine("반갑습니다");
}
Console.WriteLine("프로그램 끝");
Greet();
실행 결과 >
프로그램 시작
반갑습니다
프로그램 끝
반갑습니다
💡 팁: 문법상 위치는 자유롭지만 함수 정의를 파일 아래쪽에 모아 두면 위쪽의 실행 흐름이 한눈에 들어옴. 위 예제는 규칙을 보이려고 일부러 정의 뒤에도 실행문을 두었고, 이후 예제는 모두 아래쪽에 모으는 관례를 따름
함수가 함수를 호츨
- 함수 안에서 다른 함수를 부를 수 있다. 이렇게 하면 큰 작업을 작은 작업으로 쪼갤 수 있다.
using System;
StartGame();
void StartGame()
{
ShowTitle();
ShowMenu();
Console.WriteLine("선택하세요:");
}
void ShowTitle()
{
Console.WriteLine("=== 던전 탐험 ===");
}
void ShowMenu()
{
Console.WriteLine("1. 새 게임");
Console.WriteLine("2. 이어하기");
Console.WriteLine("3. 종료");
}
실행 결과 >
=== 던전 탐험 ===
1. 새 게임
2. 이어하기
3. 종료
선택하세요:
매개변수
값을 받는 함수
- 함수마다 다른 값을 다루게 하려면 매개변수로 값을 받는다.
using System;
ShowMessage("안녕하세요");
ShowMessage("반갑습니다");
ShowMessage("좋은 하루 되세요");
void ShowMessage(string message)
{
Console.WriteLine(message);
}
실행 결과 >
안녕하세요
반갑습니다
좋은 하루 되세요
매개변수가 여러 개일 때
- 쉼표로 구분해 여러 개를 받을 수 있다. 인수는 적힌 순서대로 매개 변수에 담긴다.
using System;
PrintSum(10, 20);
PrintSum(5, 3);
PrintSum(100, 200);
void PrintSum(int a, int b)
{
Console.WriteLine($"{a} + {b} = {a + b}");
}
실행 결과 >
10 + 20 = 30
5 + 3 = 8
100 + 200 = 300
타입이 서로 다른 매개변수
- 매개변수마다 타입을 따로 적으므로 섞어 사용할 수 있다.
using System;
Introduce("홍길동", 25, 178.5);
Introduce("김철수", 30, 172.0);
void Introduce(string name, int age, double height)
{
Console.WriteLine($"{name} / {age}세 / {height}cm");
}
실행 결과 >
홍길동 / 25세 / 178.5cm
김철수 / 30세 / 172cm
인수의 개수와 타입이 맞아야 한다.
- 매개변수가 정한 개수와 타입에 맞지 않으면 컴파일 오류가 난다.
using System;
void PrintSum(int a, int b)
{
Console.WriteLine(a + b);
}
PrintSum(10); // 오류: 인수가 모자람
PrintSum(10, 20, 30); // 오류: 인수가 남음
PrintSum("10", "20"); // 오류: 타입이 다름
배열을 매개변수로 받기
- 배열도 다른 값과 마찬가지로 넘길 수 있다.
using System;
int[] scores = { 88, 92, 79, 95, 61 };
PrintAll(scores);
void PrintAll(int[] values)
{
foreach (int value in values)
{
Console.Write($"{value} ");
}
Console.WriteLine();
}
실행 결과 > 88 92 79 95 61
반환값
값을 돌려주는 함수
- 지금까지의 함수는 화면에 출력만 했지만, 계산 결과를 호출한쪽이 받아서 쓰려면 갑을 돌려줘야 한다.
using System;
string message = GetGreeting();
Console.WriteLine(message);
string GetGreeting()
{
return "안녕하세요";
}
void 자리에 돌려줄 값의 타입을 적고, 본문에서
return으로 값을 넘김. 반환 타입과
return 이 넘기는 값의 타입은 일치해야 함.
계산 결과 반환하기
- 반환값은 변수에 담지 않고 그 자리에서 바로 쓸 수도 있다. 함수 호출이 곧 값이기 때문이다.
출력하는 함수와 돌려주는 함수
- 같은 계산이라도 출력까지 하는 함수와 값만 돌려주는 함수는 쓰임이 다르다.
// 출력까지 하는 함수
using System;
PrintSquare(5);
// 값만 돌려주는 함수
int value = GetSquare(5);
Console.WriteLine($"제곱을 두 배로: {value * 2}");
void PrintSquare(int x)
{
Console.WriteLine($"{x}의 제곱은 {x * x}");
}
int GetSquare(int x)
{
return x * x;
}
실행 결과 >
5의 제곱은 25
제곱을 두 배로: 50
PrintSquare의 결과는 화면에만 남아 다시 쓸 수 없음.
GetSquare는 결과를 값으로 받으므로 이어서 계산할 수 있음. 계산과 출력을 나누는 편이 재사용에 유리함.
조건에 따라 다른 값 반환하기
return은 함수 안 어디에나 놓을 수 있고, 여러 개를 둘 수도 있다.
오늘은 학원에서 디벨로그를 작성했다. 메모로 다 따라가기엔 수업 내용이 벅차서 강의 내용을 많이 참고했다.
배운 것은 많지만 아직 머릿속에서 정리가 되질 않아 나머지는 주말에 적어보려 한다!



