본문 바로가기

Unity 개발 공부

[내일배움캠프 사전캠프] 3일차 C# 문법기초 제어문,배열, 함수, 클래스와 객체 (25.03.24)

1. 오늘 학습 키워드

세번째: 제어문. 배열, 함수, 클래스와 객체 복습
 

 

2. 오늘 학습 한 내용을 나만의 언어로 정리하기

 

제어문에는
조건문, 반복문 이 있으며, 조건제어에는 break, continue 가 존재한다.
차례대로 학습해보자.


먼저 조건문이다.

if 문

 

if (조건)

{

실행내용

}

 

조건을 체크해서 중괄호 { } 에 있는 내용 실행한다. 조건인 논리연산으로 계산된게 맞는지 확인 후 만족하지않으면 실행 x

예)
if ( 3>1)

{

Console.WriteLine("3은 1보다 크다!");
}

// 조건을 만족하기에 실행한다.

else if 

 

if(조건)

{

}

else if (추가 조건)

{

실행내용

}

 

if 문 밑에 따라서 붙는다.

if 문을 만족하지 못하면 다시 조건을 체크한다.

if와 else if 가 있을때 둘 중 하나만 실행된다.

 

예)

int x= 20;

if(x>10)

{

Console.WriteLine ("x는 10보다 크다!");

}

else if (x>5)

{

Console.WriteLine ( "x는 10보다는 작지만 5보다는 크다");

 

// 조건이 맞아 if 문 내용 실행
int x = 8;

if(x>10)

{

Console.WriteLine ("x는 10보다 크다!");

}

else if (x>5)

{

Console.WriteLine ( "x는 10보다는 작지만 5보다는 크다");

 

// 조건이 else if 문이 맞아서 내용을 실행.

 

 

else

 

if(조건)

{

}

else

{

실행내용

}

 

if 문 밑에 다라 붙으며, if 문을 만족하지 못했을때 실행,

if와 else가 있을때 둘중하나만 실행

 

예)

if(3>1)

{

Console.WriteLine("3은 1보다 크다!");

}

else

{

Console.WriteLine("틀렸습니다!!");

}

//조건이 맞으니 3은 1보다 크다! 실행

 

if(0>1)

{

Console.WriteLine ("0은 1보다크다 !");

}

else

{

Console.WriteLine("틀렸습니다!");

}

//조건이 맞지않아, 틀렸습니다! 실행

 

if, else if, else 같이쓰기

 

if(조건)

{

실행 내용

}

else if (추가조건)

{

실행내용

}

else

{

실행내용

}

 

else if는 여러번 체크 가능,,

 

if(조건)

{

실행내용

}

else if (추가 조건)

{

실행 내용

}

else if (추가 조건)

{

실행 내용

}

else

{

실행 내용

}

 

예)

int score = 60;

 

if(score > 90)

{ // 실행 Console.WriteLine("성적이 매우 우수합니다!!!!!"); }

else if(score > 70)

{ Console.WriteLine("성적이 우수합니다."); }

else if(score > 50)

{ Console.WriteLine("합격은 했지만 좀 더 노력하세요"); }

else

{ Debug.Log("불합격 입니다."); }

// 합격은 했지만 좀 더 노력하세요 실행

 

 

switch case

변수 한개를 가지고 그 변수가 무엇인지 확인하는 조건문

if ~ else if 로 대체 할 수 있으나, 한가지 조건을 더 정교하게 체크한다.

 

switch (조건 변수)

{

case 상수 조건1:

실행내용;

break;

 

case 상수 조건2:

실행내용;

break;

 

case 상수 조건3:

실행내용;

break;

}

 

 

 

 

- case에 들어가는 조건은 고정된 상수여야 한다.

1,2,3 : 고정된 값이니 가능

x>10 : 변할수 있는 값 불가능

int a : 새로운 변수 활용 불가능

 

-case에 들어가는 조건은 중복되면 안됌.

case 1:

Console.WriteLine("치킨을 주문하자");

break;

case 1: // case 값이 중복됩니다.

Console.WriteLine("피자를 주문하자");

break;

 

올바른 예시)

