printf의 형식지정자 (format specifier)

C언어에서

printf를 이용하면

숫자등을 간단히 출력할 수 있다.

예를 들어

int변수 a의 값을 출력하려면 다음과 같이 한다.

int a = 10;

printf("%d", a);


이것이 가능한 이유는

'%d'가 a의 값을 10진수로 출력할 수 있게 하기 때문이다

이런 것을 형식지정자라고 한다.


정수출력에 사용되는 형식지정자

%d : 10진수

%o : 8진수

%x : 16진수, a~f의 소문자 사용

%X: 16진수, A-F의 대문자 사용


이러한 형식지정자를

사용하면,

같은 숫자라도 다양한 형식으로 출력해 볼 수 있다.

아래 프로그램은 10진수 15를

8진수와 16진수로 출력하고 있다.


출력함수 printf에서 사용할 수 있는 형식지정자에 대해 설명합니다.



반응형
LIST


숫자 (Numbers)


C언어에서 사용할 수 있는 

숫자들에 대해서 설명합니다.


10진수

10, 

20, 

0, 

-1,

-10

아주 쉽다. 음수는 앞에 '-'를 붙이면 된다.


16진수

이제, 컴퓨터의 세계로 왔으니,

컴퓨터가 사용하는 16진수도 알아야 한다.

16진수는 앞에 '0x' 혹은 '0X'라고 먼저 쓰고,

그 뒤에 숫자를 쓴다. '0'은 숫자 0이다.


 10진

 16진

 0

 0x0

 1

 0x1

 2

 0x2

 3

 0x3

 4

 0x4

 5

 0x5

 6

 0x6

 7

 0x7

 8

 0x8

 9

 0x9

 10

 0xA 

 11

 0xB

 12

 0xC

 13

 0xD

 14

 0xE

 15

 0xF

 16

 0x10

 17

 0x11


8진수

16진수를 많이 쓰지만, 8진수도 쓴다.

앞에 숫자 '0'을 붙여서 나타낸다.


 10진수

8진수 

 0

00 

 1

01 

 2

02 

 3

03

 4

04

 5

05

 6

06

 7

07

 8

010

 9

010


실수
소숫점을 가진 숫자도 사용할 수 있다.

3.14 같이 쓸 수도 있고,

조금

과학적으로 이런 숫자도 있다.

3.5e1


이것의 의미는 지수승을 의미한다.


그리고, 끝에 f를 붙인 소숫점 숫자도 있다.

3.14159222424232f 

이건 3.14159222424232와 거의 유사한 의미지만,

저장될 때

뒤에 몇 자리가 짤릴 수도 있다.

왜 이런 일이 생기는지는 나중에 자세히 설명한다.


문자 (Character)

숫자를 표현하는 것 말고도,

C언어에서는

알파벳 한글자씩, 즉 문자를 표현할 수 있는데,

이것은 알파벳을 작은 따옴표로 감싸서 표현한다.

이렇게

'a'

'k'


문자열 (String)

문자들이 모인 것을 

문자열, string이라고 하는데,

큰 따옴표로 감싸서 표현한다.

"Hello World"

"Bye Bye"



동영상에서 문자와 숫자 사용방법에 대해서 설명합니다.


반응형
LIST


변수(Variable)의 사용


아래 프로그램은 변수 사용의 다양한 예를 보여준다.

별로 어려운 것은 없다.

여기서는 덧셈 연산 (+)만 보여주는 데,

뺄셈은 '-'

곱셈은 '*'

나눗셈은 '/' 등의 기호도 사용할 수 있다. (이것은 나중에 자세히 설명한다.)


변수의 초기화


변수를 선언하면서 동시에 값을 지정하는 것을 초기화라고 한다.

int x = 10;

그런데, 이것은 사실 이런 것과 같다.

int x;

x = 10;

초기화를 안 할 경우, 

변수 x에는 선언할 때 이상한 값이 저장된다. 

일명 쓰레기값. 영어로는 Garbage value.

x를 가지고 계산하기 전에

적정한 값을 저장하는 것을 잊지 않을 수 있으면 초기화는 안 해도 되지만,

그럴 자신이 없으면 초기화해두는 습관을 가지는 것도 좋다.

초기값으로는 '0'을 해 두면 일반적으로 좋다.


아래 동영상에서는 변수를 선언하고, 사용하고, 초기화하는 방법을 설명합니다.



반응형
LIST


Variable (변수)


변수는 

값을 저장하기 위한, 이름 붙여진 공간이다.

아래 프로그램을 보자.

line 5:

int x;

공간을 만들고, 

거기에 x라는 이름을 붙여서 변수를 만든 것이다.

int는 integer의 약자로, 정수를 의미한다.

이것은 변수에 저장될 수 있는 값을 한정한다.

즉, 변수 x에는 정수가 저장됨을 의미한다.

int 같은 것을 변수의 data type (데이터형)이라고 한다.


비유를 들면 이렇다.

휘발유 내차;

경유 너차;

내차에는 휘발유를 넣어야 하고,

너차에는 경유를 넣어야 하는 것과 같다.


line 5-7:

변수 x, y, z, 세 개를 선언하는 것이다.

모두 정수를 저장할 수 있는 변수이다.


int x, y, z;

같은 data type을 갖는 변수들이면,

위와 같이 한 줄로 선언해도 된다.


line 9-12:

x = 10;

y = 20;

z = x + y;

기억하라!

정신 바짝 차리고!

C언어에서는,

= 표시는 '대입(assignment)', 즉 값을 집어 넣는다는 뜻이다.

오른쪽에 있는 것을 왼쪽으로!



Variable Name (변수의 이름)

x, y, z

변수이름들이었다.


변수이름의 길이

C언어는 변수이름을 마음대로 더 길게 지을 수도 있다.

얼마나 길게? 

