프로그래밍 언어 74

[ Java ] 13. Java의 자료형 (Primitive type & Reference type)

Primitive type & Reference type Primitive type에 대해 설명하라 Reference type에 대해 설명하라 자바에는 기본형(Privitive type)과 참조형(Reference type)이 있다. 일반적으로 다음처럼 분류가 된다. Java Data Type ㄴ Primitive Type ㄴ Boolean Type(boolean) ㄴ Numeric Type ㄴ Integral Type ㄴ Integer Type(short, int, long) ㄴ Floating Point Type(float, double) ㄴ Character Type(char) ㄴ Reference Type ㄴ Class Type ㄴ Interface Type ㄴ Array Type ㄴ Enum T..

[ Java ] 12. Java의 형변환 (2)

Promotion & Casting Promotion에 대해 설명하라. Casting에 대해 설명하라. 형변환할 때 발생할 수 있는 에러에 대해 설명하라. 데이터 타입 형변환 (타입 변환) Java에서 연산은 "2(byte 데이터 타입) + 3(byte 데이터 타입)" 과 같이 동일한 데이터 타입에서 가능합니다. 하지만, 프로그램을 만들다 보면 "2(byte 데이터 타입) + 3.5(double 데이터 타입)"과 같이 서로 다른 데이터 타입끼리의 연산이 필요할 때가 있습니다. 이럴 경우 변수의 데이터 타입을 바꿔주는 작업이 필요한데, 이것이 데이터 타입의 형변환(타입 변환)입니다. 이러한 형변환(타입변환)에는 크게 자동 형변환(Promotion)과 강제 형변환(Casting)이 있습니다. 또 다른 말로 ..

[ Java ] 11. Garbage Collection에 관해

Garbage Collection Garbage Collection의 역할에 대해 설명하라 Garabage Collection의 메모리 해제 과정을 3단계로 설명하라 Generational Garbage Collections에 대해 설명하라 Generational Garbage Collection 과정에 대해 설명하라 Minor GC와 Major GC의 차이점에 대해 설명하라 C/C++ 프로그래밍을 할 때 메모리 누수(Memory Leak)를 막기 위해 객체를 생성한 후 사용하지 않는 객체의 메모리를 프로그래머가 직접 해제해야 했습니다. 하지만 JAVA에서는 JVM(Java Virtual Machine)이 구성된 JRE(Java Runtime Environment)가 제공되며, 그 구성 요소 중 하나인 ..

[ Java ] 10. Intrinsic Lock

