변수(Variable)

  - literal을 기억시키기 위한 기억장소를 의미한다.

  - 메모리상의 임의의 위치에 저장

  - Datatype에 따라 일정 바이트 수 만큼 저장공간을 확보한다.

  - Syntax

    [기억류] 데이터타입 변수이름;

    ex. [register] int kor;  - 기억류를 생략하면 지역변수로 인식.

  - 기억류나 데이타타입은 키워드이며, 변수이름은 식별자(identifier)이다.


1. 식별자의 규칙(Naming Convention)

 1)변수명, 상수명, 함수명, 배열명, 구조체명, 공용체명, 라벨명에 사용

 2)영문자와 숫자로 구성된다.

 3)사용할 수 있는 특수문자는 유일하게 '_'만 가능하다.

 4)반드시 첫글자는 영문자와 '_'만 가능

 5)숫자는 두번째 글자부터 가능

 6) 컴파일러에 따라 이름길이에 제한이 있을 수 있다.

  ex. 표준 C : 8자 이내, C++ : 700자 이내, Trubo-C : 32자 이내, 지금은 제한 없음.

 7)대소문자는 구별한다.

 8)이름 중간에 공백이 올 수 없다.

 9)되도록 의미있는 이름을 부여하자.

   ex. aaa, bbb, ccc  X   / kor, eng, interest, hakjum  O


2. 문자형 변수

 - 문자형 리터럴 즉 한개의 문자(escape sequence 포함)를 저장하기 위한 공간

 - 데이터타입 : char(-128~127), unsigned char(0~255)

 - 메모리에 1Byte 공간 할당 받음.

 - char --> sign bit 인정

 - unsigned char --> sign bit 불안정 (양수만 저장)

 - 출력서식

   %c


  char ch, ch1;

  ch = 'x';

  ch1 = 'M';

  printf("ch = %c\n", ch);

  printf("ch1 = %c\n", ch1);

  ch = 66;

  ch1 = ch + 5;

  printf("ch = %c\n", ch);

  printf("ch1 = %c\n", ch1);

  ch = 'Z';

  ch1 = 'z';

  printf("ch = %d\n", ch);

  printf("ch1 = %d\n", ch1);

출력 :

ch = x

ch1 = M

ch = B

ch1 = G

ch = 90

ch1 = 122

----------------------

  unsigned char ch;

  ch = 178;

  unsigned char ch1;

  ch = -1;

  printf("ch = %c\n", ch);

  printf("ch1 = %c\n", ch1);

출력 :

ch = ▒

ch1 = ▒

(쓰레기 값이 나오는 것을 볼 수 있다)


3. 정수형 변수

 - 정수 리터럴을 저장하기 위한 변수

 - 값을 이진화해서 저장하며, 음수는 1의 보수, 2의 보수로 변환 돼서 저장

 - short(-32768 ~ 32767), unsigned(0 ~ 65535)

 - int(4byte, -2147483648 ~ 2147483647), unsigned int (0~ 4294967295)

 - long(int와 같음)


  short kor, eng;

  printf("kor's size = %d\n", sizeof(kor));

  kor = 90;

  eng = 100;

  printf("kor = %d\n", kor);

  printf("eng = %d\n", eng);

  printf("kor + eng = %d\n", (kor + eng));

  kor = 32769;

  eng = 89.5;

  printf("kor = %d\n", kor);

  printf("eng = %d\n", eng);

출력:

kor's size = 2

kor = 90

eng = 100

kor + eng = 190

kor = -32767

eng = 89

(short가 표현할수 있는 범위는 -32768~32767이다. 그런데 이것은 원으로 이어져있다고 생각하면 되는데 

32769를 집어넣었는데 표현할 수 있는 양수는 32767이라 두칸을 더갔다고 생각하면 된다. 그럼 32767 다음 -32768 다음 -32767이다.

그래서 -32767을 출력하는 것이다)


4. 실수형 변수

 - 실수 리터럴을 저장하기 위한 기억장소

 

  float f = 0.123456789123456789f;

  double d = 0.123456789123456789;

  printf("f = %.18f\n", f);

  printf("d = %.18f\n", d);

  출력 : 

f = 0.123456791043281555

d = 0.123456789123456784

f는 소수점 7자리까지 정확.

d는 소수점 15자리까지 정확.


5. 문자열형 변수

 - 한 글자 이상의 문자열을 저장하기 위한 기억장소

  - "" 로 묶여진 리터럴 처리

  - 출력서식 : %s

  -  데이터 타입

   1) char *

   2) char []

  

  char * irum = "경기도 수원시 정자동 123-567번지";

  char name[] = "Michael Jackson";

  printf("irum = %s\n", irum);

  printf("name = %s\n", name);

출력 :

irum = 경기도 수원시 정자동 123-567번지