정해진 것 없다.

그러나, 적당히.


변수이름에 사용가능한 문자

영어 돼!  

숫자 돼!

기호 '_' (밑줄기호)만 돼!

한글 안 돼!

기억하자, 한글은 안 된다.


변수이름의 첫글자는?

영어 알파벳 아무거나,

기호 '_'(밑줄기호)만 돼!

숫자 절대 안돼!

기억하자, 숫자는 안 된다.


C언어에서 이미 쓰고 있는 것은 안됩니다.

이미 C언어에서 사용하고 있는 단어들은

안됩니다.

예를 들어, data type이름인 'int'같은 것들은 안되는 겁니다.


그리고, 대소문자 구별합니다.

변수이름 a와 A는 완전히 다른 것이다.


이런 여러 가지 약속들만 지켜준다면,

마음대로 변수 이름들을 지을 수 있습니다.

아래 표는 '되는 이름'과 '안 되는 이름'들을 보여준다.


 되는 이름

안 되는 이름 

 grade

int, return 

_grade

 @grade

 grade_100

 100_grade

 Grade

그레이드 

 my_name_is_john

my name is john 


너무 독특한 이름만 아니면,

웬만한 것 다 OK다.


마지막으로, 진짜 중요한 것 하나.

변수는 사용되기 전에 반드시 선언되어야 한다.




변수, variable, 이름을 짓는 방법에 대해서 설명합니다.




반응형
LIST

쓸모있는 프로그램을 만들어보자.

화면에 별 소용도 없는 Hello 같은 인사말을 출력하는

프로그램말고,

요긴하게 쓸 수 있는 프로그램을 만들어 보자.


계산기는 어떨까?

헐,,

목표가 너무 높은거 아냐.

그래서,

아주 간단한 계산기를 만들어보자.

2개의 숫자를 입력하면,

두 숫자의 합을 출력해주는 프로그램을 만들어보자.

C언어로 말이다.


이걸 만들려면,,

2개의 숫자를 입력받는 방법을 알아야 하고,

2개의 숫자를 더하는 방법을 알아야 하고,

합을 출력하는 방법을 알아야 한다.

알아야 할 것 투성이다.


완성 프로그램

하나하나 설명해 가면서 만드는 것도

의미는 있지만,

일단, 다 만들어 놓고,

한 줄 한 줄 설명해보자.

일단, 구현한 계산기 프로그램과 실행결과이다.

 


line 5-7:

계산기는 숫자를 2개 입력받아야 하는데,

이를 저장하기 위한 변수 x와 y.

그리고 두 수의 합 x+y를 저장하기 위한 변수 sum이다.

변수는 무엇인가?

고등학교 수학시간에 배웠지 않았나?

변수 x... 그런거..

그런거다 라고 이해하면 된다.

그러면 

x, y, sum앞에 붙은 int는 무엇인가?

int는 integer, 즉 정수를 말한다.

변수 x, y, sum은 정수를 저장하는 변수라는 뜻이다.


line 9:

콘솔에 친절하게도

'첫 번째 숫자를 입력하세요'라는 메시지를 출력하기 위한 것이다.

사실 이거 안 해도 된다.


line 10:

이게 핵심이다.

scanf.

scanf 는 scan + function이다.

즉, 입력함수이다.

출력함수 printf의 반대이다.

키보드로 입력하는 것들을 읽어들인다.  

%d는 무엇인가?

d는 decimal, 즉 10진수를 말한다.

&x는 무엇인가?

변수 x와 연관있다는 것이다.

이제, scanf("%d", &x); 를 해석하면,

"10진수를 입력받아 변수 x에 넣는다"라는 뜻이 된다.


line 12-13:

두 번째 숫자를 입력받는 과정이다.

scanf("%d", &y);를 해석하면

"10진수를 입력받아 변수y에 넣는다."라는 뜻이 된다.


line 15:

sum = x + y;

이것의 뜻은 절대로 "x+y는 sum과 같다"라는 뜻이 아니다.

C언어에서는,

"x+y를 더한 결과를 변수 sum에 넣는다." 라는 뜻이다.


line 16:

프로그램 이해를 위한, 마지막 고비이다.

낯익은 printf가 보이고,

%d도 보인다.

통밥으로 맞춰보자. 무슨 뜻인지...

혹시 이걸 맞췄다면 당신은 "센스쟁이"

정답은,

"10진수 3개를 출력하는데, 변수 x, y, sum 순서로 출력한다."

라는 뜻이다.


또 다른 계산기를 만들어보자.

두 수를 입력받아,

두 수의 차를 출력하는 계산기 프로그램을 만들어보자.

위 프로그램을 응용해서 말이다.

이건, 너무 쉬우니, 더 이상 설명하지는 않는다.


쓸모있는 깨알팁 하나 투척,,

계산기가 나름 요긴하게 

쓰이긴 하겠지만,

기대 이하였을 것이다.

그래서,

만회할 겸,

생활속의 지혜 하나 드리는 걸로 '' 칩시다.




입력함수인 scanf를 이용하여

2개의 숫자를 입력받아

그 합을 계산해서 출력하는 프로그램을 작성하는 과정을 보여주는

동영상입니다.



반응형
LIST


콘솔창에 출력하는 함수: printf


print function = printf

Hello World 예제에서 보았듯이,

console창에 무엇인가 출력하려면

printf라는 것을 사용해야 한다.

printf는 print + functin으로 '출력하는 함수'라는 뜻이다.


출력하려는 내용은...

printf 라고 쓰고, 

괄호를 ( ) 친 다음,

그 안에 큰 따옴표로 묶어서 써주면 된다.

즉,

printf ("Hello World");


줄바꿈을 위한 \n

printf를 사용하다 보면,

\n를 종종 보게 된다.

이것의 의미는 '다음 줄로 이동' 이라는 뜻이다.