int x = 5;

 

switch(x)

{

case 1:

Console.WriteLine("order chicken");

break;

 

case 2:

Console.WriteLine("order pizza");

break;

 

case 3:

Console.WriteLine("orer maratag");

break;

}

 

논리 연산 -조건부 논리 연산자

조건부 논리 연산자는 같음, 비교와는 다르게 조금 일반적이지 않는 판단을 하는 연산자

 

1. And 연산자 

   &&

 

두 조건이 모두 만족하는가?

 

예) 

친구 a, b 와 식사 약속이 있습니다.

친구 a, b가 모두 도착하면 식당으로 이동할 것입니다.

 

bool isArrive_A = true ;

bool isArrive_B = false;

 

if(isArrive_A && isArrive_B)

{

Console.WriteLine("식당으로 이동");

}

else

{

Console.WriteLine("친구를 기다리자");

}

 

// b가 아직 도착 안했으므로, else 실행내용 실행.

 

 

2. OR 연산자

     ||

 

두 가지 조건중 하나라도 만족하는가?

 

예)

친구 a, b와의 식사 약속이 있습니다.

친구 a, b 둘중 한명이라도 오면 식당으로 이동할 것입니다.

 

bool isArrive_A = trule;

bool isArrive_B= false;

 

if(isArrive_A || isArrive_B)

{

Console.WriteLine("식당으로 이동");

}

else

{

Console.WriteLine("친구들을 기다리자");

}

 

// A 친구가 도착했으니 if 실행내용 실행.

 

 

 

반복문

반복문은 특정 조건이 만족될때까지 코드를 반복해서 실행.

 

for 문

 

for(초기화; 조건; 변화)

{

실행내용

}

 

예)

숫자를 1부터 세기 시작할것, +1씩 셀것이다. 10까지 셀것이다.

 

for ( int i = 1; i<=10; i++)

{

Console.WriteLine(i);

}

 

실행결과

1

2

3

4

5

6

7

8

9

10

 

초기화, 조건을 체크한후 실행내용 실행, 그리고 1씩 증감하고 다시 조건 체크하는것이 과정이다.

 

while

 

while(조건)

{

실행내용

}

 

for 문에 비해 생긴것은 간단

조건을 체크하면 계속 반복한다.

 

초기화는 while문과 별도로 해준다.

변화가 필요하면 내부나 외부에서 할수있음.

 

초기화

while(조건)

{

변화

실행내용

}

 

 

예시)

 

1부터 10까지 세고싶고, 1부터 셀것이며 +1씩 샐것이다. 숫자 10까지 셀것이다.

 

int =1;

while (i<=10)

{

Console.WriteLine(i);

i++;

}

 

실행결과

1

2

3

4

5

6

7

8

9

10

 

for, while

사용의 차이에 대해서 알아보자.

 

for문은 식자체에 초기화, 조건, 변화가 다 있음.

특수한 경우가 아니라면 for문을 사용하는게 편함.

 

while은 조건만 체크

초기화나 변화가 없거나 외부에서 진행 가능하다

즉, 외부의 조건에 의해 영향 받을때 사용한다.

- 인터넷에서 다운로드 기다리기.

- 유저의 인풋을 기다리기.

- 어떤 유저가 승리하는 것을 기다리기.

 

반복 횟수 모른다 → while문 사용 , 특정 조건(외부 상태)이 만족될 때까지 대기

반복 횟수가 명확하다 -> for문 사용

 

무한반복되지 않도록 조건을 잘 설정하는것이 중요

무한루프시, 프로그램 멈춘다.

예) 
for(int i = 0 ; i < 10 ; i--)
{
}
 

bool isSuccess = false
while(!isSuccess)
{

}

 

해당 코드들은 무한히 반복하게 설정되어서 멈춘다.

 

do while

do

{

실행내용

}

while (조건) ;

 

