작년에 리눅스 프로그래밍 과제로 만들었던던 간단한 쉘 입니다. 이름은 어찌 지어야 할지 몰라서 minish이라고 하였습니다. 몇가지의 간단한 기본 명령어를 구현하였으며 백그라운드 프로세스 실행 및 >, >>등의 리다이렉션과 파이프(|)를 구현 하였습니다. 환경 변수를 활용한 프롬프트의 모양 변경도 가능합니다. 최대한 심플하게 그리고 예외처리 없이(시간이 부족했었다곤…..ㅠㅠ) 제작 되었습니다.
만들었던 소스를 공개 합니다. 잘만들지는 않았지만 학습용으로는 좋을것이라 생각됩니다. 하지만 과제 제출용으로 쓰실려는 학생 여러분…처음부터 끝까지 혼자 능력으로 프로그래밍 잘 하는 사람은 없다고 봅니다. 하지만 이 자료를 받아서 노력하는데 보탬이 되는데 쓸 지언정…그대로 내진 마세요…예전에도 어떤 학생이 교수님한테 이 블로그를 걸렸다고 글을 내려달라는 요청을 받은적도 있는데;;ㅎㅎ 스스로 공부합시다.
참고로 안에 Makefile도 있으니 make로 돌려 컴파일 하여 사용하시면 됩니다.
1066519629.zip
Tag: 프로그래밍
Java/C++과 Object-C 비교하기
Object-C의 특별한 문법 때문에 처음 접근이 어려우신 분들을 위해 간단하게 문법을 비교하여 보았습니다.
Messages ———————————————————————————————————-
일반적으로 객체의 메서드를 호출하는 것을 Object-C에서는 메세지라고 표현합니다.
특정 객체의 메서드를 호출하는데 Java나 C++에서는 다음과 같이 표현합니다.
// Java obj.method(parameter); // C++ obj->method(parameter);
하지만 Object-C에서는 다음과 같이 표현합니다.
// Object-C [obj method:parameter];
처음 볼때는 정말 어색했는데 자꾸 보다 보니깐 이제 좀 괜찮은거 같습니다. 오히려 소스코드를 볼때 메서드라고 확 튀어 보이니 더 좋은것 같기도 하네요.
Interface ————————————————————————————————————
Object-C에서 말하는 Interface 지시자는 Java나 C++에서 말하는 Class를 뜻합니다. 정확히는 선언부분만이라고 말해야겠군요.
좀더 정확히 말해보자면 메서드의 시그네이쳐를 선언해 둔다는 관점에서 Java에서 말하는 Interface와 비슷할 수도 있겠네요.
C++에서는 헤더파일안에 클래스의 선언부분과 같을 수 있겠고요. 구현부분은 .m 파일에서 합니다.
그렇다면 마찬가지로 Java와 C++의 예제 소스 코드를 보도록 할까요?
// Java class classname extends superclassname { // instance variables int memberValue; // member methods return_type method1(param1_type param1, param2_type param2) { ... } return_type method1(param1_type param1, param2_type param2) { ... } } // C++ class classname : superclassname { // instance variables int memberValue; // member methods return_type method1(param1_type param1, param2_type param2); return_type method1(param1_type param1, param2_type param2); }
Java의 예는 클래스의 구현부분이 클래스에 포함됩니다. Java의 Interface와 비교를 해볼려니 억지같고 추상클래스를 만들자니 또 억지 같아서 그냥 저렇게 써두었습니다.
그럼 Object-C의 구현 부분을 한번 볼까요?
// Object-C @interface classname : superclassname { // instance variables int memberValue; } // member methods - (return_type)method1:(param1_type)param1 param2_varName:(param2_type)param2; - (return_type)method1:(param1_type)param1 param2_varName:(param2_type)param2; @end
어떤가요? 이해가 되시나요? 그렇다면 이제 클래스의 구현부를 보도록 하겠습니다.
Implementation —————————————————————————————————-
Java의 경우에는 클래스 내부에서 그냥 메서드가 구현되었다고 치고 C++의 예를 한번 살펴 보겠습니다.
// C++ return_type classname::method1(param1_type param1, param2_type param2) { ... } return_type classname::method1(param1_type param1, param2_type param2) { ... }
Object-C의 문법도 한번 볼 차례군요.
// Object-C @implementation classname - (return_type)method1:(param1_type)param1 param2_varName:(param2_type)param2 { ... } - (return_type)method1:(param1_type)param1 param2_varName:(param2_type)param2 { ... } @end
Instantiation ——————————————————————————————————–
Object-C 에서는 객체를 생성하는 방법또한 독특한 느낌을 가지고 있습니다. 마찬가지로 비교를 한번 해볼까요?
// Java MyObject obj = new MyObject(); obj.init(); // C++ MyObject *obj = new MyObject(); obj->init();
자 그렇다면 Object-C에서는 어떻게 하는지 알아볼까요?
// Object-C MyObject *obj = [MyObject alloc]; [obj init];
혹은 다음과 같이 한줄로 사용할 수도 있습니다.
// Object-C MyObject *obj = [[MyObject alloc] init];
어떤가요? 굉장히 색다른 느낌인가요?
지금까지 제 생각에 일반 프로그래밍 언어와 가장많이 다른 부분을 정리해 보았습니다. 이정도면 처음 Object-C를 봤을때의 혼란을 줄어들지 않을까 싶네요.
더 공부해 보고 싶으신 분은 [이곳]을 참고해 보시면 애플에서 잘 정리한 문서를 제공하고 있으니 참고하시면 되겠네요.