매크로, 연산자

언어로그/C/C++ 2011. 3. 10. 01:22




사칙연산자

C언어 설계의 특징 중 하나로 친숙성을 들 수 있는데, 그 예로 일상생활에서 사용하는 연산자를

그대로 언어에 채용하였다. 

사칙연산자 +, - , *, /  는 2개의 피연산자가 정수이면 결과는 정수로, 하나라도 실수라면 실수를 반환한다.

12 + 14 = 26 (정수)

12.0 + 14 = 26.0 (실수)

12 + 14.0 = 26.0 (실수)

12.0 + 14.0 = 26.0 (실수)



나머지 연산자

% 는 나머지(modular) 연산자로 2개의 피연산자가 반드시 정수이여야 하며, 실수 사용시 컴파일 에러가 발생한다.

 30.0 % 10 =>  컴파일 에러




증감연산자 (++, --)

증감연산자는 a++ , a--는 변수를 1씩 증가 또는 감소시키는 연산자로 각각 a = a+1 , a = a-1 과 같은 의미를 갖는다. 

++a  는 앞에 연산자가 붙어 전위 연산자라 부르고, a++ 는 뒤에 연산자가 붙어 후위 연산자라고 부른다.

전위 연산자는 해당하는 문장이 평가되기 전에 작용하고,  a++ 는 문장이 평가된 후 작용하는 차이가 있다.


while문과 if문의 비교문에서 후위 연산자가 사용되었을 경우, 조건문 괄호가 평가 된 후 바로 변수가 증가한다 것을 주의하자.

while (a++ > 0) { 
    printf("%d \n", a); 
}

if (a++ > 0) { 
    printf("%d \n, a"); 
}



타입캐스팅

데이터 타입은 (표현범위가) 작은 데이터 타입에서 큰 타입으로는 데이터 손실이 없기 때문에 자동 형변환이 이루어진다.

 하지만 그 반대의 경우는 큰 데이터를 작은 데이터타입에서는 표현할 수 없기 때문에 데이터 손실이 발생하기 때문에 

컴파일러 경고가 발생하는데 사용자가 수동으로 형변환을 하여 경고를 없앨 수 있다.

(프로그래머가 데이터 손실을 고려했다는 것을 컴파일러에게 알리는 것임)


char ch = 'a';
int i = 1;
float f = 1.0;
double d = 1.0;

d = ch * i * f + 3000;  // 자동 형변환이 일어남.



매크로 상수, 기호상수

# 기호는 전처리 지시어라고 하며, #이 붙은 키워드는 컴파일러가 번역을 수행하기 전에  전처리기가 소스코드를 변경하는 

작업을 수행하게 하는 명령이다.

#define BASE 700 // 매크로상수 선언 

이 문장은 매크로 상수 라 하며 소스코드에  사용된 모든 BASE 기호는 컴파일전에 모두 700으로 대치가 된다.
프로그램에서 추후 변경될 수도 있는 간단한 수치를  매크로 상수로 선언해두면 나중에 매크로 상수 하나의 변경만으로

해당 데이터가 사용된 소스코드를 모두 변경할 수 있게 하는 장점이 있다. 


매크로 상수 외에 기호상수를 사용할 수도 있다.  변수 앞에 const  키워드를 붙히면 해당 변수를 기호상수로 만들 수 있다.
기호 상수는 최초 초기화 시에만 값을 할당할 수 있으며,  이후 변경할 수 없는 변수이다.


const int BASE = 700;// 기호상수 선언



논리 연산자

AND 연산자 && 는 2개의 피연산자가 참일 경우에만 참을 반환하는 연산자이며,

OR 연산자 || 는 2개의 피연산자 중 적어도 하나가 참이면 참을 반환하는 연산자이다.

(변수가 0이 아닌 값은 참으로, 0이면 거짓으로 평가된다.)


논리연산자에서 다음과 같은 특성을 유추할 수 있다.

0 && a     //  a의 값에 상관없이 무조건 거짓(0)으로 평가되어, a값을 보지않음

1   ||  a     //  a의 값에 상관없이 무조건 참(1)으로 평가된어, a값을 보지않음



관계연산자

2개의 피연산자 비교하는 연산자로 다음과 같은 연산자가 있다.

<  : less than (lt)   

<= : less than or equal (le)   

>  : greater than (gt)   

>= : greater than or equal (ge)      

== : equal   (eq) 

!= : not equal (ne)




연산자 우선순위와 결합성

컴파일러는 모든 연산자에 부여된 우선순위에 따라 연산자를 순차적으로 처리한다.

연산자의 우선순위를 모두 암기할 필요는 없다. 연산자들이 평가되는 순서를 보장하기 위해서

가장 우선순위가 높은 () 연산자를 명시적으로 사용하면 좋다

동일한 우선순위의 연산자가 사용되었을 경우, 연산자가 갖는 결합성 특성에 따라 연산자가

처리된다. 오른쪽 결합성은 왼쪽에서 오른쪽 방향으로 처리되는 성질을, 왼쪽 결합성은 오른쪽에서

왼쪽으로 처리되는 특성을 갖으며,  = 할당연산자는 왼쪽 결합성을 갖는다.


int a = 10, b = 20, c = 30;
res = a += b -= c += 5;    
printf("a : %d, b : %d, c : %d\n",  a, b, c);// a : -5, b : -15, c : 35 가 출력됨

'언어로그 > C/C++' 카테고리의 다른 글