따라서

printf("Hello \n World\n");

Hello가 출력되고,

\n은 그 다음줄로 바꾸고,

World를 출력하고,

마지막의 \n은 그 다음 줄로 바꾸게 된다.


요즘은 입체모양도 프린트 할 수 있다.

printf 함수는 고작해야

console창에 메시지를 출력하는 수준이지만,

3D printing 기술의 발전은

입체모양도 출력할 수 있게 한다.



입체 모델을 얻는 기술도 중요

3D 프린터를 주위에서 쉽게 볼 수 있게 되면서,

이제는 3D 프린팅 자체는 그리 신기한 기술이 아니다.

물론, 더 많이 발전해야 겠지만,

그런데, 3D 프린팅을 하려면,

3D 모델이 있어야 하는데,

그 모델을 얻는 기술도 3D printing만큼이나 중요하다.


3D 스캐닝

3D 모델을 얻는 방법인데,

요즘 워낙 기술들이 많이 발전됐다.

레이저를 이용해서 초정밀 스캐닝을 할 수도 있고,


사진을 이용해서 할 수도,,

각도를 달리해가면서

사진을 찍어서, 3차원 모델을 만들 수도 있다.

아래 그림에서는

사람의 얼굴을 각도를 달리해 가면서

여러 장의 사진을 찍은 후에,

그것을 이용해서 3D 얼굴을 만들어 낸 것이다.

신기하죠...근데 실제로 해보면 어려워요..C언어로 프로그램짜서 만들었지요.



출력함수 printf에 대해서 자세히 설명합니다.



반응형
LIST


Indentation (들여쓰기)

들여쓰기는 모양새다.

프로그래밍과 그닥 관계는 없지만,

indentation이 잘 된 소스코드를 보는 것은

잘 차려진 음식을 보는 것과 같다.


푸드스타일리스트 (Food stylist)

직업이다.

요리를 하는 것이 주가 아니고,

요리를 "보기 좋게" 담아내는 것을 목적으로 한다.


푸드스타일리스트, 어디에 쓰는 물건인고?

광고에 나오는 대부분의 음식들을

이 사람들이 차린다고 보면 된다.

음식 담는 것 뿐만 아니라,

어떤 그릇에, 심지어 식탁보, 앞치마 같은

소품까지 다 조율한다.,, 광고 찍을 때,, 특히 홈쇼핑 광고 찍을 때,,


소스코드 스타일리스트

뭐, 이런 직업은 없지만,

푸드스타일링과 같이,

들여쓰기가 잘 된 코드는 

읽기도 편하고,

이해하기도 좋다.

물론, 광고 찍을 일은 없지만,   


막돼먹은 소스코드 


들여쓰기가 잘 된 소스코드





들여쓰기, indentation에 대해서 설명합니다.


반응형
LIST


함수 main

모든 c언어 프로그램들이

가지고 있어야 할 것이 있다.

바로 main함수이다.


프로그램 실행의 시작점

C언어로 프로그램을 막 작성해서

컴퓨터에게 휙 던져주면,

컴퓨터는 그 프로그램을 어디서부터 

실행해야 하는지 어떻게 알까?

그건 바로,

함수 main( )부터이다.

프로그램이 아무리 길더라도 

컴퓨터는 함수 main( )을 찾아서

거기서 부터 한줄 한줄 실행하는 것이다.


함수 main( )은 딱 하나.

프로그램 내에 함수 main( )이 여러 개 있으면,

누가 진짜 원조인지 알 수 없다.

그래서 딱 하나만 만들어 놔야 한다.


함수 main ( )의 생김새

해부하는 기분으로,

main을 들여다 보면,

크게

머리와 몸통으로 구성되어 있다.

머리에는 함수의 이름, 반환형, 인수정보 등이 있고,

몸통은 철갑을 두르고 있는데,

그 안에 함수가 하는 일들이 들어있다.

철갑은 { 과 }을 의미한다.

line 2:

일단 무시하시고, 


line 4:

main함수 머리를 보면

일단,

main : 함수의 이름이다. 소문자로만 써야 한다. 이거 이름 바꿀 생각하지 마시고,

int: 함수의 반환형 (return type)이라는 건데, 이거 일단 알려고 하지말고, 건드리지도 말고,

(void): 함수의 인수정보 라는 것도, 이것도 일단 알려고 하지 말되, 건드리지도 말고,


line 5:

기호 { 는 함수 main의 나와바리가 시작되는 것을 의미한다.

즉, 함수의 몸통이 어디인지를 나타낸다.

마치,

사람은 허리띠를 기준으로 상체와 하체가 구분되는 것처럼.


line 8:

기호 }는 함수 main의 나와바리가 끝나는 것을 의미한다.

즉, 함수 main은 여기까지...


line 6-7:

여기 안이 함수 main( )의

몸속이다.

이 부분에 컴퓨터에게 지시할 내용을 

쭉,,,쭉,,,

써주면 된다.

당분간은 요기 안에다만 프로그래밍 해도 충분하다.


Statement

위 프로그램에서,

line 6:

컴퓨터에게 내릴 수 있는 간단한 명령이다.

console 창에 'Hello World'를 출력하라는 뜻이다.

이렇게 명령문 하나하나를 

statement라고 한다.


Statement의 끝은 semi-colon (;)

C언어 문법에 따르면

명령문 끝에다가 요상하게 생긴 기호, ;

이것을 써 줘야,

이거는 세미콜론이라고 읽으면 되는데,

컴퓨터는 여기까지해서 

하나의 명령문이 끝났구나를 알고,

다음 명령문을 처리하게 된다.

그러니 빼먹지 말자.

이건 마치,

군대에서 

모든 말의 끝에는 '다, 나, 까'를 붙여야 하는 것과 마찬가지입니다.