조건과 상관없이 일단 do에 있는 실행내용 한번 실행후, 

while () 안의 조건에 따라  do를 반복한다. while의 조건을 만족하지 않는다면 빠져나온다.

 

예)

1부터 10까지 세고싶고

+1씩 셀것이며, 숫자는 10까지 

 

int i = 1;

do

{

Console.WriteLine(i);

i++;

}

while(i<=10);

// 1부터 10까지 세준다.

 

그런데,

int i = 11;

do

{

Console.WriteLine(i);

i++;

}

while(i<=10);

 

//할경우엔,

do while은 무조건 한번 실행하기때문에 

11을 한번 출력하고 종료한다.

 

한줄 쓰기

중괄호 사용하는 문법들은 특별한 상황에서 중괄로 { } 없이 사용가능, 

각기능이 한줄로 끝나면, 중괄호 {}는 생략이 가능하다.

 

int num = 10;

if(num ==10)

Console.Write("num은 10이랑 같습니다.");

 

for(int i = 2; i <=9; i++)

Console.WriteLine("2 x" + i + " = " + 2 * i);

 

조건제어

조건에 따라 코드의 실행을 제어하거나 변경하는 것을 조건제어라고 한다.

break

break가 실행되면 진행되고 있는 구문들이 즉시 종료된다.

크게 2가지 경우에 사용된다.

1. switch case문

2. for 문

 

switch case에서는 break 를 구문마다 쓰는것을 보았느니 넘어가고,

 

for문에서 반복문에서 break가 걸리면 그 순간 반복문을 종료하고 빠져나가게 예시

for ( int i =0; i<5 ; i++)

{

if(i ==3)

{

break;

}

Console.WriteLine(i+ "번째 반복입니다.");

}

 

실행결과

0 번째 반복입니다.

1 번째 반복입니다.

2 번째 반복입니다.

 

3, 4번째 반복입니다는 3에서 break 가 걸려 for  문을 종료해버리므로 출력되지않는다.

 

중첩 for 문에서의 break는 

가장 가까이 있는 반복문만 종료합니다. 멀리있는 반복문은 계속 동작합니다.

 

for (int i = 0 ; i<5 ; i ++)

{

for (int j =0; j<5; j++)

if(j ==2)

{

break;

}

}

}

할시 가장 가까이 있는 j에대한 for문은 2가 되는순간 break 하지만 멀리있는 i에대한 for문은 계속 진행된다.

 

continue

반복문에서 해당 반복은 넘기고 다음 반복으로 넘어갈때 사용

예)

for ( int i = 0; i < 5; i++)

if(i == 3)

{

continue;

}

Console.WriteLine(i + "번째 반복입니다.");

}

 

할시에, 

// "0 번째 반복입니다."

// "1 번째 반복입니다."

// "2 번째 반복입니다."

// "4 번째 반복입니다."

3에서 continue로 인해 해당 반복은 실행안한것.

 

 

배열 - 기본

배열이란 여러 데이터를 한가지 변수에 저장하는 기능.

우선 생성을 해보자.

 

string[ ] game = new string [ 3 ] ;

이때 new는 뒤에 오는것을 새로 만들어 주는 키워드입니다.

 

string[ ] game;

game = new string [ 3 ] ;

// 변수 먼저 만들고 방은 나중에 만들 수도 있다.

 

이렇게 만들고 나면 3칸 짜리 방을 가진 game이라는 집이 생기는 것.

 

 몇호실인지 정해져있는데, 이렇게 정하는것을 인덱스(index) 라고 하며 0부터 1씩 올라간다.

생성이 끝났다면

저장을 해보자.

string[ ] game =new string [3];

game[0] = "Leage of Legends" ;

game[1] = "메이플 스토리" ;

 다음은 데이터를 활용해보자.

 

Console.WriteLine(game[0]);

할시에 

//출력 League of Legends

배열에 특정 호실을 다루는것을 접근한다 라고 표현한다.

 

배열 -타입별 배열

배열에는 문자열 말고도 있다.