함수의 이해  (0) 2011.03.27
포인터의 이해  (0) 2011.03.11
매크로, 연산자  (3) 2011.03.10
표준입출력함수 getchar() / putchar()  (0) 2011.02.22
비표준 입출력함수 getch(), getche()  (0) 2011.02.22
표준입출력함수 printf() / scanf()  (0) 2011.02.22
  • 서정권 2011.03.10 08:52 ADDR 수정/삭제 답글

    성배 공부 진짜 열심히 한다ㅋ

  • 로그 @로그 2011.03.10 17:57 신고 ADDR 수정/삭제 답글

    열심히 하기는 ㅎㅎ. 예전에 작성한 것들 조금씩 이곳으로 옮기고 있는거야~ ㅎ

  • 서정권 2011.03.11 11:50 ADDR 수정/삭제 답글

    성배랑 놀고 싶구나

[자바] (1) 자바소개

언어로그/Java 2011. 3. 10. 00:49


나름 잘 보이게 한다고, 노란박스를 사용했는데...굉장히 눈을 자극하네요...otz...   


자바(Java)란?

자바언어의 개발사인 썬은 spac이란 서버제품군을 제작하는 회사였는데, 낮은 H/W 마진을 개선하고자, 자사의 H/W 위에 마진이 높은 SW(유닉스 등)를 얹혀 팔려했는데, H/W 마다 SW를 재작성해야하는 문제가 있었습니다.  이에 해결책으로 , 즉 한번 작성하면  다양한 머신 위에서  동일하게 작동할 수 있는 SW를 작성할 수 있는  java를 개발하게 된겁니다.


자바의 장정

객체지향적이고, 플래폼 독립적이고, 동적이고 배포하기 쉬우며, 견고하고 보안에 강하다고 합니다.

엄밀히 말하면 객체지향적이다는 특성은 전적으로 S/W를 작성하는 개발자에게 달려있습니다.

 

                                       

플랫폼 독립성

c언어와 같이 컴파일러가 머신에 의존적인 기계어 코드(실행파일)를  생성하면, 유닉스, 리눅스, 윈도우, 맥 등 각 머신에서 소스를  재컴파일 해야합니다. (각 머신에 맡는 바이너리를 생성해야함).  반면 자바는 OS  와 소스 사이에 Java Virtual Machine이라는 중간계층을 두어 이를 해결했습니다. 소스코드를 가상머신이 인식할 수 있는 중간언어인 바이트 코드로 컴파일해서 배포하는 겁니다. 그러면 각 OS에 설치되있는, JVM이 바이트코드를 머신 의존적인 기계어 코드로 번역하여 실행하는 겁니다. 

 (단,  OS마다 각 머신에 맞는 JVM을 설치해야하지만, 한번만 설치하면 이후에는 소스를 재컴파일 해야하는 번거로움이 사라집니다. 바이너리 레벨에서의 플랫폼 독립성을 확보하게 됩니다. )  



기업 인터넷 환경에서 자바

유연성을 위해  3 - tier ( 프레젠테이션 계층 - 비지니스 계층 - 데이터(DB) 계층 ) 의 형태로 구성된답니다.

현재는 더욱 확장된 N - tier로  됩니다.  

          


JVM(Java Virtual Machine)의 동작방식

클래스 로더는 먼저 소스코드를 보고 모든 필요한 클래스를 로드합니다. 필요한 클래스 위치는 CLASSPATH 환경변수를 참조하여 해당하는 위치에서 찾게됩니다. JVM Verifier는 오작동을  일으킬 수 있는 코드(무한루프)를 검사해 실행을 차단하고, 이어 바이트 코드를 실행합니다. 또한 Just-In-Time 컴파일러를 호출하여, 소스코드와 클래스 파일을 비교합니다. 클래스 파일이 생성되지 않았거나, 소스코드가 클래스파일보다 나중에 수정됐을 때만 재컴파일을  합니다.

(JIT 를 도입해서 자바의 느린성능을 어느 정도 극복했고, 버전업 될때마다, 개선을 통해 성능을 향상시키고 있습니다.)

가비지 컬레터라는 메모리 관리자는  더 이상 사용되지 않는 객체를 수시로 검사하여 자동으로 메모리를 반환해줍니다.



자바환경에서의 보안

언어차원 - 컴파일러 - 클래스 로더 - bytecode verifyer 등 계층적으로 위해한 코드를 차단해주어 안정성을 제공합니다.

자바애플리케이션은  - .zip 또는 .jar로  형태로 압축하여 배포합니다. .jar은 단순히 소스만 압축 할 수도 있고,  클래스파일

까지 포함하여 같이 압축해서 실행가능한 형태로 만들수 있습니다. 웹 기반 애플리케이션은  .WAR 형태로 압축해서 배포

합니다.



JDK(Java Development Kit)

보통 J2SE(Java2 Standard Edition)를 의미하며, 자바를 기반으로 SW를 개발할 수 있는 환경을 의미합니다.  

컴파일러(javac),  core class 라이브러리, 디버거(jdb), JVM, JAR(Java ARchive utility), 기타 등으로 구성됩니다.

Java1.2 버전 이후 부터 대폭 내부구조가 개선되었으며, 이런 변경을 표현하기 위해 1.2 버전 이후부터는 JAVA2라고 

부릅니다. 개발 아키텍처에 따라 J2SE, J2ME, J2EE 로 나뉘기도 합니다.  J2ME는 모발일 환경  SW 작성을 위해 꼭 필요한 

핵심 클래스만으로 이루어진 버전입니다. J2EE는 기업환경에 적합하게 병렬실행 등을 강화한 버전입니다. 


'언어로그 > Java' 카테고리의 다른 글

(2) 리플렉션(Reflection) 사용하기  (0) 2011.04.07
(1) 리플렉션(Reflection)  (3) 2011.04.07
예외처리 (Exception Handling)  (0) 2011.03.24
[Java] 어노테이션 사용하기  (1) 2011.03.19
[Java] 어노테이션(Annotation)  (2) 2011.03.15
[자바] (1) 자바소개  (0) 2011.03.10