분류 전체보기 (392) 썸네일형 리스트형 [Java] 10.03 - System.out.println() & public static void main() 들어가며 지금까지 main 메소드를 정의할 때 그 앞에 static 선언을 붙여왔다. 그리고 인스턴스의 생성 없이 println 메소드를 호출해 왔다. 어케했ㄴ노 System.out.println()에서 out과 println의 정체는? static 선언의 의미를 알았으니, System.out.println의 구성을 이해할 수 있다. 일단 System은 자바에서 제공하는 클래스로, java.lang 패키지에 묶여 있다. 따라서 원칙적으로는 다음과 같이 호출하는 것이 맞다. java.lang.System.out.println( . . . ); 그러나 컴파일러가 다음 문장을 삽입해주기 때문에 패키지의 이름 부분을 생략할 수 있다. import java.lang.*; // 컴파일러가 삽입하는 import 선언.. [Java] 10.02 - static 선언을 붙여서 선언하는 클래스 메소드 들어가며 클래스 내에 정의된 메소드에 static 선언을 하면 '클래스 메소드'가 된다. 그리고 클래스 메소드는 그 성격이 클래스 변수와 유사하다. 접근 방법도 동일하며, 인스턴스 생성 이전부터 호출이 가능한, 그리고 어느 인스턴스에도 속하지 않는 메소드라는 점도 클래스 변수와 유사하다. 클래스 메소드의(static 메소드의) 정의와 호출 앞서 공부한 클래스 변수의 특성 2가지는 다음과 같다. 인스턴스 생성 이전부터 접근이 가능하다. 어느 인스턴스에도 속하지 않는다. 이 두가지는 클래스 메소드도 동일하게 갖는 특성이다. 따라서 이 사실을 다음 예제를 통해서 확인해보겠다. 더불어 클래스 변수의 접근 방법과 동일한 '클래스 메소드의 호출 방법'도 확인해보자. class NumberPrint { private.. [5. 게임 규칙 - 9] 게임 버그와 예외 규칙 게임 버그와 예외 규칙 게임은 컴퓨터 프로그램으로서, 어쩔 수 없이 버그를 가지거나 버그가 있을 가능성을 내포하고 있다. 게임에 발생하는 버그는 개발자가 코딩을 할 때 논리의 허점이 있거나, 기획자가 만든 규칙에 논리의 허점이 있을 때 발생한다. 기획자가 야기한 게임 버그에 대한 부분은 규칙의 논리를 바로 잡는 것으로 고칠 수 있으며, 이 작업은 5장 앞부분, '규칙의 검토 및 개선'에서 설명한 내용으로 처리할 수 있다. 그렇다면 개발자가 만든 버그는 개발자의 영역인가? 안타깝게도 그렇다. 개발자의 작업물인 소스 코드에 심어지는 버그의 원인을 기획자가 어떻게 할 수 있는 방법은 없다. 하지만 기획자가 버그의 원인을 발견하고 처리하지는 못할지라도, 버그의 결과를 완화시킬 수는 있다. 즉, 어떤 원인인지는 .. [Java] 10.01 - static 선언을 붙여서 선언하는 클래스 변수 들어가며 '인스턴스 변수'는 인스턴가 생성되었을 때, 생성된 인스턴스 안에 존재하는 변수이다. 그러나 '클래스 변수'는 인스턴스의 생성과 상관없이 존재하는 변수이다. 선언된 클래스의 모든 인스턴스가 공유하는 '클래스 변수(static 변수)' 클래스 내에 선언된 변수 앞에 static 선언을 붙이면 이는 인스턴스 변수가 아닌 '클래스 변수'가 된다. 이러한 클래스 변수의 특성을 파악하기 위해서 다음 예제를 관찰하자. 이 예제는 클래스 변수의 이해에 초점이 맞춰져 있어서 이 예제만으로도 클래스 변수의 기본 특성을 파악할 수 있을 것이다. class InstCnt{ static int instNum = 0; // 클래스 변수 (static 변수) InstCnt(){ // 생성자 instNum++; // st.. [5. 게임 규칙 - 8] 규칙에 대한 예시 작성 규칙에 대한 예시 작성 규칙을 작성하는 것은 논리의 흐름을 적리하는 것과 같다. 규칙을 논리적으로 정확하게 작성하는 것도 중요하지만, 논리 흐름을 다른 사람이 이해하도록 작성하는 것도 중요하다. 사람마다 사고하는 방식이 저마다 다르기 때문에, 자기 자신은 빠르게 납득이 가는 내용이라 하더라도 다른 사람은 이해하는 데 어렴움을 겪을 수 있다. 사고하는 방식 뿐만 아니라 논리적인 사고 능력도 저마다 다른데, 논리적 사고 능력이 뛰어난 사람을 기준으로 삼기 보다는 오히려 그렇지 못한 사람을 기준으로 삼는 것이 좋다. 하지만 규칙을 쉽게 작성하는 것에는 한계가 있으며, 논리적 완성도를 높이는 게 더 중요한 상황에서 마냥 규칙을 쉽게 고치고 있을 수만은 없는 노릇이다. 따라서 규칙 작성을 쉽게 한 뒤, 더 쉽게 .. [5. 게임 규칙 - 7] 인지요소 규칙 인지요소 규칙 인지요소 규칙은 시스템의 기능과 동작에 대한 설명으로, 인지요소 명세에 포함되는 내용인 동작원리도 인지요소 규칙에 해당한다. 인지요소 명세에서는 하나의 인지요소에 초점을 맞춰서 단편화된 동작원리를 정리했다면, 인지요소 규칙은 전체 시스템의 입장에서 이를 체계적으로 통합해 정리한다. 캐릭터 스탯 시스템을 예로 들면, '지능'이라는 하나의 인지요소에 대한 공식을 정리한 것은 지능이라는 인지요소 명세의 동작원리이고, 지능을 포함한 유사 스탯들을 모아서 전투 공식이나 스탯 적용 공식을 작성하는 것은 인지요소 규칙이다. 인지요소 규칙을 작성하는 여러 방법이 있지만, 여기서는 '상태 정리'와 '공식'에 대해 설명하겠다. 시스템(인지요소)의 상태를 정리하는 것은 큰 규칙을 작성하는 것이고, 공식을 작성.. [5. 게임 규칙 - 6] 유저 시나리오 규칙 유저 시나리오 규칙 유저 시나리오 규칙은 게임의 진행에 대한 규칙으로, 흔히 떠올릴 수 있는 게임 규칙은, 이 유저 시나리오 규칙에 해당한다. 유저 게임 시나리오 규칙은 유저가 게임을 즐기는 실제 게임 내용과 관련이 있기 때문에, 게임 시스템보다는 콘텐츠와 관련 있는 내용들로 구성된다. 로 예를 들자면, '스킬 사용 시 마나가 소모된다.' 와 같은 스킬 시스템에 대한 규칙이 아니라, '14초가 지나면 캐릭터 생성 제단으로부터 나갈 수 있다.' 와 같이 경기 진행에 대한 규칙이 유저 시나리오 규칙이라고 볼 수 있다. 유저 시나리오 규칙은 다음 내용을 포함하며, 이에 대한 예시로 의 '소환사의 협곡' 맵에서 진행되는 경기의 유저 시나리오 규칙을 예로 들겠다. 게임(콘텐츠)의 구성요소와 설정 게임의 목적 게임.. [Java] 09.03 - 캡슐화(Encapsulation) 들어가며 캡슐화는 정보 은닉과 더불어 객체지향 기반의 클래스 설꼐에 있어 가장 기본이면서 중요한 원칙 중 하나이다. 캡슐화는 문법적인 내용은 아니다. 클래스 안에 '무엇을 넣을까' 에 대한 이론을 제시하는 내용이다. 콘택 600과 캡슐화 코감기 약 중에서 대충 매우 유명한 약이 있었다. 아주 오래 전에 나온 약인데, 지금도 이름이 '콘택600'에서 '콘택골드'로 변경되어 판매되고 있다. 그리고 무엇보다 그 생김새가 다른 약들과는 확연히 구분된다. 모든 약들이 그러하지만 이 약은 갭슐화가 잘 이뤄진 예로 볼 수 있다. 이 약이 갖는 기능은 다음과 같다. 흐르는 '콧물'을 멎게 하는 기능 멈추지 않는 '재채기'를 가라앉혀 주는 기능 답답한 '코막힘' 상태를 완화시켜 주는 기능 그런데 만약에 이 약이 '콧물용.. [Java] 09.02 - 접근 수준 지시자(Access-level Modifiers) 들어가며 앞서 인스턴스 변수를 대상으로 private 선언을 하였는데 이러한 유형의 키워드를 가리켜 '접근 수준 지시자'라고 한다. (Access-level Modifiers) 이름 그래도 접근의 허용 수준을 결정할 때 선언하는 키워드이다. 4가지 종류의 '접근 수준 지시자' '접근 수준 지시자'의 종류는 다음과 같이 4가지이다. 참고로 '참근 수준 지시자'는 다양한 한글 표현이 존재하므로 영어 표현 'Access-level Modifiers'를 기억해 두는 것이 좋다. public, protected private, default 이 중에서 default는 키워드가 아닌, '아무런 선언도 하지 않은 상황'을 의미한다. 비록 이는 키워드가 아닌 일종의 '상황'이지만 이 역시 '접근 수준 지시자'의 한 종.. [Java] 09.01 - 정보 은닉(Information Hiding) 들어가며 자바에서 말하는 '정보'는 클래스의 '인스턴스 변수'를 의미한다. 따라서 정보를 은닉한다는 것은 인스턴스 변수를 숨긴다는 것이다. 정보를 은닉해야 하는 이유 다음 예제를 시작으로 이야기를 전개하고자 한다. 다음 예제는 컴파일도 실행도 잘 된다. 다만 내용상 그리고 의미상 문제가 되는 부분이 있다. class Circle{ double rad = 0; // 원의 반지름 final double PI = 3.14; public Circle(double r){ setRad(r); // 아래에 정의된 setRad 메소드 호출을 통한 초기화 } public void setRad(double r){ if(r < 0){ // 반지름은 0보다 작을 수 없으므로 rad = 0; return; // 이 위치에서 메.. [Java] 08.02 - 패키지(Package)의 이해 들어가며 간단하게 설명하면, 패키지는 클래스를 묶는 수단이다. 묶어서 '다른 클래스' 또는 '다른 클래스들의 묶음'을 구분하기 위한 수단이다. 패키지 선언의 의미와 목적 자바 8을 기준으로 Java SE에서 제공하는 클래스의 수만 해도 300개가 넘는다. 단, 이름이 A로 시작하는 클래스의 수만 세었을 때, 그 정도이다. 따라서 이름이 Z로 시작하는 클래스까지 그 수가 수천을 넘는다는 것을 쉽게 짐작할 수 있다. 그런데 이들이 단순히 이름만 갖는다면 어떠한 용도로 사용되는 클래스인지 구분이 어려워진다. 예를 들어서 다음의 클래스가 무엇과 관련이 있는지 알 수 있는가? Class CookieManager 클래스의 이름만 놓고 보면 짐작이 가지 않는다. 그런데 위의 클래스가 속한 다음 패키지의 이름을 보면 .. [Java] 08.01 - 패키지와 클래스 패스 들어가며 '패스(Path)'라는 단어는 경로를 의미한다. 그리고 자바에서 '클래스 패스'가 의미하는 바는 다음과 같다. 자바 가상 머신이 클래스 파일을 찾는 경로 즉 자바 가상 머신은 프로그램의 실행 과정에서 클래스 파일을 찾을 때, 이 '클래스 패스'라는 것을 기준으로 찾는다. 물론 클래스 패스를 지정하는 것은 프로그래머의 몫이다. 현재 디렉토리(Current Directory)를 기준으로 한 실행 다음 예제를 컴파일하고 실행하자. 단 실행 환경을 일치시키기 위해서 소스파일을 다음 위치에 가져다 놓고 컴파일 및 실행을 하자. C:\PackageStudy class AAA{ public void showName(){ System.out.println("My name is AAA"); } } class Z.. 이전 1 ··· 19 20 21 22 23 24 25 ··· 33 다음