정수 배열

int [ ] year = new int [4];

year[0] = 2020;

year[1] = 2021;

 

실수 배열

float [ ] height = new float [4];

height[0] = 164.5f;

 

...

 

배열의 타입이 안맞는다면 에러가 발생한다.

 

배열 반복처리

 

배열에 접근하는 부분은 0, 1, 2, 3,... 등 차례로 증가한다.

이것에 반복문을 혼합하여 사용하면 활용도가 높아진다.

 

우선 배열을 만들어보자.

int [ ] year = new int [4];

year[0] = 2020 ;

year[1] = 2021 ;

year[2] = 2022 ;

year[3] = 2023 ;

 

출력에 필요한것은 0~3이므로 0부터 3까지만 반복하는 for문을 만들자면.

 

for ( int i = 0 ; i < 4 ; i ++)

{

Console.WriteLine(year[i]);

}

 

실행결과

//

2020

2021

2022

2023

 

이 출력된다.

 

활용 뿐아니라 저장에도 사용된다.

 

int [ ] year = new int [4];

for ( int i =0 ; i <4 ; i ++)

{

year[i] = 2020 + i;

Console.WriteLine(year[i]);

}

실행결과

2020

2021

2022

2023

 

혹은,

int [ ] number = new int [ 10 ];

for ( int i = 0 ; i < 10 ; i++)

{

number [i] = i ;

Console.WriteLine(number[i]);

}

 

// 실행결과

0

1

2

3

4

5

6

7

8

9

 

가 나온다.

 

 

foreach

조건식을 쓰지않고 해당 배열을 처음부터 끝까지 반복할때 사용한다.

 

foreach (변수타입 반복변수 in 배열 )

{

실행내용

}

 

string [ ] games = new string [3] { "League of Legends", " 메이플 스토리" , "디아블로"};

foreach (string goty in games)

{

Console.WriteLine(goty);

}

//실행결과

//League of Legends

//메이플 스토리

//디아블로

 

지정할 반복변수의 타입은 배열의 타입과 일치해야한다.

 

배열에 데이터가 없다면?

- 기본값을 내놓는다.

 

string[] game = new string[3];
game[0] = "League of Legends";  
game[1] = "메이플 스토리";         

Console.WriteLine(game[0]);    // 출력 - League of Legends
Console.WriteLine(game[1]);    // 출력 - 메이플 스토라
Console.WriteLine(game[2]);    // 출력 - 

 

아무것도 안나오는게아니라 " " 가 들어있는상태

문자의 기본형이 " " 이기 때문이다.

기본값에 경우,

숫자의 경우 0을

불리언의 경우 false를 출력한다 

자료형
특징
기본값
크기
bool
true , false
 
false
1 byte
string
문자열
" " 로 감싸야 함
null
계속 변함
char
문자
' ' 로 감싸야 함
'\0'
2 byte
sbyte
8bit 정수
-128 ~ 127
0
1 byte
byte
8bit 정수 (부호 없음)
0 ~ 255
0
1 byte
short
16bit 정수
–32,768 ~ 32,767
0
2 byte
ushort
16bit 정수 (부호 없음)
0 ~ 65,535
0
2 byte
int
정수
–2,147,483,648 ~ 2,147,483,647
0
4 byte
uint
정수 (부호 없음)
0 ~ 4,294,967,295
0
4 byte
long
64bit 정수
–9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
0
8 byte
ulong
64bit 정수 (부호 없음)
0 ~ 18,446,744,073,709,551,615
0
8 byte
float
실수
1.5E-45 ~ 3.4E+38 (7자리 유효) 0.0000001f 뒤에 f를 붙여 야함
0
4 byte
double
실수
5.0E-324 ~ 1.7E+308 (15자리 유효) 0.000000000000001d 뒤에 d를 붙여야 하지만 붙이지 않더라도 double로 인식
0
8 byte
Decimal
실수
±1.0 x 10-28 ~ ±7.9228 x 1028 28-29개의 자릿수
0
16 byte

 