아시겠습니까;

잘 기억하시기를 바랍니다;


위에서 설명한 내용을

보다 전문적으로, 무미건조하게

설명하는 동영상으로,

C프로그램의 시작점인 main합수에 대해 설명합니다.


반응형
LIST

Comment, 주석에 대하여


comment라는 것이 있다. 

프로그램에서 comment라는 것이 있다.

모든 컴퓨터 프로그래밍 언어에 있다.

우리말로는 주석이라고도 한다.

주석은 설명이라는 뜻이다.


comment란,

프로그램 내용을 사람이 쉽게 이해하기 위해서,

중간중간에 메모해 놓은 것을 말하는 것으로,

컴퓨터는 프로그램을 실행할 때,

comment를 무시해 버린다.


왜 comment를 쓴다구요?

프로그램을 짜다보면,

굉장히 복잡하고, 

길어질 때가 있다.

본인이 작성해 놓고도,

몇 년 후에 보면,

왜 이렇게 짰지 이해가 안될 때가 있다.

또는 남이 작성한 프로그램을 

고쳐야 할 때도 있다. 그러려면

프로그램을 이해해야 하는데, 설명이 없으면 

어려울 때가 있다.

그래서,

프로그램 내부에 사람이 볼 목적으로

간단간단히 메모를 할 수 있게 해주기 위해서

comment라는 것을 만들었다.


어떤 것이 comment인가?

일단, 눈치 테스트.

눈썰미가 좋은 당신이라면,

comment가 어떤건지 순식간에 알 수 있습니다.


C언어 프로그램에서

comment는 두 가지 방법으로 지정할 수 있습니다.


두 개의 slash (/) 기호를 먼저 쓰면,

거기서부터 그 줄 끝까지는 모두 comment


/*과 */로 둘러싸인 영역 전체가 comment,

여러 줄에 걸쳐서 comment 영역을 지정할 수 있습니다.


컴퓨터는 comment따위는 신경쓰지 않는다.

다시 한 번 말하지만,

comment는 사람을 위한 것이다.

컴퓨터는 프로그램을 실행할 때,

comment는 개무시한다.


comment를 꼭 써야 하나요?

예, 꼭 써야 합니다.

메모를 많이 하는 사람, 

필기를 많이 하는 사람, 

이런 사람이 바람직하죠,

그런 것과 똑 같습니다.

프로그램 중간중간에 comment를 써 놓으면

다른 사람이 쉽게 프로그램을 이해할 수 있고,

나도 나중에 기억을 되살리기 좋고,

프로그램을 수정해야 할 때 좋습니다.


그렇다고, comment를 과도하게

많이 쓸 필요는 없습니다.

프로그램 이해에 필요한 내용을 충분히 쓴다는 느낌으로,,,


위에서 설명한 내용과 좀 더 자세한 comment사용 방법에 대해서

설명하고 있습니다.


반응형
LIST


첫 번째, 초간단 C언어 프로그램 작성해 보기

일명, Hello World


Console창 (명령프롬프트 창이라고도 불리우는 검은 창)에

Hello World를 출력하는 

아주 간단하지만,

Visual studio 사용법을 배우는데 아주 적합한,

C언어 프로그램을 

차근차근 배워 봅시다.



일번, Visual studio 프로그램을 실행시키고,

아래 그림과 같이 파일-->새로만들기-->프로젝트를 순서대로 클릭




이번. 선택할 수 있는 여러 가지 사항들이 있다.

1. 템플릿 중에 Visual C++,

2. Win32 콘솔 응용 프로그램. 영문버전 Visual studio 2015를 깔았으면 Win32 console application program

3. 프로젝트 이름으로 아무거나, 여기서는 HelloWorld



삼번, 마법이 시작된다.

콘솔 응용 프로그램으로 나오는지 흘깃 보고,

'다음' 버튼을 꾹!



사번. 마법은 무슨 개뿔.

정신차리고 아래처럼 꾹꾹 눌러 선택해야 한다.

안 그러면, 정말 Visual Studio의 마법에 걸려 엄청 고생만 한다.

특히, 초보자들은 더더욱.

왜 이렇게 선택하냐고 궁금할 것이다.

대학가고, 어른되면 저절로 알게된다. 일단 패스.

혹시 대학생이신데 잘 모르겠으면, 아직 어른이 안 된 겁니다. 


다 됐으면 '마침' 버튼을 꾹.





오번. 원하던 프로젝트 HelloWorld가 생성된다.

그렇다고 해서 바로 프로그램을 작성할 수는 없다.

소스파일을 오른쪽 마우스 버튼으로 꾹 누르면 (마우스 없었으면 어떻게 할 뻔했나...)



육번. 아래 그림과 같이 추가-->새항목으로 차례대로 선택한다.

이건 소스파일 폴더에 실제로 프로그램을 작성할

소스코드 파일을 생성하는 것이다.

'새 항목'을 누르면,,,,,



칠번. 또 다른 창이 열리는데,

당황하지 않고,

Visual C++에서,

C++파일을 선택하고,

'이름'으로 main.cpp를 입력.

반드시 main.cpp를 할 필요는 없지만,

잘 모를땐, 따라하기가 최고,,,

hello.cpp, test.cpp, helloworld.cpp 등등,

원하는 것을 골라잡아서 입력



팔번. 드뎌 프로그램을 입력할 수 있는 창이 열린다.

main.cpp가 왼쪽 창에 생겨나고,

오른쪽에 main.cpp 파일에 입력할 수 있는 공간이고,

여기에 C언어 프로그램을 쳐 넣으면 된다.

요즘 세상 많이 복잡해졌다.

C언어 프로그램 하나 작성하는데, 이리도 복잡한 과정을 거쳐야 하니,

옛날에 '메모장'에 대충 쳐넣고, 그냥 그랬는데,,,

