int& a;
요 &가 바로 레퍼런스 변수이다.
어떻게 보면 포인터와 비슷하지만, 다른 녀석이고, C++ 공부중에 함수 인자에서 혼동을 느끼게 한 녀석이다.
// more than one returning value
#include <iostream>
using namespace std;
void prevnext (int x, int& prev, int& next)
{
prev = x-1;
next = x+1;
}
int main ()
{
int x=100, y, z;
prevnext (x, y, z);
cout << "Previous=" << y << ", Next=" << z;
return 0;
}
위의 소스중, prevent() 함수의 두/세번째 인자가 바로 reference 변수인데,
C에서는 당연히 포인터로 넘겨주어야 할꺼라고 생각을 했는데,
C++에서는 변수를 그냥 인자로 취해줌에도 불구하고 원본의 값이 바뀐다.
(당연히.. 레퍼런스 변수란걸 모르니 이상하게 보일수 밖에 ㅠ.ㅠ)
처음에는 자동형변환과 연관이 되어있나 했는데.. 그거랑은 거리가 좀 있는것 같고
그냥 단순히 C++ 문법적 특성으로 "참조형 변수" 라고 생각중 -_-
C++ 참조와 포인터의 차이점
- 만들어지면 값 변경불가
- 위의 이유로 null로 선언불가
C++ references differ from pointers in several essential ways:
It is not possible to refer directly to a reference object after it
is defined; any occurrence of its name refers directly to the object it
references.
Once a reference is created, it cannot be later made to reference another object; it cannot be reseated. This is often done with pointers.
References cannot be null, whereas pointers can; every reference refers to some object, although it may or may not be valid.
References cannot be uninitialized. Because it is impossible to
reinitialize a reference, they must be initialized as soon as they are
created. In particular, local and global variables must be initialized
where they are defined, and references which are data members of class
instances must be initialized in the initializer list of the class's
constructor. For example:
개인적으로는, x 값과 x의 값을 변경하는 부분을 추가하여 의문을 가지게 되었다.
위의 int x는 그 루틴을 종료하고 나서 값이 변경되지 않았지만,
아래의 int& x는 루틴종료후 x의 값이 1로 변경되었고, 즉 포인터와 같은 역활을 하는 것으로 보였다.
하지만, prevent() 함수에 들어가는 인자는 "x, y, z" 였고 포인터 값이 아님에도 불구하고 변경되었다는 점이 신기했다.
아무튼.. C와 C++은 다른거구나 라고 깨닫는중...
void prevnext (int x, int& prev, int& next)
{
prev = x-1;
next = x+1;
x = 1;
}
void prevnext (int& x, int& prev, int& next)
{
prev = x-1;
next = x+1;
x = 1;
}
x는 main() 함수이고, tt는 prevnext()내의 변수이다.
특이하게도(?) tt의 주소값이 x 변수의 주소값과 동일하다.
In computer science, weak typing (a.k.a. loose typing) is a property attributed to the type systems of some programming languages. It is the opposite of strong typing, and consequently the term weak typing has as many different meanings as strong typing does.
동적 형 변환(dynamic typing)
A programming language is said to be dynamically typed when the majority
of its type checking is performed at run-time as opposed to at
compile-time. In dynamic typing, values have types but variables do not;
that is, a variable can refer to a value of any type. Dynamically typed
languages include Erlang, Groovy, JavaScript, Lisp, Lua, Objective-C, Perl (with respect to user-defined types but not built-in types), PHP, Prolog, Python, Ruby, Smalltalk and Tcl.
정적 형 변환(static typing)
A programming language is said to use static typing whentype checking
is performed during compile-time as opposed to run-time. Statically
typed languages include Ada, AS3, C, C++, C#, Eiffel, F#, Go, JADE, Java, Fortran, Haskell, ML, Objective-C, Pascal, Perl (with respect to distinguishing scalars, arrays, hashes and subroutines) and Scala. Static typing is a limited form of program verification (see type safety): accordingly, it allows many type errors to be caught early in the development cycle.
The usual way is &v[0]. (&*v.begin() would probably work too, but I seem to recall there's some fluffy wording in the standard that makes this not 100% reliable)
Developers는 말 그대로 어플리케이션 개발자를 위한 SDK를 제공하고
Partners는 안드로이드 플랫폼을 개발하기 위한 안드로이드 플랫폼을 제공한다.
# Required Packages:
* Git, JDK, flex, and the other packages as listed above in the i386 instructions:
* JDK 5.0, update 12 or higher.Java 6 is not supported, because of incompatibilities with @Override.
* Pieces from the 32-bit cross-building environment
* X11 development
아무튼, 이녀석을 위해서는 Git 가 필요하고, 오만가지 것들이 필요한데
MacOSX 와 Linux는 지원하지만 Windows는 지원하지 않는다.
게다가, git for windows는 cygwin 으로 작동해서 엄청난 속도를 자랑한 악몽이 있기에... OTL
생각보다 repo sync에서 시간이 엄청나게 오래 걸린다. 전체용량이 대략 2기가 정도를 받는데
git 임에도 불구하고 이렇게 오래 걸리다니..(대략 6시간 넘게 걸린듯..)
안드로이드 플랫폼(?)은 git를 깜산 python 스크립트로 작동되는 repo 라는 녀석으로 받아온다.
그리고 home 디렉토리의 ~/bin 에 repo를 설치한다.
개인적으로는 상대경로를 입력해서 repo를 실행했으나
repo 를 초기화 하면 .repo 라는 디렉토리가 생성되므로 /bin 에 넣는것 추천할만한 방법은 아니나
개인 계정에 설치하고 심볼릭 링크로 걸어도 상관은 없을듯 하다.
$ cd ~
$ mkdir bin
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo
안드로이드를 다운받기 위해서는 폴더를 하나 지정하고,
그 안에서 repo init 명령을 통해 초기화를 하고
repo sync 명령을 통해 다운로드 받는다.(6시간 정도 걸렸는데 네트워크 상황에 따라 달라질수 있음)
Your Name [XXXXXXXX]: YYYYYYYY
Your Email [username@devlinux.(none)]: username@gmail.com
Your identity is: YYYYYYYY<username@gmail.com>
is this correct [y/n]? y
Testing colorized output (for 'repo diff', 'repo status'):
black red green yellow blue magenta cyan white
bold dim ul reverse
Enable color display in this user account (y/n)? y
1. make 중에 멈추는 경우가 있는데, g++-4.3 패키지를 추가로 설치해준다.
(아마 gcc는 이미 깔려있었을테니, g++ 라이브러리 문제라고 생각이 된다. 설치시 심볼릭 링크도 변경된다)
frameworks/base/tools/aidl/AST.cpp:10: error: 'fprintf' was not declared in this scope
라는 에러로 시작해서 fprintf() 에러를 뿜어내면서 중단될때는 두개의 패키지를 설치해준다.
$ sudo apt-get install gcc-4.3g++-4.3
gperf는 performace 관련이 아니라.. hash function generator 라고 한다.
흐음.. 그 해쉬가 그 해쉬가 아닌가 -_-? 맹글링과 연관이 있어 보이기도 하고..
GNU gperf is a perfect hash function generator. For a given list of strings, it produces a hash function and hash table, in form of C or C++ code,
for looking up a value depending on the input string. The hash function
is perfect, which means that the hash table has no collisions, and the
hash table lookup needs a single string comparison only.
GNU gperf is highly customizable. There are options for generating C or C++ code, for emitting switch statements or nested ifs instead of a hash table, and for tuning the algorithm employed by gperf.
음.. 예전에 어떤 분의 블로그에서 스마트 포인터 란것을 들었지만
어떤건지 알지 못했는데 C++/STL 공부하면서 문득 떠올라 검색을 하니 아래와 같이 상큼하게 정의가 내려져있다.
C++은 자바와 같은 가비지 컬렉션(GC) 기능이 없어서,
new로 동적 할당한 객체를 매번 delete를 써서 수동으로 삭제해야 하는 건 아실 겁니다.
조심하지 않으면 엄청난 메모리 누수(leak)가 나버리는 버그가 발생할 가능성이 있죠.
(이런 버그를 잡기위해서 바운즈 체커나 코드 가드와 같은 프로그램이 나온거죠.)