배열은 만들어진 순간 모든 데이터가 기본값으로 준비되어있다.

배열은 만들어짐과 동시에 데이터가 기본값으로 초기화 되어있다.

 

따라서 변수에서는 데이터를 저장하지않고 사용하면 에러가 발생하지만, 배열은 그냥 사용가능하다.

 

매번 인덱스를 지정하는 방법은 불편할 수 있다.

생성과 동시에 초기화하는 방법으로

배열을 만들고 뒤에 중괄호 { } 를 붙이고 데이터를 입력하면된다. 인덱스 구분은 쉼표 , 로 한다.

 

string [ ] game = new string [3] { "First game", "Second game", "디아블로" };

int [ ] year = new int [4] { 2020, 2021, 2022, 2023 } ;

 

단 생성한 배열 크기에 맞게 데이터를 저장해야한다.

더욱 간략하게도 가능하다, 배열의 방이 몇개짜리인지 입력조차도 생략한다. 

 

string [ ] game = new string [ ] { "League of Legends" , " 메이플 스토리" , "디아블로" } ;

생성과 동시에 초기화하는것이다. 데이터 갯수가 맞지않아 생기는 에러도 방지된다.

 

암시적으로 배열 형식 지정도 가능하다.

개발할때 형태가 짐작가능한경우 생략하고 작성하는 것을 암시적이라고 표현한다.

배열에서는 new 배열 [ ] 을 생략, 초기화 가능하다

 

string [ ] game = { " League of Legends" , "메이플 스토리"  , " 디아블로" } ;

 

 

자주 하는 실수

인덱스는 0 부터 시작하기때문에 헷갈려서 인덱스를 초과한 숫자를 불러오지않도록한다

예)

string[] game = new string[3];
game[3] = "디아블로";   // 에러 - 존재하지 않는 방에 접근하려고 합니다.


 

함수

함수는 어떤 일을 하기 위해 만들어진 코드의 모음으로 , 이름을 불러서 그 일을 시킬 수 있다.

예)

Console.WriteLine(); 

 

함수를 만들때는 아래와 같은 형식을 가진다.

void hello ()

{

}

반환형식: 호출된 함수의 결과로 어떤 값을 돌려줄지 선언, 알려주는 부분.

void는 "값을 돌려주지않는다." 라는 뜻

으로 작업 수행만 하고 결과값이 불필요할때 쓰인다.

또는,

숫자형 ( int, double, float, decimal) 은 숫자값을 반환한다. 계산 결과를 반환하는것으로

int sum ( ) => 5; 같은거다.

문자열 (string) 은 메시지, 텍스트를 반환

불린(bool)은 trule/false를 반환 한다. 조건 검사결과를 반환하는것.

객체타입이 있는데, 클래스/ 구조체 인스턴스를 반환한다. 복합 데이터 반환을 반환한다.

배열/컬렉션은 여러값을 반환한다. 주로 리스트, 배열 반환을 할때 사용한다.

의 반환 형식들이 존재한다. 

 

함수이름: 내가 마음대로 지을 수 있는 나만의 함수이름, 자유롭게 정할 수는 있지만, 의미있게 부여하는것이 중요.

 

중괄호 ( )  :

기능 실행할때 붙이는 기호로 대부분 함수에서 쓰이는데, if, for, switch 등 미리 정해진 문벙이 아닌 이상 중괄호가 있는 대부분은 함수라고 생각하면된다.

 

함수의 영역 { } 

함수의 영역을 표시하는 스코프를 가지고있다.

 

함수에 포함되는 부분은 원할때 실행하도록 할 수 있으며 따라서 이런 상황에서는 실행안된다. 

 이러면 실행결과는

안녕하세요

반갑습니다.

이해가 되셨으면 좋겠습니다.

라고 실행한다. 함수에 포함되는 영역은 실행되지않았다.

함수를 사용하기 위해선

함수 이름뒤에 중괄호 ( ) 를 사용하면된다.

 

