GitHub pages 구축 후 설정 (3)
블로그 구성을 위해 했던 History 관리차 기록합니다.
블로그 구성을 위해 했던 History 관리차 기록합니다.
1. 저장소(Repository) 생성 및 설정 Git repository를 이용하는 것인만큼 Git에 새로운 Repository를 만들어야 한다. 주의할 점은 이 때 Repository 이름에 따라서 블로그의 도메인 주소가 바뀐다. https://id.github.io 형...
GitHub에서 제공하는 GitHub Pages 기능을 이용하면 간단한 사이트를 만들 수 있다. 이렇게 만들어진 사이트는 https://{my-github-id}.github.io 형태의 사이트가 된다. Github pages 공식 자료 여기서는 Jekyll 을 이용한...
0. Intro 암호화 알고리즘은 크게 대칭형와 비대칭형 2가지로 나뉘는데 이는 암호화에 사용하는 Key와 복호화에 사용하는 Key가 같은지 다른지를 기준으로 분류된다. 통상적으로 대칭형 암호는 비밀키 암호에 사용되며 비대칭형 암호는 공개키 암호에 사용된다. 따라서 각각 대칭...
oAuth는 인증 및 권한부여를 관리하는 범용 프레임워크로 사용자가 Facebook이나 트위터 같은 외부 서비스의 일정 기능을 사용할 수 있게 한다.
Cookie와 Session에 대해서는 Session과 Cookie 를 참고할 것. 1. 전통적인 인증 방식 전통적인 인증 방식은 쿠키와 세션을 사용한다.
HTTP 프로토콜은 Connectless, Stateless의 특징이 있다. 즉, 연결을 유지하지 않고 이로인해 상태 정보를 가질 수 없다는 특징이다. 이러한 HTTP 프로토콜의 특성은 장점이자 단점이 되는데 단점을 커버하고자 쿠키와 세션이 사용된다. 1. Cookie
SSL에 대해서는 암호화 알고리즘 를 참고할 것.
equals() 메서드를 Override 하는 클래스는 반드시 hashCode() 도 Override해야 한다. 그렇지 않으면 Object.hashCode() 의 일반규약을 어기게 되어 HashMap, HashSet, Hashtable 과 같은 해시 기반 컬렉션을 사용할 때 오동작...
equals() 메서드는 Override시 실수하기 쉬워 가능한 그대로 사용하는게 좋다.
C++의 경우 생성자와 소멸자를 쌍으로 만들지만 자바의 경우는 GC가 불필요한 메모리를 정리하기 때문에 소멸자가 필요하지 않다. 자바에서 소멸자인 finalize는 절대로 사용하면 안된다. 1. finalize의 단점 자바의 finalize의 경우 예측이 불가능하고, 위험하며 ...
당연한 얘기지만 checked exception은 개발자에게 명시적으로 처리할 예외가 있다는 것을 알리는 것이다. 그렇기 때문에 무시하는 것은 좋지 못하다. 빈 catch문은 예외를 사용하는 목적에 맞지 않게 무시하는 것이다. 처리할 별다른 내용이 없다면 적어도 주석이라도 달아두...
일반적으로 메서드 호출이 정상적으로 처리되지 못하고 예외가 발생한 경우 객체의 상태는 메서드 호출 이전과 동일해야 한다. 이를 만족할때 실패원자성(failure atomicity)을 갖췄다고 한다. 1. failure atomicity를 달성 방법
Unchecked Exception으로 프로그램이 죽으면 자동으로 해당 Exception의 stact-trace를 출력한다. 이 정보는 해당 Exception의 toString 메서드가 예외 정보를 문자열로 변환한 결과이다.
api 문서에는 예외에 대한 내용도 명시되어 있어야 한다. 문서에 남길때는 @throws 태그를 이용한다.
메서드가 하는 일과 뚜렷한 관련이 없는 예외가 발생하면 혼동스럽다. 추상화 수준이 낮은 곳에서 발생한 예외를 그대로 전달해버리면 이와 같은 일이 생긴다.
자바 플랫폼 library에는 대부분 api가 필요로 하는 Runtime Exception이 갖춰져 있다. 수준 높은 코드는 코드 재사용성이 높다. Exception역시 마찬가지다. 참고로 Exception을 재사용 할때는 예외를 발생시키는 조건이 문서에 기술된 것과 일치해야...
GC가 있는 Java의 경우 메모리 관리를 망각하는 경우가 많다. 하지만 실수에 의해 불필요한 참조가 제거되지 않아 Memory leak이 발생할 수 있다.
Checked Exception을 사용하면 예외처리를 강제함으로써 프로그램의 안전성을 높일 수 있다. (try-catch 문 사용이 필수적이기 때문에) 하지만 너무 남발하면 사용하는 측에서 불편한 api가 된다. 만약 API를 제대로 사용해도 예외적인 상황이 발생하는 것을 피...
자바는 크게 Checked Exception과 Unchecked Exception으로 나뉜다. 그리고 Unchecked Exception은 Runtime Exception과 Error로 나뉜다. Checked Exception Runtime Exception Erro...
Exception은 말 그대로 예외적인 상황을 위해서만 사용해야 한다. Exception을 흐름 제어에 사용해서는 안된다.
자바의 작명 관습은 철자 와 문법 두가지 범주로 나눌 수 있다. 1. 철자 철자의 작명 관습은 패키지, 클래스, 인터페이스, 메서드, 필드, 자료형 변수에 관한 것으로 별다른 이유가 없다면 어겨서는 안된다. 1.1. 철자 관습을 어길 경우 유지 보수가 어려워 진다. 코...
만약 적당한 Interface 자료형이 있다면 parameter, return value, 변수, 멤버 필드의 자료형은 가능한 Class 대신 Interface로 선언하는 것이 좋다. 객체의 실제 Class를 참조할 필요가 있는 순간은 생성자로 객체를 생성할때이다. ```jav...
문자열은 Immutable class이다. 따라서 n개의 문자열을 +를 통해 더할 경우 드는 시간은 n제곱에 비례한다.
1. 적절한 자료형으로 변환하라. 네트워크나 키보드를 통해 입력되는 값이 문자열 형태이다 보니 그대로 사용하려는 경우가 있을 수 있다. 하지만 이는 매우 좋지 못한 것으로 적절한 자료형이 있다면 그것이 기본 자료형이든 객체 자료형이든 상관없이 해당 자료형으로 변환해서 사용해야 한...
기능적으로 동일한 객체는 필요할때마다 생성하는 것보다 재사용 하는 것이 좋다.
모든 기본 자료형(primitive type)에는 이와 대응되는 참조 자료형이 있다. 이를 boxed primitive type 이라고 부른다. JDK 1.5부터는 autoboxing, auto-unboxing을 지원하게되어 기본 자료형과 이런 참조 자료형의 차이를 희미하게 ...
float와 double은 부동소수점 연산을 수행한다. 이는 넓은 범위의 값에 대해서 정확도가 높은 근사치를 제공할 수 있도록 설계된 연산으로 정확한 값을 보장하지 않는다. 특히나 돈과 같이 정확한 연산을 할때는 절때 float와 double을 사용해서는 안된다. 예를 들어...
라이브러리를 활용할때의 장점은 아래와 같다. 표준 라이브러리를 사용하면 그 라이브러리를 개발한 전문가의 지식뿐 아니라 먼저 그 라이브러리를 사용한 개발자의 경험을 활용할 수 있다.
JDK 1.5에 도입된 for-each 문은 반복자나 첨자 변수, 기타 성가신 코드를 없애서 오류 가능성을 없앤다. 또한, 성능면에서도 기존 for 문과 거의 동일하고 어떤 상황에서는 for문보다 나은 성능을 보이기도 한다.
지역 변수의 유효범위를 최소화하면 가독성(readability)과 유지보수성(maintainability)이 좋아지고 오류 가능성도 줄어든다. 변수 범위를 최소화하는 가장 좋은 방법은 처음 사용하는 곳에서 선언하는 것이다. 지역 변수를 너무 빨리 선언하면 유효범위가 앞 뒤로 ...
객체 생성을 막고자 할 경우 private 생성자를 사용하자. 가끔 Utility성 Class로 static method나 field만 모은 클래스를 만들때가 있다. 이런 구조는 객체지향적이지 않기 때문에 남용하면 안된다. 하지만 반드시 필요한 경우도 있기 때문에 자주 사용되...
Effective java : 3. private 생성자나 enum 자료형은 싱글턴 패턴을 따르도록 설계하라.
중첩 class(nested class)에는 4가지 종류가 있다. 이 4가지 중첩 클래스에 대해 알아본다. 1. static member class 정적 멤버 클래스. static member class는 바깥 클래스의 static 멤버이며, 다른 static 멤버와 동일한 ...
Class가 특정 상태에 따라서 다르게 동작하는 식으로 구현되는 경우가 있다. 이런 특정 상태(태그)에 따라서 내부 구현이 달라진다면 상속으로 구분하는 것이 좋다. 아래는 이러한 구현의 예로 shape 라는 태그 내용에 따라서 클래스가 사용하는 멤버가 정해진다. public...
생성자의 parameter가 많을때는 Builder 패턴을 고려하는것이 좋다. 특히나 선택적으로 필요한 parameter가 많을 경우 유용하다.
인터페이스를 구현하는 클래스를 만들면 그 인터페이스는 해당 클래스 객체를 참조할 수 있는 자로형의 역할을 하게 된다. 인터페이스를 구현해 클래스를 만든다는 것은 해당 클래스의 객체로 어떤일을 할 수 있다라는 것을 클라이언트에게 알리는 행위로, 이 외에 다른 용도로 인터페이스를 사...
1. 상속을 위한 문서 상속을 위한 문서를 갖춘다는 것은 method를 override 할때 무슨 일이 생기는지 명확하게 남긴다는 것이다. 즉, override가 가능한 메서드를 내부적으로 어떻게 사용하는지 반드시 문서에 남기라는 뜻이다. 관습적으로 override가 가능한 ...
상속은 코드 재활용을 위한 강력한 방법이지만 적절하게 사용하지 않은 경우 깨지기 쉬운 소프트웨어가 된다. 1. 상속이 안전한 경우
immutable class란 변경 불가능한 클래스로 객체가 생성되고 난 이후 그 객체 값의 변경이 불가능한 class를 말한다. 자바에서는 String, 기본자료형 wrapper, BigInteger, BigDeciaml 등이 이러한 class 이다. 변경 불가능한 클래스는 ...
public Point { public double x; public double y; }
잘 설계된 모듈은 구현 세부사항을 API 뒤에 잘 숨긴다. 즉, 정보 은닉(information hiding). 다른말로 캡슐화(encapsulation)가 잘 된 것이다. 1. 캡슐화의 중요성 모듈간의 캡슐화가 잘 된 경우 모듈사이 의존성을 낮춰서 개별적인 개발, 테스트, ...
1. 일반규약 보통 Object.toString()을 호출하면 아래와 같이 나온다.
객체를 생성하는 방법으로 생성자 외 정적 팩토리 메서드(Static Factory Method)를 사용하는 방법이 있다. 일반적인 생성자보다 장점이 많으니 무조건 생성자를 만들것이 아니라 static factory method를 만드는것을 고려해봐야 한다. singleto...
1. if문 개수에 따른 속도차이 결론적으로 if문의 개수에 따른 실행속도의 차이는 무시해도 될 만큼 작다. if문 자체보다 if문에 들어가는 조건을 비교하는 구문이 얼마나 빠르냐가 성능을 좌우한다. 2. switch-case 문에서의 String 비교 JDK 6까지 swit...
1. 자바의 GC(Garbage Collector) GC는 프로세스의 힙 영역에 할당된 메모리 중 더 이상 사용되지 않는 메모리를 주기적으로 회수함으로써 프로세스 메모리를 관리한다. 자바에서 GC는 다양한 형태가 있지만 공통적으로 다음과 같은 작업을 한다. 힙(heap...
시간 관련 메서드에 대표적으로 System.currentTimeMills() 가 있다. 이 메서드는 UTC 시간 표준을 따르면서 현재 시간을 ms로 리턴한다. System.nanoTime() 은 JDK 5.0에 추가된 메서드로 시간을 ns 로 리턴한다. 1. System....
변수는 메모리 공간에 할당된 이후 값이 변화될 수 있는 값이다.
자바는 Primitive type에 상응하는 각각의 Wrapper class를 가지고 있다. 이를 통해 기본 데이터 타입도 객체 단위로 처리할 수 있도록 하고, 기본 데이터를 다루는 여러 유용한 메서드를 사용할 수 있도록 한다. 1. Autoboxing, Auto-unboxi...
1. volatile 키워드란? volatile 역시 synchronized와 마찬가지로 동기화를 위한 키워드이다. volatile은 instance의 멤버 필드를 동기화하기 위한 키워드로 JDK 1.4까지 제대로 지원이 안되다가 1.5부터 다시 주목받게 되었다.
자바 Thread에 대한 내용은 자바의 Thread 포스팅을 참고할 것.
1. Thread의 기본 운영체제 레벨에서 Thread는 명령어 포인터(instruction pointer)와 스택 포인터(stack pointer) 두가지를 가지고 있다. 명령어 포인터 : 다음에 실행할 명령어를 가리킴 스택 포인터 : Thread의 독립적인 loc...
Thread를 대기시키는 메서드
1. 문자열 생성 방식과 메모리 위치 자바에서 String을 생성하는 방법은 두가지가 있다. String 생성 방법에 따라서 메모리 저장위치가 달라진다.
자바에서 문자열을 다룰때 String이 아닌 StringBuilder 나 StringBuffer를 사용하는 것이 성능에 유리하다.
static은 ‘클래스의’ 또는 ‘공통적인’ 이란 의미를 가지고 있다. 자바에서 변수와 메서드앞에 static 키워드를 붙이게 되면 겍체의 멤버 변수나 멤버 메서드가 아니라 클래스 변수, 클래스 메서드가 된다. 일반적인 클래스의 멤버 변수, 멤버 메서드의 경우 인스턴스화 과...
메인 메소드는 프로그램을 실행했을 때 자바에서 가장 먼저 실행되어 명령들을 수행하고 끝나면 프로그램을 종료하는 공간이다. 프로그램의 시작지점이기 때문에 메인 메소드는 프로그램에서 반드시 하나만 존재하여야 한다. 또한, JVM(Java Virtual Machine)이 자바 ...
개발에 있어 Log를 출력하는 것은 반드시 필요한 일이다. 자바에서 Log를 출력할때 모두 System.out.println()으로 출력하는 경우가 있다면 이는 성능상 안좋은 영향을 끼칠 수 있다.
1. JVM의 특징
1. Hash 란 임의의 데이터를 고정된 크기의 정수로 변환해주는 것. Hash 또는 Hashing이라 한다. Hash 함수는 이런 역할을 하는 Hash algorithm을 구현한 함수를 말한다. 2. Hash의 용도 데이터를 저장함에 있어 빠르게 검색을 할 수 있도록 ...
데드락이란, 둘 이상의 쓰레드가 lock 을 획득하기 위해 기다리는데, 이 lock 을 잡고 있는 쓰레드도 똑같이 다른 lock 을 기다리며 서로 블록 상태에 놓이는 것을 말한다. 데드락은 다수의 쓰레드가 같은 lock 을, 동시에, 다른 명령에 의해, 획득하려 할 때 발생할 수 ...
Concurrent는 동시의 라는 뜻이고, Modification은 수정 이란 뜻이다. 즉, 객체의 상태를 동시에 변경하는 것을 허용되지 않는데 변경이 발생하여 상태가 깨지는 경우에 발생하는 예외이다. 1. Multi thread 문제만은 아니다. 동시에 수정이 발생한다라고 ...
java.util.concurrent 패키지에 속한 클래스들로 동시성(concurrency) 작업을 위한 클래스들이다. 동시성이란 말에서 알 수 있듯 멀티 쓰레딩 환경에서 유용한 클래스들이다. 대표적으로 Executor, Callable, Future와 같이 비동기 작업을 위...
자바의 Collection 클래스 대부분은 thread-safety 하지 않다.
Callback은 Listener과 비슷하다. Callback이나 Listener모두 이벤트 처리에 사용하기 때문이다. 하지만 정확히 이 두 가지는 디자인 패턴이 다르다. Callback은 Command Pattern을 따르고 Listener는 Observer Pattern을...
1. Singleton Pattern 이란 클래스에 대해서 오직 하나의 instance만을 가지는 클래스이다. 설정과 같이 전역변수를 관리하거나 유틸성 기능을 가지는 클래스의 경우 쓸때마다 새로운 instance를 생성할 필요없이 하나의 instance만을 가지고 사용하는 것이...
1. Iterator 패턴이란 List와 같은 집합 객체들의 내부 표현 구조들을 노출시키지 않고 원소들을 반복자(Iterator)를 이용하여 접근하는 패턴이다.
절차지향, 객체지향처럼 프로그래밍 패러다임의 하나이다.
목표 OS, Framework, Library 의 차이에 대해서 구분하고 안드로이드 환경에서 앱이 동작하는 기본적인 원리에 대해서 이해한다. 프레임워크와 라이브러리 차이를 설명할 수 있다. new Activity() 코드가 왜 없는지에 대해 설명할 수 있다. Life...
안드로이드에서 Activity는 서로 다른 앱에서도 사용이 가능하다. 예를 들어 A앱의 A1 Activity는 A앱에서 실행이 가능하지만 B앱에서도 실행이 가능하다. 만약 A앱에서 A1 Activity를 실행하였다면 사용자 입장에서는 이 Activity가 A의 앱인것으로 ...
Java Thread에 대한 기본은 아래 포스팅을 참고할 것 Java의 Thread Thread 상태를 조절하는 메서드
안드로이드 Task에 대한 내용은 안드로이드 Task 포스팅을 참고할 것. 아래 ADB 명령을 통해 현재 기기에 생성된 Task를 확인할 수 있다.
1. flow 간단정리 view는 Tree 구조를 가지며 Activity는 반드시 Root view가 있어야 한다. view가 그렬질때 tree의 부모에서 자식 순서로 그려지도록 호출된다. 그리는 과정은 크게 measure(크기 측정), layout(배치), draw(...
안드로이드에서 터치 이벤트는 3가지의 이벤트(Down, Move, Up)를 감지한다. 이 3가지는 정확히 순서대로 일어나며 하나의 프로세스로 간주한다. 사용자가 한번 터치했다고 하는 것은 이 프로세스를 한번 거쳤다는 것이기 때문이다.
구글 문서 번역 입니다. 안드로이드 App은 리눅스 프로세스 위에서 구동된다. 프로세스는 실행이 필요한 Application의 코드가 있을때 생성되고 더 이상 필요하지 않으면서 다른 앱의 실행을 위해 메모리가 회수되어야 하기 전까지 유지된다.
Thread, 프로세스간 통신에 대한 내용은 아래 포스팅을 참고할 것 Java의 Thread 안드로이드의 Thread와 Process
안드로이드는 메모리가 부족할 때 다른 앱의 프로세스를 죽임으로써 메모리를 확보한다. LMK는 앱 상태에 따라 우선순위를 매기고 가장 우선순위가 높은 앱의 프로세스부터 메모리가 확보될 때까지 하나씩 죽인다. 우선순위가 높다는 것은 현재 죽여도 큰 문제가 발생하지 않는 앱이라고...
Thread와 Process에 대해서는 안드로이드의 Thread와 Process 포스팅을 참고할 것.
Fragment를 사용해본적이 있으나 왜 Fragment를 사용하는지 잘 모르는 분들께 유용할것 같습니다.
프로세스간 통신에 대해서는 IPC, RPC, Binder에 대해서 포스팅을 참고할 것.
ActivityGroup은 이미 오래전 deprecated 되었다. ActivityGroup과 관련한 내용은 Fragment에 대해서 포스팅을 함께 참고할 것.