물론 지금도 '메모장'에 입력하고, 그걸 가지고 해도 되는데,,, 



구번. 꼼짝마!

다른 생각하지마!

C언어 프로그램에 대해 초보자라면,

암 소리말고, 

아래 내용을 그대로 타입핑하시오.

한 글자도 틀려서는 안돼, 

대소문자도 달라서는 안돼,

왜냐구요?

대학가고 어른되면 다 압니다. 



십번. 입력한 C언어 프로그램 소스코드를 컴퓨터가 알아듣는 기계어로 바꾸어야 한다.

이 과정을 빌드 (build)라고만 알아두고,

이를 위해서 빌드-->HelloWorld 빌드를 꾹꾹.




십일번. 빌드하면,

그리고 정신을 똑바로 차려서 한글자도 안틀려서 입력했다면,

아래와 같이 

'성공' 메시지가 뜬다.

만약 '실패' 메시지가 나오면,

구번과 십번 과정을 '성공'이 나올 때까지 무한반복해야 한다.

분명히, 

오타가 있을 것이다.

컴퓨터가 구형이라서 실패한다고?

절대 그럴리 없다.

당신의 실수일 뿐이다.

틀린 그림찾기 하듯 주의깊게 살펴보다 보면,

실수한 곳을 찾을 수가 있다.

'윌리'를 찾아라를 잘 하는 사람이면 유리할 수도,,,




십이번. 이제 결실을 거둘 때다.

혹시, 십일번에서 '실패'했는데, 여기로 그냥 온 사람이 있다면,

좋은 말로 할 때, 돌아가시오.

더 이상 해봤자 무의미 할 뿐이니.

하지만,

진짜 '성공'한 사람들이라면,

이제 꿀을 맛보자.

디버그-->'디버깅하지 않고 시작'을 꾹꾹!!

이렇게 하면,,,, 

기대하시라,,,



십삼번. 갑자기 번개가 치며,





비둘기가 나타나 

사람 말로 축하인사를 건내고,



대신에,,,

콘솔창에 아래와 같이 조촐하게..

콩심은데 콩나듯이,, 별로 한 것도 없으니, 그냥 "Hello World"메시지만...



위에서 설명한 전과정을 동영상으로 '무미건조'하게 설명하고 있습니다.



반응형
LIST


Visual studio 2015의 설치


Visual studio (간단히 줄여서 VS)를 설치하다 보면,

설치유형을 선택하라고 나온다.

두 가지 설치 유형이 있다.


하나는 기본값. VS를 통째로 설치하는 것이다.

VS가 워낙 덩치가 크다보니 이렇게 설치하면

공간을 많이 잡아먹는다.


다른 하나는 '사용자 지정 설치'

필요한 것들만 뽑아서 설치하는 것이다.

C언어나 C++언어 프로그래밍만 할 것이므로 VS를 다 설치할 필요는 없다.


그래서!, 아래 그림과 같이 '사용자 지정 설치'를 선택




어떤 요소들을 설치해야 하는가?

복잡하겠지만, 

아래 그림과 같이 선택하면 되겠다.

프로그래밍 언어 중에서 Visual C++,

그 중에서도 일반도구와 Microsoft Foundation Classes만 선택하면 된다.

그리고 나머지는 모두 빈칸!




Project 생성하기


첫 번째 단계는 project 생성

VS를 실행하고 나서, project를 일단 만들어야 한다.

Project는 작성하고자 하는 프로그램들과 관련된 파일들을 모아 놓은 집합을 말한다.

어떤 파일들이 관련된 것인가?

우선 소스 코드 (source code)가 있겠고,

그 외에도 실행파일, 등등 여러 가지가 있다.


Project 유형은

Visual C++를 선택하고, (당연하다, C언어 프로그래밍이니까)

Win32 Console Application을 선택한다.

Console이란 무엇인가?

명령프로프트 창이라고 들어봤을 것이다.

검정 바탕을 가진 창. 

그게 바로 console이다.

Console application은 그 검정창 안에서 수행되는 프로그램이다.

보잘 것 없어 보이겠지만, 

일단 가장 간단히 프로그램을 작성해 볼 수 있는

초보자용 환경이다.



Project이름은

Console application이긴 하지만

project에도 이름을 붙여야 한다.

이름 쓰는 칸에 적당한 이름을 붙이고,

next 버튼을 누르면 된다.

그러면, 아래와 같은 화면으로 전환되고,

이제 마지막 'Finish'버튼을 누르면 거의 다 끝났다.



어플리케이션 설정?


이제 마지막으로 

아래와 같은 화면이 나오는데,

Additional options에서 

'Empty project'만 체크되도록 한다.

그리고 나서, Finish 버튼을 누르면 project 생성이 완료된다.




프로젝트에 소스파일 추가


프로젝트가 다 만들어졌으면

프로그래밍을 입력해 넣을 소스파일을 만들어야 한다.

'소스파일' 폴더를 마우스 오른쪽 버튼 클릭하고,

'추가' 혹은 'add' 선택하면

아래 그림과 같이 추가할 파일을 만들게 된다.

이름으로 그림에서는 'main.cpp'를 지정하였지만,

확장자가 .cpp면 아무 이름이나 된다. 

확인 버튼을 누르면 main.cpp 파일이 생겨나면서,

이제 그 파일에 C언어 프로그램을 입력하면 된다.



C언어로 프로그래밍을 하는 기초적인 과정에 대해서 소개합니다.



반응형
LIST

C언어에 대해 기초적인 내용을 소개합니다.


https://youtu.be/mx1Q2MRsBuQ


반응형
LIST
Java언어의 method overriding의 개념에 대해 설명합니다.


반응형
LIST

instanceof 연산자에 대해 설명합니다.