함수이름 ( ) ;

 

 

 결과 

 

 

 로 하여 함수의 영역도 순서대로 실행된다.

 

단, 가독성을 위해 보통 로직 중간에 함수를 만들지는 않으며

 이미지와 같이 분리해놓는다.

 

함수 - return

특정한 상황에서 함수의 로직이 더이상 실행되지 않게 하고싶은 경우가 있다.

int hp = 5;

Attack();    // 데미지 : 1    현재체력 : 4
Attack();    // 데미지 : 1    현재체력 : 3
Attack();    // 데미지 : 1    현재체력 : 2
Attack();    // 데미지 : 1    현재체력 : 1
Attack();    // 데미지 : 1    현재체력 : 0
Attack();    // 데미지 : 1    현재체력 : -1
...

void Attack()
{
--hp;
Console.Write("데미지 : 1    현재체력 : " + hp);
}

 

이렇게 공격할때마다 계속 체력이 감속하면 체력이 0이되더라도 -로 넘어가버린다.

이럴때 return을 사용한다.

 

int hp = 5;

Attack();    // Console X
Attack();    // Console X
Attack();    // Console X
...

void Attack()
{
    return;   <-
--hp;
Console.Write("데미지 : 1    현재체력 : " + hp);
}

 

아무것도 실행되지않는데, return은 해당 코드 밑에 있는 모든 기능을 캔슬하고 함수를 종료하기 때문이다.

 

int hp = 5;

Attack();    // 데미지 : 1    현재체력 : 4
Attack();    // 데미지 : 1    현재체력 : 3
Attack();    // 데미지 : 1    현재체력 : 2
Attack();    // 데미지 : 1    현재체력 : 1
Attack();    // 데미지 : 1    현재체력 : 0
Attack();    // Console X
...

void Attack()
{
if(hp < 1)
{
    return;   <-
}

--hp;
Console.Write("데미지 : 1    현재체력 : " + hp);
}

 

이런식으로 if 조건문을 설정해서, return을 실행내용으로 집어넣으면 원할때만 작동하도록 할 수 있다.

 

 

 

★ 함수가 void가 아니라 반환형식이 존재한다면 반드시 return값으로 반환해줘야한다.

그리고 함수의 반환 타입과 return 결과물의 타입이 같아야한다.

 

int GetPoint()
{
Console.WriteLine("보상으로 100 포인트를 획득합니다.");
    반환값이 없다!!  <- 에러
}

 

 

함수 GetPoint() ; 를 실행하면 100을 반환하며, 보상으로 100 포인트를 획득합니다. 를 호출한다.
데이터는 int point = 100; 을 저장하기 때문에

1번과 2번은 같은 뜻이된다.

 

 

함수 - 매개변수

attack 함수로 실행할때마다 체력을 깎고 싶은데, 1이 아닌 다양한 데미지를 줘서 공격하고싶을 수 있다.

함수를 실행할때 소괄호에 변수를 하나 만든다.
그다음 소괄호에 방금 만든 벼수에 적용하고 싶은 값을 입력하면 아래와 같이 사용가능하다.

 

void Attack(int damage)

{

if(hp<1)

return;

}

hp -= damge; 

Console.Write("데미지 : " + damge + "   현재 체력 : " + hp);

}

 

으로 만들고

Attack(3) ;

할경우 // 데미지 : 3   현재체력 : 2

Attack(2);

연달아 할경우 // 데미지 :2   현재체력: 0

 

매개변수는 여러 매개변수를 만들 수도 있다.

 

void DisplayMyInfo( int level, string name, string job)

{

Console.WriteLine ( "레벨 : " + level + " 이름 : " + name + "직업 : " + job);

}

 

이때 매개변수의 순서와 타입에 맞게 실행해야한다.

 

DisplayMyInfo ( 10, "chad" , "전사");

 

 

★주의

1. 함수를 만들때 매개변수를 설정하였다면 함수 실행시 반드시 값을 입력해야함.

2. 매개변수를 설정하지않았다면 함수 실행할때 값을 입력 할 수 없음