name = Michael Jackson


6. 나열형 변수 및 리터럴

 1) 타 언어에서는 열겨형이라고 한다.

 2) 위치에 따라 순서가 달라지고, 값이 달라진다.

 3) 정수값을  대치하기도 한다.

 4) 출력서식 : %d

 5)나열형 변수 : 나열형 리터럴을 저장하기 위한 기억장소


  enum yoil {SUN, MON, TUE, WED, THU, FRI, SAT};

  printf("TUE = %d\n", TUE);

  printf("SAT + WED = %d\n", (SAT + WED));

출력:

TUE = 2

SAT + WED = 9

(enum의 { }안의 차례대로 0,1,2 이렇게 숫자가 지정된다)

----------------------------

  enum yoil {SUN, MON=10, TUE, WED=500, THU, FRI=1000, SAT};

  printf("TUE = %d\n", TUE);

  printf("SAT + WED = %d\n", (SAT + WED));

출력:

TUE = 11

SAT + WED = 1501

(MON이 10으로 지정되었으면 다음은 11이고, THU는 501, SAT는 1001이 된다)

---------------------------------

  enum lessons {Ubuntu, Clanguage, Java, Oracle, Jsp, Spring};

  enum lessons study;

  study = Java;

  printf("study = %d\n", study);

출력:

study = 2





형변환

암시적 형변환

  //implicit conversion(cast)

  //89.5 + 9;

(89.5는 실수이고 9는 정수인데 계산은 실수로 나오게 된다. 크기가 작은 쪽에서 큰 쪽으로 간다)

명시적 형변환

  //explicit conversion(cast)

  int kor = (int) 89.5;

(89.5를 정수만 표시하게 (int)를 통해 강제적으로 변환해준다)


  double avg = 89.5;

  int total = 300;

  printf("avg + total = %f\n", (avg + total));

  printf("total / 7 = %d\n", (total / 7));

  printf("total / 7. = %f\n", (total /7.));

출력:

avg + total = 389.500000

total / 7 = 42

total / 7. = 42.857143





연산자(Operator)

  - 연산하기 위한 기호

  - 항(operand)을 연산하기 위한 기호

1. 연산자의 우선순위

 1) 최우선 연산자 : [], (), ., ->

 2) 단항 연산자 : (type), !, ~, +, -, ++, --, sizeof(), *, &

 3) 이항 연산자 :

   - 산술연산자 : +, -, *, /, %

   - 이동연산자 : <<, >>

   - 관계연산자 : <, >, <=, >=, ==, !=

   - 비트 연산자 : ^, $, |

   - 논리 연산자 : &&, ||

 4) 삼항 연산자 : (조건) ? 참 : 거짓

 5) 할당 및 복합 연산자 : =, +=, -=, /=, %=, <<=, >>=, |=, $=, ^=

 6) 나열 연산자 : ,


2. 최우선 연산자(Primary Operator)

 1) []

 2) () : (4-5) * 6

 3) . : 구조체형 변수가 구조체 속의 멤버에 접근할 때 사용하는 연산자

 4) -> : 구조체형 포인터 변수가 구조체 속의 멤버에 접근할 때 사용하는 연산자


(1)

  int array[3];

  array[0] = 5;

  array[1] = 7;

  array[2] = 9;

  printf("array[0] = %d\n", array[0]);

  printf("array[2] = %d\n", array[2]);

출력 :

array[0] = 5

array[2] = 9

---------------------------------

(3)

  struct Student{

        int age;

        double ki;

  };

  struct Student chulsu;

  chulsu.age = 24;

  chulsu.ki = 175.3;

  struct Student younghee;

  younghee.age = 18;

  younghee.ki = 162.5;

  printf("chulsu.age = %d\n", chulsu.age);

  printf("chulsu.ki = %f\n", chulsu.ki);

  printf("younghee.age = %d\n", younghee.age);

  printf("younghee.ki = %f\n", younghee.ki);

출력 :

chulsu.age = 24

chulsu.ki = 175.300000

younghee.age = 18

younghee.ki = 162.500000

---------------------------------------------

 (4)

  struct Student {

        int age;

        double ki;

  };

  struct Student chulsu;

  chulsu.age = 24;

  chulsu.ki = 175.3;

  struct Student * ptr;

  ptr = &chulsu;

  printf("chulsu.age = %d\n", ptr -> age);

  printf("chulsu.ki = %f\n", ptr -> ki);

  출력:

chulsu.age = 24

chulsu.ki = 175.300000

-------------------------------------------------


