본문 바로가기

OOP, FP

(37)
이펙티브 자바 06. 종료자 종료자개발자가 메모리에 직접적으로 관여하는 C++와 같은 언어는 생성자와 쌍으로 존재하야하는 소멸자가 있다. C++에서 이와같은 소멸자는 생성된 자원을 반환하는 수단으로 사용된다. 반면에, 쓰레기 수집기가 존재하는 자바와 같은 언어는 객체에 할당된 자원을 수집기가 알아서 반환하므로 개발자가 직접 소멸자를 호출할 필요가 없기에, 소멸자가 존재하지 않는다. 하지만 자바의 최상위 클래스인 Object 클래스에는 finalize라는 종료자 메소드가 정의되어 있다. 이 메소드는 JVM이 메모리 누수(leak) 를 방지하기 위해 실행하는 메소드로, 가비지 컬렉션이 수행될 때 더 이상 사용하지 않는 자원에 대한 정리 작업을 진행하기 위한 종료자 메소드이다. C++ 의 소멸자 1 2 3 4 5 6 7 8 9 10 11..
11. [스칼라 테트리스] 07. 메인 프레임, 테트리스 패널 메인 프레임스윙 애플리케이션에서 전체 화면의 모양을 담당한다. 프레임은 내부에 다른 컨테이너를 담을 수 있는 최상위 컨테이너 중 하나로, 윈도우나 메뉴를 가지는 일반적인 데스크탑 애플리케이션에 적합하다.* 최상위 컨테이너란 다른 컨테이너에 포함되지 않고도 화면에 출력되어 독립적으로 존재할 수 있는 컨테이너이다. 메인 프레임은 가장 상단에 메뉴바가 존재하며 내부 컨테이너로 패널을 담는다. 메뉴는 위의 그림처럼 새 게임, 일시정지, 도움말 보기 그리고 게임 종료 4가지의 아이템이 존재한다. 위 창은 메뉴바에서 Help 아이템을 클릭했을 시 띄워지는 다이얼로그 창이다. 스윙에서 다이얼로그는 프레임과 마찬가지로 최상위 컨테이너 중 하나이며, 메뉴가 없는 일반적인 대화 상자 형식의 간단한 애플리케이션에 사용된다...
10. [스칼라 테트리스] 06. 게임을 진행하는 보드 컨트롤러 보드 컨트롤러보드 컨트롤러는 게임 진행을 담당하는 클래스. 테트리스는 현재 블록, 현재 블록의 고스트블록과 다음에 생성될 블록 세 개의 테트로미노 블록으로 게임을 진행된다. 이러한 블록들의 움직임과 처리를 담당하는 클래스가 보드 컨트롤러이다. 키보드 이벤트를 추가하기 위해 Reactor 트레잇의 reactions 속성을 이용한다. 자세한 설명은 분석을 참조하자. 구현보드 컨트롤러는 앞서 말한 세 개의 테트로미노 블록이 필요하다. 또한 패널을 다시 그리기 위해서 패널의 인스턴스를 가져야 하며, 공간을 의미하는 보드의 인스턴스까지 필요하다. 1 2 3 4 5 6 class BoardController(val parent: TetrisPanel) extends Reactor { var board = new B..
이펙티브 자바 05. 만기 참조와 메모리 누수 유효기간이 지난 객체 참조 프로그래머가 직접 메모리를 제어해야하는 C와 같은 언어와 달리, 자바는 가비지 컬렉션(Garbage Collection, 이하 GC)으로 메모리를 관리한다. 자바는 개발자가 메모리를 명시적으로 해제하지 않기 때문에 가비지 컬렉터(Garbage Collector)가 더 이상 필요 없는 객체를 찾아 지우는 작업을한다. 그래서 결국에는 메모리 관리가 필요하다는 사실을 망각하곤 한다. 본인 또한 GC에 대해 잘 알지 못하며, 메모리를 관리하지 않는 일이 습관이 되어버렸다. 그헣다면 우리가 객체 수집에 직접 관여해야할 상황은 어떤 상황일까? 바로 자체적으로 메모리를 관리하는 코드를 작성할 경우다.코드를 살펴보자. 12345678910111213141516171819202122232425..
09. [스칼라 테트리스] 05. 테트로미노를 쌓는 게임보드 지금까지 블록, 테트로미노 클래스를 개발하고 테스트했다.블록은 하나의 정사각형, 테트로미노는 4개의 블록으로 이루어진 테트리스의 기본 블록이다. 이제 테트로미노 블록이 움직이고 쌓이는 보드 클래스와 보드의 게임 동작을 제어하는 보드 컨트롤러를 구현하고보드 컨트롤러와 스윙을 이용한 패널, 프레임을 개발하면 싱글 테트리스는 완성된다.이번에는 테트로미노를 쌓는 게임보드 클래스를 구현해보자. 게임보드 스칼라 테트리스의 기본 실행화면은 위의 사진과 같다.메인프레임 내의 패널, 점수판, 메뉴바가 존재한다.게임보드 클래스는 왼쪽 검정색 패널에서 테트로미노 블록을 이동시키고, 쌓기 위한 공간을 의미한다. 앞에서 (x, y) 튜플의 2차원 배열로 블록의 포지션을 정의하고,테트로미노 블록의 회전값과 위치를 정의한 이유가 ..
이펙티브 자바 04. private 생성자, 불필요한 객체 private 생성자만 존재하는 클래스자바에는 private 기본 생성자와 정적 메소드나 필드만으로 구성된 클래스가 존재한다.이러한 클래스는 생성자를 다른 곳에서 호출할 수 없으므로 하위 클래스를 만들 수 없다. Arrays와 같이 기본 자료형이나 배열에 적용되는 메소드를 제공하는 클래스를 사용해본 적이 있을 것이다.이런 클래스는 객체를 만들어 제공하는 목적이 아닌, 유틸성 기능을 제공하는 목적으로, 정적 메소드나 필드만으로 구성된다.객체를 지향하는 자바에서 객체를 생성할 수 없고 상속, 구성을 활용할 수 없기 때문에 악명이 높다. 하지만, 이런 클래스들도 분명 필요할 때가 있다.Java.lang.Math나 java.util.Arrays처럼 기본 자료형 또는 배열에 적용되는 메소드를 한군데 모아놓을 때 ..
08. [스칼라 테트리스] 04. 4개의 블록을 표현하는 테트로미노 이번에는 테트로미노를 구현해보자.블록과 테트로미노가 헷갈릴 수 있기 때문에 다시 한번 정리하고 넘어가겠다. 블록블록은 하나의 정사각형을 의미한다.블록은 T, Z, S 등 7가지의 종류와 EMPTY라는 빈 블록으로 분류된다. 테트리스라는 게임에서 블록을 회전시켜 모양을 변경할 수 있기 때문에 각각의 블록은 4가지 다른 모양을 가져야 한다.블록이 가진 모양은 4개의 튜플(점)으로 구현한다. (T의 경우 (0, 0), (1, 0), (-1, 0), (0, -1)) 테트로미노테트로미노는 4개의 정사각형(블록)으로 이루어진다. 4개의 블록으로 구성되지만 블록의 종류는 같아야 한다.하나의 테트로미노가 L, T, EMPTY, T 이런 식으로 구성되는 것은 말이 안되기 떄문이다.따라서 하나의 테트로미노 객체에는 하나의..
이펙티브 자바 03. private 생성자, enum 자료형, 싱글톤 패턴 싱글턴 패턴싱글턴은 말 그대로 객체를 하나밖에 생성할 수 없는 클래스를 말한다.동기화 문제를 가진 고전적 구현법, 동기화 문제를 해결하는 방법과 속도를 보완하는 방법처럼 보통 세 가지 방법으로 싱글턴 패턴을 구현할 수 있다. 가장 간단하게는 클래스의 static 필드를 이용하여 만든다.하지만 이는, 쓰레드 환경에서 동기화 문제가 존재하기 때문에 synchronized 키워드를 사용하여 동기화를 시킨다.그러나 동기화는 항상 속도와 관련된 문제가 따라다닌다.싱글턴 패턴의 동기화 과정에서 속도 문제를 해결하기 위해 DCL(Double-Checking Locking) 기법을 사용해서메소드의 동기화되는 부분을 줄일 수 있다. 싱글턴 패턴에 대한 자세한 설명은 헤드퍼스트 디자인 패턴: 5. 싱글턴 패턴 에 등장하므..