int hp = 5;

Attack(3);    <- 에러!!

void Attack() <- 에러!!
{
...
}

 

또는 

 

int hp = 5;

Attack();               <- 에러!!

void Attack(int damage) <- 에러!!
{
...
}

 

네이밍 규칙은 코딩 스탠다드를 따른다. 

코드에 이름만들때 특수문자 x

공백을 포함한 이름 x

카멜 케이스 : 변수

-소문자로 시작

파스칼 케이스 : 함수나 클래스

-대문자로 시작

 

코딩 스탠다드 심화 내용 참고

https://docs.popekim.com/ko/coding-standards/pocu-csharp

 

자주하는 실수 - if 문과 return 값

예)

체력이 0 미만일때 200 포인트를 얻는 코드를 만들어보자.

int hp = 5; 

int GetPoint ()

{

if(hp<1)

{

return 200;

}

}

하면 에러발생하는데,

hp가 0미만이라면 return 200 이 실행되지만, 

hp가 1이상이라면 return 하는 부분이 없어서 그렇다.

 

따라서  기본적으로 실행될 return을 준비해두어야 한다.

int hp = 5;

int GetPoint()

{

if(hp<1)

{

return 200;

}

return 0; <- 기본 return 값으로 설정

}

 

여러 return의 결과물 타입

각 return의 타입은 같아야한다.

 

 

클래스와 객체

클래스는 어떤 물건이나 개념을 코드로 설명하는 틀,

객체는 그 틀을 이용해 만들어낸 실제 물건이나 개념.

 

oop 에 대해서
C#은 객체 지향 프로그래밍 언어이다. ( object oriented programming, oop) 

모든것이 다 객체라고 할 수 있는데, 컴퓨터, 노트북, 스마트폰 등 물건들도 객체, 인간, 가족 등도 다 객체로 일컫는다.

 

객체 지향의 4가지 특징으론

1. 캡슐화

-데이터와 코드를 외부에서 알 수 없게 감춘다.

- 외부에서는 필요한 정보만 알면된다..

 

2. 추상화

-객체들의 공통적인 특징을 추려낸다.

 

3. 상속

-하위 클래스가 상위 클래스의 모든 것을 활용 가능

-클래스를 재사용하여 반복적인 코드를 줄일 수 있다.

 

4. 다형성

-프로그램 언어의 각 요소(상수, 변수, 식, 오브젝트, 함수, 메서드) 들이 여러가지 타입을 가질 수 있는것..

 

장점

-재사용 가능한 코드가 많다

-코드 생산성이 높다

-유지보수에 용이하다.

 

★class에 대해서

클래스를 이용하면 데이터들의 공통된 부분을 추상화 할 수 있다.

 class character

{

}

 

클래스의 영역안에서 변수를 만들거나 함수를 만들 수 있음 "무엇이 들어갈지" 정의하는것.

 함수의 호출, 계산등의 동작은 할수 없음(실행문 불가)

 

예)

class Character

{

string userName;

string job;

string level;

 

Console.WriteLine("제 이름은" + userName + "입니다");

}

의 경우 실행불가.

 

class Character

{

string userName;

string job;

string level;

 

public void IntroduceCharacter()

{

Console.WriteLine("제 이름은 " + userName + "입니다");

}

}

로는 함수를 만들었기때문에 실행 가능.

 

좀더 이론부터 얘기해보자면,

1. 클래스란 객체(object)를 만들기위한 설계도

2. 멤버 (member)

클래스 안에 들어가는 구성 요소 전체를 "멤버" 라고 부른다.

멤버에는 4가지가 존재

-필드(field) - 객체가 가지는 데이터 속성 //
선언 private string name; 외부에서 접근 불가, 유효성 검사 불가능, 캡슐화 불가능

-속성(property) - 데이터 접근 방법 (getter/ setter) //
필드에 안전하게 접근하기 위한 접근방법
get 으로 외부에서 읽기