3. 단항연산자(Unary Operator)

 1)(type) : 강제형변환(명시적형변환) 시 사용

 2) ! : 

   - 논리 NOT

   - false --> 0, true --> 0 외의 값

 3) ~ : bit NOTk, 1의 보수 연산자

 4) +, - : 양의 1을 곱하거나, 음의 1을 곱하는 연산자

   int su = 5; -su --> -5 --> 5*-1

 5) ++, -- : 각 항에 1을 누적하거나 감소하는 연산자

   int su = 5;

   su = su + 1;  --> su++;

   su = su - 1;  --> su--;

 6) & 연산자 : 해당 변수의 메모리 절대번지를 얻어오는 연산자

 7) * 연산자 : 

   - pointer 변수를 선언할 때 사용

   - 이미 선언된 pointer 변수에 *를 사용하면 그 포인터 변수가 가리키는  공간을 의미한다.

 8)sizeof 연산자

   - 메모리에 확보된 사이즈를 표시하는 연산자


(2)

  int isTrue = 4 > 5;

  printf(" isTrue = %d\n", isTrue);

  printf("!isTure = %d\n", !isTrue);

출력:

 isTrue = 0

!isTure = 1

-------------------------------------------

  enum BOOLEAN {FALSE, TRUE};

  int isTrue = FALSE;

  printf(" isTrue = %d\n", isTrue);

  printf("!isTure = %d\n", !isTrue);

  return 0;

}

출력:

 isTrue = 0

!isTure = 1

--------------------------

(3)

  int su = 128;

  printf("su = %d\n", su);

  printf("~su = %d\n", ~su);

출력:

su = 128

~su = -129

(~8을 구하면 0000 1000에서 1의 보수는 1111 0111이다. 이것의 -기 때문에 다시 2의 보수를 취하면 0000 1001이기 때문에 앞의 -는 가져오고 -9가 된다)

-----------------------------

(5)

  int su = 5;

  su++;

  printf("su = %d\n", su);

  ++su;

  printf("su = %d\n", su);

출력:

su = 6

su = 7

-------------------------------

(5)

  int su = 5;

  printf("su = %d\n", ++su);    //prefix operator

  printf("su = %d\n", su++);    //postfix operator

출력:

su = 6

su = 6

------------------------------------

(5)

 int a = 8;

 int b = a++;

 a=9, b=8 이 나온다.

 -------------------------------------

 (6)

  int su = 128;

  printf("su = %d\n", su);

  printf("&su = %d\n", &su);

  printf("&su = %u\n", &su);

  printf("&su = %x\n", &su);

출력:

su = 128

&su = -1074424468

&su = 3220542828

&su = bff5956c

-----------------------------------------------

(7)

 int num = 8;

  int * ptr = &num;

  * ptr = 100;

  printf("num = %d\n", num);

출력:

num = 100

(포인터변수 ptr에 num의 주소값을 넣어준다. 포인터변수 ptr에 또 포인터를 달아줌으로써 num의 직접 접근을 해서 num의 값을 수정해 준다. 그래서 변경된 num의 값이 나온다.

--------------------------------------------

(8)
   printf("%d, %d, %d\n", sizeof(int), sizeof(int *), sizeof(double *) 
  (그럼 4 , 4, 4가 나오는 것을 볼 수있다)
  -----------------------
    double array[3];
  struct Student {
        int age;
        double ki;
  };
  struct Student chulsu;
  printf("%d, %d, %d\n", sizeof(double *), sizeof(array), sizeof(chulsu));
출력:
4, 24, 12
----------------------------

4. 이항연산자(Binary Operator)
 1)산술연산자
   - *, /, %
   - +, -
 2)이동연산자
   - <<
   - >>
 3)관계연산자
   - <, >, <=, >=, ==, !=
 4)비트연산자 : &, |, ^
 5)논리연산자 : &&, ||

(1)
  int kor, eng, mat, tot;
  printf("Input a Korean Score : ");
  scanf("%d", &kor);
  printf("Input a English Score : ");
  scanf("%d", &eng);
  printf("Input a Math Score : ");
  scanf("%d", &mat);
  tot = kor + eng + mat;
  printf("kor = %d, eng = %d, mat = %d\n", kor, eng, mat);
  printf("total = %d, avg = %.2f\n", tot, tot/3.);
출력:
Input a Korean Score : 90
Input a English Score : 78
Input a Math Score : 100
kor = 90, eng = 78, mat = 100
total = 268, avg = 89.33
-------------------------------------------------
(1)
  int num;
  printf("정수를 입력하세요 : ");
  scanf("%d", &num);
  num = num % 2;
  if(num == 0) printf("짝수입니다\n");
  else printf("홀수입니다\n");
  return 0;
출력:
정수를 입력하세요 : 1355
홀수입니다
------------------------------------------------
(2)
<<는 2의 비트수만큼 곱하기에 대한 개념 , >>는 2의 비트수만큼 나누기에 대한 개념
8<<3
00001000  8
01000000  64
64>>3
01000000  64
00000100  4
-64>>2
01000000  64
11000000  -64
11110000에서 2의보수를 취하면 00010000 -16
---------------------------------
(2)
  int su = -64;
  printf("su <<4 = %d\n", (su << 4));
  printf("su >>5 = %d\n", (su >>5));
  return 0;
