Development/Java
[Java] Collection
이 글에서는 java의 collection에 대해 알아볼 것이다. Collection Collection은 object group을 나타내는 object이다. 편하게 data sturcture 집합이라고 이해하면 된다. Java collection에는 위와 같은 많은 interface와 class가 있는데, 이들에 대해 알아볼 것이다. List 순서가 있으며, 데이터 중복이 허용된다. ArrayList index를 가지고 있어 조회 시 성능이 빠르다. O(1)이다. erase나 insert 시 해당 위치 앞/뒤에 있는 모든 element 위치를 조정해야 하므로 O(n)이다. 따라서 삽입/삭제 성능이 느리다. thread-safe하지 않다. object array로 구현되어 있다. LinkedList 조회..
[Java] Multi Thread
이 글에서는 java에서 사용하는 thread와 multi-thread의 개념만 간략히 짚고 넘어 간다. Thread Thread는 process 내에서 작업의 흐름 단위이다. 하나의 thread는 하나의 작업만 처리하지만, 여러 개의 thread는 병렬로 여러 개의 작업을 처리하기 때문에 더 빠르다. Concurrency & Parallelism 모든 작업은 컴퓨터의 CPU가 작업하며, CPU의 core가 thread를 실행한다. 하나의 core가 여러 개의 thread를 수행할 수도 있고(concurrency), 여러 개의 core에서 여러 개의 thread를 수행할 수도 있다.(parallelism) 하나의 core가 여러 개의 thread를 작업할 때는 각 thread를 조금씩 실행하고 다른 th..
[Java] String vs StringBuffer vs StringBuilder
Java에서는 문자열을 사용할 때 String, StringBuffer, StringBuilder 이렇게 3개의 class를 사용한다. 이 글에서는 이 세가지 class의 차이를 알아볼 것이다. String 앞선 포스팅에 언급했듯 String은 reference type이자 immutable이며 다음 과정을 거쳐 address를 받아온다. literal로 할당 시 intern() method를 호출한다. string constant pool에 해당하는 값이 있으면 그 address를 받아온다. string constant pool에 해당하는 값이 없으면 그 값을 string constant pool에 할당하고 address를 받아온다. new String()과 같이 constructor로 할당 시 hea..
[Java] Primitive Wrapper Class
이 글에서는 java의 primitive wrapper class에 대해 알아본다. Primitive Wrapper Class Primitive Wrapper Class는 primitive type을 object로 다뤄야 할 때 사용한다. 대표적으로 collection이나 generic에 들어가야 하는 값은 모두 object여야 하는데 primitive type의 collection이 필요할 수도 있는데 이 때 primitive wrapper class를 사용한다. 참고로 primitive type는 byte, char, short, int, long, float, double, boolean 이렇게 8종류밖에 없으며 다음과 같이 wrapping한다. byte - Byte char - Character ..
[Java] Generic
이 글에서는 java의 generic에 대해 다룬다. Generic Generic이란 java에서 class, interface 또는 method를 정의할 때 type을 pameter화하는 것이다.(type을 parameter로 사용해 일반화하는 것이다.) Generic은 compile time에 object type을 확인하기 때문에 casting을 줄여주고 type 안정성을 보장받을 수 있다, type별로 작성해야 하는 코드의 양을 크게 줄여준다. 사용 방법 : class, interface 아래와 같이 class나 interface를 선언 시 이름 뒤에 keyword를 이용한다. 1개 이상의 type을 넣을 수 있다. method의 parameter type이나 return type으로 해당 gen..
[Java] Java Virtual Machine
이 글에서는 java가 실행되는 환경인 Java Virtual Machine에 대해 알아볼 것이다. Java 8 이후에 변경된 점을 포함하기 때문에 기존 PermGen 영역에 위치하던 Method Area를 Metaspace라고 표기했으며, static과 constant pool이 heap으로 옮겨졌다는 것을 반영한다. JDK, JRE, JVM Java의 구동에는 여러가지가 필요하다. Java Development Kit - Java 개발 도구 Java Runtime Environment - Java용 실행 환경 Java Virtual Machine - Java 실행 프로그램 Java는 여러가지 OS에서 사용 시 java platform indepence를 보장받기 위해 virtual machine을 사..
[Java] Exception Handling
이 글에서는 Java에서 사용하는 예외 처리 방법을 알아볼 것이다. Error vs Exception Java에서 Error는 치명적인 오류이며 프로그램 내에서 수습이 불가능하다. Stack overflow나 Out of memory같이 JVM의 실행에 문제가 생겼다는 것이므로 대처할 수 없다. 반면 Exception은 Error보다는 경미한 오류이며 프로그램 내에서 수습할 수 있다. Java의 exception은 runtime-error과 compile error로 나뉘며 runtime error는 unchecked exception, compile error는 checked exception으로 부른다. (이 문장에서의 error는 Java에서 사용하는 Error와는 다르다! runtime error..
[Java] abstract class vs interface
이 글에서는 java에서 사용하는 abstract class와 interace, 그리고 둘의 차이를 알아볼 것이다. Abstraction 이전 글에서 abstract를 다음과 같이 설명했다. 일반적으로 컴퓨터 과학에서 추상화라 함은 불필요한 정보(세부 구현 등)는 숨기고 중요한 정보만을 보여주는 것이다. 객체지향에서 추상화는 객체를 만들 때 사용하는 개념으로, 일반화를 통해 공통된 속성과 행위를 추출하는 것이다. 불필요한 정보(객체마다 다른 특이한 정보)는 숨기고 중요한 정보(공통된 속성과 행위)를 상위 class로 추출하는 것이다. 추상 클래스 Abstract Class abstract class는 abstract로 선언된 class이거나 abstract method가 1개 이상 포함된 class를 말..
[Java] Polymorphism - static polymorphism, dynamic polymorphism, casting
이 글에서는 Java의 inheritance와 연관된 것들에 대해 알아볼 것이다. 다형성 Polymorphism 앞선 포스팅에서 상속을 다음과 같이 정의했다. 하나의 component(variable, method, class, ...)가 casting, overloading, 또는 overriding을 통해 상황에 따라 다르게 사용되는 것을 말한다. Overloading은 이름은 같지만 parameter를 다르게 해, 이름만 같은 함수로 사용하는 것이며, static binding이다. Overriding은 parent class의 method를 child class에서 재정의하는 것이며, dynamic binding이다. polymorphism을 이용하면 code reuse, 유지보수성, 유연성이 증..
[Java] Inheritance - access modifier, super, overriding
이 글에서는 Java의 inheritance와 연관된 것들에 대해 알아볼 것이다. 상속 Inheritance 앞선 포스팅에서 상속을 다음과 같이 정의했다. parent class로부터 새로운 child class를 만드는 것이다. 또한 상속받는 child class는 새로운 attribute나 method를 추가해 확장해 나갈 수 있다. 상속을 통해 class hierarchy를 만들 수 있다. access modifier에 따른 상속 parent class member의 access modifier에 따라 child class에서 사용여부가 달라진다. [public 또는 protected access modifier로 선언된 member]들만이 child class에서 바로 접근할 수 있으며, [pri..
[Java] static, final
이 글에서는 Java에서 사용하는 static과 final에 대해 알아볼 것이다. static class 내에서 static으로 선언된 member는 class로 정의된 모든 instance에서 같은 값을 가진다. (class와는 별도로 생성되기 때문에 class를 정의하지 않고도 사용할 수 있다) 해당 member는 class가 메모리에 로드될 때 heap에 올라가기 때문에 instance가 생성되기 전에도 사용할 수 있으며, object와는 별도로 만들어지기 때문에 class 크기에 영향을 주지 않는다. static member는 GC가 관리하긴 하지만, 해당 class가 static member를 참조하지 않는 경우가 거의 없기 때문에 계속 남아 있게 되므로 남발하는 경우 메모리 효율이 나빠진다는 ..
[Java] Class - constructor, access modifier, identity & equality & hashCode
객체지향 프로그래밍 포스팅에서 객체지향의 특징을 몇 가지 살폈었다. Java는 객체지향 언어인만큼 class를 사용하고 있으며 객체지향의 특징 중 encapsulation, inheritance, polymorphism 등이 적용되어 있다. 이 글에서는 Java에서 사용하는 class에 대한 기본적인 몇 가지를 알아볼 것이다. Java에서 class 앞선 포스팅에서 다음와 같은 내용을 작성했다. 객체란 어떤 개념을 추상화하고 모델링한 요소이다. 객체는 상태(state)와 행위(behavior)를 가지고 있으며 행위를 통해 상호작용한다. class는 instance를 만들기 위한 설계도이며, instance는 class라는 설계도를 이용해 만들어진 메모리에 할당된 실체이다. class는 객체를 만들기 위한..
[Java] Data types, 예외적인 String, 그리고 call by value
이 글은 Java의 data type와 call by value를 정리한 글이다. data type에 따라 function parameter로 넘기고 값을 조작했을 때 어떻게 바뀌는지, 그리고 특히 예외적으로 작동하는 string의 동작 방식에 대해 정리했다. C++의 reference C++에서는 reference라는 변수형을 지정할 수 있다. C++에서 reference는 pointer처럼 동작하지만 변수처럼 사용할 수 있는, 변수의 주소값을 저장하는 변수이다. #include using namespace std; int main(){ int number = 10; int &reference = number; cout
[Java] HttpURLConnection으로 HTTP 통신하기
Overview 자바에서 HTTP 연결을 할 때, 일반적으로 HttpURLConnection을 사용한다. python의 경우 .request method에 여러 가지가 override되어 있어 HTTP 연결 방식(GET, POST, ...), parameter, 파일 입력 여부 등등을 함수의 인자로 넣으면 알아서 처리를 해 준다. 그러나 자바는 그런 게 없다. 따라서 연결 방식, parameter, 파일 입력 등을 직접 header와 body에 작성해 주어야 하고, 그 결과도 response code에 따라 error stream인지, 정상적인 stream인지 판단을 해야 한다. 따라서 해당 글에서는 Java에서 HttpURLConnection을 사용하는 방법을 설명하고자 한다. HttpConnectio..