Intrinsic Lock 위로 고유 락 = monitor lock = monitor 자바의 모든 객체는 lock을 갖고 있따. Synchronized 블록은 Intrinsic Lock을 이용해서 Thread의 접근을 제어한다. public class Counter { private int count; public int increase() { return ++count; // Thread-Safe 하지 않은 연산 } } Q) ++count문이 atomic 연산인가? A) read (count 값을 읽음) modify (count 값 수정) write (count 값 저장) 의 과정에서 여러 Thread가 공유 자원(count)으로 접근할 수 있으므로 동시성 문제가 발생한다. 그러면 Synchronize..

[ Java ] 09. Java에서의 Thread 활용

Java에서의 Thread 활용 요즘 OS는 모두 멀티태스킹을 지원한다. 실제로 동시에 처리될 수 있는 프로세스의 개수는 CPU 코어의 개수와 동일한데, 이보다 많은 개수의 프로세스가 존재하기 때문에 모두 함께 동시에 처리할 수는 없다. 각 코어들은 아주 짧은 시간동안 여러 프로세스를 번갈아가며 처리하는 방식을 통해 동시에 동작하는 것 처럼 보이게 할 뿐인다. 이와 마찬가지로 멀티스레딩이란 하나의 프로세스 안에 여러개의 스레드가 동시에 작업을 수행하는 것을 말한다. 스레드는 하나의 작업 단위라고 생각하면 편하다. Thread 구현 자바에서의 스레드 구현방법에는 2가지가 있다. Runnable 인터페이스 구현 Thread 클래스 상속 둘다 run() 메소드를 오버라이딩 하는 방식이다 ! public cla..

[ Java ] 08. JAVA의 형변환(Promotion, Casting)

Casting 캐스팅이란? 변수가 원하는 정보를 다 갖고 있는 것 int a = 0.1; // (1) 에러 발생 X int b = (int) true; // (2) 에러 발생 O, boolean 은 int로 캐스트 불가 (1)은 0.1이 double 형이 지만, int로 될 정보 또한 가지고 있다. (2)는 true는 int형이 될 정보를 가지고 있지 않다. 왜 캐스팅이 필요한가요? 다형성 : 오버라이딩 된 함수를 분리해서 활용할 수 있다. 상속 : 캐스팅을 통해 범용적인 프로그래밍이 가능하다. 형변환의 종류 묵시적 형변환 Promotion 캐스팅이 자동으로 발생 (업캐스팅) 작은 타입이 큰 타입으로 변환 Parent p = new Child(); (Parent) new Child()할 필요가 없다. P..

[ Java ] 07. JVM에 관하여

JVM Java Virtual Machine 시스템 메모리를 관리하면서, 자바 기반 애플리케이션을 위해 이식 가능한 실행 환경을 제공 JVM은, 다른 프로그램을 실행시키는 것이 목적입니다. 크게 2가지 기능이 있습니다. 자바 프로그램이 어느 기기나 운영체제 상에서도 실행될 수 있도록 하는 것 프로그램 메모리를 관리하고 최적화 하는 것 JVM은 코드를 실행하고, 해당 코드에 대해 런타임 환경을 제공하는 프로그램에 대한 사양이다. 개발자들이 말하는 JVM은 보통 어떤 기기상에서 실행되고 있는 프로세스, 특히 자바 앱에 대한 리소스를 대표하고 통제하는 서버를 지칭합니다. 자바 애플리케이션을 클래스 로더를 통해 읽어들이고, 자바 API와 함께 실행하는 역할이며 JAVA와 OS 사이에서 중개자 역할을 수행하여 O..

[ Java ] 06. String, StringBuffer, StringBuilder의 특징

String, StringBuffer, StringBuilder 분류 String StringBuffer StringBuilder Storage Area Heap or Constant String Pool Heap Heap 변경 No (Immutable)(불변) Yes (Mutable)(가변) Yes(Mutable)(가변) 동기화 Yes Synchronized 가능 (Thread-safe) Synchronized 불가능. String 특징 new 연산을 통해 생성된 인스턴스의 메모리 공간은 변하지 않습니다.(Immutable) ex. + Boolean, Integer, Float, Long Garbage Collector로 제거되어야 합니다. 문자열 연산시 새로 객체를 만드는 Overhead가 발생합니다..

[ Java ] 05. Call by value vs Call by reference

Call by value vs Call by reference call by value 값에 의한 호출 함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시공간이 생성됩니다.(종료 해당 공간 사라짐) call by value 호출 방식은 함수 호출 시 전달되는 변수 값을 복사해서 함수 인자로 전달합니다. 이 때 복사된 인자는 함수 안에서 지역적으로 사용되기 때문에 local value 속성을 가집니다. 따라서, 함수 안에서 인자 값이 변경되더라도, 외부 변수 값은 변경되지 않습니다. 예시 void func(int n) { n = 20; } void main() { int n = 10; func(n); printf("%d", n); } 10 call by reference 참조에 의한 호출 c..

[ Java ] 04. Java의 컴파일 과정

자바 컴파일과정 위로 자바는 OS에 독립적인 특징을 가지고 있다. 그게 가능한 이유는 JVM(Java Virtual Machine) 덕분인데, 그렇다면 JVM의 어떠한 기능 때문에, OS에 독립적으로 실행시킬 수 있는지 자바 컴파일 과정으로 알아보자. 자바 컴파일 순서 개발자가 자바 소스 코드(.java)를 작성합니다. 자바 컴파일러(Java Compiler)가 자바 소스파일을 컴파일한다. 이 때 나오는 파일은 자바 바이트 코드(.class) 파일로 아직 컴퓨터가 읽을 수 없는 자바 가상 머신이 이해할 수 있는 코드입니다. 바이트 코드의 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져 있습니다. 컴파일된 바이트 코드를 JVM의 클래스 로더(Class Loader)에게 전달합니다. 클래..

[ JavaScript ] 00. 자바스크립트의 기본 문법

Java Script 모던 자바스크립트에서 지원하는 모든 기능을 활성화하려면 스크랩트 맨 위에 use strict를 적어줘야 한다. 'use strict' ...이 'use strict'는 스크립트 최상단이나 함수 본문 최상단에 있어야 한다. 'use strict'가 없어도 코드는 정상적으로 동작한다. 다만, 모던한 방식이 아닌 옛날 방식으로 동작한다. (하위 호환성을 지키면서 말이다!) 되도록이면 모던항 방식을 사용하는것을 추천하고, 추후에 배우게 될 클래스와 같은 몇몇 모던 기능은 이 엄경 모드를 자동으로 활성화한다. 1. 변수 var 자바스크립트에는 변수형(int, double, string)이 존재하지 않는다. var이라는 가변형 변수만 존재하여 초기화 ..

[ C++ ] 14. STL 컨테이너

STL 컨테이너 컨테이너(Container)는 다른 객체들을(원소) 보관하는 하나의 커다란 보관소라고 볼 수 있다. 특히, STL 컨테이너는 클래스 템플릿(class template) 의 형태로 구현되어 있기 때문에 임의의 타입의 원소들을 위한 컨테이너를 만들 수 있다. 물론 한 컨테이너에는 한 가지 종류의 객체들만 보관할 수 있다 컨테이너는 자신이 보관하는 원소(element)들의 메모리를 관리하며, 각각의 원소에 접근할 수 있도록 멤버 함수를 제공해준다. 컨테이서 상에서 원소에 접근하는 방법으로 크게 두 가지가 있는데, 하나는 직접 함수를 호출해서 접근하는 것이고, 다른 하나는 반복자(iterator) 을 이용해서 접근하는 것이다. 이에 관해서는 나중에 설명하도록 하겠다. 또한 표준 라이브러리에서는,..

[ C++ ] 13. 생성자

생성자 (Constructor) 클래스의 모든 멤버 변수가 모두 public인 경우 초기화 목록(initialization list) 또는 유니폼 초기화(uniform initialization)를 사용해서 초기화를 직접 초기화할 수 있다. class Foo { public: int m_x; int m_y; }; int main() { Foo foo1 = { 4, 5 }; // initialization list Foo foo2 { 6, 7 }; // uniform initialization (C++11) return 0; } 그러나 멤버 변수가 private인 경우에는 변수에 직접 접근할 수 없는 비공개 상태이므로 더는 위와 같은 방법으로는 클래스를 초기화할 수 없다. 생성자 (Constructor)는..

[ C++ ] 12. 캡슐화

캡슐화 (Encapusulation) 왜 멤버 변수를 비공개(private)로 할까? 이전 포스트 public과 private 접근 지정자에서 멤버 변수는 일반적으로 private로 설정한다고 했다. 왜 이렇게 설정하는지 현실 세계에서 비유를 들어보자. TV에는 TV를 끄고 켜기 위한 리모컨이 있다. 이 리모컨에는 버튼과 휠 등의 TV를 조작할 수 있는 인터페이스(interface)를 제공하지만, 리모컨의 내부가 어떻게 구현되어 있는지는 숨겨져 있다. 리모컨의 버튼을 누르면 리모컨 내부에서 어떻게 동작해서 TV를 조작하는지 알 필요가 없다. 인터페이스와 구현의 분리는 이렇게 리모컨의 작동 방식을 이해하지 않아도 리모컨을 사용할 수 있으므로 효과적이다. 비슷한 이유로, 프로그래밍에서도 구현과 인터페이스의 ..

[ C++ ] 11. public과 private 접근 지정자

public과 private 접근 지정자 다음 구조체를 보자: struct DateStruct // members are public by default { int month; // public by default, can be accessed by anyone int day; // public by default, can be accessed by anyone int year; // public by default, can be accessed by anyone }; int main() { DateStruct date; date.month = 10; date.day = 14; date.year= 2020; return 0; } 위 프로그램에서는 DataStruct*를 선언한 다음 멤버를 직접 초기화하기..