검색결과 리스트
언어로그에 해당되는 글 48건
- 2011.03.10 매크로, 연산자 (3)
- 2011.03.10 [자바] (1) 자바소개
- 2011.03.04 자바 개발자를 위한 루비적 관점
- 2011.02.22 표준입출력함수 getchar() / putchar()
- 2011.02.22 비표준 입출력함수 getch(), getche()
- 2011.02.22 표준입출력함수 printf() / scanf()
- 2011.02.22 음수의 표현
- 2011.02.22 C 언어 학습에 핵심. 변수와 상수
- 2011.02.22 C 프로그램 실행과정
- 2011.02.22 C 언어란?
글
매크로, 연산자
사칙연산자
C언어 설계의 특징 중 하나로 친숙성을 들 수 있는데, 그 예로 일상생활에서 사용하는 연산자를
그대로 언어에 채용하였다.
12 + 14 = 26 (정수)
12.0 + 14 = 26.0 (실수)
12 + 14.0 = 26.0 (실수)
12.0 + 14.0 = 26.0 (실수)
나머지 연산자
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 |
설정
트랙백
댓글
글
[자바] (1) 자바소개
나름 잘 보이게 한다고, 노란박스를 사용했는데...굉장히 눈을 자극하네요...otz...
자바(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 |
설정
트랙백
댓글
글
자바 개발자를 위한 루비적 관점
핵심클래스 확장(Core Class)
Java에서는 SDK와 같은 Language Runtime의 핵심클래스에 메서드를 추가할 수 없기 때문에 확장메서드들을
다른 클래스의 정적메서드로 모아두는 방식을 선택함 (공백문자열인지 검사하는 StringUtils의 isBlank 메소드)
루비의 클래스들은 개방되어 있어서, 언제든지 수정 가능함
class String
def blank?
empty? || strip.empty?
end
end
루비의 nil은 자바의 null 에 해당하지만, 객체이며, 메소드 호출 및 추가가 가능
class NilClass
def blank?
true
end
end
불변객체의 장점
스레드 안정성 - 객체를 변경할 수 없기 때문에 스레드 충돌이 없음
캡슐화 용이
효율적인 해시키 생성 - 해시코드가 변경되지 않기 때문
가변(Mutable) 객체와 불변(Immutable) 객체
자바는 가변과 불변 2가지 버전의 클래스들이 존재하며, final 키워드를 사용해 불변성을 지원함
루비는 클래스가 아닌 인스턴스 수준에서 가변성이 이루어지는데, freeze 메서드를 호출하면 불변이됨
자바의 불변클래스에 변경메소드 호출은 변경된 새로운 객체를 리턴함
루비문자열은 자동 불변속성은 아니지만, 변경메소드에 대해 새로운 객체를 리턴함
루비 메소드기호 관례
Boolean 값을 반환하는 메소드는 ?로 끝남
객체의 값을 바꾸는 메소드는 !로 끝남
대입문에 사용되는 메소드는 =로 끝남
패키지와 네임스페이스
자바는 package 키워드를 사용해 네임스페이스를 생성
루비는 module을 사용하여 네임스페이스 생성. 참조하는 모듈다음에 범위연산자 :: 사용
module Relevance
class User
def initialize(name)
@name = name
end
attr_accessor : name
end
end
module Codecite
class User
def initialize(name)
@name = name;
attr_accessor : name
end
end
end
u1 = Relevance::User.new("Justin")
u2 = Codecite::User.new("Stu")
include Relevance
u3 = User.new("Jared")
puts "u3 is a #{u3.class}"
코드배포
- 로드패스(Load Path)
자바는 클래스패스 및 클래스 풀네임을 통해 클래스 단위로 로딩함
루비는 :$ 라는 이름을 가진 로드패스를 가지고 있으며, 소스파일 단위로 코드를 로딩함
(한 소스에 여러개의 클래스가 있을 수 있고, 아에 클래스 정의가 없을 수도 있기 때문 )
require 'super_widget'
w = new SuperWidget('phlange")
- 루비젬(RubyGems)
루비젬은 소스파일의 덩어리를 가리키는 말로, 자바에서의 jar 라고 생각할 수 있다.
gem 커맨드를 사용하여, 젬으로 그룹핑하고, 문서파일 생성, 웹을 통해 다운받고, 버전을 관리할 수 있다
require 'rubygems'// 젬을 로딩하기 위한 사전정의어 정도... require_gem 'pdf-writer'
애플리케이션을 특정 버전의 레일스에 바인딩하는 것을 동결(freezing)이라고 함!
레일스는 동결 지정/해제를 위한 freeze란 레이크 태스크를 포함하고 있음
위임
레일스에서 확장한 delegate라는 메소드를 사용하여 위임을 쉽게 사용할 수 있다.
require 'rails'
class Manager
attr_accessor : programmer, :tester
delegate :code, :debug, :to=> :programmer
delegate :write_test_plans, :run_tests, :to=>:tester
end
다형성과 인터페이스
루비에는 컴파일 타임이 없기 때문에, 자바의 다형성과는 다르게 작동함
루비의 타입 안전성은 인터페이스 차원이 아닌 메서드 차원에서 보장됨. 런타임에 실제 구현되지 않은 메소드를
호출하면 NoMethodError 예외를 던짐
자바에서는 컴파일 타임에 객체가 특정 인터페이스 타입이 아니면 에러를 발생시켜 주지만, 루비는 실행시에 실제로
해당 메소드가 구현되외 있는지 확인하고 예외를 발생시켜준다는 의미이다.
루비 메타프로그래밍
- 리플렉션
루비의 Object클래스도 자바처럼 객체의 상태와 내용을 볼수 있는 기능을 제공함
리플렉션 메서드로 Object#respond_to?, Object#instance_of?, Object#instance_variables, Object#kind_of 가 있음
- 메시지 전달
Object클래스의 send메서드를 통해 동적으로 객체의 메소드를 호출 할 수 있으며, 매개변수로 블록전달도 가능
실행할 메서드의 이름을 동적으로 조합해서 지정할 수 있기 때문에 다양한 형태의 메소드 호출, 전달이 가능
- 없는 메서드 처리(method missing)
존재하지 않는 메서들을 처리해주는 Object#method_missing 메서드를 재정의해서 사용할 수 있음
오리 타이핑(Duck Typing)
객체의 타입이 클래스(Object#class)가 아닌, 실제 그일을 수행하는 메서드를 가지고 있는지를 기준으로 판단
(오리처럼 걷고, 오리처럼 말하면, 인터프리터 입장에서 오리로 취급해줄게~)
- 오리타이핑의 장점
단위테스트 스텁객체 작성이 용이 - 필요한 메서드만 구현해주면 됨
반복적으로 사용하는 코드에 대해 인위적인 경계를 허물어뜨림 - 유연성?
객체 간의 관계 리팩터링이 쉬움
- 오리타이핑의 단점
자동화 도구들이 변수와 메서드 추측을 어렵게 만들어, 좋은 품질의 코드완성과 리팩터링 제공이 힘듬
믹스인
한번 작성한 코드를 믹스인으로 몇 개의 클래스나 모듈과 혼합할 수 있는 방식
위임을 믹스인으로 쉽게 구현할 수 있음
module Employer
def employees
@employees ||= []
end
def add_employee(employee)
...
end
def remove_employee(employee)
...
end
end
class BusinessPerson < Person
include Employer, Employee
end
특정 객체의 인스턴스를 생성하고 extend를 사용하여 특정 인스턴스에만 적용되게 할수도 있다
p = Persion.new("Stu", "Halloway")
p.extend Employer
함수(Functions)
함수형 언어에서의 함수를 의미한다. c, c++, 자바같은 절자지향 또는 객체지향 언어들은 명령형 프로그래밍의
개념들을 따르고 있다. 이들 프로그래밍에서 함수는 객체의 상태를 변경시키는 작업을 한다.
함수형 언어에서의 함수는 특정 입력값에 대해 항상 동일한 결과값을 반환하는 동작만을 한다.
루비에는 이런 함수와 유사한 블럭(block)이 존재한다. 자바에서도 인터페이스와 익명클래스를 사용하여 블럭 또는
클로저를 구현할 수 있다.
자바
public interface Comparator {
int compare(Object o, Object o1);
}
Collectons.sort(al, new Comparator() {
public int compare(Object o, Object o1) {
return ((String)o).length() - ((String)o1).length();
}
});
루비
sorted = readlines.sort { |x, y| x.length - y.length }
puts "sorted:\n #{sorted.join}
블록은 특정 작업에 대한 래퍼(Wrapper)를 구현할 때 유용함
def expect_exception(type)
begin
yield// 전달받은 블록을 호출함, 없으면 무시
rescue type=>e // 해당하는 타입의 예외이면 정상종료
return
end
raise "Excpected exception: #{type}"// 다른타입의 예외이면 예외를 발생시킴
end
expect_exception(ZeroDivisionError) {10/0}
&를 사용하여, 명시적으로 블록을 인자로 전달 받을 수 있다. block_given?를 호출해서 블록전달 유무도 알수 있다.
def expect_exception(type, &blk)
begin
blk.call if block_given? // 전달받은 블록을 호출함, 없으면 무시
rescue type=>e // 해당하는 타입의 예외이면 정상종료
return
end
raise "Excpected exception: #{type}"// 다른타입의 예외이면 예외를 발생시킴
end
expect_exception(ZeroDivisionError) {10/0}
'언어로그 > Ruby/Rails' 카테고리의 다른 글
| 자바 개발자를 위한 루비적 관점 (0) | 2011.03.04 |
|---|---|
| [Ruby]WEBrick 서블릿 사용하기 (0) | 2010.12.12 |
| [Ruby]WEBrick 서버구동 (0) | 2010.12.12 |
설정
트랙백
댓글
글
표준입출력함수 getchar() / putchar()
입출력함수의 동작방식
프로그램이 실행되기 전(main함수로 진입되기 전) 운영체제는 그 프로그램을 위해 입출력 버퍼를 생성한다.
생성된 입출력 버퍼에 대한 접근을 위해 <stdio.h>에 표준입력 버퍼를 위해 stdin을, 표준출력 버퍼를 위해
stdout 등의 값을 정의해두었고, 프로그래머는 이 값에 접근함으로 표준입출력 버퍼를 다룰 수가 있다.
int ch; ch = getchar(); putchar(ch);
위 소스 코드가 실행되면, 먼저 1바이트의 메모리가 생성이 되고, ch라는 이름이 부여된다.
getchar() 함수가 실행이 되고, 표준입력버퍼가 비어있기 때문에, 커서가 깜박이게 된다.
사용자가 abc값을 입력하면, 이 값은 입력버퍼에 쌓이게 된다. 엔터를 치면, 개행문자까지 버퍼에 입력이 되고,
이 버퍼에서 한문자가 읽혀져 getchar에 반환된다.
stdin : a b c \n <= 개행문자가 입력되는 순간 getchar 함수가 문자 a를 반환함
getchar 함수에 의해 문자 'a' 의 정수값 97이 반환이 되고, puchar(ch)는 이값을 출력버퍼에 쓰고 동시에 버퍼를 비우게 되고,
비로소 모니터에 출력이 되게 된다.
중요한 것은 입출력 버퍼에 데이터를 기록하고 읽어온다는 것과 개행문자까지 버퍼에 함께 기록되기 때문에 동작방식을
잘 이해해야 한다는 것이다.
표준입력함수
int getchar();
표준입력버퍼에서 1문자를 읽어 정수값을 반환하는 함수.
표준 출력함수
int putchar(int ch);
표준출력버퍼에 1문자를 쓰고, 버퍼를 비우는 함수
기억해 두면 유용한 아스키값
- 'A' : 65
- 'a' : 97
- '0' : 48
'\n' : 10
이 글은 스프링노트에서 작성되었습니다.
'언어로그 > C/C++' 카테고리의 다른 글
| 포인터의 이해 (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 |
| 음수의 표현 (0) | 2011.02.22 |
설정
트랙백
댓글
글
비표준 입출력함수 getch(), getche()
getch(), getche()는 입출력버퍼를 거치지 않는 비표준 입출력함수로 <conio.h> 헤더파일에
선언되어 있다. 표준이 아니기 때문에 시스템마다 함수 지원여부가 다를 수 있지만 대다수 시스템에서
지원한다고 한다
- int getch(void)
표준입력(키보드)로부터 1문자를 읽어오는 함수로, 버퍼에서 읽지 않고 바로 읽어온다.
- int getche(void)
getche 는 getch 와 동일한 기능을 하지만, 읽은 1문자를 바로 echo해 준다.
escape(이스케이프 문자)
- '\a' :beep sound
- '\t' : tab
- '\b' : back space
- '\0' : null character (아스키 코드값 0)
- ...
이 글은 스프링노트에서 작성되었습니다.
'언어로그 > C/C++' 카테고리의 다른 글
| 매크로, 연산자 (3) | 2011.03.10 |
|---|---|
| 표준입출력함수 getchar() / putchar() (0) | 2011.02.22 |
| 비표준 입출력함수 getch(), getche() (0) | 2011.02.22 |
| 표준입출력함수 printf() / scanf() (0) | 2011.02.22 |
| 음수의 표현 (0) | 2011.02.22 |
| C 언어 학습에 핵심. 변수와 상수 (0) | 2011.02.22 |
설정
트랙백
댓글
글
표준입출력함수 printf() / scanf()
printf 와 scanf 는 포맷에 맞추어, 표준 입출력을 수행하는 함수, 이 함수들도 표준입출력 버퍼의
데이터를 다루는 함수들이다. printf 와 scanf 함수에 인자로 적절한 포맷을 지정하는 변환코드를
지정해 줄 수 있다.
변환코드
%c : 문자
%d : 정수
%f : 실수(단정도 - float)%lf : 실수(배정도 - double)
printf 함수에 변환코드를 좀더 세부적으로 표현해줄 수 있다.
printf 함수에 %nd (n은 양수) 은 최소 n 자리를 확보하라는 뜻이다.
int a = 12345;a값을 다음과 같은 변환코드에 적용을 하면
- %8d : 최소 8자리를 확보하여 출력한다. >> _ _ _ 1 2 3 4 5 가 출력됨.
- %3d : 최소 3자리를 확보하지만, 더 큰자리수를 표현할수 잇다. >> 12345
- %08d : 최소 8자리를 확보하되, 빈칸은 0으로 표시한다. >> 0 0 0 1 2 3 4 5
- %-8d : 최소 8자리를 확보하되, 왼쪽칸 부터 채운다. >> 1 2 3 4 5 _ _ _
실수는 디폴트로 소수 6자리까지 표시를 한다.
double d = 123. 456
에 변환코드를 적용해보면,
- %f :디폴트로 소수 6번째 자리까지 표시한다. >> 1 2 3 . 4 5 6 0 0 0
- %8.2f : 최소 8자리를 출력하되, 소수 2째 자리까지 표시 >> _ _ 1 2 3 . 4 6
%08.2f : 최소 8자리 중, 소수 2째자리까지 표시하고 빈칸은 0으로 채움 >> 0 0 1 2 3 . 4 6 -
%.2f : 소수 2째자리까지 표시하고, 최소 자리수는 알아서 출력 >> 1 2 3 . 4 6
- %o : 8진수로 표현
%0x : 16진수로 표현 - %% : % 문자 자체 출력
- % s : 문자열 출력
정수를 8진수 16진수로 표현하기
8진수 1자리수는 2진수 3비트에 해당하며, 16진수 1자리는 2진수 4비트에 해당한다.
int a = o73;
8진수 73을 2진수로 표현을 하면 0111 0011 로 표현할 수 있다.
int b = 0xf4;
16진수 64를 2진수로 표현하면 1111 0100 로 표현할 수 있다.
scanf
Scanf : 표준 입력버퍼에서 지정한 서식에 맞게 읽어오는 함수로, 값을 저정할 메모리의 정확한 물리적인 주소를
전달해야 한다. 통상 주소 연산자 &(엠퍼센트) 를 변수 앞에 두어 변수의 주소를 전달한다.
1234 (천이백삼십사) 라는 값을 입력받고 싶은 경우, getchar() 함수는 한 문자를 반환하기 때문에
네 문자를 읽어서 적절한 정수형태로 변환을 해주어야 한다. 이러한 과정은 어렵진 않지만 번거로운 작업으로
scanf 를 사용하여 편리하게 읽어올 수 있다.
int a;
scanf("%d", &a);
위 코드를 실행하여 1234를 입력했다고 가정하면, sscanf
whitespace(공백, 탭, 엔터)를 만날 때까지 값을 읽어들이고, 변환코드에 지정한 형식으로 자동으로 변환하여
변수에 값을 담아준다.
scanf 에서의 변화코드
scanf("%3d", &a);
scanf에서 변환코드는 printf 와는 다르게, whitespace가 나올 때까지 읽되, 최대 3문자까지만 읽어들인다는 의미이다.
즉 whitespace가 나오지 않더라도, 3문자까지 읽으면 더이상 버퍼에서 읽지 않는다는 것이다.
scanf 에 변환코드를 여러개 주어 한번에 여러값을 읽어들일 수 있다.
char ch;
int a;
float f;
double d;
scanf("%c %d %f %d", &ch, &a, &f, &d);
scanf 사용시 주의사항
1) printf 에서는 float와 double형 데이터를 위해 %f 변환코드를 사용할 수 있었지만, scanf에서는
반드시 float는 %f, double은 %lf 변환코드를 사용하여야 한다.2) %c 를 제외한 변환코드는 whitespace가 나올때까지 읽지만, %c는 whitespace 문자가 나올때까지 읽지만
whitespace를 버퍼에 제거하지 않고 남겨두어 이후 오작동에 원인이 될수 있다. %c를 사용한 후 fflush(stdin)를사용하여 버퍼를 비워주는 것이 좋다.
3) scanf("%d \n" , &a) 나 scanf("%d ", &a); 와 같이 변환코드 다음에 다른 문자가 있으면, 다른 변환코드가 있을거라가정하여 의도하지 않게 2번 입력해야 하는 경우가 발생하기 때문 포맷문자열에는 변환코드만을 사용한다.
이 글은 스프링노트에서 작성되었습니다.
'언어로그 > C/C++' 카테고리의 다른 글
| 표준입출력함수 getchar() / putchar() (0) | 2011.02.22 |
|---|---|
| 비표준 입출력함수 getch(), getche() (0) | 2011.02.22 |
| 표준입출력함수 printf() / scanf() (0) | 2011.02.22 |
| 음수의 표현 (0) | 2011.02.22 |
| C 언어 학습에 핵심. 변수와 상수 (0) | 2011.02.22 |
| C 프로그램 실행과정 (0) | 2011.02.22 |
설정
트랙백
댓글
글
음수의 표현
컴퓨터에서는 모든 데이터를 이진수로 다룬다. 그러다 보니 음수를 어떻게 이진수로
표현을 해야하는가에 대한 문제가 생기게 됐다. 가장 단순하게 음수를 표현하는 방법으로
부호화비트 표현법이 있다. 가장 상위비트를 부호비트로 표현하여 부호비트가 0이면 양수,
1이면 음수로 표현하는 방법이다. 하지만 두 수를 연산하는데 문제가 생기게 되는데...
(4비트로 이뤄진 수중에 첫번째 비트가 부호비트라고 가정해보자)
+ 5 => 0101
- 5 => 1101: 부호화 비트 표현
와 같이 +5는 0101, -5는 부호비트만 바꾼 1010 으로 표현이 된다.
하지만 두 값을 더한 값은 0이 되야 하지만 결과는 0010 (2)가 되어 잘못된 결과가 나오게 된다.
그래서 다른 이진수 음수 표현법이 필요하게 됐고, 1의 보수표현법, 2의 보수표현법이 생겨나게 됐다.
1의 보수표현법은 음수를, 절대값의 이진수 표현에서 각 비트를 역전시킨 값을 음수로 나타낸다.
+ 5 => 0101
- 5 => 1010 : 1의 보수 표현
두 값 0101과 1010을 더하면 결과는 1111 이 나온다. 음수를 1의 보수로 변경했기 때문에
다시 결과를 1의 보수로 취해주면 결과는 0000이 되어 올바른 결과가 나온다.
그럼 2의 보수 표현법을 알아보자. 2의 보수 표현법은 1의 보수표현법에 1을 더한 값이다
+ 5=> 0101
- 5=> 1011: 2의 보수 표현
두 값 0101 과 1011 을 더하면 10000이 나오고, 4비트 표현이기 때문에 최상위 1비트를 버리면,
결과가 0으로 올바른 값이 나온다.
2의 보수표현법은 1의 보수 표현법보다 속도가 더 빠르기 때문에 (총 n비트라면 1의 보수표현법은 2n번의 비트 역전을,
2의 보수표현법은 1n + 1 번의 비트 역전을 수행한다.) 컴퓨터에서 음수를 표현하기 위해 2의 보수표현법이 선택되었다.
'언어로그 > C/C++' 카테고리의 다른 글
| 비표준 입출력함수 getch(), getche() (0) | 2011.02.22 |
|---|---|
| 표준입출력함수 printf() / scanf() (0) | 2011.02.22 |
| 음수의 표현 (0) | 2011.02.22 |
| C 언어 학습에 핵심. 변수와 상수 (0) | 2011.02.22 |
| C 프로그램 실행과정 (0) | 2011.02.22 |
| C 언어란? (0) | 2011.02.22 |
설정
트랙백
댓글
글
C 언어 학습에 핵심. 변수와 상수
C언어를 학습하는데 있어서 중요한 요소는
- 운영체제에게 어떻게 메모리를 확보해서 쓸 것인가?
- 프로그램을 어떻게 효율적으로 작성할 것인가?
- 어떻게 파일을 모듈화 할 것인가?
C언어는 빠른 실행속도를 장점으로 하는 언어이다. java 언어와 같은 객체지향 언어는 그 나름대로의
장점을 가지고 있지만, 낮은 성능과 제약된 자원을 갖는 시스템 혹은 빠른 속도를 필요로 하는 프로그램에
적합한 언어이다. 직접적으로 메모리에 접근할 수 있기 때문에 빠른 속도를 낼 수 있는 만큼, 메모리를 얼마나
잘 다루느냐가 C언어 프로그래밍의 중요한 화두이다. 효율적인 프로그래밍은 C언어 자체뿐 아니 컴퓨터에 대한
구조를 정확히 이해하고 있을 때 이루어질 수 있다. 효율적인 프로그램을 작성하는 것 만큼, 중요한 것이
어떻게 구조적으로 프로그램을 작성하는냐 이다. 요즘과 같은 규모가 대형화된 프로젝트에서는 프로그램에 대한
복잡도 감소와 관리를 용이하게 하는 것이 비용 절감에 중요한 요소이다.
변수의 선언 , 상수?
변수란 프로그램에서 사용할 데이터를 담을 메모리 혹은 그릇을 의미하며, 변수를 선언한다는 것은
이러한 메모리를 생성한다는 것을 의미한다. 변수 의미 자체는 '변하는 수' 로 이 메모리는 운영체제의 의해
할당되지만, 사용은 사용자가 하기 때문에 그 데이터가 변할 수 있다. 반면 상수는 운영체제가 메모리에 대한
제어권을 가지고 있어서 사용자에 의해 변경될 수 없는 메모리 혹은 데이터를 의미한다.
int a;
다음과 같은 문장은 정수형 데이터를 저장할 수 있는 4바이트의 메모리 공간을 할당하고, 그 메모리 공간을
a 라는 이름으로 접근하겠다고 운영체제에 말하는 것이다.
변수의 타입
변수의 타입에는 정수형, 실수형, 문자형 등... 다양한 타입들이 존재한다. 하지만 운영체제 입장에서 이것들은
수치값을 저장할 수 있는 크기가 다른 메모리 블럭에 해당할 뿐이다. 프로그래머들이 좀더 용이하게 프로그램을 작성할 수 있게
실세계에서 다루는 데이터의 유형을 나누고, 크기를 부여하고, 다르게 해석하도록 컴파일러에게 장치를 한 것이다.
변환코드
char ch = 'A';
printf("%d %c", ch, ch);
위의 문장을 실행하면 65 'A' 라는 결과가 나온다.
먼저 char 형은 문자를 저장하기 위한 1바이트 크기의 데이터 타입이다. 자주 사용하는 문자들의 표를 구성하고, 각 문자에 해당
하는 숫자(ASCII 코드)를 부여했다. char 형은 사실 작은 범위를 수를 저장할 수 있는 정수형과 다름이 없다.
%d , %c는 변환코드라 부르며, 우측에 일치하는 쌍의 값이 어떻게 해석되야 하는지를 나타낸다. %d를 decimal, %c는 character를
의미하며 이 변환코드에 의해 'A' 라는 값이 65라는 정수(아스키값)로 혹은 문자 'A'로 해석이 되었다.
'언어로그 > C/C++' 카테고리의 다른 글
| 표준입출력함수 printf() / scanf() (0) | 2011.02.22 |
|---|---|
| 음수의 표현 (0) | 2011.02.22 |
| C 언어 학습에 핵심. 변수와 상수 (0) | 2011.02.22 |
| C 프로그램 실행과정 (0) | 2011.02.22 |
| C 언어란? (0) | 2011.02.22 |
| 비트필드 (0) | 2010.12.10 |
설정
트랙백
댓글
글
C 프로그램 실행과정
C프로그램 컴파일 - 실행
C언어로 작성된 프로그램은 .c 라는 확장자를 갖는다. 이를 소스파일이라 부르며 이 소스파일이
실행파일로 최종적으로 변환이 된다. 소스파일은 먼저 전처리기(preprocess)에 의해 읽혀지어, 컴파일 전에
특정한 작업이 수행된다. (소스 일부분이 삽입되거나 대체되는 것 같은...) 전처리기에 의해 읽혀진 컴파일러에 의해
머신에 맞는 기계어 (혹은 어셈블리어)로 변환이 되어 목적파일을 생성하게 된다. 이 목적파일은 링커에 의해
해당 프로그램에서 참조하고 있는 파일들을 삽입하여 완전한 실행파일을 생성하게 된다.
실행파일은 사용자가 실행을 하는 순간 운영체제에서 지원하는 Loader(적재기)에 의해 메모리가 올라가 실행되게 된다.
소스파일(.c) > [Preprocessor, Translator] > 목적파일 (.o) > [Linker] > 실행파일(.exe) > [Loader]
이와 같이 C 프로그램이 생성되는 코딩, 디버깅, 컴파일, 배포 과정을 통일된 하나의 툴에서 제공해주는
프로그램이 IDE(통합개발환경)이다. 대표적인 IDE로 Visual Studio 가 있다.
Visual Studio6.0 단축키
컴파일 : Ctrl + F7
실 행: Ctrl + F5
코드정렬 : Alt + F8
에러메시지 : F4
다음은 컨솔에 "Hello world!" 라는 문구를 출려가는 프로그램이다
#include <stdio.h> // 표준 입출력 라이브러리를 사용하겠음
int main() // 프로그램 시작점
{
printf("Hello world!\n"); // 표준 출력에 문자열 출력
return 0;
}
#이 붙어 있는 명령을 전처리 지시자 라고 한다. 컴파일전에 전처리기에 의해 소스파일에 특정한 작업을
수행하는 명령이다. 위에서는 표준입출력 라이브러리를 사용하겠다고 알리고, 표준출력(컨솔)에 출력하는
printf 라는 함수를 사용하였다. main은 C 프로그램에서 항상 시작점이 되는 함수로, 운영체제에 의해 처음으로
읽혀질 메모리 주소를 나타낸다.
'언어로그 > C/C++' 카테고리의 다른 글
| 음수의 표현 (0) | 2011.02.22 |
|---|---|
| C 언어 학습에 핵심. 변수와 상수 (0) | 2011.02.22 |
| C 프로그램 실행과정 (0) | 2011.02.22 |
| C 언어란? (0) | 2011.02.22 |
| 비트필드 (0) | 2010.12.10 |
| 함수의 이해 / 데이터 전달 (0) | 2010.12.10 |
설정
트랙백
댓글
글
C 언어란?
컴퓨터를 동작시키기 위해서는 컴퓨터가 이해할 수 있는 언어로 프로그램을 작성해야 한다.
컴퓨터가 이해할 수 있는 언어가 0과 1의 조합으로 이루어진 기계어이다. 하지만 기계어는
컴퓨터가 잘 이해할 수 있을지는 몰라도, 결국 프로그램을 작성하는 사람이 이해하기에는 너무
어렸다는 단점을 가지고 있다. 특정 기계어 명령에 심볼로 대체하여 좀더 가독성이 좋은 형태로 만든것이
어셈블리어이다. 하지만 이 이 어셈블리어는 Intel, AMD 등 컴퓨터 CPU 머신마다 서로 달라, 각 머신맞게
프로그램을 재작성해야 하는 문제가 생기게 된다. 이러한 문제점을 극복하고자 탄생한 언어가 C 언어이다.
C 언어는 Bell 연구소에서 B언어를 기반으로 데니스 리치에 의해 생겨났다.
C언어가 생겨남으로 소스수준에서의 독립성을 가지게 되었다. C언어를 사용하여 프로그램을 작성하면,
다른 머신에서도 (컴파일러에 의해) 각 머신에 맞는 실행파일을 생성할 수 있게 되었다.
C언어가 널리쓰이게 되면서, 다양한 버전들이 생겨나게 됐다. 호환성 문제가 대두되어, C언어를 표준화하고자
하는 움직임이 생기게 되었다. 1989년 미국 규격협회(ANSI) 에서 표준화된를 승인하게 됐다.(ANSI C라고 함 : C89)
90년에는 국제 표준화 기구(ISO)에 의해 ANSI C가 표준으로 채택되었다. (ISO C 또는 표준C : C90)
이후 C++와 유니코드의 발전 등을 수용하기 위한 C99 등이 생겨나게 되었다.
(이 블로그에서는 표준C 를 기초로 함)
'언어로그 > C/C++' 카테고리의 다른 글
| C 언어 학습에 핵심. 변수와 상수 (0) | 2011.02.22 |
|---|---|
| C 프로그램 실행과정 (0) | 2011.02.22 |
| C 언어란? (0) | 2011.02.22 |
| 비트필드 (0) | 2010.12.10 |
| 함수의 이해 / 데이터 전달 (0) | 2010.12.10 |
| 과제 #3 함수, 포인터의 사용 (0) | 2010.12.10 |