반응형
LIST
상속과 관련있는 캐스팅인 업캐스팅(upcasting)과 다운캐스팅(downcasting)에 대해 설명합니다.



반응형
LIST
상속에서 사용되는 생성자를 실습합니다.


반응형
LIST
상속환경에서 접근지정자와 생성자가 어떻게 사용되는지 설명합니다.


반응형
LIST
상속의 특징을 설명하고, 접근지정자가 상속과 함께 어떻게 사용되는지 설명합니다.


반응형
LIST


상속 (Inheritance)의 구현

상속은 객체기반 프로그래밍을 아주 쉽게 해주는 즐거운 도구이다.
쉽게 한마디로 설명하자면,
새로운 클래스를 만들 때, 기존 클래스를 확장시켜서 만드는 것이다.
예를 들어,
학교에 본관건물이 하나만 있었다고 하자. 
확장하기 위해서 강당을 하나 지으면,
이제 학교는 본관+강당이 되는 것이다.
상속도 유사한 원리로 진행된다.

class Point

이 클래스는 2차원 공간 위의 점을 하나 나타낸다고 하자.
멤버변수 x, y는 좌표 (x,y)를 나타내고,
멤버메소드 showPoint( )는 좌표 (x,y)를 출력한다. 
public class Point
{
   int x;
   int y;
   public void showPoint()
   {
      System.out.println(x+","+y);
   }
}

이제 점을 나타내는 새로운 클래스를 만들고자 한다.
좌표값 외에도, 점의 색깔에 대한 정보도 넣고 싶다.
이 경우, class Point를 확장해서 만들면 아주 쉽다.
추가로 점의 색깔에 대한 정보, 그리고 색깔을 가지고 동작하는 메소드만 
만들면 되는 것이다.

우선, 새로 만드는 클래스 이름을 ColorPoint라고 하고,
class Point를 확장해서 만들어보자.
이를 Java언어로 구현하면 다음과 같다.
public class ColorPoint extends Point
{
   .......
}
'extends'는 Java언어의 예약어이다.
class Point를 확장해서, ColorPoint를 만든다는 의미이다.

상속: 이것은 확장과 동일한 의미이다.
위에서 class Point를 확장해서 (extends) ColorPoint를 만드는 것은,
결국,  Point의 멤버 변수와 메소드들을 모두 상속받아서
사용하겠다는 것과 같은 뜻이다.

class ColorPoint 

이것은 class Point를 확장(상속)했기 때문에,
기본적으로 멤버 변수 x, y 그리고 멤버 메소드 showPoint( )를 
가지고 있다.
이를 그림으로 표현하자면 다음과 같다.


추가 멤버변수와 메소드


class ColorPoint에 점 색깔에 대한 정보를 넣는 것은
아래와 같다.

public class ColorPoint extends Point
{
   public String colorName;
   public void showColor()
   {
      System.out.println("The color of the point is "+colorName);
   }
}
위의 코드에서는
점색깔을 String 타입의 멤버변수 colorName으로,
그리고 메소드로 그 색깔을 출력하는 showColor()를 추가하였다.

class ColorPoint의 객체 생성과 사용

상속받아 만든 클래스로부터 객체를 생성하는 것은
이전과 다름이 없다.
대신 신기한 것은 직접 정의하지 않은 멤버변수와 메소드들을
마치 자기 것인야 쓸 수 있다는 것이다.
ColorPoint cp = new ColorPoint();

cp.x = 10;
cp.y = 20;
cp.showPoint();

cp.colorName = "Red";
cp.showColor();

위의 코드에서 볼 수 있듯이
멤버 변수 x와 y, 메소드 showPoint( )는 ColorPoint가 정의하지는 않았지만,
상속받았기에 마치 자기 것 처럼 쓰고 있다.

위의 내용을 동영상에서 자세히 설명하고 있습니다. 


반응형
LIST
객체지향언어 Java의 핵심개념인 상속 (inheritance)에 대해 설명합니다.



반응형
LIST
static 지정자에 대해 실습을 통해 알아보고, final 지정자에 대해 설명합니다.



반응형
LIST
접근지정자에 대해 실습하고 static 지정자에 대해 설명합니다.



반응형
LIST
접근지정자에 대해 상세하게 설명합니다.



반응형
LIST
Java Virtual Machine의 메모리 관리 기능인 garbage collection과 클래스 멤버에 대한 접근지정자에 대해 설명합니다.


반응형
LIST
클래스 생성자, (class constructor)에 대해 설명합니다.


반응형
LIST
클래스 (Class)를 사용하는 방법에 대해서 알아봅니다.


반응형
LIST



클래스 정의

객체기반 프로그래밍의 순서는 간단히 2단계로 이루어진다.
1. 필요한 클래스들을 정의한다.
2. 클래스들로부터 객체를 만들어내서 조합하여 원하는 프로그램을 만든다.

Java언어에서 클래스를 정의하는 것에 대해 알아보자.

Person이라는 클래스를 만든다고 하자.
우선 아래와 같이 쓴다.
맨 앞의 public은 접근지정자 (access modifier)라고 하며,
'public'은 Person 클래스를 다른 사람들도 사용할 수 있도록 하겠다는 것이다. 
클래스 정의는 { 과 } 사이에 기입해 넣으면 된다.
public class Person
{

}

이제 클래스 안에 넣을 데이터를 지정해야 한다.
이 데이터를 '클래스 멤버변수 (member variable)이라고 한다.
Person이라는 정보이므로 사람의 나이와 성별을
각각 age와 isFemale 멤버변수에 저장한다고 하자.
isFemale 변수의 경우, true이면 여자이고, false이면 남자를 나타낸다고 하자.
'private'도 'public'과 마찬가지로 접근지정자의 일종이다.
이것의 의미는 클래스 외부에서는 이 멤버변수들을 읽거나 쓸 수 없다는 뜻이다.
public class Person
{
   private int age;
   private boolean isFemale;
}