출력:
su <<4 = -1024
su >>5 = -2
---------------------------------------------------
(4)
5&3= 0101&0011 = 0001 = 1
5|3= 0101|0011 = 0111 = 7
5^3= 0101^0011 = 0110 = 6
------------------------------------------
(4)
  int su = 5, num = 3;
  printf("su & num = %d\n", (su & num));
  printf("su | num = %d\n", (su | num));
  printf("su ^ num = %d\n", (su ^ num));
  int isTrue = (4 > 5) || (100 > 4);
  printf("isTrue = %d\n", isTrue);
출력:
su & num = 1
su | num = 7
su ^ num = 6
isTrue = 1
---------------------------------------------------------
(4)(5)
  int a = 5, b = 100, x = 10;
  int result = (a > b) & (++x > b);
  printf("result = %d\n", result);
  printf("x = %d\n", x);
출력 :
result = 0
x = 11
여기서   int result = (a > b) & (++x > b); 이부분을 &&으로 바꿔주면,
출력은 result = 0, x = 10이 나온다. &&은 앞의 a>b가 거짓으로 판명나서 
뒤에 계산은 하지않고 다음으로 넘어가기 때문에 이런 현상이 나온다.
-----------------------------------------------------------------

5. 삼항연산자(Ternara Operator)
  (조건) ? 참 : 거짓

  int a, b, c;
  a = 10; b = 5;
  c = (b > a) ? b : a;
  printf("c = %d\n", c);
  int num;
  printf("정수를 입력하세요 : ");
  scanf("%d", &num);
  printf("%s\n", (num % 2 == 0) ? "even number" : "odd number");
  return 0;
출력:
c = 10
정수를 입력하세요 : 25
odd number
-------------------------------------------------
  int num;
  printf("정수를 입력하세요 : ");
  scanf("%d", &num);
  printf("%s\n", (num % 3 == 0) ? "3의 배수" :
        (num % 3 == 1) ? "1 나머지" : "2 나머지");
  return 0;
출력:
정수를 입력하세요 : 5
2 나머지
-------------------------------------------------------

6. 복합(할당)연산자
  - = --> 할당 연산자
    int su = 5;
    su++; --> ++su; --> su = su + 1;
    su = su + 5; --> su += 5;
    su -= 10;  su *= 4;  su /= 2;  su %= 4;

    su = su >> 3; --> su >>= 3;
    su = su << 4; --> su <<= 4;
    su = su & 3; --> su &= 3;
    su = su | 5; --> su |= 3;
    su = su ^ 2; --> su ^= 2;

단항연산자와 할당연산자는 연산이 오른쪽에서 왼쪽으로, 나머지는 왼쪽에서 오른쪽.

7. 나열 연산자
 - ,
 int a;
 int b;
 int c;
 --> int a, b, c;



리눅스 파일공유(삼바서비스)
삼바서비스를 다운받기전에 sudo apt-get update 잊지말고...(캐시업데이트임, 업그레이드는 os업그레이드)
그리고 sudo apt-get install samba 로 설치.
계정을 루트에 추가해주기 위해 sudo smbpasswd -a mino 쓰고 비번 써주고.(이것은 삼바서비스를 쓸 계정과 비번. 난 간단히 비번은 samba로 해줬어.)
어떤 폴더를 공유할지를 정하고, sudo gedit/etc/samba/smb.conf 에 들어가서
42번째줄 share definitions밑에 (약 51번째줄)
[MyShare]  //다른사람에게 보이는 공유폴더의 이름
path = /home/mino/CRoom  //내가 공유하려는 폴더 경로
browsable = yes  //넷상에 보이게
writable = no   //쓰지못하게
readonly = yes  //읽을수있음
guest ok = yes //게스트도 허용
위와 같이 추가해주고 저장 후  sudo service smbd restart 으로 서비스 재시작.
그리고 윈도우즈 실행에서 접속하려고 하면 방화벽때문에 들어갈 수 없다. 그러면 파이어월을 접속한 후에 category 를 network로 application name 을 samba로 바꿔줌 그리고 add 해줌.
접속 방법은 실행에서 \\192.168~~~~~~ 자기 우분투 IP 써주면 됨.


'Java & Oracle' 카테고리의 다른 글

c 제어문 day9  (0) 2014.02.27
c 입출력함수 day8  (0) 2014.02.26
c 시작 day6  (0) 2014.02.24
ftp 연결, ping day5  (0) 2014.02.21
vi editor day5  (0) 2014.02.21

+ Recent posts