set 으로 외부에서 쓰기 (검증 로직 추가 가능)

자동 속성으로 간단 선언 가능, 사용자 정의속성으로 복잡 로직 가능
선언 public string name { get; set; } get/ set으로 접근제어 가능, 유효성 검사 가능(set 안에 로직), 캡슐화 가능

-메서드(method) - 동작(함수)
클래스 안에 정의된 함수, 호출해야 실행되며, 지정된 타입의 반환값을 가지고 있다. (void를 포함한다)

-생성자(constructor) - 객체 생성시 초기화

클래스 인스턴스를 만들때 자동 실행되는 특별 메서드
클래스 이름과 동일, 반환 타입은 없다. 

 

인스턴스

클래스를 기반으로 실제 메모리에 만들어진 "객체"

설계도(클래스) -> 실제집(인스턴스)

Character hero = new Character () :

hero 는 Character 클래스의 인스턴스 입니다.

클래스를 만든다고 동작하지않는다, 사용하기 위해선 객체를 생성해줘야한다.

Character myCharacter = new Character();

 

class Character

{

public string userName;

public string job;

public string level;

 

public void IntroduceCharacter()

{

Console.WriteLine("제 이름은" + userName + "입니다");

}

}

각 변수나 함수에 접근할때는 이 객체를 통해 접근해야한다. 

객체의 속성을 접근하려면 . 을 눌러서 접근 할 수 있다. .(닷) 연산자는 멤버 접근 연산자 라고 부른다
객체.멤버 -> 해당 객체의 "멤버"를 사용한다 라는것으로 객체(인스턴스)의 안에 있는 필드, 속성, 메서드에 접근할때 쓰인다.

 

Character myCharacter = new Character () ; // Character 인스턴스 생성

myCharacter.userName. = "chad"; // userName 필드에 값 할당

myCharacter.job = "전사"; // job 필드에 값 할당

myCharacter.level = "20"; // level 필드에 값 할당

 

myCharacter.IntroduceCharacter(); // IntroduceCharacter() 메서드 호출하겠다.

 

class Character

{

public string userName;

public string job;

public string level;

 

public void IntroduceCharacter()

{

Console.WriteLine ("제 이름은" + userName + "입니다");

}

}

 

 

실행문
실제 "동작"을 수행하는 코드로 반드시 메서드, 생성자, static 생성자 안에 있어야한다. 함수가 아니다.

 Console.writeLine( )같은것을 일컫는다.

 

멤버 선언

-클래스 안에 " 이런 속성/ 동작이 있어요" 라고 정의하는것

-선언만 하고 실행은 인스턴스 생성 후 호출해야함.

 

class Character

{

//필드 선언

string name;

int level;

 

//생성자 선언

public Character(string name)

{

this.name = name;

level = 1;

}

 

//메서드 선언

public void Introduce()

{

Console.WriteLine($"이름: {name}, 레벨: {level}");

}

}

 

$" " 는 문자열 보간 방식으로 +로 덧붙이는 방식과 같은 출력을 내는데 + 연산자를 안써도되므로 조금더 읽기 쉽고 직관적일 수 있다. 

this 는 현재 인스턴스(객체)를 가리키는 키워드로 여기서 name이 필드로 선언되었는데, 생성자 안에서 매개변수도 name이 존재한다.. 따라서 this로 구분해준다.

this.name은 객체 name , 오른쪽의 name은 매개변수 name이다.

 

사용흐름

1. 클래스 작성 -> 멤버 선언

2. 인스턴스 생성 ( new ClassName())

3. 메서드 호출 (instance.Method()) 또는 속성 접근 (instance.Property)

 

 

 


3. 학습하며 겪었던 문제점 & 에러

 

 

 


- 문제&에러에 대한 정의


- 내가 한 시도 - 해결 방법


- 새롭게 알게 된 점


- 이 문제&에러를 다시 만나게 되었다면?

 



4. 내일 학습 할 것은 무엇인지 

C# 문법 퀘스트 걷기 - 
기초 수학공부