클래스 안에는 데이터 외에도, 동작에 해당하는 멤버메소드(member method)들을
지정할 수 있다.
여기서는 나이를 출력하는 동작을 하는 메소드와
남자 혹은 여자인지를 출력하는 동작을 하는 메소드를 구현해 넣어보겠다.
public class Person
{
   private int age;
   private boolean isFemale;

public void showAge() 
{
   System.out.println("My age is "+age);
}

pubic void showGender()
{
   if (isFemale == true) 
   {
      System.out.println("I am female.");
   }
   else
   {
      System.out.println("I am male.");
   }
}
}
먼저 showAge( )메소드를 살펴보자.
'public'은 앞서 설명한 대로 접근지정자이고,
클래스 외부에서 이 메소드를 호출할 수 있다는 뜻이다.
이 메소드는 멤버변수 age의 값을 단순 출력하는 역할을 한다.
그리고,
showGender( ) 메소드를 보면,
멤버변수 isFemale의 값에 따라 성별을 출력하는 역할을 한다.
이것 역시 'public' 접근지정자를 갖는다.

생성자(Constructor)의 정의

클래스의 이름, 멤버변수, 멤버메소드 들을 정의하면
어느 정도 클래스가 모양새를 갖추게 된다.
한가지만 더 추가하면 거의 완벽한 클래스 정의가 된다.
그것은 바로 생성자이다.

생성자는 클래스로부터 객체를 만들어 내는 역할을
하는 특수 메소드이다.
생성자의 이름은 클래스 이름과 같고,
반환형이 없다.
그러나 함수의 인수는 가질 수 있다.
생성자 역시 클래스 정의 안에 만들어야 한다.

public class Person
{
   private int age;
   private boolean isFemale;

   public Person() // constructor 1
   {
   }

   public Person (int _age, boolean _isFemale)
   {
      age = _age;
      isFemale = _isFemale;
   }

public void showAge() 
{
   System.out.println("My age is "+age);
}

pubic void showGender()
{
   if (isFemale == true) 
   {
      System.out.println("I am female.");
   }
   else
   {
      System.out.println("I am male.");
   }
}
}
위에서 2개의 생성자를 정의했다. (빨간 색으로 표시했다.)
하나는 default 생성자(위의 것)이고, 다른 하나는 인수를 갖는 생성자이다.
default 생성자란 아무런 인수를 받지 않는 생성자를 말한다. 
특히, 클래스 안에 생성자를 굳이 만들지 않을 경우에라도 자동으로 만들어지는 생성자이다. 
(자동이라는 의미는 없어도 있는 것처럼 행동한다는 뜻이다. 클래스 정의 안에 저절로 입력된다는 뜻은 아니다.)
다만, default 생성자 외에 다른 생성자를 만들면, 반드시 default 생성자를 만들어야 하는 규칙이 있다.
두 번째 생성자는 두 개의 인수를 받아서,
멤버변수들을 초기화하고 있다.
객체를 생성하기 위해서는 필요에 따라 이들 두 생성자 중에 선택해서 사용하면 된다.
또한 필요한 경우, 생성자를 더 추가해서 만들어도 된다. 


클래스로부터 객체를 생성

이제 Person 클래스 정의를 이용해서 객체를 만들어서
사용하는 방법을 알아보자.
Person p1 = new Person();
Person p2 = new Person(20, true);

위에서는 두 개의 객체, p1과 p2를 만들고 있다.
'new'라는 것은 객체를 만드는 역할을 한다.
이 때 생성자가 사용되었다.
위의 것은 default 생성자를 사용했고,
아래 것은 두 개의 인수를 받는 생성자를 사용했다.

객체의 사용

이제 p1과 p2의 객체를 사용하는 예를 보자.
p1.showAge();
p2.showGender();
객체에다가 '.'을 붙이고 메소드 이름을 쓰면
해당 메소드를 호출하는 것이 된다.
메소드 showAge( )와 showGender( )는 접근 지정자가 'public'이므로
클래스 밖에서 호출이 가능한 것이다.

반면에, 멤버변수 age와 isFemale은 객체를 통해서 접근이 불가하다.
왜나햐면 'private' 접근지정자를 사용하고 있기 때문이다.
접근을 허용하려면 'public'으로 바꾸어야 한다.

이상에서 클래스를 정의하는 방법과 객체를 생성하여 사용하는 방법에 대해
쉬운 예를 들어 알아보았다.
복잡한 예들도 많지만 위에서 설명한 기본 골격을 잘 알아두면
크게 어렵지는 않다.

위의 내용을 동영상으로 설명합니다. 


반응형
LIST
Java언어의 핵심개념인 클래스 (class)에 대해 설명합니다.






반응형
LIST


Exception (예외) 

Java 프로그램이 수행되는 중에 오류 (error)가 발생하면
이것에 대한 정보를 담은 객체가 만들어지는데, 이것을 Exception 이라고 한다.

이러한 Exception은 크게 둘로 나누어진다.
1. Checked Exception
2. Unchecked Exception

Checked Exception

오류가 발생했을 때, 프로그램이 수행을 포기하지 않고도
복구할 수 있는 방법을 찾을 수 있는 Exception을 말한다.
예를 들어, 사용자가 파일이름을 지정하면, 그것을 열어서 동작하는 프로그램이라고
가정하자. 만약, 존재하지 않는 파일이름을 지정하면, 파일을 열 수 없기
때문에 오류가 발생한다. 
하지만, 사용자에게 오류를 알리고 다시 파일이름을 지정하라고 하여
복구할 수 있다.

여기에 해당하는 Exception에는
FileNotFoundException 같은 것이 있다.
여기에 대해서 나중에 더 자세히 설명한다.

