전체 글75 1주차 1. JVM 이란 Java Virtual Machine Java Byte Code를 OS에 맞게 해석 해주는 역할 JVM의 해석을 거치기 때문에 c언어 같은 네이티브 언어에비해 속도가 느렸지만 JIT(Just In Time)컴파일러를 구현해 이점을 극복 2. 컴파일 하는 방법 javac 파일 이름 3. 실행하는 방법 java 파일 이름 4. 바이트 코드 자바 바이트 코드(Java bytecode)란 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드 5. JIT 컴파일러 JIT(Just-in-Time) 컴파일러는 바이트코드를 컴퓨터 프로세서(CPU)로 직접 보낼 수 있는 명령어로 바꾸는 프로그램 6. JVM 구성요소 Class Loader, Memory, Execution Engine 7. .. 2021. 12. 5. 유저 모드 디버깅 유저 모드 - 일반적인 응용 프로그램이 동작하는 환경을 의미 응용 프로그램들은 이런 환경에서 각 프로세스로 실행 프로세스마다 2GB의 별도의 메모리 공간을 가지고 있다 프로세스들은 서로의 메모리를 침범할 수 없다 오직 자신의 메모리 공간만 사용할 수 있다 물론 많은 응용 프로그램이 잘못된 메모리에 접근해 중지 계산을 잘못해 중지 프로세스마다 별도의 메모리 공간을 사용하므로 하나의 프로세스가 잘못해 자신의 메모리 공간을 망치더라도 다른 프로세스에는 영향을 미치지 않는다. 유저모드에서 실행되는 프로세스에 문제가 발생하더라도 운영체제가 동작하는 커널모드에는 영향을 미치지 않는다. 유저 모드의 프로세스만 중지된다. 유저 모드 디버깅 - 유저모드에서 실행된 프로세스를 대상으로 디버깅하는 것 디버거가 응용 프로그램.. 2018. 6. 5. WinDbg 디버깅 종료 - 윈도우용 응용 프로그램 디버깅 - 커널 모드 드라이버 디버깅 - 프로그램이 동작하는 중에 WinDbg 붙여서 디버깅 - 프로그램이 동작하다가 문제가 발생해 덤프 파일을 WinDbg로 열어서 디버깅 - 사실 이 모든 기능을 제공하는 디버거는 WinDbg 밖에 없음 따라서 WinDbg 하나만 잘 활용할 줄 알아도 많은 문제 해결 가능 2018. 6. 5. 자바에서 C 라이브러리 함수 호출하기 예제 프로그램 - C 함수를 호출하는 간단한 자바 프로그램 자바에서 호출할 C 함수는 콘솔 화면에 문자열을 출력하는 간단한 함수다 예제 프로그램에서 자바가 JNI를 통해 어떻게 C 함수를 호출하는지에 초점을 맞춰 살펴보기 바란다 여기서 보여줄 예제는 이해하기 어렵지 않으며 JNI를 이용해서 개발할 때는 대부분 동일한 절차를 밟으므로 이번 예제를 통해 확실히 이해해두기 바란다 전체적인 개발 순서 자바에서 JNI를 거쳐 C 함수를 호출하려면 다음과 같이 진행해야 한다 1단계. 자바 코드 작성 2단계. 자바 코드 컴파일 3단계. C 헤더 파일 생성 4단계. C 코드 작성 5단계. C 공유 라이브러리 생성 6단계. 자바 프로그램 실행 1단계. 자바 코드 작성 예제와 같이 자바 코드에서 JNI 를 통해 C로 구현.. 2017. 12. 19. JNI 레이어 안드로이드 프레임워크에서 C/C++과 자바 레이어가 유기적으로 동작하게 만들려면 자바 레이어(상위)와C/C++ 레이어(하위) 를 상호 연결해 주는 매개체가 필요하다 자바와 C/C++ 모듈 간의 인터페이스를 가능하게 해주는 것이 바로 JNI (Java Native Interface) 다 JNI는 C/C++ 같은 자바 이외의 언어(네이티브 언어)로 만들어진 모듈이나 애플리케이션과 자바 클래스가 서로 상호작용할 수 있게 정의한 인터페이스를 의미한다 예를 들어, 자바 클래스에서 C언어로 작성된 라이브러리에 포함된 특정 함수를 사용하고 싶다거나, 반대로 C 프로그램에서 자바 클래스 라이브러리를 사용하고 싶다면 JNI를 사용해야 한다 일반적으로 JNI는 다음과 같은 경우에 주로 활용한다 * 빠른 처리 속도를 요구하.. 2017. 12. 19. 애플리케이션 템플릿의 수동 생성 우선 애플리케이션에 필요한 기본 템플릿들을 만들어보자안드로이드 SDK 를 통해 만들어지는 모든 안드로이드 애플리케이션에는 사전에 정의된디렉터리 구조와 환경 설정 .xml 파일들이 포함되어야 한다 이를 위해서는 안드로이드 SDK 툴과 IDE를 이용해야 한다이번 예제에서는 이를 수작업으로 처리하는 방법을 배워본다이 파일들은 차후 모든 예제들의 토대가 될 것이다 여기서는 안드로이드 툴을 이용하지 않고 필요한 파일들을 전부 수동으로 생성해보려고 한다 * 예제 구현 2017. 11. 30. NDK 빌드 환경 구축 * 윈도우에서 안드로이드 개발 툴 설치 안드로이드용 게임 개발을 시작하려면 필수적인 몇 가지 툴을 시스템에 설치해야 한다 * 준비 다음은 안드로이드용 게임 개발을 시작하는 데 필요한 전체 준비사항의 목록이다 1. http://developer.android.com/sdk/index.html 의 안드로이드 SDK 2. http://developer.android.com/tools/sdk/ndk/index.html 의 안드로이드 NDK 3. http://ant.apache.org 의 아파치 앤트(Apache Ant). 아파치 앤트는 자바 명령행 툴로 C++ 개발자들에게 친숙하지는 않을 것이다 이 툴은 자바 애플리케이션을 빌드하기 위한 것인데, 모든 안드로이드 애플리케이션이 자바 wrapper를 가지고 있으므.. 2017. 11. 30. 안드로이드 NDK 시작 C++ 로 모바일 애플리케이션을 개발할 때, 기존의 C++ 라이브러리를 재활용하고 싶거나 부분적인 성능 향상을 위해 네이티브 기능을 사용하고 싶을 때는 주로 안드로이드 NDK(Native Development Kit)를 이용한다 초기에 NDK는 바이오닉(Bionic) 라이브러리를 기반으로 했다이 라이브러리는 구글에서 안드로이드용으로 개발한 BSD 표준 C 라이브러리(libc)의 파생 버전이다 바이오닉의 주요 목표는 다음과 같다 - 라이선스 : 원래의 GNU C 라이브러리(glibc)는 GPL 라이선스를 가지고, 바이오닉은 BSD 라이선스를 가진다 - 크기 : 바이오닉은 GNU C 라이브러리에 비해 크기면에서 훨씬 작다 - 속도 : 바이오닉은 상대적으로 낮은 클록 주파수를 가진 모바일 CPU용으로 설계됐다.. 2017. 11. 30. 나쁜 코드 지우기 8 * 일반 G21. 알고리즘을 이해하라 - 대다수 괴상한 코드는 사람들이 알고리즘을 충분히 이해하지 않은 채 코드를 구현한 탓이다잠시 멈추고 실제 알고리즘을 고민하는 대신 여기저기 if문과 플래그를 넣어보며 코드를 돌리는 탓이다 프로그래밍은 흔히 탐험이다 알고리즘을 안다고 생각하지만 실제는 코드가 '돌아갈' 때까지 이리저리 찔러보고 굴려본다.'돌아간다'는 사실은 어떻게 아느냐고? 생각할 수 있는 테스트 케이스를 모두 통과하니까이 방식이 틀렸다는 말이 아니다 사실상 대다수 상황에서는 원하는 대로 함수를 돌리는 유일한 방법이다하지만 '돌아간다'고 말하기는 뭔가 부족하다구현이 끝났다고 선언하기 전에 함수가 돌아가는 방식을 확실히 이해하는지 확인하라테스트 케이스를 모두 통과한다는 사실만으로 부족하다 작성자가 알고.. 2017. 11. 28. 나쁜 코드 지우기 7 * 일반 G17. 잘못 지운 책임 - 소프트웨어 개발자가 내리는 가장 중요한 결정 중 하나가 코드를 배치하는 위치다예를 들어, PI 상수는 어디에 들어갈까? Math 클래스에? 아니면 Trigonometry 클래스에? 아니면 Circle 클래스에? 여기서도 최소 놀람의 원칙을 적용한다 코드는 독자가 자연스럽게 기대할 위치에 배치한다PI 함수는 삼각함수를 선언한 클래스에 넣어야 맞다OVERTIME_RATE 상수는 HourlyPayCalculator 클래스에 선언해야 맞다 때로는 개발자가 '영리하게' 기능을 배치한다 독자에게 직관적인 위치가 아니라 개발자에게 편한 함수를 배치한다예를 들어, 직원이 근무한 총 시간을 보고서로 출력함는 함수가 필요하다 가정하자보고서를 출력하는 함수에서 총계를 계산하는 방법이 있.. 2017. 11. 28. 나쁜 코드 지우기 6 * 일반 G14. 기능 욕심 - 클래스 메서드는 자기 클래스의 변수와 함수에 관심을 가져야지 다른 클래스의 변수와 함수에 관심을 가져서는 안 된다메서드가 다른 객체의 참조자(accessor)와 변경자(mutator)를 사용해 그 객체 내용을 조작한다면메서드가 그 객체 클래스의 범위를 욕심내는 탓이다자신이 그 클래스에 속해 그 클래스 변수를 직접 조작하고 싶다는 뜻이다예를 들어, 다음 코드를 살펴보자 public class HourlyPayCalculator { public Money calculateWeeklyPay(HourlyEmployee e) { int tenthRate = e.getTenthRate().getPennies(); int tenthsWorked = e.getTenthsWorked();.. 2017. 11. 28. 나쁜 코드 지우기 5 * 일반 G7. 기초 클래스가 파생 클래스에 의존한다 - 개념을 기초 클래스와 파생 클래스로 나누는 가장 흔한 이유는 고차원 기초 클래스 개념을 저차원 파생 클래스 개념으로부터 분리해 독립성을 보장하기 위해서다 그러므로 기초 클래스가 파생 클래스를 사용한다면 뭔가 문제가 있다는 말이다일반적으로 기초 클래스는 파생 클래스를 아예 몰라야 마땅하다 물론 예외는 있다 간혹 파생 클래스 개수가 확실히 고정되었다면 기초 클래스에 파생 클래스를 선택하는 코드가 들어간다FSM(Finite State Machine) 구현에서 많이 본 사례다 하지만 FSM은 기초 클래스와 파생 클래스가 굉장히 밀접하며 언제나 같은 JAR 파일로 배포한다일반적으로는 기초 클래스와 파생 클래스를 다른 JAR 파일로 배포하는 편이 좋다 기초 .. 2017. 11. 28. 이전 1 2 3 4 ··· 7 다음