프로그래밍 언어 (28) 썸네일형 리스트형 Java는 왜 컴파일러와 인터프리터를 같이 사용하는가? 배경예전에 C를 배우고 Python을 배울 때, 약간 의문이 들었던 것이 있다.❓왜 Python은 C랑 다르게 더 느린 Interpreter를 사용하지?✅ Python의 설계 철학은 더 쉽고 더 용이한 개발을 추구하는 것이다.Python이 Interpreter를 사용함으로 얻는 장점컴파일 과정없이 코드를 빠르게 실행할 수 있어서 개발과 테스트를 빠르게 할 수 있음.한 줄씩 실행하므로 디버깅이 용이함.동적 타이핑(C나 Java처럼 타입이 정적으로 정해지지 않아도 되는것).이식성이 높음.위의 이유로 언어마다 추구하는 장점이 다른 것으로 이해하고 넘어갔다.하지만 Java는 컴파일러와 인터프리터를 모두 사용한다.Java 실행과정java 실행과정을 간단히 살펴보면 아래와 같은 순서로 실행된다.우선 Java 컴파일.. 자바는 어떻게 동작하는가? 자바가 어떻게 동작하는지 알기 위해서는 일단 Java 플랫폼의 핵심 구성 요소에 대해서 알 필요가 있습니다.다음은 자바의 핵심 구성요소에 대한 간단한 설명입니다.JDK (Java Development Kit) JDK는 Java 애플리케이션을 개발하기 위한 소프트웨어 개발 키트입니다.Java 컴파일러(javac)를 포함하여 소스 코드를 바이트코드로 변환합니다.디버거, 아카이브 도구(jar) 등 개발에 필요한 다양한 도구를 제공합니다.JRE를 포함하고 있어 개발한 애플리케이션을 실행할 수 있습니다.Java API 문서와 소스 코드도 포함되어 있습니다.JRE (Java Runtime Environment) JRE는 Java 애플리케이션을 실행하기 위한 환경입니다.JVM과 Java 클래스 라이브러리를 포함합니다.. 입출력 객체는 왜 close 해줘야 하는가? close()BufferedReader와 Scanner 클래스는 java.io.Closeable 인터페이스를 구현하고 있다. Closeable 인터페이스는 AutoCloseable 인터페이스를 상속받고 있고 이는 해당 클래스가 시스템 리소스를 사용하는 클래스이며, 사용 후 명시적으로 리소스를 해제해야 함을 의미합니다. 따라서 리소스 누수 혹은 메모리 누수를 막기 위해서 사용이 끝난 후 명시적으로 close() 메서드를 호출하여 리소스를 해제하는 것이 좋다.https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/BufferedReader.htmlhttps://docs.oracle.com/en/java/javase/17/docs/api/ja.. Java 입출력 BufferedReaderSystem.in 은 자바에서 표준 입력 스트림을 나타낸다.InputStreamReader 는 바이트 스트림인 System.in 을 문자 스트림으로 변환한다. 즉, 바이트 단위로 입력받은 데이터를 char 단위로 처리할 수 있게 해준다.BufferedReader 는 문자 입력 스트림에 버퍼링을 수행한다.readLine() 메서드는 BufferedReader 객체를 통해 호출되며, 사용자로부터 한 줄의 문자열 입력을 받는다. 이 메서드는 사용자가 입력한 데이터의 끝을 나타내는 엔터(Enter) 키를 입력할 때까지 기다린다.읽을 줄이 없거나 입출력 오류가 발생하면 IOException 을 발생시킬 수 있다.만약 입력 소스의 끝에 도달하거나 더 이상 읽을 데이터가 없으면 readLin.. 데이터를 미리 로드하고 Rserve 실행 내용Rserve 환경과 Rscript, Rstudio 환경과의 차이 발생에 따른 문제가 발생했다.코드의 결과가 다른 문제였는데 조사과정에서 어떤 매개변수에서 특정 데이터가 출력되지 않는 것을 알게되었고 데이터 로드가 잘 안되지 않을까? 하는 의문을 갖게 되었다.→ Rserve 환경에서 필요한 데이터를 미리 로드해두고 추후 함수만 호출해서 사용하고 싶다..해결과정메모리 크기가 문제가 아닐까 생각해서 Rserve의 메모리 설정을 알아보았으나 따로 적절한 정보를 얻지 못했다. (추후 알아보니 Rserve의 메모리 설정은 R 버전이 발전하면서 사라졌다고 한다.)Rstudio등 R을 실행하는 환경과 Rserve의 환경이 다르다면 Rserve를 실행할 때 미리 데이터를 로드해두고 R 서버를 시작하는 방법이었다. R.. 펑터(Functor)를 쓰는 이유 1. Separation of concerns 기능을 나눌 수 있다. 예를 들어 반복하는 함수와 그에 대한 인자로 계산을 하는 펑터를 전달 인자로 주면 반복 기능을 하는 코드를 여러 번 적지 않고 간단하게 재사용할 수 있다. 이 외에도 기능을 나누는 수많은 상황에 적용 가능하다. (STL algorithm을 생각해보라는데 공부하고 추가함) 2. Parameterisation 객체를 매개변수로 쉽게 사용할 수 있다. 3. statefulness 펑터는 상태를 유지할 수 있다. 이 상태는 class의 인스턴스(객체)에 의해 유지되므로 Thread Safe를 지킬 수 있다. 4. Performance 펑터는 컴파일러에 의해 종종 인라인화 되기 때문에 성능 향상을 이끌어 낼 수 있다. 정리 펑터가 함수보다 객체.. 11-4 연산자 오버로딩2 스마트 포인터 스마트 포인터는 포인터처럼 동작하는 객체이다. class SmartPtr { private: Point * posptr; public: SmartPtr(Point * ptr) : posptr(ptr) { } Point& operator*() const { return *posptr; } Point* operator->() const { return posptr; } ~SmartPtr() { delete posptr; } }; 스마트 포인터는 전문 개발자들이 오랜 기간 걸쳐서 다듬어 가는 클래스이다. 그래서 개인적으로 스마트 포인터를 구현하는 경우는 드물고 라이브러리 속 스마트 포인터를 활용하는 경우가 대부분이다. 펑터 펑터는 함수처럼 사용하는 객체이다. 함수 호출에 인자 전달의 목적으로 사.. 11-3 연산자 오버로딩2 new 연산자 오버로딩 new 연산자가 하는 일은 다음과 같다. 1. 메모리 공간의 할당 2. 생성자의 호출 3. 할당하고자 하는 자료형에 맞게 반환된 주소 값의 형 변환 세 가지 작업중 프로그래머가 오버로딩할 수 있는 것은 2번 생성자의 호출뿐이다. void * operator new(size_t size) { void * adr = new char[size]; // void * adr = malloc(size); return adr; } 컴파일러에 의해서 필요한 메모리 공간의 크기가 바이트 단위로 계산되어서 인자로 전달되기 때문에 크기가 1바이트인 char 단위로 메모리 공간을 할당해서 반환하였다. delete 연산자 오버로딩 void operator delete(void * adr) { delete.. 이전 1 2 3 4 다음