Unchecked Exception
오류가 발생하면, 프로그램이 수행을 포기해야하거나, 
원래 목적했던 바를 이룰 수 없는 Exception을 말한다.
이것은 크게 둘로 나누어 ErrorRuntimeException이 있다.

Error는 프로그램 외적인 요인으로부터 생긱는 오류이다.
파일 읽기를 하는 프로그램이 수행 중 하드디스크가 하드웨어적으로 고장난 경우가
여기에 해당한다.

RuntimeException은 프로그램 수행 중에 논리 오류에 의해
일어나는 상황을 말한다. 예를 들어 나누기를 하는데 0으로 나누거나,
배열 인덱스를 사용할 때, 범위를 벗어나는 값을 사용하는 경우이다.
전자를 ArithmeticException, 후자를 ArrayIndexOutofBoundsException이라고 한다.

Arithmetic Exception예제

아래 프로그램은 0으로 나누는 연산이 들어가는 프로그램이다.

실행 중에 ArithmeticException이 발생하는 것을 알 수 있다.

ArrayIndexOutOfBoundsException 예제


이번에는 배열의 인덱스가 범위를 넘어가는 경우에 대한 예제이다.

아래 프로그램에서 인덱스는 0~2까지 이지만,

line 8에서 3을 사용하고 있다. 

프로그램을 실행하면 ArrayIndexOutOfBoundsException 이 발생함을 알 수 있고,

관련 정보들, 인덱스 3이 사용되었고, 그것이 line 9 임을 표시하고 있다.


Checked Exception 처리를 위한 try-catch문


<< 작성 예정 >>



Java프로그램 실행 중 발생하는 오류(Exception)을 처리하기 위한 try-catch 문에 대해 설명합니다.






반응형
LIST

다차원 배열 (Multi dimensional array)

2차원 이상의 배열을 다차원 배열이라고 한다.
행렬 같은 것을 생각하면 2차원 배열을 쉽게 이해할 수 있고,
입체공간을 생각하면 3차원 배열이 머리속에 그려질 것이다.

2차원 배열의 선언

1차원 배열과 비슷하지만, 배열을 나타내는 [] 표시를
하나 더 사용해서 아래와 같이 나타낸다.
int[][] a = new int[3][3];

2차원 배열선언과 동시에 값을 할당하는 것은 아래와 같이 한다.

눈여겨 볼 것은, 2차원 배열이기 때문에 행별로 { }로 감싸서 표시해야 하다.

만약, { } 표시를 하지 않을 경우에는 다음과 같이 컴파일 오류로 표시된다.


선언된 2차원 배열의 각 요소에 접근하는 것은 for-loop을 2번 중첩하면 된다.



2차원 배열의 길이


2차원 배열의 길이는 1차원 배열과는 조금 다르다.

예를 들어 아래와 같은 3x3 배열을 예를 들어보자.

전체적인 공간은 9개이다.


int[][] a = new int[3][3];


하지만, a.length는 행의 개수를 의미하여, 3이 되다.

전체 공간의 개수 9가 아님에 유의하자.

각 행에 들어있는 열의 개수는 각 행별로 확인해야 한다.

예를 들어, 0번 행의 경우에는 a[0].length와 같다.

아래는 2차원 배열에 .length를 사용했을 때의 출력결과를 보여준다.


이렇게 되는 이유는 아래 그림을 보면 다소나마 쉽게 이해할 수 있다.

a.length는 a안에 있는 요소의 개수 이므로 3이 되고,

a[0].length는 그 안에 있는 요소의 개수이므로 3이 되는 이치이다.




3차원 배열의 선언


2차원배열 보다 [] 를 하나 더 붙이면 3차원 배열을 만들 수 잇다

이것을 그림으로 표시해 보면 아래와 같은 입체를 생각해볼 수 있다.

모두 12개( = 3*2*2)의 사각형으로 구성된 입체이다. 

3차원 배열에 대한 초기화는 조금 신경써서 해야 한다.

c[3][2][2]의 경우에,

우선 { }으로 3등분을 한다.

그리고, 각 { }안에서, { }으로 다시 2등분을 한다.

가장 안 쪽의 { }안에, 숫자 2개씩을 쓰면 된다.

이것을 그림으로 보여주면 아래와 같다.


실제로 초기화 한 예는 아래와 같다.


그리고, 3차원 배열의 각 요소를 접근하는 것은 

2차원 배열과 마찬가지지만, for-loop을 한 번 더, 즉 3번을 중첩하여야 한다.



3차원 배열의 길이


위에서 2차원 배열의 길이를 설명했다.

3차원 배열의 길이도 아래 그림과 같은 의미를 같는다. 

배열 이름에다가 .length를 붙이면, 가장 큰 그룹의 개수를 의미하며,

차원이 하나씩 들어갈 수록 그 안에 있는 서브그룹의 개수들을 의미하게 된다.


아래 그림에서 a.length는 가장 큰 그룹의 개수이므로 3이 되고,

a[0].length는 그 안에서의 서브그룹의 개수이므로 2,

마지막으로 a[0][0]는 또 다시 그안에서의 서브그룹의 개수이므로 2가 되는 것이다.

따라서, 전체 공간의 개수를 알려면 각 단계별 개수를 모두 곱한 값이 된다.


3차원 배열의 크기를 출력해 보는 아래 예제를 살펴보자.

c는 3*2*2 크기를 갖는 3차원 배열이다.

이 때, c.length는 가장 큰 그룹의 개수를 의미한다.

그리고 c[0]은 0번째 그룹 안에서의 서브그룹의 개수, 2를 의미한다.

마지막으로 c[0][0]는 가장 안쪽 그룹에 있는 숫자의 개수이므로 2가 된다.




위의 내용을 동영상에서 보다 자세하게 설명합니다. 


반응형
LIST

+ Recent posts